tr1::reference_wrapper
好久以前就知道 TR1,但一直到讀了《Effective C++, 3/e》才正式開始看 TR1。先前對 unordered_map、unordered_set、shared_ptr 早有耳聞,應不需要費太多工夫。翻開 TR1 (Draft),第一個遇上的是 tr1::reference_wrapper,顧名思義,這種 object 外覆於 references(不過內部實作應該是用指標:reference_wrapper 支援 copy assignment operator),使 reference 成為「第一級物件」(first class objects),而可置於容器內。這是我寫的測試碼:
#include <tr1/functional>
#include <iterator>
#include <iostream>
#include <vector>
using namespace std;
int main() {
int i = 0, j = 0, k = 0;
// "angle-bracket hack" has not yet been supported
vector<tr1::reference_wrapper<int> > v;
v.push_back(tr1::ref(i)); // helper function
v.push_back(tr1::ref(j)); // of tr1::reference_wrapper
v.push_back(tr1::ref(k));
i = 2; j = 3; k = 1;
copy(v.begin(), v.end(), ostream_iterator(cout, " "));
cout << endl; // 2 3 1
sort(v.begin(), v.end());
copy(v.begin(), v.end(), ostream_iterator(cout, " "));
cout << endl; // 1 2 3
i = 4; j = 6; k = 5;
copy(v.begin(), v.end(), ostream_iterator(cout, " "));
cout << endl; // 5 4 6
sort(v.begin(), v.end(), greater());
copy(v.begin(), v.end(), ostream_iterator(cout, " "));
cout << endl; // 6 5 4
}
reference_wrapper<T> 看來也和 tr1::function 有點關係,我猜當 T 為某種 callable type 時(e.g. plain functions, member functions, function objects),reference_wrapper 也類似 tr1::function。繼續往下,看看這個猜測的準確度如何。
喔,對了,在 tr1::enable_shared_from_this 看到熟悉的手法:CRTP(curiously-recurring template pattern)。我猜是想藉以實現侵入式計數(intrusive counting)或其他侵入式手法。在還沒看源碼之前,多猜猜也滿有意思的 :P。
--
我還沒睡 XD。
回覆(直接在下面回的話,沒有<code>、沒有<pre>,縮排太麻煩了 XD):
> tr1::reference_wrapper似乎是一種smart reference ?
應該只是單純的 wrapper 而已,因為它不做什麼資源管理。
for_each 是對區間內每個元素施用「作為第三引數傳入的那個 unary function object」,所以如果要用 for_each,應該會變成類似這樣:
template<typename Arg>
// or make Printer a plain class
// and make operator() a member template
class Printer: public unary_function<Arg, void> {
public:
Printer(ostream& a, const char* b = 0):
os(a), tail(b) { }
void operator()(const Arg& arg) const {
os << arg << tail;
}
private:
ostream& os; // os & tail can also be templatized
const char* const tail;
};
// ...
vector<int> v;
// ...
for_each(v.begin(), v.end(), Printer<int>(cout, " "));


看懂歸看懂....
tr1::reference_wrapper似乎是一種smart reference ?
這樣子的特性,我不是很有研究,但應該可避免許多不必要錯誤,哈,我等會再看書
話說,問一個比較簡單的問題
copy(v.begin(),v.end(),ostream_iterator(cout," "));
是這樣子寫
如果使用for_each
void output(){ ... }
for_each(v.begin(),v.end(),output);
再另外寫一個function obeject ?
還是說,for_each 也可以使用ostream_iterator?
哈哈,我反而在問微末細節
漂亮的程式碼,漂亮的回覆
謝謝你啦(^_^)
繼續努力去
補充一下,現在發現
原來wrapper是包覆的意思
所以不一定會包括資源管理
<< 回到主頁