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)
这个例子的简化是因为它的结构类似于列表; 而绑定表达式通常是树.
std::bind是一个黑盒子.它不支持内省(除了std::result_of和std::is_bind_expression)或多态(除了std::placeholders).当你打电话时f(0),它会编译为本机代码0*2+1.
在黑盒子里面就像一个表达式模板,引用组合的仿函数类型并为任何绑定参数提供存储.这种实现与编译器有关,平台细节实际上差别很大.
如果要移植操作表达式,请查看Boost.Proto通用表达式模板库.不过,这很重要.
| 归档时间: |
|
| 查看次数: |
394 次 |
| 最近记录: |