簡體   English   中英

c ++ 11 std :: ref如何工作?

[英]How does c++11 std::ref work?

我的任務是實現自己的std :: ref函數。 我知道有一個reference_wrapper函子,它有助於std :: ref。 但是我該如何實現這些功能/類。 我考慮以下幾點:

template <class T>
struct myreference_wrapper{
    T& functor;
    myreference_wrapper(T& t):functor(t){}
    void operator()('parameter') {
        functor('parameter');
    };
};

template<class T>
myreference_wrapper<T> myref(T& t){
   myreference_wrapper<T> functor(t);
   return functor;
}

調用myref時,不能使用模板參數,因為std :: ref不使用模板參數。 但是,當我們調用operator()時,我們需要知道其參數,因為我們想將它們傳遞給函子的operator()(我用“ parameter”簽名)。 std :: ref如何在沒有任何模板參數的情況下做到這一點?

模板函數可以從調用函數的類型中推導出模板參數。 例如:

template <class T> T min(T a, T b) {
    return a < b ? a : b;
}

調用此函數時,無需指定模板參數:

int x = min(1, 2);

編譯器查看了函數參數的類型,發現它們都是int ,並得出結論,需要調用min<int>

調用myref模板函數時也是如此:

int i;
myref(i);

再次,編譯器查看函數參數的類型,將其視為int ,並得出結論,需要調用myref<int>

順便說一句,上面的min函數使用起來可能更加復雜。 min(1, 2.0)無法編譯,因為兩個函數參數類型不同; 一個是int ,一個是double ,所以沒有T完全匹配兩者。 這里有幾種可能的解決方案。 一種是重寫模板函數,以便具有兩個模板類型參數,而不是一個: template <class T0, class T1> ??? min(T0, T1) template <class T0, class T1> ??? min(T0, T1) 這導致一個設計問題:正確的返回類型是什么? 另一種解決方案是更改調用代碼以傳遞相同類型的參數。 還有一個方法是顯式地指定模板參數類型: min<int>(1, 2.0) 這段代碼說要調用min<int> ,它接受兩個類型為int參數; 將double轉換為int ,就像采用兩個int值的非模板函數一樣。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM