据我所知,SFINAE表示替换失败不会导致编译错误,而只是从可能的重载列表中删除原型(prototype)。
我不明白的是:为什么这个SFINAE:
template <bool C, typename T = void> struct enable_if{};
template <typename T> struct enable_if<true, T> { typedef T type; };
但这不是吗?
template <bool C> struct assert;
template <> struct assert<true>{};
根据我的理解,这里的基本逻辑是相同的。这个问题来自对this answer的注释。
最佳答案
在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 presentation。除了其他功能(如@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&);
关于c++ - 了解SFINAE,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/17829874/