C++ 如何在Boost Proto/Phoenix中使用非多态lambda?

C++ 如何在Boost Proto/Phoenix中使用非多态lambda?,c++,boost,c++11,boost-phoenix,boost-proto,C++,Boost,C++11,Boost Phoenix,Boost Proto,我想提供一个API,它接受用户定义的Boost Phoenix lambda。与C++11 lambda不同,Phoenix lambda是多态的 我能够使用lambda参数的[]运算符。以下代码段将输出数组的第一个元素arr: int arr[4] = {1,2,3,4}; cout << _1[_2](arr,0) << endl; int-arr[4]={1,2,3,4}; 请尝试(&_1)->*&vec2::x)(v2)。谢谢,这很有帮助。不过,我必须承认,考虑

我想提供一个API,它接受用户定义的Boost Phoenix lambda。与C++11 lambda不同,Phoenix lambda是多态的

我能够使用lambda参数的
[]
运算符。以下代码段将输出数组的第一个元素
arr

int arr[4] = {1,2,3,4};
cout << _1[_2](arr,0) << endl;
int-arr[4]={1,2,3,4};

请尝试
(&_1)->*&vec2::x)(v2)
。谢谢,这很有帮助。不过,我必须承认,考虑到最终用户,我希望有一些更简单的东西。这没有帮助,不。你可以编写一个
x
,这样
x(_1)
意味着“一个获取其第一个参数的
x
成员的函子”。请参阅有关如何编写函子的文档。您还可以使用稍微不那么难看(但只是稍微难看)的
phx::bind(&vec2::x,_1)(v2)
。如果你想要一个可以使用任意结构的通用解决方案,我相信你运气不好。如果你只想要几个特定的结构,你可以考虑做一些类似的事情。我注意到上面链接的例子没有编译(至少不在1.5 3.0)。将成员函数的返回类型中的
phoenix::expression::function
更改为
phoenix::detail::expression::function\u eval
,显然可以使其正常工作。
struct vec2 { float x,y; };
vec2 v2{1,2};
cout << ((_1).x)(v2) << endl;