我试图只在类的模板参数是浮点数时启用默认构造函数。注意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.
1条答案
按热度按时间ni65a41a1#
使用
requires
:或者,在C++17中:
SFINAE条件必须依赖于函数本身的模板参数。否则,即使函数没有被使用,也可以在类第一次示例化时检查它。
我还调整了一些东西,纯粹是为了时尚。