「int」、「long」などの型の代入演算子をオーバーロードしたい。つまり、次のようなコードを使用したい:
class CX {
private:
int data;
...
};
CX obj;
int k;
k = obj; // k should get the value of obj.data
どうやら代入演算子はフレンド関数にはなり得ません。上記を達成するにはどうすればよいですか?
単純なものが欠けているかもしれませんが、これを行うための構文/方法がわかりません。
また、1 つの IMP 制限 - get/set メソッドは使用できません :: リリース コードでは、CX を int または long (必要に応じて) として型定義しますが、DEBUG コードでは、それをクラスとして使用します (自動何千もの場所で型チェックを行います)。コードは共通である必要があります。その理由は、CX をクラスにすると、コンパイラ (少なくとも使用しているバージョン) がすべての操作を最適化できないためです。
問題の 1 つは、これを通過させたくないということです。
CX x; long p; p = x;
以下のキャストソリューションは、ロング/ショートなどのコードも暗黙的に通過させると思います。(そうでない場合は、まさに私が探しているものです!)。
関連するメモとして、David の質問に答えます。私がリファクタリングしたい理由は、CX を 32 ビットまたは 64 ビットに切り替える機能が必要だからです。そのため、暗黙的な変換を禁止し、コンパイル時にそれらをキャッチしたいと考えています。今、逆 - (許可されていません
CX x = some_64_bit_int;
しかし許す
CX x = some_32_bit_int;
デフォルトでコンパイル時にアサートするテンプレート化された = 演算子を使用して達成しましたが、目的の型に合わせてオーバーロードしました。
これが悪い設計であると感じた場合、または他の代替案を試す必要がある場合 - 私が必要な理由は次のとおりです。何千行ものレガシーコードがあり、何かが「int」に型定義されているだけです。
typedef int CX;
次のような課題があちこちにあります。
CX x; int k; k = x; // Writing the simplified relevant code here
CXをクラスに変更するプロジェクトに取り組んでいます。最初のフェーズでは、すべてのコンパイル エラー (CX をクラスにする際に発生) を修正し、コードへの変更をできるだけ少なくします。