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