c++ - 从 MPL 元函数类创建仿函数

标签 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 中已经有一个类似的类,但搜索文档对我来说没有任何结果。我错过了什么吗?

最佳答案

我认为 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"
}

关于c++ - 从 MPL 元函数类创建仿函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8243393/

相关文章:

c++ - Boost::Mpi 是否支持并行IO

c++ - OpenCV findContours,如何检查两侧的颜色

c++ - 未定义对 'function' 的引用——链接器问题?

c++ - 如果我使用 Glew,是否需要手动处理所有这些代码?

C++ 模块化框架(如 OSGi)?

c++ - boost::filtered_range 值的引用类型

c++ - std::variant 是否提供类似于 boost::variant<>::types 的功能?

c++ - 我如何实现嵌套的 boost::mpl::fold

c++ - 公共(public)和私有(private)领域的内存分配 - GCC方式

c++ - 无法使用 booster、C++、graphlab 解析 pm 格式的日期时间