获取模板参数的typedef,或者失败,获取类型本身

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失败.显然,第二个定义从未被调用,但我不确定为什么(它肯定会比第一个更好).

有任何想法吗?

ipc*_*ipc 5

您必须使用有效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)


Joh*_*itb 5

另外

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黑客:)