|
Shinya Kitaoka |
810553 |
#pragma once
|
|
Toshihiro Shimizu |
890ddd |
|
|
Toshihiro Shimizu |
890ddd |
#ifndef TCG_SFINAE_H
|
|
Toshihiro Shimizu |
890ddd |
#define TCG_SFINAE_H
|
|
Toshihiro Shimizu |
890ddd |
|
|
Toshihiro Shimizu |
890ddd |
/*!
|
|
Toshihiro Shimizu |
890ddd |
\file sfinae.h
|
|
Toshihiro Shimizu |
890ddd |
|
|
Toshihiro Shimizu |
890ddd |
\brief Contains template metafunctions that can be used to enable or
|
|
Toshihiro Shimizu |
890ddd |
disable template class members.
|
|
Toshihiro Shimizu |
890ddd |
|
|
Toshihiro Shimizu |
890ddd |
\details SFINAE (Substitution Failure Is Not An Error) is a C++ \a feature
|
|
Toshihiro Shimizu |
890ddd |
that allows the compiler to silently discard failures in template
|
|
Toshihiro Shimizu |
890ddd |
function instantiations during function overload resolution.
|
|
Toshihiro Shimizu |
890ddd |
*/
|
|
Toshihiro Shimizu |
890ddd |
|
|
Toshihiro Shimizu |
890ddd |
#if defined(__APPLE_CC__)
|
|
Toshihiro Shimizu |
890ddd |
#include <type_traits>
|
|
Toshihiro Shimizu |
890ddd |
#endif
|
|
Toshihiro Shimizu |
890ddd |
|
|
Shinya Kitaoka |
120a6e |
namespace tcg {
|
|
Toshihiro Shimizu |
890ddd |
|
|
Toshihiro Shimizu |
890ddd |
template <typename X, typename Y>
|
|
Toshihiro Shimizu |
890ddd |
struct type_match {
|
|
Shinya Kitaoka |
120a6e |
enum { value = false };
|
|
Toshihiro Shimizu |
890ddd |
};
|
|
Toshihiro Shimizu |
890ddd |
|
|
Toshihiro Shimizu |
890ddd |
template <typename X>
|
|
Toshihiro Shimizu |
890ddd |
struct type_match<X, X> {
|
|
Shinya Kitaoka |
120a6e |
enum { value = true };
|
|
Toshihiro Shimizu |
890ddd |
};
|
|
Toshihiro Shimizu |
890ddd |
|
|
Toshihiro Shimizu |
890ddd |
//------------------------------------------------------------------------
|
|
Toshihiro Shimizu |
890ddd |
|
|
Toshihiro Shimizu |
890ddd |
template <typename X, typename Y>
|
|
Toshihiro Shimizu |
890ddd |
struct type_mismatch {
|
|
Shinya Kitaoka |
120a6e |
enum { value = true };
|
|
Toshihiro Shimizu |
890ddd |
};
|
|
Toshihiro Shimizu |
890ddd |
|
|
Toshihiro Shimizu |
890ddd |
template <typename X>
|
|
Toshihiro Shimizu |
890ddd |
struct type_mismatch<X, X> {
|
|
Shinya Kitaoka |
120a6e |
enum { value = false };
|
|
Toshihiro Shimizu |
890ddd |
};
|
|
Toshihiro Shimizu |
890ddd |
|
|
Toshihiro Shimizu |
890ddd |
//========================================================================
|
|
Toshihiro Shimizu |
890ddd |
|
|
Toshihiro Shimizu |
890ddd |
template <typename T, typename B>
|
|
Toshihiro Shimizu |
890ddd |
struct enable_if_exists {
|
|
Shinya Kitaoka |
120a6e |
typedef B type;
|
|
Toshihiro Shimizu |
890ddd |
};
|
|
Toshihiro Shimizu |
890ddd |
|
|
Toshihiro Shimizu |
890ddd |
//========================================================================
|
|
Toshihiro Shimizu |
890ddd |
|
|
Toshihiro Shimizu |
890ddd |
template <bool, typename T = void>
|
|
Shinya Kitaoka |
120a6e |
struct enable_if {};
|
|
Toshihiro Shimizu |
890ddd |
|
|
Toshihiro Shimizu |
890ddd |
template <typename T>
|
|
Toshihiro Shimizu |
890ddd |
struct enable_if<true, T> {
|
|
Shinya Kitaoka |
120a6e |
typedef T type;
|
|
Toshihiro Shimizu |
890ddd |
};
|
|
Toshihiro Shimizu |
890ddd |
|
|
Toshihiro Shimizu |
890ddd |
//========================================================================
|
|
Toshihiro Shimizu |
890ddd |
|
|
Toshihiro Shimizu |
890ddd |
template <bool, typename T = void>
|
|
Toshihiro Shimizu |
890ddd |
struct disable_if {
|
|
Shinya Kitaoka |
120a6e |
typedef T type;
|
|
Toshihiro Shimizu |
890ddd |
};
|
|
Toshihiro Shimizu |
890ddd |
|
|
Toshihiro Shimizu |
890ddd |
template <typename T>
|
|
Shinya Kitaoka |
120a6e |
struct disable_if<true, T> {};
|
|
Toshihiro Shimizu |
890ddd |
|
|
Toshihiro Shimizu |
890ddd |
//========================================================================
|
|
Toshihiro Shimizu |
890ddd |
|
|
Toshihiro Shimizu |
890ddd |
template <bool, typename TrueT, typename FalseT = void>
|
|
Toshihiro Shimizu |
890ddd |
struct choose_if;
|
|
Toshihiro Shimizu |
890ddd |
|
|
Toshihiro Shimizu |
890ddd |
template <typename TrueT, typename FalseT>
|
|
Toshihiro Shimizu |
890ddd |
struct choose_if<true, TrueT, FalseT> {
|
|
Shinya Kitaoka |
120a6e |
typedef TrueT type;
|
|
Toshihiro Shimizu |
890ddd |
};
|
|
Toshihiro Shimizu |
890ddd |
|
|
Toshihiro Shimizu |
890ddd |
template <typename TrueT, typename FalseT>
|
|
Toshihiro Shimizu |
890ddd |
struct choose_if<false, TrueT, FalseT> {
|
|
Shinya Kitaoka |
120a6e |
typedef FalseT type;
|
|
Toshihiro Shimizu |
890ddd |
};
|
|
Toshihiro Shimizu |
890ddd |
|
|
Toshihiro Shimizu |
890ddd |
//========================================================================
|
|
Toshihiro Shimizu |
890ddd |
|
|
Toshihiro Shimizu |
890ddd |
template <typename T, typename MatchT, typename NotMatchedT = void>
|
|
Toshihiro Shimizu |
890ddd |
struct choose_if_match {
|
|
Shinya Kitaoka |
120a6e |
typedef NotMatchedT type;
|
|
Toshihiro Shimizu |
890ddd |
};
|
|
Toshihiro Shimizu |
890ddd |
|
|
Toshihiro Shimizu |
890ddd |
template <typename MatchT, typename NotMatchedT>
|
|
Toshihiro Shimizu |
890ddd |
struct choose_if_match<MatchT, MatchT, NotMatchedT> {
|
|
Shinya Kitaoka |
120a6e |
typedef MatchT type;
|
|
Toshihiro Shimizu |
890ddd |
};
|
|
Toshihiro Shimizu |
890ddd |
|
|
Shinya Kitaoka |
120a6e |
} // namespace tcg
|
|
Toshihiro Shimizu |
890ddd |
|
|
Shinya Kitaoka |
120a6e |
#endif // TCG_SFINAE_H
|