C++ 流畅接口

流畅接口(Fluent Interface),第一次见是在看 RapidJSON 的 wiki 时看见的。

意为返回自己的引用,这样可以不间断地调用一个函数多次。

1 template<typename T>
2 class Array{
3     ...
4     Array &push_back(const T& value){
5         ...
6         return *this;
7     }
8 };

这样插入操作的时候,就可以

1 Array<int> arr;
2 arr.push_back(1).push_back(2);

这只是简单的用法。

 

之前看到过一个问题,如何在 C++ 中实现这种函数调用效果:

1 if ( add(3)(4)(10) == 17 )
2     return true;

我的方法是用 operator() 重载 + 隐式类型转换:

 1 class Add{
 2 public:
 3     Add():sum(0){}
Add(int value) : sum(value){}
4 Add &operator() (int value){ 5 sum += value; 6 return *this; 7 } 8 operator int(){ 9 return sum; 10 } 11 private: 12 int sum; 13 }; 14 15 int 16 main(void){ 17 if (Add(3)(4)(10) == 17) 18 cout << "True" << endl; 19 else 20 cout << "False" << endl; 21 return 0; 22 }

 这个例子里,Add(3) 会调用 Add(int value) 来构造一个临时 Add 对象,然后后面会调用两次 Add& operator()(int value) ,此时 == 左边是一个 sum 为 17 的 Add 临时对象,同时 == 会调用 Add 对 int 的隐式类型转换,所以比较的是临时对象的 sum 和 17。

posted on 2017-05-15 11:41  daghlny  阅读(428)  评论(0编辑  收藏  举报

导航