如何转换嵌套的C++ 11绑定表达式

use*_*370 2 c++ bind metaprogramming compile-time c++11

是否可以转换嵌套的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;
}
Run Code Online (Sandbox Code Playgroud)

我们可以创建一个转换版本,f而不是添加一个,然后将结果乘以2; 结果表现得好像定义为:

auto f2 = std::bind(mul2, std::bind(add1, _1));
Run Code Online (Sandbox Code Playgroud)

这个例子的简化是因为它的结构类似于列表; 而绑定表达式通常是树.

Pot*_*ter 5

std::bind是一个黑盒子.它不支持内省(除了std::result_ofstd::is_bind_expression)或多态(除了std::placeholders).当你打电话时f(0),它会编译为本机代码0*2+1.

在黑盒子里面就像一个表达式模板,引用组合的仿函数类型并为任何绑定参数提供存储.这种实现与编译器有关,平台细节实际上差别很大.

如果要移植操作表达式,请查看Boost.Proto通用表达式模板库.不过,这很重要.