Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/templates/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 阵列模板专业化,std::is_阵列_C++_Templates_Sfinae_Specialization - Fatal编程技术网

C++ 阵列模板专业化,std::is_阵列

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>

我使用模板专门化和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>
    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])