让我们承认,出于任何合理的原因,动态(虚拟)多态性对我们来说都是不可用的。CRTP提供高效的静态多态性,如下所示:
template<typename derived_t>
struct Base {
void sayFoo() { std::cout << "foo" << std::endl; }
void sayBaz() { std::cout << impl().bazWord() << std::endl; }
derived_t& impl() { return static_cast<derived_t&>(*this); }
};
struct derived1 : public Base<derived1> {
std::string bazWord() { return "baz1"; }
};
struct derived2 : public Base<derived2> {
std::string bazWord() { return "baz2"; }
};
实例化很容易完成,如下所示:
derived1 d1;
d1.sayFoo(); // says "foo"
d1.sayBaz(); // says "baz1"
derived2 d2;
d1.sayFoo(); // says "foo"
d2.sayBaz(); // says "baz2"
现在,我想将这些元素保存在一个异构集合中,如下所示:
std::vector<Base<??>> v;
v.push_back(d1);
v.push_back(d2);
std::for_each(v.begin(), v.end(), [](auto& elem) { elem.sayBaz(); })
这样做会给我带来一个错误,显然是因为无法定义基类型。
有没有一种简单的方法来实现基于CRTP的异构收集?