C++ 使用SFINAE进行结构定义
人们经常看到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
#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;
// ...
};