如何使 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;
这是将默认参数 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;