我正在构建一个类,其实例可以表示多个简单的值类型。它的界面看起来大致如下:
class value {
public:
value();
explicit value( double value );
explicit value( bool value );
...
}
我发现我无法以我希望的方式构造它,因为整数(一个非常常见的用例)在bool和double之间被认为是不明确的。
value bool_value( true ); // OK
value pi_approx( 3.14159 ); // OK
value int_value( 42 ); // ERROR: ambiguous constructor
有没有办法让这项工作不需要调用者使用小数点数值或使用显式“make”静态函数?
[编辑]:此类表示来自JSON解析树的值,因此bool和number之间的区别很重要,必须保留。
答案 0 :(得分:4)
在这种情况下,你应该指出,它是双重的,或者是bool。像
这样的东西value int_value(static_cast<double>(42));
或者只是编写构造函数,它应该接收整数值。
问题是,编译器有两个变体用于构造对象,一个是将整数转换为double
,第二个是将整数转换为bool
,没有人比另一个更值钱,所以,编译器无法选择,没有帮助。
答案 1 :(得分:1)
似乎不可能让编译器以我希望的方式自动消除构造函数的歧义。
我通过使用工厂方法解决了这个问题:
class value {
public:
static value from_double( double value );
static value from_int64( int64_t value );
static value from_bool( bool value );
...
}