在 C++ 中,我想为类型列表中指定的每个类型创建一个新元素 (shared_ptr)(并将生成的指针添加到 vector 中)。在伪代码中,这应该类似于:
vector< shared_ptr< baseT > > v;
foreach(type T: <derivedT1, derivedT2, ..., derivedTn>)
{
v.emplace_back(make_shared< T >());
}
是否有使用 std
或 boost
(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/