7

エビデンスの反復可能なリストを取得してモデルを作成するメソッド generate() を持つインターフェース ModelGenerator が必要です。STL疑似ダックタイピング反復子イディオムの使用...

template<class Model>
class ModelGenerator {
  public:
    template<class Iterator>
    virtual bool generate(Iterator begin, Iterator end, Model& model) = 0;
};

ただし、仮想関数はテンプレート化できません。したがって、クラス全体をテンプレート化する必要があります。

template<class Model, class Iterator>
class ModelGenerator {
  public:
    virtual bool generate(Iterator begin, Iterator end, Model& model) = 0;
};

理想的には、私がやりたいことは次のようなものです...

template<class Model, class Evidence>
class ModelGenerator {
  public:
    virtual bool generate(iterator<Evidence>& begin,
                          iterator<Evidence>& end,
                          Model& model) = 0;
};

しかし、反復子が継承するようなインターフェースはありません。(クラス std::iterator には一連の typedef のみが含まれ、メソッドは含まれません。)

私が考えられる唯一の方法は、ModelGenerator にメソッド addEvidence() を与えて、generate() を呼び出す前にそれらを 1 つずつ追加することですが、ModelGenerator に状態を与える必要がありますが、これは少し面倒です。

任意の STL コンテナーを使用する仮想メソッドを作成するにはどうすればよいですか?

4

2 に答える 2

5

が必要なようですany_iterator。これは、型消去を実行して実際のイテレーターの実装から隔離するイテレーターです。

Adobe には次の実装がありany_iteratorます: http://stlab.adobe.com/classadobe_1_1any__iterator.html

Boost には次の実装がありany_rangeます: http://www.boost.org/doc/libs/1_49_0/libs/range/doc/html/range/reference/ranges/any_range.html

于 2012-05-25T23:10:02.657 に答える
0

この目的のために、仮想メソッドの代わりにテンプレートの特殊化を使用することを検討できます。私が理解していることから、一意の Evidence クラス、多数の異なる Model クラスがあり、一連の Evidence から選択した Model を生成するジェネリック ファクトリを作成したいと考えています。

#include <vector>
#include <iostream>

struct Model1 { };
struct Model2 { };
struct Evidence { };

template<class Model>
struct ModelGenerator;

template<>
struct ModelGenerator<Model1>
{
    typedef Model1 model_type;

    template<class Iterator>
    model_type generate(Iterator begin, Iterator end)
    {
        std::cout << "Generate Model1\n";
        return model_type();
    }
};

template<>
struct ModelGenerator<Model2>
{
    typedef Model2 model_type;

    template<class Iterator>
    model_type generate(Iterator begin, Iterator end)
    {
        std::cout << "Generate Model2\n";
        return model_type();
    }
};

template<class Model, class Iterator>
Model make_model(Iterator begin, Iterator end)
{
    ModelGenerator<Model> gen;
    return gen.generate(begin, end);
}

次のように使用できます。

int main()
{
    std::vector<Evidence> v;

    Model1 m1 = make_model<Model1>(v.begin(), v.end());
    Model2 m2 = make_model<Model2>(v.begin(), v.end());
}
于 2012-05-26T03:51:36.830 に答える