C++ 实现仅在特定条件下定义的typedef

C++ 实现仅在特定条件下定义的typedef,c++,c++11,typedef,C++,C++11,Typedef,在阅读C++11标准20.8.3时,我注意到有三个typedef仅在满足特定条件时才定义 人们通常如何编写这样一个有条件的typedef #include <type_traits> namespace detail { template <class T, bool = std::is_integral<T>::value> struct maybe_has_a_value_type_or_something_else_impl { using

在阅读C++11标准
20.8.3
时,我注意到有三个
typedef
仅在满足特定条件时才定义


人们通常如何编写这样一个有条件的
typedef

#include <type_traits>

namespace detail
{

template <class T, bool = std::is_integral<T>::value>
struct maybe_has_a_value_type_or_something_else_impl
{
    using value_type = T;
};

template <class T>
struct maybe_has_a_value_type_or_something_else_impl<T, false>
{
    using something_else = T;
};

} // namespace detail


template <class T>
struct maybe_has_a_value_type_or_something_else
    : public detail::maybe_has_a_value_type_or_something_else_impl<T>
{

};

class Foo
{

};

int main()
{
    maybe_has_a_value_type_or_something_else<int>::value_type          a;
    // maybe_has_a_value_type_or_something_else<int>::something_else   b;
    // maybe_has_a_value_type_or_something_else<Foo>::value_type       c;
    maybe_has_a_value_type_or_something_else<Foo>::something_else      d;
}
#包括
名称空间详细信息
{
模板
结构可能有一个值、类型或其他内容
{
使用值_type=T;
};
模板
结构可能有一个值、类型或其他内容
{
使用其他东西=T;
};
}//名称空间详细信息
模板
struct可能有一个值、类型或其他东西
:公共详细信息::可能\u有\u值\u类型\u或\u其他内容\u impl
{
};
福班
{
};
int main()
{
可能有一个值类型或者其他东西::值类型;
//也许你有一个值类型或者其他东西::其他东西b;
//可能有一个值类型或者其他东西::值类型c;
也许你有一个值,类型,或者其他东西::其他东西d;
}

类似的实现在LLVM
\uuu functional\u base
头中使用。

这样做的方法是通过部分专门化。考虑下面的实现:<代码> Enablle,如果(用于许多反射技巧,加上更多):

但是

通过插入任何不是数字的类型
T
,我将得到一个编译器错误。它很脏,但能用

template <bool Condition, typename T>
struct enable_if {
    typedef T type;
};

template <typename T>
struct enable_if<false, T> { /* no typedef */ };
typename enable_if<std::is_same<int, int>::value, int>::type; // = int
typename enable_if<std::is_same<int, long double>::value, int>::type; // = error. No typedef inside.   
template <typename T, typename = enable_if<is_numeric<T>::value, int>::type>
struct Complex {
    // impl...
};