-1

テンプレートの参照渡し変換/型キャスト演算子 (const なし) を指定すると、次のことが可能になります。

class TestA
{
    public:

        //Needs to be a const return
        template<typename TemplateItem>
        operator TemplateItem&() const {TemplateItem A; A = 10; return A;}
};

int main()
{
    TestA A;
    {
        int N;
        N = A;
        printf("%d!\n",N);
    }
    {
        float N;
        N = A;
        printf("%f!\n",N);
    }
    return 0;
}

そして、次のコードが与えられます(const付き):

class TestA
{
    public:

        //Produces error
        template<typename TemplateItem>
        operator const TemplateItem&() const {TemplateItem A; A = 10; return A;}
};

次のエラーが発生します。

エラー: 代入で 'TestA' を 'int' に
変換できません エラー: 代入で 'TestA' を 'float' に変換できません

質問

変換/型キャスト演算子がテンプレート型の const 参照渡しを返すようにするにはどうすればよいですか?

環境

ほとんどの人が入ってきて、「何にも変換できない」とびっくりする前に、コンテキストが必要です。上記のコードは疑似コードです。テンプレート化された変換関数の落とし穴ではなく、可能な const 参照の戻りにのみ関心があります。しかし、それが何のためにあるのか疑問に思っているなら、それは比較的単純です:

TemplateClass -> 変換 (バイトデータに変換) -> ファイル
TemplateClass ← 変換 (バイトデータから元に戻す) ← ファイル

ユーザーは、何を取得しているのかを知っているか、自動化されていることが期待されます (IE の保存/読み込み状態)。はい、ポインタを使用して任意の型をバイトデータに変換するテンプレートの普遍的な方法があります。

そして、この種のことをすでに行っているstdについて私に拍手を与えないでください。変換プロセスは、より複雑なクラス ライブラリのセットアップの一部です。

私はプログラマーです。私を信じて。C++ は私を信頼し、間違いを許してくれます。私が学ぶ唯一の方法。

4

1 に答える 1

2

まず、スコープ外になったローカル変数への参照 (const かどうか) を返すため、変換演算子は既に未定義の動作です。UB を誘発しない値で返すように変換演算子を変更すると、正常に動作するはずです。

編集: (変換演算子に関する誤った情報を削除しました)。

しかし、本当に自分のクラス型を何かに変換できるようにしたいのですか? コードを保守していて、予期しない型に自動的に変換されると、将来多くの頭痛の種になるようです。

もう 1 つの可能な実装はas、基本的に変換演算子が実行したいことを行うテンプレート メソッドを作成し、それを のように呼び出すことですobj.as<int>()

于 2011-09-30T15:23:52.320 に答える