C++ 如何使用Boost.Hana声明成员变量

C++ 如何使用Boost.Hana声明成员变量,c++,c++14,boost-hana,C++,C++14,Boost Hana,我以前使用过Boost.MPL库的一部分,现在我想更多地了解Boost.Hana。我似乎对图书馆完全误解了 我想用任意数量的模板参数实例化一个对象,创建一个基于这些类型的对象元组作为成员,然后迭代或稍后使用该元组 我遇到的是,所有的示例和文档都只涉及在函数中生成元组,而不是实际生成一个可以用于类成员的类型 这是我试图做的一个简化示例: template<typename T> struct Bar { void apply() const {} }; template<typ

我以前使用过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();
         });
   }
};
Hana

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*>
自动Ptrs=hana::转换(类型,[](自动t){ 返回hana::traits::add_指针(t); }); //->hana::元组 但是MPL版本给了我一个类型,我可以用它来创建类成员,而Hana版本给了我一个变量,这个变量不能是类成员,我似乎不能用它来创建类型的类成员。

答案是,这是一个元组的别名,其中所有成员都被包装在其中

注释中链接的答案是一个很好的解决方案,但这里有一个示例,它进一步远离了MPL样式的模板元编程。它更简洁,并且不隐藏它依赖于默认构造的事实

#包括
名称空间hana=boost::hana;
模板
结构条{void apply()常量{};
模板
结构Foo
{
无效应用()
{
哈娜:每个人(
hana::元组{},
[](自动常量和条形图)
{
bar.apply();
});
}
};
int main()
{
Foo{}.apply();
}

谢谢您的帮助。现在我回到文档中,我看到有几个地方对此进行了解释,但我没有理解。我想我被MPL和Hana的比较弄糊涂了。也许如果它包含“用decltype(…)::type展开结果”步骤,它会更像是一对一。@llonesmiz,你的评论给了我所需要的推动力。如果你发布一个答案,我会接受,或者我想这可能会被标记为一个副本。
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*>