[英]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.