組み込みと同じユーザー定義型のキャストの処理を取得するにはどうすればよいですか。たとえば、次のようになります。
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 スタイルまたは 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
};
Vector2 から Vector2 への暗黙的なキャストは期待どおりに機能しますが、Vector2 から Vector2 へのキャストは、明示的な C スタイルまたは static_cast が使用された場合でも、常に (2、x に 1 つ、y に 1 つ) の警告を引き起こします。明示的なキャストではなく、暗黙的なキャストの警告を保持したい。
内部で各要素の明示的なキャストを使用する特別な T vector_cast(T2) 型メソッドを作成することで、これを回避できることはわかっていますが、むしろ C-Style と static_casts を使用できるようにしたいと思います