【问题标题】:Create a functor from a MPL metafunction class从 MPL 元函数类创建函子
【发布时间】:2011-11-23 13:55:41
【问题描述】:

我一直在寻找 MPL 中的一个类,它将从一个表现良好的 MPL 元函数类创建一个函数对象。我手动完成了这个实现:

  template <class Lambda, class Result>
  struct functor
  {
      typedef Result result_type;

      template <typename Type>
      Result operator()( Type ) 
           { return Lambda::template apply<Result>::type::value; }
  };

一个使用示例是

  Foo foo;
  return functor< boost::mpl::always<boost::mpl::int_<5> >, int >( foo );

作为写作return 5的美化版本。

由于这个操作看起来很基本,我原以为 MPL 中已经有一个类似的类,但是搜索文档并没有为我找到任何东西。我错过了什么吗?

【问题讨论】:

  • 在阅读澄清的 cmets 后,Boost Fusion 可能就是您所寻找的。它做到了这一点:元和运行时编程的融合(请注意,Fusion 带有它自己的序列(和派生)概念。但是,MPL 序列被改编

标签: c++ boost boost-mpl


【解决方案1】:

我认为 Boost.MPL 中没有这样的类,因为它们只专注于编译时计算。这种包装器宁愿放在Boost.Fusion 中,其目的是在编译和运行时实体之间建立链接,但我没有找到任何东西。

我认为您将不得不使用自己的实现,乍一看似乎没问题(尽管我宁愿使用mpl::apply 来处理占位符表达式)。我认为您也可以省略返回类型,因为它可以从 lambda 推导出来。

这是使用apply 并从 lambda 推导出返回类型的替代实现:

template < typename Lambda >
struct functor
{
    template < typename Type >
    typename boost::mpl::apply< Lambda, Type >::type::value_type 
    operator()( Type ) 
    { 
        return boost::mpl::apply< Lambda, Type >::type::value; 
    }
};

// sample use:
int main()
{
    boost::mpl::int_<5> five;
    std::cout << functor< boost::mpl::identity< boost::mpl::_ > >()( five );
    // Output "5"
}

【讨论】:

猜你喜欢
  • 2017-11-24
  • 1970-01-01
  • 2011-06-14
  • 1970-01-01
  • 2018-10-15
  • 2017-02-04
  • 2020-06-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多