And*_*ott 3 c++ templates sfinae c++11
我试图从ValueType我定义的类(typedef)获取typedef指向的类型.但是,当这个失败时,我希望它返回给定的类型(例如,如果我给它一个double,我希望它返回一个double).这是我到目前为止:
struct myClass { typedef double ValueType; };
template < typename V, typename U = typename V::ValueType>
struct base_type { typedef U type; };
template < typename V >
struct base_type< V, V > { typedef V type; };
static_assert( std::is_same < typename base_type< myClass >::type , double >::value,
"base_type doesn't work" ); //This works.
static_assert( std::is_same < typename base_type< double >::type , double >::value,
"base_type doesn't work" ); //This returns "error: 'double' is not a class, struct, or union type"
Run Code Online (Sandbox Code Playgroud)
但是,这不起作用,第二个static_assert失败.显然,第二个定义从未被调用,但我不确定为什么(它肯定会比第一个更好).
有任何想法吗?
您必须使用有效SFINAE的功能.
以下是新C++ 11功能的外观:
template <typename T> auto get_base_type(int) -> typename T::ValueType;
template <typename T> auto get_base_type(...) -> T;
template <typename T>
struct base_type { using type = decltype(get_base_type<T>(0)); };
Run Code Online (Sandbox Code Playgroud)
另外
template < typename V, typename = void>
struct base_type { typedef V type; };
template < typename V >
struct base_type< V,
typename base_type<void, typename V::ValueType>::type > {
typedef typename V::ValueType type;
};
Run Code Online (Sandbox Code Playgroud)
我们都喜欢这些原始和丑陋的SFINAE黑客:)