0

次のような単純なプログラムがある場合:-

class Program
{
    public:
       my_func(void)                 \\ What return type do I use here??
       {
            switch (i)               \\ assume i comes from somewhere...
            {
                case 1:
                {
                    Glue g;
                    g.init();
                    return g;
                }
                case 2:
                {
                    Wood w;
                    w.init();
                    return w;
                }
                ....
            }
        }
}

この関数の戻り値の型を、いずれかのスイッチ ケースで作成されたオブジェクトに設定する方法を教えてもらえますか? また、時間の制約により、オブジェクトの作成に new/delete を使用できないか、void* ptr を返すだけです。スイッチで作成されたオブジェクトは十分に大きいので、それぞれの場合にそれらを作成し、範囲外にならずにそれらへの参照を返すことは可能ですか?

4

4 に答える 4

3

最初の問題に対する 1 つの解決策は明らかです。階層を取得して、基本型を返します。別の解決策は、 Boost.Variantのような Variant 型を使用することです。次に、戻り値の型を次のように定義できますboost::variant<Wood, Glue>。これは、階層が不自然な場合や複雑になる場合に適した方法です。一方、階層アプローチは実行が簡単で、一部の人々は Variant クラスに付属するテンプレート マジックを避けません。

独自のバリアント型を展開することは非常に複雑な作業になる可能性があり、ライブラリを好むことに注意してください。

2 番目の質問は、要約すると、より優れたコンパイラを入手することです。clang と gcc 4.8 の最近のバージョンでは、両方の機能について警告が報告されます。

于 2013-04-29T17:05:55.893 に答える
0

最初のプログラム テンプレートのコンセプトが正しく適用されていない

関数を呼び出すときに T を置き換える型を渡す必要があるためです。

コンパイラでコンパイルした2番目のプログラムで、両方の関数に対して警告が表示されます

于 2013-04-29T16:26:45.047 に答える