首先解释下为什么有时候需要bind. 我们可以用bind从函数T add(T a, T b)造出个inc()来,即把b写死为1。这个例子本身比较傻,但有不傻的应用。

template<typename T> T add(T a, T b) { return a + b; }

template<typename T> auto get_inc() {
T b = 1;
return bind(add<T>, std::placeholders::_1, b);
} std::function<int(int)> inc = get_inc<int>();
printf("%d\n", inc(2));

其次为啥bind默认传copy而不是reference? get_inc()返回后, 它里面的b就没了,stack frame供别的函数用去了。传引用的话就引错地方了。

可有时候很需要传应用,如两个vector相加,而且我们知道引用是有效的:

#include <stdio.h>
#include <vector>
#include <functional>
using namespace std; struct vec : public vector<int> {
vec() {}
vec(const vec&) { puts("vec(const vec&)"); }
vec& operator=(const vec&) { puts("operator=(const vec&)"); return *this; }
}; void addv(const vec& a, const vec& b) {} // 没有返回值不重要 int main() {
std::function<int(int)> inc = get_inc<int>();
printf("%d\n", inc(2)); vec a, one;
auto incv = bind(addv, std::placeholders::_1, ref(one));
incv(a);
}

如果把ref(one)换成one,可看到copy constructor被调用。可以在某个函数里new个vec* v, 再ref(*v),最后某处delete v.

std::ref是如何实现的?Function templates ref and cref are helper functions that generate an object of type std::reference_wrapper, using template argument deduction to determine the template argument of the result. [cppreference]

How does c++11 std::ref work? - Stack Overflow  我搞了个指针版:

template<class T> struct myref_wrapper {
T* p;
myref_wrapper(T& t) : p(&t) {}
T& operator()() { return *p; }
}; template<class T> myref_wrapper<T> myref(T& t) { return myref_wrapper<T>(t); } int i = 0;
myref(i)() = 1;
printf("%d\n", i);

真是人生苦短,我学python啊。c++ - Implementation of std::reference_wrappestd::bind简单使用 - 博客园  Passing reference with std::ref in C++

最新文章

  1. Sublime Text安装Package Control
  2. Dapper学习 - Dapper.Rainbow(一) - Create
  3. 三:Go编程语言规范-表达式
  4. JS 自定义正则表达式
  5. vim标准操作
  6. apache301重定向设置
  7. Eclipse中使用正则屏蔽Logcat中的某些Tag
  8. AN ESAY HIT COUNTER
  9. linux下安装QT过程
  10. centos5.5 Apache2 Web 服务器的安装
  11. 回到顶端的jquery
  12. matlab笔记(1) 元胞结构cell2mat和num2cell
  13. TortoiseSVN文件夹图标不显示
  14. 什么是shell? bash和shell有什么关系?
  15. TensorFlow.org教程笔记(一)Tensorflow初上手
  16. 【blog】用emoji-java解决Emoji存储MySQL乱码问题
  17. PL/SQL程序设计、流程控制
  18. IOS开发之无法选择模拟器显示NO Scheme
  19. log4j生成有日期的日志文件名
  20. 使用overflow:hidden之后使的同行元素不对齐

热门文章

  1. NOI 2008 志愿者招募
  2. eclipse不自动弹出提示的解决办法(eclipse alt+/快捷键失效)
  3. ubuntu20.04安装EasyConnect兼容性问题解决
  4. Excel-判断一个文本字符串中是否包含数字! 判断一个文本字符串是否是纯汉字!
  5. Vector总结及部分底层源码分析
  6. Hadoop入门 运行环境搭建
  7. 学习java 7.5
  8. 紧张 + 刺激,源自一次 OOM 历险
  9. 【Reverse】每日必逆0x03
  10. 求最长子序列(非连续)的STL方法 - 洛谷P1020 [NOIP1999 普及组] 导弹拦截