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

How to make C++ compile time template cast 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});

当您的参数是常量引用时,这也适用,如

Widget(const TNumber& initial_value = TNumber{1});

按照惯例,数值的显式默认构造函数 returns 0,因此以下两行对于标准数值类型(int、char、float 等)是等价的

Widget(const TNumber& initial_value = TNumber{0});

Widget(const TNumber& initial_value = TNumber{});

[编辑] 复数 (std::complex<>) 也是如此。如果您定义自己的 'numerical-like' 类型,我建议您遵循相同的约定。它真的可以在某些时候拯救你的一天。

可以使用模板类型的默认成员初始化吗?所以,只是...

私人: TNumber value_ = 1;