私はstd::generateを初めて使用し、それを使用してベクトルを初期化するプログラムを構築しようとしました。しかし、それは私の期待とは異なった振る舞いをしています。
私は抽象的な基本クラスを持っています:
template <typename G>
class RandomAllele {
public:
RandomAllele() { /* empty */ }
virtual ~RandomAllele() { /* empty */ }
virtual G operator()() const = 0;
};
これは(たとえば)によって拡張されます:
class RandomInt : public RandomAllele<int> {
public:
RandomInt(int max) : max_(max) {}
int operator()() const { return rand() % max_; }
private:
int max_;
};
継承クラスのインスタンスをポインタでファクトリクラスに渡し、それをstd :: generate:の3番目の引数として使用します。
template<typename G, typename F>
class IndividualFactory {
public:
IndividualFactory(int length, const RandomAllele<G> *random_allele)
: length_(length), random_allele_(random_allele) { /* empty */ }
individual_type *generate_random() const {
std::vector<G> *chromosome = new std::vector<G>(length_);
std::generate(chromosome->begin(), chromosome->end(), *random_allele_); */
return new individual_type(chromosome);
}
private:
int length_;
RandomAllele<G> *random_allele_;
};
RandomAlleleは抽象クラスであるため、インスタンス化できないというエラーが表示されます。ポインタがすでに存在するのに、なぜgenerateはそれをインスタンス化する必要があるのですか?また、継承クラスRandomIntの代わりに基本クラスを使用しようとしているのはなぜですか?
std :: generateを:に置き換えると、これは正常に機能します。
for(auto iter = chromosome->begin(); iter != chromosome->end(); ++iter)
*iter = (*random_allele_)();
しかし、なぜそれが奇妙に動作するのかを理解したいので、これを行う方法がある場合は、generateを使用したいと思います。
御時間ありがとうございます、
リス