2013-12-13 258 views
1

我想編寫一個函數像這樣:C++,返回類型爲模板類型的模板

template<class T1, T2> 
    T2 getvalue(T1 in) 
    { 
    T2 tmp; 

    // do some work here 
    return T2; 
    } 

,並以這種方式撥打:

float x[100]; 
    int x=getvalue<int>(x); 

但似乎我不能這樣做。這個想法是,編譯器從使用中檢測T1,但我定義了返回類型。但是上面的代碼會產生一個錯誤。

有關我如何做到這一點的任何建議?

回答

5

當您明確指定函數模板參數時,將從左側填充;所有其餘的論據都被推斷出來。所以,你必須把它寫這樣的:

template <typename T, typename U> 
T getvalue(U in) 
{ 
    return in; 
} 

用法:

auto x = getvalue<int>(1.5);  // x is an "int", and U is deduced as "double" 
+0

當然,'typename'和'class'在這裏是等價的。 – dyp

+0

模板參數的順序不需要與模板參數的順序相同(例如:http://ideone.com/T1Iom2)//編輯:啊,好的。我首先誤解了你。 –

2

首先,你有一個錯字。在您的return聲明中,您試圖返回一個類型,而不是名稱。變化:

return T2; 

到:

return tmp; 

其次,你必須在你的模板參數列表進一步的語法錯誤。您需要用classtypename先於每個一位模板參數名稱(我喜歡typename,但就是我):

template<typename T1, typename T2> 

最後,你可以得到扣除通過將返回類型,你希望工作第一個模板參數:

template<typename T1, typename T2> 
    T1 getvalue(T2 in) 
    { 
    T1 tmp; 

    // do some work here 
    return tmp; 
    } 

如您所願Decuction將現在的工作:

bool b = getValue <bool> (42.0); 

原因是模板參數從左側右側評估,而不是以任意順序。編譯器將試圖推導出一旦最左邊的應用程序被指定的任何模板參數。

+0

@DyP:很對,謝謝!固定。 –

0

很好的問題,模板可以在C++中變得棘手。

正確寫入版本:

template<typename T1, typename T2> 
T2 getvalue(T1 in) 
{ 
    T2 tmp; 
    // do some work here with tmp 
    return tmp; 
} 

正確的方式來按您的通話例如:

float x[100]; //array of 100 floats. depending on your application, best practice would suggest to initial the values in the array to 0. 
    int x=getvalue<double, int>(3.5); //note int x is different than float x[]. 

您的功能正在返回一個int。如果你想返回一個浮點數的數組,你的模板參數也應該反映出來。 最好總是指定兩個模板參數。記得功能模板不能像部分模板那樣部分專業化(只有完全)

只是我的$ 0。02