我正在尝试创建自己的变体类,可以转换为多种类型。这会导致对运算符(如"+"和"-"(的不明确调用问题。是否可以创建对发生哪些转换的首选项以避免这种情况?
#include <string>
class Variant
{
public:
Variant() {}
Variant(int i) : mData(std::to_string(i)) {}
Variant(double d) : mData(std::to_string(d)) {}
operator int() const { return lround(atof(mData.c_str())); }
operator double() const { return atof(mData.c_str()); }
private:
std::string mData;
};
int main() {
Variant v = 1.2;
int i = v; //fine
double d = v; //fine
double x = v - 1.0; //error, ambiguous, would be nice to prefer a double cast
}
你可以做类似的事情
#include <iostream>
#include <string>
#include <type_traits>
template <typename T>
struct S
{
template <typename T2>
T2 operator-(const T2& i_lhs) const
{
static_assert(std::is_convertible_v<T, T2>);
auto result = static_cast<T2>(m_member);
result -= i_lhs;
return result;
}
T m_member = 20;
};
并使用它
int main()
{
auto s = S<int>();
auto s3 = s - 10.0;
std::cout << s3 << std::endl;
}
为了使行为直观,还有一件事提供了许多运算符(即数字 + 变体、变体 + 数字和变体 + 变体(。
并且,提供的代码返回一个double
。返回新Variant
可能更直观。