2013-03-21 60 views
2

在我試圖理解我看到構造這樣的代碼:ref<date>(entry)。請問任何人,請解釋它的意思。模板類型的引用是什麼意思?

我假設我們創建了一個對entry對象的引用,但是如何使用date類型。例如,ref<date>(entry)ref<location>(entry)將返回不同的值。它是如何工作的?

+0

這是'的std :: ref'? – 2013-03-21 10:47:18

+0

@sftrabbit,我不確定。在代碼中我使用'namespace std;'並且沒有其他名稱空間以這種方式使用。而且,在'ref'前面我沒有'::',所以我假設它來自'std'名稱空間。 – Roman 2013-03-21 10:49:42

+0

@sftrabbit我問我自己同樣的問題,而是'的std :: ref'不應該需要一個明確的模板參數。 – juanchopanza 2013-03-21 10:53:33

回答

3

如果您有using namespace std;並且包含<functional>標題,這是指std::ref函數。

std::ref是將創建一個std::reference_wrapper包裹你傳遞對象的功能。 std::ref的整點是你不要必須給出模板參數,因爲它可以被推斷出來。所以,如果你想entry參考,那麼你應該只是做:

std::ref(entry) 

這是一個方便的功能,節省了您不必創建std::reference_wrapper當鍵入多餘的類型名稱。如果你做手工,你就必須做到:

std::reference_wrapper<date>(entry) 

這是因爲std::reference_wrapper是一個模板類和模板類參數不能用這種方式來推斷。

2

std::ref功能模板用來針對特定對象創建std::reference_wrapper。這允許通過引用傳遞一個目的是一個函數模板即使函數模板採用由值對應的參數:

例如:

template<typename T> 
void foo(T t) 
{ 
    t = 42; 
} 

int x = 0; 
foo(std::ref(x)); 
std::cout << x; // Will print 42 

通告,該函數foo()上面是一個相當笨功能,和我只是爲了說明的目的而寫的。更多的時候,你會發現std::refstd::cref結合使用與std::bind,默認情況下會創建一個複製的參數您提供:

template<typename T> 
void bar(T v1, T& v2) 
//   ^
//    Second argument accepted by reference this time... 
{ 
    v2 = v1 + 42; 
} 

int x = 0; 
auto f = std::bind(bar, 0, ref(x)); 
//       ^^^ 
//       ...but without this, a copy of x would be created! 

f(x); 
std::cout << x; // Will print 42 

還要注意,你通常不會明確指定模板參數爲std::refstd::cref,但你寧願讓函數模板推斷出結論。