gpt4 book ai didi

c++ - 从 boost::phoenix::lambda 中调用一个函数

转载 作者:塔克拉玛干 更新时间:2023-11-03 01:14:54 24 4
gpt4 key购买 nike

我正在尝试使用 boost::phoenix 在缺少 C++11 支持的旧编译器上模拟 C++ lambda 表达式,但我无法从 lambda 表达式中调用简单函数.

C++11 版本:

[](unsigned a) { foo( a ); }( 12678u );   // calls foo( 12678u )

我的 Phoenix Lambda 代码如下:

#include <cstdint>
#include <iostream>
#include <boost/phoenix.hpp>

namespace ph = boost::phoenix;
using ph::local_names::_a;
using ph::placeholders::arg1;

void foo( uint32_t val )
{
std::cout << "\t" << __func__ << "( " << val << " ) called...\n";
}

int main()
{
auto myLambda = ph::lambda( _a = arg1 )
[
foo( _a )
//std::cout << ph::val( "Called with: " ) << _a << ph::val( "\n" )
]( 567u );

myLambda();

return 0;
}

这会产生以下编译器错误:

lambda-ex.cpp: In function ‘int main()’:
lambda-ex.cpp:18:19: error: cannot convert ‘const _a_type {aka const boost::phoenix::actor<boost::proto::exprns_::basic_expr<boost::proto::tag::terminal, boost::proto::argsns_::term<boost::phoenix::detail::local<boost::phoenix::local_names::_a_key> >, 0l> >}’ to ‘uint32_t {aka unsigned int}’ for argument ‘1’ to ‘void foo(uint32_t)’ lambda-ex.cpp:20:15: error: unable to deduce ‘auto’ from ‘<expression error>’

如何从 Phoenix lambda 表达式中调用函数?

我希望能够像过去使用 C++11 lambda 一样使用 phoneix::lambdas,例如:

auto lambda1 = [&]( uint32_t arg )
{
func1( "Some Stuff", arg );
func2( "Some More Stuff", aValueFromLocalScope, arg );
func3( "Some Stuff", anotherValueFromLocalScope, arg );
};

someFuncImpl( aParam, lambda1 );

最佳答案

ph::lambda 是这项工作的错误工具(ph::lambda 是用于在 phoenix 表达式中创建嵌套 lambda 表达式的工具)。 Phoenix 表达式已经是函数,因此您需要做的就是找到一种使用 phoenix 表达式调用函数的方法(bind),找到一种顺序执行多个操作的方法(operator,),然后找到一种引入局部变量的方法(let)。将所有这些放在一起给出:

#include <cstdint>
#include <iostream>
#include <boost/phoenix.hpp>

namespace ph = boost::phoenix;
using ph::local_names::_a;
using ph::placeholders::arg1;

#define FOO(name) void name( uint32_t val ) {\
std::cout << "\t" << __func__ << "( " << val << " ) called...\n";\
}
FOO(foo)
FOO(bar)
FOO(baz)

int main()
{
auto&& myLambda = ph::let(_a = arg1)
[
ph::bind(foo, _a),
ph::bind(bar, _a),
ph::bind(baz, _a)
];

myLambda(342);

return 0;
}

关于c++ - 从 boost::phoenix::lambda 中调用一个函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15851598/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com