3

これで寝てみましたが、それでも負けました。どの検索語句を使用すればよいかさえわかりません。誰かが私を正しい方向に向けることができますか?

私はこのようなものが欲しい:

template < typename Interim >
class phase_one
{
    Interim do_something () ;
}
template < typename Output, typename Interim >
class phase_two
{
    Output do_something_more ( Interim ) ;
}
template < Output >
class main_class
{
    phase_one m_first;
    phase_two m_second;

    Output do_main ( )
    {
        return m_second.dosomething_more( m_first.do_something() );
    }
}

疑似コードから、両方のテンプレート クラスを保存して呼び出す必要があることがわかります。ただし、Interim型は実行時までわかりません。私が事前に知っている唯一のことは、Outputタイプと、両方のフェーズに共通のタイプがあるという事実です。

これらのオブジェクトをどのように保管し、どのように連携させることができますか? これは型消去が必要なインスタンスですか?

編集: 私の作成の別のものにphase_oneなります。に基づいて選択する必要があります。そして、これはすべて、ファイルの BOM を読み取った後、実行時に行われます。std::codecvtphase_twocodecvtphase_twophase_one

ブーストまたはc ++ 11なしでこれを行うことをお勧めします。これを行うためのブースト方法がある場合は、それを見たいと思いますが、同様の方法/テンプレートを自分で作成する必要がある場合でも、ブースト ライブラリがなくても実装できる必要があります。

4

3 に答える 3

0

非 C++ ソリューションを提案したい。

このシナリオでは、Interim の可能なタイプを知る必要があると言いたいです。

実行時に型を取得できる C# や Java のような言語であっても、考えられる型セットを明確にする必要があります。

@ubi answereに基づいて、それを処理するスイッチを作成します。すべてのタイプを処理するために大きなスイッチケースを作成するコストが高い場合は、可能な暫定タイプリストからコードを生成するスクリプトツールを作成することをお勧めしますプロジェクトをコンパイルします。

于 2013-07-18T10:04:57.863 に答える
0

ブーストが必要ないことはわかっていますが、 boost::variantがおそらくここで役立ちます。変数が多くの可能なタイプの1つを格納できる「ユニオン」タイプを定義できます。次に、バリアントに実際に格納されているデータのタイプに応じて実行時に決定される関数 (「ビジター」と呼ばれる) を適用できます。すぐに扱いにくくなることがわかりましたが、役立つかもしれません。

yourm_firstを として定義してから、 yourを「ビジター」クラスとしてboost::variant宣言することを描いているので、行は次のようになります。phase_one::do_somethingoperator()

Output do_main ( )
{
    return m_second.dosomething_more(
       boost::apply_visitor( phase_one(), m_first ) );
}

多分それはあなたが探しているものではありませんが、考慮すべきものです.

于 2013-07-18T16:16:20.647 に答える