如何在提供bool和double重载时避免模糊的构造函数错误

时间:2013-12-24 07:28:07

标签: c++ constructor overloading

我正在构建一个类,其实例可以表示多个简单的值类型。它的界面看起来大致如下:

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之间的区别很重要,必须保留。

2 个答案:

答案 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 );
  ...
}