C++ 阵列模板专业化,std::is_阵列
我使用模板专门化和SFINAE 至于下面的例子,事情似乎很简单:C++ 阵列模板专业化,std::is_阵列,c++,templates,sfinae,specialization,C++,Templates,Sfinae,Specialization,我使用模板专门化和SFINAE 至于下面的例子,事情似乎很简单: template <class T> void Do(T t, typename std::enable_if<std::is_integral<T>::value >::type* = 0) { cout << "is integer" << endl; } template <class T>
template <class T>
void Do(T t, typename std::enable_if<std::is_integral<T>::value >::type* = 0)
{
cout << "is integer" << endl;
}
template <class T>
void Do(T t, typename std::enable_if<std::is_floating_point<T>::value >::type* = 0)
{
cout << "is float" << endl;
}
模板
void Do(T,typename std::enable_if::type*=0)
{
cout我想你自己已经做到了——如果你想在序列化中使用数组的类型,就通过引用将数组传递给模板函数
要执行此操作的原因是数组到指针衰减,这是模板函数参数在与参数类型匹配之前发生的少数隐式转换之一。这就是为什么当您尝试在DoIt
中检查它是否为数组类型时,T
是指针。但是,数组到指针衰减不是当目标类型为引用类型时发生。综上所述:
template <class T>
void Do(T& t, typename std::enable_if<std::is_array<T>::value >::type* = 0)
模板
void Do(T&T,typename std::enable_if::type*=0)
应该有用
顺便说一句,不使用SFINAE的无聊方式
template <class T, unsigned N>
void Do(T (&t)[N])
模板
无效Do(T&T)[N])
同样有效。+1,但在C++11中,您应该使用通用引用:void Do(T&&T,…)
@ecatmur:也许,但它对数组有任何好处吗?不会有不可复制但可移动的数组rvalue,是吗?您可以通过访问临时:结构S{int a[3];};S{.a;
。
cout << boolalpha << std::is_array<decltype(e)>::value << endl;
template <class T>
void Do(T& t, typename std::enable_if<std::is_array<T>::value >::type* = 0)
template <class T, unsigned N>
void Do(T (&t)[N])