0

この例でテンプレート ソリューションまたは何かを使用する方法はありますか? 現在、クラス C の parse() 関数の戻り値の型は、使用されている型によって異なります。

私はクラスAを持っています:

class A {

    std::vector<SomeClass*> parseData(const char *data);
}

そして、私はクラスBを持っています

class B {

    std::string parseData(const char *data); }

次に、クラス C で call right クラス メソッドを呼び出したいと思います。

class C {

    std::vector<SomeClass*> parse { A::parseData(_data); }
    std::string parse { B::parseData(_data); }

    void setData(std:string data) { _data = data; }

    std:string _data;
}

int main()
{
    C c1.setData(data_with_many_strings_and_numbers);
    C c2.setData(data_with_one_string);
    std::vector<SomeClass*> someClassData = c1.parse();
    std:string someString = c2.parse();
}
4

2 に答える 2

0

それらは異なるタスクを実行するので、それらの呼び出しに対して2つの別々のメソッドがあるとよいでしょう。この実装をある種のものに変更することを検討してください。

class C {

    std::vector<SomeClass*> parseVector { A::parseData(_data); }
    std::string parseString { B::parseData(_data); }

    void setData(std:string data) { _data = data; }

    std:string _data;
}

int main()
{
    C c1.setData(data_with_many_strings_and_numbers);
    C c2.setData(data_with_one_string);
    std::vector<SomeClass*> someClassData = c1.parseVector();
    std:string someString = c2.parseString();
}
于 2013-03-17T19:44:44.090 に答える
0

いいえ、やろうとしていることを、やろうとしているやり方でやることはできません。解析は基本的にランタイムの問題であり、その場で何を返すかを決めることはできません。直接、または読み取ったタイプを通知できるラッパーを介して、何らかの方法でタイプを返すサブタイプを作成する必要があります。その後、パーサーを一連の責任に登録できます。この一連の責任に登録すると、テンプレート化された関数呼び出しの恩恵を受ける可能性がありますが、静的型をポリモーフィズしてそれらの型で同じ名前付き関数を呼び出すよりも、型非表示のカプセル化器でそれらをラップする必要があります (おそらく時間の無駄です...やむを得ない場合を除き、抽象ベースをサブタイプするだけでもかまいません)。

いずれにしても、今とはまったく違うアプローチが必要です。

于 2013-03-17T19:46:38.213 に答える