0

我正在尝试创建一种可以存储 int、double 或 uint 的类型,如下所示:

struct Value
{
    /*...*/

    Value& operator=(const int value) { /*...*/ }
    Value& operator=(const double value) { /*...*/ }
    Value& operator=(const uint value) { /*...*/ }

    operator int() const { /*...*/ }
    operator double() const { /*...*/ }
    operator uint() const { /*...*/ }
}

当我尝试使用它时,我得到了关于“推断冲突类型”的错误。我在某处读到“演绎指南”可以提供帮助,但它似乎需要模板。我的类型不需要模板。

有没有一种解决方案可以使用这种 Value 类型,而无需每次都将其转换为 int、double 或 uint?

Value v;
v=123;

// I would like to type:
std::clamp(v,0,1234); // error

// But I need to type:
std::clamp(int(v),0,1234); // ok

我对操作员也有同样的问题(有不同的错误消息)

int x=v+12;

我想我应该添加更多的运算符重载,但我没有找到哪一个。

4

1 回答 1

0

// 我想输入:

std::clamp(v,0,1234); // error

尝试

 // .......VVVVV
 std::clamp<int>(v, 0, 1234);

问题是签名std::clamp()

 template<class T>
 constexpr const T& clamp( const T& v, const T& lo, const T& hi );

因此,如果您不加解释地调用它T

 std::clamp(v, 0, 1234);

模板类型T是 deduced Value, from v, and int, from0和 from 1234

鉴于冲突的类型,您会收到错误消息。

如果您明确模板类型

 // .......VVVVV
 std::clamp<int>(v, 0, 1234);

没有更多的推论,编译器期望一个int在第一个位置,所以operator int ()被调用了v

于 2020-09-03T20:11:05.297 回答