我是 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 的第三个参数:
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。
谢谢你的时间,
里斯