庫ref在boost/ref.hpp中提供了模板工廠函數boost::ref,boost::cref分別對應包裝引用和常引用。 當在某些情況下需要拷貝對象參數,如果該對象無法進行拷貝,或者拷貝代價過高,這時候就可以選擇ref。 [cpp] #pragma once #include <boost/ref.hpp> #include <boost/assert.hpp> #include <string> #include <iostream> #include <conio.h> #include <vector> using namespace std; using namespace boost; //boost.ref應用代理模式,引入對象引用的包裝器(reference_wrapper)概念解決了這類問題(一般情況下傳值語義都是可行的,但也有很多特殊情況,作為參數的函數對象拷貝代價過高,或者不希望拷貝對象,甚至拷貝是不可行的(單件)) void test1() { int x=10; reference_wrapper<int> rw(x);//包裝int類型的引用 assert(x==rw);//隱身轉換為int類型 (int&)rw=100;//顯示轉換為int&類型,用於左值 reference_wrapper<int> rw2(rw);//拷貝構造函數 assert(rw2.get()==100); string str; reference_wrapper<string> rws(str);//包裝字符串的引用 *rws.get_pointer()="test reference_wrapper";//指針操作 cout<<"str: "<<str<<" size:"<<rws.get().size()<<endl;//str:test reference_wrapper size:22 //reference_wrapper的用法類似於C++在那個的引用類型(T&),就像是被包裝對象的別名。為此,必須賦值初始化,就像是使用一個引用類型的變量。它提供了get()和get_pointer()分別返回存儲的引用和指針。 } //reference_wrapper的名字過長,聲明引用包裝對象很不方便,因而ref庫提供了兩個便捷的工廠函數ref()和cref()(const ref()),可以通過參數類型很容易推導出構造reference_wrapper對象。 void test2() { // vector<int>v(10,2); // BOOST_AUTO(rw,cref(v)); // assert(is_reference_wrapper<BOOST_TYPEOF(rw)>::value); // assert(!is_reference_wrapper<BOOST_TYPEOF(v)>::value); // string str; // BOOST_AUTO(rws,ref(str)); // cout<<typeid(unwrap_reference< BOOST_TYPEOF<rws>::type).name()<<endl; // cout<<typeid(unwrap_reference< BOOST_TYPEOF<str>::type).name()<<endl; } #include <iostream> #include <vector> #include <algorithm> #include <boost/bind.hpp> #include <boost/function.hpp> void print(std::ostream& os,int i) { os<<i<<std::endl; } void test3() { //std::cout為標准輸出對象,它是無法進行拷貝的,因此此處必須使用boost::ref來綁定它的引用,否則會提示拷貝構造失敗,因為拷貝構造是私有的。 boost::function<void (int)>pt=boost::bind(print,boost::ref(std::cout),_1); vector<int>v(1,1); v.push_back(2); v.push_back(3); v.push_back(4); std::for_each(v.begin(),v.end(),pt);//1 2 3 4 } void test(char t) { cout<<"press key====="<<t<<endl; switch (t) { case '1':test1();break; case '2':test2();break; case '3':test3();break; // case '4':test4();break; case 27: www.2cto.com case 'q':exit(0);break; default: cout<<"default "<<t<<endl;break; } } int main() { while(1) { test(getch()); } return 0; }