c++ - 如何使 C++ 编译时模板强制转换常量?

标签 c++ templates compile-time-constant

这是将默认参数 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/

相关文章:

c++:如果条件不满足,函数调用会出现编译时错误?

c++ - CRTP和重载返回类型推导

c++ - 为什么这个 sfinae 不起作用?

actionscript - 错误1046 :Type was not found or was not a compile-time constant

c++ - 如何计算立体图像的密集视差图?

c++ - 分配给 char* 的内存

c++ - Visual Studio 2010 - 数据段和堆栈内存相同

c++ - 如何对 float 执行按位运算

模板类的 C++11 std::vector 在构造函数中带有参数

c++ - 自定义strtoi函数编译时间问题