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

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/222.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++ 使用SFINAE进行结构定义_C++_Templates_C++11_Struct_Sfinae - Fatal编程技术网

C++ 使用SFINAE进行结构定义

C++ 使用SFINAE进行结构定义,c++,templates,c++11,struct,sfinae,C++,Templates,C++11,Struct,Sfinae,人们经常看到SFINAE用于函数。例如: #include <type_traits> #include <iostream> template<int N>//version for N!=4 typename std::enable_if<N==4, int>::type val(){ return N; } template<int N>//version for N==4 typename std::enable_i

人们经常看到SFINAE用于函数。例如:

#include <type_traits>
#include <iostream>

template<int N>//version for N!=4
typename std::enable_if<N==4, int>::type val(){
    return N;
}

template<int N>//version for N==4
typename std::enable_if<N!=4, int>::type val(){
    return 2*N;
}

int main(){
  std::cout<<val<4>()<<std::endl;//prints: 4, version N==4
  std::cout<<val<5>()<<std::endl;//prints: 10, version N==10
}
#包括
#包括
模板//N的版本=4.
typename std::enable_if::type val(){
返回N;
}
模板//N==4的版本
typename std::enable_if::type val(){
返回2*N;
}
int main(){

std::cout看起来您只需要类模板专门化:

template <int N> struct S
{
    long v;
    // ...
};

template <> struct S<4>
{
    int v;
    // ...
};
模板结构
{
长v;
// ...
};
模板结构
{
INTV;
// ...
};

复杂性可以通过将这些选择分解成单独的特征类模板,然后使用依赖类型(如
typename-type\u-picker::type v;
)来管理。或者您可以使用现成的选择器:
typename-std::conditional::type v;

SFINAE是关于函数重载解析的,所以您的问题并不清楚看起来你只是想要类模板专门化。谢谢你的建议!但是如果我需要“N是偶数”和“N是奇数”的不同实现呢或者更复杂。它也可以通过模板专门化来完成吗?@ead:可以。你可以专门化一些中间选择器参数,例如布尔值,比如
std::conditional
template <int N> struct S
{
    long v;
    // ...
};

template <> struct S<4>
{
    int v;
    // ...
};