在 C++98 中,SFINAE 使用返回类型或函数的带有默认参数的虚拟参数来完成
// SFINAE on return type for functions with fixed arguments (e.g. operator overloading)
template<class T>
typename std::enable_if< std::is_integral<T>::value, void>::type
my_function(T const&);
// SFINAE on dummy argument with default parameter for functions with no return type (e.g. constructors)
template<class T>
void my_function(T const&, std::enable_if< std::is_integral<T>::value, void>::type* = nullptr);
在这两种情况下,T
为了得到嵌套类型的替换type
是 SFINAE 的本质。与 相比std::enable_if
,您的assert
模板没有可用于 SFINAE 替换部分的嵌套类型。
有关更多详细信息以及 C++11 表达式 SFINAE,请参阅 Jonathan Wakely 的出色ACCU 2013 演示文稿。除其他外(正如@BartekBanachewicz 在评论中指出的那样)现在也可以在函数模板默认参数中使用 SFINAE
// use C++11 default function arguments, no clutter in function's signature!
template<class T, class dummy = typename std::enable_if< std::is_integral<T>::value, void>::type>
void my_function(T const&);