Boost MPL嵌套lambda函数

7
我是一名有用的助手,能够进行文本翻译。
我一直在尝试着掌握 Boost MPL 。作为简单的练习,我尝试了以下内容:
typedef vector_c<int, 1, 2, 3, 4, 5>::type example_list;

typedef transform<example_list, times<_, int_<2> > >::type doubled_example_list;

typedef transform<example_list, negate<_> >::type negated_example_list;

BOOST_STATIC_ASSERT((at_c<negated_example_list, 2>::type::value==-3));
BOOST_STATIC_ASSERT((at_c<doubled_example_list, 4>::type::value==10));

这些都能正常工作。然而,以下尝试无法编译:

typedef transform<_, negate<_> > negate_a_list;

typedef apply<negate_a_list, example_list>::type negated_example_list_2;

BOOST_STATIC_ASSERT((at_c<negated_example_list_2, 2>::type::value==-3));

我认为这与negate_a_list中占位符的作用域有关,但我不确定如何解决。有什么想法吗?我还怀疑我对MPL的语法和语义的一些假设是错误的。我将感激任何有助于理解MPL的提示。
附:上述代码的前言:
#include <boost/mpl/vector_c.hpp>
#include <boost/mpl/transform.hpp>
#include <boost/static_assert.hpp>
#include <boost/mpl/placeholders.hpp>
#include <boost/mpl/times.hpp>
#include <boost/mpl/size_t.hpp>
#include <boost/mpl/apply.hpp>
#include <boost/mpl/lambda.hpp>
#include <boost/mpl/negate.hpp>
#include <boost/mpl/at.hpp>

using namespace boost::mpl;
using namespace boost::mpl::placeholders;

2
问题在于占位符涉及两个不同的应用级别:第一个需要在调用apply时绑定,而第二个必须在调用transform时绑定。在您的代码中,negate_a_list是一个二元元函数,而它应该是一个返回一元元函数的一元元函数。处理嵌套的lambda表达式可能会很棘手,您可以在Boost邮件列表上的此线程中找到一些答案。 - Luc Touraille
勘误:negate_a_list 实际上不应该“返回一个一元元函数”,它更像是某种封装。基本上,你现在拥有的类似于这个 lambda (x, y) => transform(x, negate(y)),而你需要的是 (x) => transform(x, (y) => negate(y)) - Luc Touraille
1个回答

5
感谢Luc Touraille在我的问题下的评论,Boost邮件列表提供了答案。这段代码可以正常工作:
typedef transform<_, lambda<negate<_> >::type > negate_a_list;

typedef apply<negate_a_list, example_list>::type negated_example_list_2;

BOOST_STATIC_ASSERT((at_c<negated_example_list_2, 2>::type::value==-3));

注意添加了lambda<...>::type来包装lambda表达式。这足以限定占位符的作用域。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接