c++ - 如何为类型列表中的每种类型创建一个元素并将其添加到 C++ 中的 vector 中?

标签 c++ templates boost-mpl boost-fusion typelist

在 C++ 中,我想为类型列表中指定的每个类型创建一个新元素 (shared_ptr)(并将生成的指针添加到 vector 中)。在伪代码中,这应该类似于:

vector< shared_ptr< baseT > > v;
foreach(type T: <derivedT1, derivedT2, ..., derivedTn>)
{
    v.emplace_back(make_shared< T >());
}

是否有使用 stdboost(MPL、Fusion、?)的简洁解决方案?

一些研究:

  • 我在 type visitor over typelist in c++ . 不幸的是,我目前无法想出如何用上面示例中的创建代码替换该帖子中的 sizeof 以及如何封装所需的定义以实现简洁的使用。
  • 在 boost MPL 和 Fusion 中,我还找不到合适的迭代算法只在一个类型上运行(没有该类型的实例)。

最佳答案

[全面披露:我开发 Hana]

我会使用 Hana 来回答库,它还没有在 Boost 中,但很快就会被提议进行正式审查。 Hana 在统一的界面下合并了 MPL 和 Fusion 的功能。

#include <boost/hana.hpp>
#include <memory>
#include <vector>


struct baseT { };
struct derivedT1 : baseT { };
struct derivedT2 : baseT { };
struct derivedT3 : baseT { };

int main() {
    std::vector<std::shared_ptr<baseT>> v;
    auto types = hana::tuple_t<derivedT1, derivedT2, derivedT3>;
    hana::for_each(types, [&](auto t) {
        // decltype(t)::type is derivedTk
        using T = typename decltype(t)::type;
        v.emplace_back(std::make_shared<T>());
    });
}

关于c++ - 如何为类型列表中的每种类型创建一个元素并将其添加到 C++ 中的 vector 中?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28764085/

相关文章:

c++ - 使 boost::fusion::result_of::as_set<> 's instance doesn' t 调用其元素的构造函数

c++ - Loki序列可以有多少个元素?

C++ OpenGL奇怪的正交相机

c++ - 用替代运算符提振 spirit '|' 失败!当有两个可能的规则时

c++ - cmd.exe 中的控制台输出,以及通过 C++ 的 powershell.exe

c++ - 模板类不同的返回类型取决于类参数

templates - D 中是否可以使用可变参数混合模板?

c++ - 简单 CRTP 案例中没有名为 "XXX"的成员

c++ - 为什么使用 LLVM 时 std::ifstream "break"std::getline 的缓冲?

c++ - boost::mpl::vector - 获取类型的基本偏移量