c++ - 基于 CRTP 的多态元素的异构集合
问题描述
让我们承认,出于任何正当理由,我们无法使用动态(虚拟)多态性。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 的异构集合?
解决方案
最简单的解决方案(但可能不是最优雅的)是使用std::tuple
. 以下示例运行良好:
auto coll = std::make_tuple(d1, d2);
std::apply([&](auto & ... el) {
(..., el.sayBaz());
}, coll);
迭代不是直截了当的,它具有所有优点和缺点std::tuple
(主要是没有运行时插入),但至少它有效!
推荐阅读
- class - 如何将代数 cpos 编码为 Isabelle 语言环境
- azure-devops - 是否可以进行跨组织的 Pull Request 提及?
- cassandra - What are the advantages of using "new style" Cassandra paging state over "old style" token functions?
- tableau-api - Tableau add trend line to discrete data?
- reactjs - React/Redux 应用程序中的导入问题
- javascript - 如何使用最新的 Mapbox-gl-js 版本避免透明度重叠?
- python - 在python中替换字典的值
- php - Looking for Laravel php developer to resolve updating function with image uploading its not working
- python - Tensorflow 确认权重已冻结
- ios - 打开 iOS 设置应用程序(顶级 - 不是应用程序设置页面的深层链接) - iOS 12/13