Arm*_*ani 4 c++ std stdbind c++11
我需要一种方法来分解函数std::bind()模板中返回的函数对象及其参数。
下面的代码片段显示了我想要做的事情:
\n#include <iostream>\n#include <functional>\n\nvoid foo(int x, double y, char z)\n{\n    std::cout << "x = " << x << ", y = " << y << ", z = " << z << \'\\n\';\n}\n\nint main()\n{\n    auto f = std::bind(foo, 42, 3.14, \'a\');\n    std::cout << "The first argument is: " << std::get<0>(f) << \'\\n\';\n    std::cout << "The second argument is: " << std::get<1>(f) << \'\\n\';\n    std::cout << "The third argument is: " << std::get<2>(f) << \'\\n\';\n}\n输出应该是:
\nThe first argument is: 42\nThe second argument is: 3.14\nThe third argument is: a\n但它无法编译并出现错误:
\ntest.cpp:12:60: error: no matching function for call to \xe2\x80\x98get<0>(std::_Bind<void (*(int, double, char))(int, double, char)>&)\xe2\x80\x99\n为什么我需要这个?
\nstd::generate()并且std::generate_n()可以接受引擎或分布来生成随机数。当您传递分布时,std::bind除了函子和 lambda 之外,还有一种标准方法:
std::mt19937 R(666);\nstd::::uniform_int_distribution<int> D(0, 100);\nstd::vector<int> v(10);\nstd::generate(v.begin(), v.end(), std::bind(D, std::ref(R));\n我开发了一种generate()公平的并行算法(即,如果您使用相同的种子和分布,您总是会得到相同的序列)。我希望它具有相同的接口,std::generate()但算法需要调用discard()引擎的函数,这对于串行算法来说是不必要的。我的想法是用来std::is_bind_expression<T>::value查看引擎或发行版是否通过。如果它是引擎,则调用discard();如果它是绑定表达式,则首先分解它,然后调用discard()引擎。Lambda 在这里不起作用,因为算法无法访问引擎。\n如果无法实现std::bind,那么我将实现我的版本std::bind.
如果有更好的方法来做到这一点,我将非常高兴知道。
\n| 归档时间: | 
 | 
| 查看次数: | 146 次 | 
| 最近记录: |