程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> C語言 >> C++ >> C++入門知識 >> [Boost基礎]函數與回調——ref引用

[Boost基礎]函數與回調——ref引用

編輯:C++入門知識

庫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;   }    

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved