我一直在寻找 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/