【发布时间】:2020-02-25 14:02:23
【问题描述】:
我正在尝试理解 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;
}
};
【问题讨论】:
-
您的版本无法处理
double、long、long long... -
函数重载仅适用于
int和float。模板适用于int8_t、uint8_t、int16_t、uint16_t、int32_t、uint32_t、int64_t、uint64_t、float和double。 -
此外,您还接受转换为
int(或float)的自定义类型。