【发布时间】:2019-01-21 19:28:43
【问题描述】:
我以前使用过一些 Boost.MPL 库,现在我正在尝试更多地了解 Boost.Hana。我似乎完全误解了图书馆。
我想用任意数量的模板参数实例化一个对象,根据这些类型创建一个对象元组作为成员,然后迭代或以其他方式使用该元组。
我遇到的是,所有示例和文档都只涉及在函数中创建元组,而不是实际创建可以用于类成员的类型。
这是我正在尝试做的一个简化示例:
template<typename T>
struct Bar { void apply() const {} };
template<typename ...T>
struct Foo
{
template<typename _T>
using Bar = Bar<_T>;
static constexpr auto tuple = boost::hana::transform(
boost::hana::tuple_t<T...>,
boost::hana::template_<Bar>);
void apply()
{
boost::hana::for_each(
tuple,
[](auto const& bar)
{
bar.apply();
});
}
};
我得到的错误:
error: 'const struct boost::hana::type_impl<Bar<int> >::_' has no member named 'apply'
所以元组不包含 Bar<T> 类型的对象,而是 boost::hana “表示类型的对象”类型的对象。
我可以像这样制作一个元组:
boost::hana::tuple<T...> m_tuple;
我已经非常接近我想要的了,但是如何将 boost::hana::transform 集成到 m_tuple 的声明中?
我不明白如何从boost::hana::transform 返回的变量转换为我可以用于类成员的类型。这甚至可能吗?或者我应该看看 Boost.MPL?
我确实看到了a presentation given at cppnow 2017,其中有一个从 MPL 迁移到 Hana 的示例:
MPL:
using Ptrs = mpl::transform<Types, std::add_pointer<mpl::_1>>::type;
// -> mpl::vector<int*, void*, char*, long*, void*>
哈娜:
auto Ptrs = hana::transform(Types, [](auto t) {
return hana::traits::add_pointer(t);
});
// -> hana::tuple_t<int*, void*, char*, long*, void*>
但是 MPL 版本给了我一个可以用来制作类成员的类型,而 Hana 版本给了我一个不能成为类成员的变量,我似乎不能用来制作类成员一种类型。
【问题讨论】:
-
感谢您的帮助。现在我回到文档,我看到这在几个地方都有解释,但我没有抓住它。我想我被 MPL 和 Hana 的比较搞糊涂了。也许如果它包含“使用 decltype(...)::type 解包结果”步骤,它会更加一对一。
-
@llonesmiz,你的评论给了我需要的推动力。如果您发布答案,我会接受,或者我想这可能会被标记为重复。
标签: c++ c++14 boost-hana