在boost::phoenix::lambda中调用函数
Calling a function from within a boost::phoenix::lambda
我试图使用boost::phoenix
在缺乏c++ 11支持的旧编译器上模拟c++ lambda表达式,并且我无法从lambda表达式内调用简单函数。
[](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;
}
您的示例是否琐碎并不重要。调用非phoenix函数需要使用phoenix::bind
。时期。
c++ 11没有添加lambdas作为一种语言特性,因为它很有趣。他们这样做是因为各种各样的图书馆解决方案在某种程度上都是不够的。你发现了凤凰的不足之处
相关文章:
- 如何用参数值调用函数(仅在运行时已知)
- 从python中调用C++函数并获取返回值
- 当使用通配符和null指针调用函数时,对输出的说明
- 从R调用C++函数并对其进行集成时出错
- 使用QTreeView,如何通过调用函数只突出显示特定的行/列
- 如何在qt中从另一个类调用函数
- 在 COUT 语句中使用 COUT 调用函数
- 如何从线程中的不同模块调用函数?
- C++从函数指针数组调用函数
- 当 A 在 for 循环中调用函数 B 时,如何计算函数 A 的空间复杂度?
- 如何在 C/C++ 中从外部库调用函数
- 如何使用运算符在同一行中多次调用函数
- 是否可以创建一个从不同类调用函数的线程?
- 无法为类成员调用函数
- 如何从另一个标头 c++ 调用函数
- C++有什么方法可以在既不调用函数模板也不提供其模板参数的情况下引用函数模板?
- 如何只允许在调用函数 B 后调用函数 A?
- 我可以这样调用函数吗?
- 如何在 c++ 的类中递归调用函数方法?
- 为什么在指向对象的迭代器上调用函数不允许我更改对象本身?