为什么使用SFINAE而不是函数重载
Why use SFINAE instead of function overloading?
我正在努力理解std::enable_if
,在cppreference.com上有一个例子,使用它比函数重载有什么好处?
struct T {
enum { int_t,float_t } m_type;
template <typename Integer,
std::enable_if_t<std::is_integral<Integer>::value, int> = 0
>
T(Integer) : m_type(int_t) {}
>
template <typename Floating,
std::enable_if_t<std::is_floating_point<Floating>::value, int> = 0
>
T(Floating) : m_type(float_t) {} // OK
};
struct T1 {
enum { int_t, float_t } m_type;
T1(int) :m_type(int_t)
{
cout << "int ctor" << endl;
}
T1(float) :m_type(float_t)
{
cout << "float ctor" << endl;
}
};
您的两个示例不相同。在第一个例子中,类将完全地排除任何整数或浮点类型。在第二个例子中,您只接受int
或float
,这意味着如果您传递了long long
或double
,那么您就有可能进行窄范围转换,这可能会导致数据丢失。这与您正在使用的代码无关,但可以而且应该注意它。
使用可以转换为float
或int
的类型时,也会出现歧义。例如
T1 foo{0l};
不会编译,但
T foo{0l};
意志。
在这种情况下,确实没有真正的优势,因为整数类型将首先转换为例如int
,然后调用正确的重载构造函数。
但是,假设您想要创建一个只接受整数的函数。它应该返回作为参数接收的整数类型。在这种情况下,手动创建>10个重载只是容易出错/愚蠢/令人讨厌/。。。相反,你会写这样的东西:
template <typename Integer,
std::enable_if_t<std::is_integral<Integer>::value, int> = 0>
Integer doMagic (Integer a) {
return a;
}
相关文章:
- 为什么使用SFINAE而不是函数重载
- 为什么我不能在 C++ 中的特定函数重载中调用同一函数的任何其他重载?
- c++:可变模板和函数重载
- 在缺少函数重载时抛出异常,并带有 std::variant 而不是编译时错误
- 解决模板成员函数重载
- 为什么不允许成员函数和非成员函数之间的函数重载?
- 推断模板化函数中的函数重载
- C++复制函数重载导致"must be a nonstatic member function"错误
- 为什么 std::sort 找不到合适的(静态成员)函数重载?
- 可变参数泛型 lambda 和函数重载
- C++中的函数重载和继承
- 当有右值构造函数可用时,为什么从右值调用类引用构造函数重载?
- C/C++ 可变参数宏函数重载
- 将基类的成员函数重载到其他派生类C++
- C++ 函数重载匹配
- C++函数重载,具体步骤是什么
- C++:使用 param pack 显式调用函数重载
- 隐式生成的函数重载用于右值参数?
- 使用函数重载输入运算符
- 运算符重载函数上的函数重载