从MPL元函数类创建一个仿函数

时间:2011-11-23 13:55:42

标签: c++ boost boost-mpl

我一直在寻找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中已经有类似的类,但搜索文档并没有给我带来任何好处。我错过了什么吗?

1 个答案:

答案 0 :(得分: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"
}