【发布时间】:2013-12-18 18:15:49
【问题描述】:
是否可以转换嵌套的 C++11 绑定表达式?例如,在下面的代码中,与 f 关联的绑定表达式将首先将其参数乘以 2,然后再将结果加 1:
#include <iostream>
#include <functional>
using namespace std::placeholders;
int main(int argc, char *argv[])
{
auto add1 = [](int x) { return x+1; };
auto mul2 = [](int x) { return x*2; };
auto f = std::bind(add1, std::bind(mul2, _1));
std::cout << f(0) << '\n';
return 0;
}
我们能否创建f 的转换版本,而不是首先 加一,然后 将结果乘以二;结果的行为就像定义为:
auto f2 = std::bind(mul2, std::bind(add1, _1));
这个例子被简化了,因为它的结构类似于一个列表;而绑定表达式通常是一棵树。
【问题讨论】:
-
那有什么用?您通常无法反转组合(在这里完全忽略绑定),并且您也不了解
bind的内部结构。 -
@Xeo 可能是一种函数式方法,但如果 OP 喜欢函数式,我认为 C++ 下对它的支持并不多,或者至少 C++ 它不是一种真正的函数式语言。
-
@Xeo 我一般不想反转构图。这只是一个简单的例子。我想探索转换绑定表达式的可能性。我可能会选择一个子树;或来自聚合结构的单个函数对象。现在,我会对相反的情况感到满意。谢谢。
-
std::bind的返回值未指定。你必须定义自己的编译时树才能做你想做的事。 -
如果你想做这样的事情,请查看 Boost.Proto。它构建了可以遍历和操作的表达式树。
标签: c++ c++11 metaprogramming bind compile-time