【问题标题】:How to declare a member variable using Boost.Hana如何使用 Boost.Hana 声明成员变量
【发布时间】: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&lt;T&gt; 类型的对象,而是 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


【解决方案1】:

答案是hana::tuple_t 是一个元组的别名,其中所有成员都包含在hana::type 中。

cmets 中链接的答案是一个很好的解决方案,但这里有一个示例,它与 MPL 样式模板元编程相距甚远。它更简洁,并没有隐藏它依赖于默认构造的事实。

#include <boost/hana.hpp>

namespace hana = boost::hana;

template <typename T>
struct Bar { void apply() const { } };

template <typename ...T>
struct Foo
{
  void apply()
  {
    hana::for_each(
      hana::tuple<Bar<T>...>{},
      [](auto const& bar)
      {
        bar.apply();
      });
  }
};

int main()
{
  Foo<int, float, char>{}.apply();
}

【讨论】:

    猜你喜欢
    • 2011-04-04
    • 2010-10-24
    • 1970-01-01
    • 2010-12-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-08-04
    • 1970-01-01
    相关资源
    最近更新 更多