【发布时间】:2018-11-23 16:10:43
【问题描述】:
我正在设计一个具有两个构造函数的类,该构造函数带有具有不同语义的单个整数参数。
template <typename value_t>
class Numeric {
value_t value_;
public:
Numeric(value_t value) : value_(value) {}
Numeric(long l) { /* computes value_ from l */ }
Numeric(double d) { /* computes value_ from d */ }
Numeric(std::string bstring) { /* computes value_ from binary string */ }
// ...
};
value_t 必须 在这种情况下是一个整数类型,它甚至可以是long 的别名(在这种情况下甚至无法编译)。即使它不是long 的类型别名,我也不太确定整数提升会如何混淆这两个构造函数。
我的想法是我想通过提供基础表示来支持用户构建,或通过给它任何可能的数字表示,然后将其转换为基础表示(A.K.A value_t)。
分离构造函数的最佳方法是什么?
【问题讨论】:
-
选项要么使用一个构造函数为
long定义特化,要么更改构造函数的签名。这些是您在 C++ 中的唯一选择。 -
为什么不创建一个函数来“从 long 中计算 value_”,然后将其传递给类?
-
@hlscalon 这不是构造函数的重点吗?取值并计算和分配成员?我只是也试图支持成员的直接初始化。
-
构造函数的工作不可能是关心您可以对其参数进行的所有可能的转换。如果您需要
long来构造实例,则构造函数应采用long -
@ktb 构造函数的重点是构造一个对象。从代码中可以明显看出,仅使用转换的 result 即可完全构造对象,因此无需在构造函数中执行该计算。您可以只需要该结果,并在需要时提供一种执行转换的方法。
标签: c++ constructor constructor-overloading