如何获得与内置的用户定义类型相同的转换处理,例如:
float a = 5.4;
std::string s = a;//error, no conversion avaible
int x = a;//warning, possible data loss
int y = (int)a;//fine
int z = static_cast<int>a;//fine
float b = c;//warning, possible data loss
现在说我有自己的 Int 和 Float 类,我该如何获得相同的错误和警告?
class Int
{
public:
int value;
Int(int v);
...
};
class Float
{
public:
float value;
Float(float v);
...
};
Int c = 10;
Float a = 5.5;
std::string s = a;
Int x = a;
Int y = (Int)a;
Int z = static_cast<Int>a;
Float b = c;
我知道创建重载的强制转换运算符和使用构造函数,但是我不知道如何使它正确地用于隐式和显式强制转换,例如考虑。如果我没有在这些方法中添加显式强制转换,那么我会在编译时收到警告,但在调用时不会收到警告,如果我这样做了,那么我不会在类代码中收到错误,但我仍然没有得到使用时发出警告。
我猜有某种方法可以将强制转换运算符标记为显式,以便在它尝试隐式强制转换时生成警告,而不是显式(C-Style 或 static_cast)强制转换)
编辑:好的,我想我可以在这样的情况下得到它,在这种情况下,所有有问题的类型都是完全已知的,但是当一个或两个都是模板并且两种类型都映射到内置类型时呢?
template<typename T> class Vector2
{
public:
T x, y;
Vector2():x(0),y(0){}
Vector2(T x, T y):x(x),y(y){}
//Works as expected, warning if adding T and T2 is unsafe, or error if
//incompatible*/
template<typename T2>Vector2<T>& operator += (const Vector2<T2> &v);
//Also works as desired
Vector2<T>& operator *= (T s);
//allows the conversion, but always generates warnings if
//T and T2 would, even if this constructor is used by an explicit
//case. How can I suppress the warnings for the explicit cast, but
//not for implicit casts?
template<typename T2>Vector2(const Vector2<T2> &v);//uses implicit conversion form T2 to T
};
从say Vector2 到 Vector2 的隐式转换按预期工作,但是从say Vector2 到 Vector2 的转换总是会导致(2,一个用于 x,一个用于 y)警告,即使使用了显式 C 样式或 static_cast 也是如此。我想保留隐式转换的警告,而不是显式转换的警告。
我知道我可以解决这个问题,创建一个特殊的 T vector_cast(T2) 类型方法,该方法在内部对每个元素使用显式强制转换,但我宁愿能够使用 C-Style 和 static_casts