使C++构造函数主题能够说std::is_floating_point< T>

webghufk  于 2023-03-14  发布在  其他
关注(0)|答案(1)|浏览(113)

我试图只在类的模板参数是浮点数时启用默认构造函数。注意T不是参数类型也不是返回类型,而是类的模板类型。

template <typename T>
  struct Thing
{
    const T x;
    Thing( T t) : x(t) {}
    //only turn on this constructor if T is floating point
    Thing() : x(std::numeric_limits<T>::quiet_NaN()) {}
};

//...

Thing<double> dt;
Thing<float> ft;
Thing<int> it1;
Thing<int> it2(3);

我试着在构造函数前面加上以下代码

template <std::enable_if_t<std::is_floating_point<T>::value, bool> = true>

我还尝试将std::enable_if_t...= true作为默认构造函数的参数(以及其他各种尝试)。
这两个尝试都正确地抱怨it1,所以这很好,但当我删除它时,他们也抱怨it2!我不明白,也找不到魔法咒语。
谢谢你的见解。
我忘了说,我卡在C++17.

ni65a41a

ni65a41a1#

使用requires

Thing() requires std::is_floating_point_v<T>
    : x(std::numeric_limits<T>::quiet_NaN())
{}

或者,在C++17中:

template <typename U = T, std::enable_if_t<std::is_floating_point_v<U>, std::nullptr_t> = nullptr>
Thing()
    : x(std::numeric_limits<T>::quiet_NaN())
{}

SFINAE条件必须依赖于函数本身的模板参数。否则,即使函数没有被使用,也可以在类第一次示例化时检查它。
我还调整了一些东西,纯粹是为了时尚。

相关问题