这是将默认参数 initial_value
初始化为 TNumber
类型的编译时常量的唯一方法吗?如果不是,这样做的首选方法是什么?
template <typename TNumber>
class Widget {
public:
Widget(TNumber initial_value = static_cast<TNumber>(1))
: value_(initial_value) {};
private:
TNumber value_;
};
最佳答案
首选方法是使用类型的预期构造函数。在 C++ 98 中:
Widget(TNumber initial_value = TNumber(1));
在 C++ 11+ 中,您也可以使用聚合构造函数:
Widget(TNumber initial_value = TNumber{1});
当你的参数是一个 const ref 时,这也有效,如
Widget(const TNumber& initial_value = TNumber{1});
按照惯例,对于数值,显式默认构造函数返回 0,因此以下两行对于标准数值类型(int、char、float 等)是等价的
Widget(const TNumber& initial_value = TNumber{0});
Widget(const TNumber& initial_value = TNumber{});
[编辑] 复数 (std::complex<>) 也是如此。如果您定义自己的“类数字”类型,我建议您遵循相同的约定。它真的可以在某些时候挽救你的一天。
关于c++ - 如何使 C++ 编译时模板强制转换常量?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45643228/