1

我一直在寻找 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 中已经有一个类似的类,但是搜索文档对我没有任何帮助。我错过了什么吗?

4

1 回答 1

1

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

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

apply这是使用lambda 并从 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"
}
于 2011-11-23T14:13:14.167 回答