重载解析作用于函数,但不适用于隐式构造函数参数



这段代码显示了__int32bool类型的基本包装器类。我的目的是用方法和自定义操作符等来扩展基本类型。

每个类有一个隐式构造函数,允许隐式地将__int32赋值给Int32类型。这工作得很好,直到有一个函数重载同时接受Int32Boolean.

当具有重载__int32bool的函数编译并工作时,具有重载类的函数会导致对重载函数的歧义调用。.

我的问题:是否有一种方法可以正确地解决这个问题,这样我就可以实现基本类型的包装器类,而不会出现重载解析问题,也不需要调用者进行显式强制转换?

class Boolean
{
private:
bool _Value = false;
public:
Boolean(bool value)
{
_Value = value;
}
};
class Int32
{
private:
__int32 _Value = 0;
public:
Int32(__int32 value)
{
_Value = value;
}
};
void AmbiguousFunc(const Int32 &x) { }
void AmbiguousFunc(const Boolean &x) { }
void NotAmbiguous(__int32 x) { }
void NotAmbiguous(bool x) { }
int main(int argc, char *argv[])
{
AmbiguousFunc(123);         // Ambiguous calls to overloaded function
AmbiguousFunc((Int32)123);  // works
NotAmbiguous(123);
return 0;
}

问题是,给定AmbiguousFunc(123);,123可以转换为bool(标准转换),然后转换为Boolean(用户自定义转换);与用户自定义的从123Int32的排序相同,则AmbiguousFunc(const Int32 &)AmbiguousFunc(const Boolean &)之间的调用是二义性的。

您可以将构造函数更改为模板,并限制它们仅接受适当的类型。

class Boolean
{
private:
bool _Value = false;
public:
// accept bools only; no __int32s
template <typename T, std::enable_if_t<std::is_same_v<T, bool>>* = nullptr>
Boolean(T value)
{
_Value = value;
}
};
class Int32
{
private:
__int32 _Value = 0;
public:
// accept __int32s only; no bools
template <typename T, std::enable_if_t<std::is_same_v<T, __int32>>* = nullptr>
Int32(T value)
{
_Value = value;
}
};

生活

相关内容

  • 没有找到相关文章

最新更新