C++11 ref函式的使用
說到ref() 函式,就必須先提ref() 函式的返回值 reference_wrapper 類型別,reference_wrapper<T> 是個類模板,用來模仿一個型別為T 的物件的引用,使用起來就像是引用一樣,不過reference_wrapper<T> 物件是可以拷貝構造和賦值構造的。
template<class Ty> class reference_wrapper { public: reference_wrapper(Ty& p) : ptr(p) { }//建構函式 Ty& get() const { return *ptr ;} //返回私有成員變數 operator Ty&() const {return *ptr; } //型別轉換函式 使reference_wrapper類物件能夠隱式的轉換為 Ty& 型別的引用, 所以看起來像一個引用 template<class T1, class T2, ..., class TN> typename result_of<T(T1, T2, ..., TN)>::type operator()(T1& t1, T2& t2, ..., TN& tN) { (*ptr)(t1, t2, ... ,tN);} //對可呼叫物件的包裝 使包裝一個可呼叫物件時,包裝之後的也是可以呼叫的 private: Ty *ptr; // exposition only };
測試程式碼:
#include <iostream>
#include <functional>
using namespace std;
int main()
{
int i{9};
auto m = ref(i);
cout << typeid(m).name() << endl;
++m;
cout << i << endl;
cin.get();
return 0;
}
m是對i的引用包裝,m 可以進行對 i 一樣的操作,比如這裡的前置 ++ 運算子 , 實際的效果相當於 對 i 進行了 ++ 操作, 即引用語義。輸出結果如下:
相關推薦
C++11 ref函式的使用
說到ref() 函式,就必須先提ref() 函式的返回值 reference_wrapper 類型別,reference_wrapper<T> 是個類模板,用來模仿一個型別為T 的物件的引用,使用起來就像是引用一樣,不過reference_wrapper<
C++函式指標 與 C++11 function 函式物件對比
轉自:https://blog.csdn.net/skillart/article/details/52336303 1.函式指標 函式指標:是指向函式的指標變數,在C編譯時,每一個函式都有一個入口地址,那麼這個指向這個函式的函式指標便指向這個地址。函式指標主要由以下兩方面的用途:呼叫函式和
C++ 11 模板函式的預設模板引數
關於預設的函式引數,有一條規則: void defFunc(int i ,int j = 2,int k = 3) { } 那就是預設實參必須在形參的右邊. 為什麼要這麼規定? 其實我們呼叫一下程式碼就可以發現,必須這樣: defFunc(1); 預設等於 defFunc(
C++11系列——函式物件(Function Object)
之前總結過一篇Boost之高階函式——函式物件,介紹了幾個用於處理函式物件的 Boost C++ 庫。而目前C++11的標準庫std已經提供了函式物件的一些功能。 In mathematics and computer science, a high
c++11 中函式宣告 新關鍵字 delete的妙用之一: 搭配巨集NonCopyable(ClassName) 使用
c++11 中函式宣告 新關鍵字 delete的妙用之一: 搭配巨集NonCopyable(ClassName) 使用 編譯器版本: gcc version 5.4.0 20160609 (Ubuntu 5.4.0-6ubuntu1~16.04.4) 1. 首先先來
C++11 Lambda函式(匿名函式)
C++11引入了lambda表示式,使得程式設計師可以定義匿名函式,該函式是一次性執行的,既方便了程式設計,又能防止別人的訪問。 Lambda表示式的語法通過下圖來介紹: Lambda表示
C/C++程式設計教訓----函式內靜態類物件初始化非執行緒安全(C++11之前)
不少程式設計師在編寫程式的時候,會使用函式內靜態(static)變數,既能滿足函式內這個變數可以持久的記錄某些資訊,又使其訪問範圍的控制侷限於函式內。但函式內靜態類物件初始化是非執行緒安全的。 問題背景 在我們產品中對log4cxx做了一些簡單的封裝 (採用VS2005編譯),其中會
C++11新特性(80)-繼承的建構函式與多重繼承
複習 本文算是前面文章的繼續。 對於繼承的建構函式,C++11通過一個簡單的using語句,使得繼承一個類時可以省去一些麻煩。具體可以參照下面的文章。 C++11新特性(59)-繼承的建構函式 https://mp.weixin.qq.com/s/BGUa7-RSCtFRnBYj
C++11新特性——default函式和deleted函式
轉自:http://blog.jobbole.com/103669/ default函式 default函式作用於類的特殊成員函式,為其自動生成預設的函式定義體,提高程式碼的執行效率。 類的特殊成員函式: 預設建構函式 解構函式 複
c++11:物件移動 & 右值引用 & 移動建構函式
一、概述 c++ 11 新標準中最主要的特徵是可以移動而非拷貝物件的能力。很多情況下,物件拷貝後就會立即被銷燬。 在這些情況下,移動而非拷貝物件會大幅度提升效能。 在舊 C++ 標準中,沒有直接的方法移動物件。因此,即使不必要拷貝物件的情況下,我們也不得不拷貝。如果物件本身要求
C#系列 ---5 函式引數 optional , ref, out, params 和 引數值傳遞和引用傳遞問題
variables and parameters variable 代表的是一個記憶體地址,該地址包含一個可變的值。可以是local variable, parameter (value, ref, or out), field (instance or static), or arra
C++11之前和C++11之後的 vector 建構函式的區別
例子: #include <iostream> #include <vector> using namespace std; class A { public: A(const char* s = "1234") { cout << "ASDF"
C++11使用自定義hash函式及比較函式的unordered_set
#include <unordered_set> #include <functional> #include <iostream> struct MyKey { int key; }; struct MyKeyHashHasher { size_
c++ 11 中顯式預設設定的函式和已刪除的函式 總結
今天在一個類中看到如下程式碼不是很懂,原來是c++11 新特性 RateTimer(const RateTimer&) = delete; //不可拷貝/不可賦值 RateTimer& operator=(const RateTimer&) = delete;
《隨筆十四》—— C++中的 “ 委託建構函式 (C++11)”
目錄 委託建構函式 委託建構函式 ● 一個委託建構函式使用它所屬類的其他建構函式執行它自己的初始化過程, 在委託建構函式內,成員初始值列表只有一個唯一的入口, 就是類名本身(就是同類的其他建構函式的類名)。 類名後面的引數列表必須與類中另外一個建構函式匹配。 c
C++11的shared_ptr有可能導致函式呼叫棧溢位
最開始關注這個問題是在測試C++ Concurrency in Action這本書提及的幾個版本stack資料結構的實現,其中lock free版本的實現時,需要精巧的記憶體回收機制,其中在介紹count reference記憶體回收機制時,作者認為shared_ptr是有r
c++11 std::ref使用場景
C++本身有引用(&),為什麼C++11又引入了std::ref? 主要是考慮函數語言程式設計(如std::bind)在使用時,是對引數直接拷貝,而不是引用。如下例子: #include <functional> #include <iostream> vo
C++11函式模板的預設模板引數
1.函式模板預設模板引數簡介 函式模板與類模板在C++98一起被引入,因種種原因,類模板可以擁有預設模板引數,而函式模板不可以。從C++11開始,這個限制被解除了,即函式模板同樣可以擁有預設模板引數。預設模板引數的用法與函式的預設引數類似,考察如下示例: #include <
C++11多執行緒程式設計 第十章: 使用packaged_task優雅的讓同步函式非同步執行
C++11 Multithreading – Part 10: packaged_task<> Example and Tutorial Varun July 2, 2017 C++11 Multithreading – Part 10: packaged_tas
C++11 delete關鍵字 禁止預設拷貝建構函式和複製操作
在講解delete關鍵字之前,我們先說說最早之前我們是如何禁止拷貝建構函式的! 把delete關鍵字引入的前因後果都深入的理解一下 ! class A { public: A(){} private: //拷貝建構函式 A(const