问题描述
我正在尝试创建一个可以存储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,1234); // error
// But I need to type:
std::clamp(int(v),1234); // ok
操作员也遇到同样的问题(带有不同的错误消息)
int x=v+12;
我认为我应该增加更多的运算符重载,但是我找不到哪个。
解决方法
//我想输入:
std::clamp(v,1234); // error
尝试
// .......VVVVV
std::clamp<int>(v,1234);
问题是std::clamp()
的签名是
template<class T>
constexpr const T& clamp( const T& v,const T& lo,const T& hi );
因此,如果您在不重复T
的情况下调用它,
std::clamp(v,1234);
从T
和Value
,从v
和int
推论0
,模板类型1234
。
鉴于类型冲突,您会得到一个错误。
如果您明确指定模板类型
// .......VVVVV
std::clamp<int>(v,1234);
没有更多的推论,编译器期望int
处于第一位置,因此operator int ()
被v
调用。