2013-04-01 44 views
-3

我有一個ABC類,我想給一個未知的類變量,它的模板,這樣的:C++:給未知的類變量模板

template <v> 
class ABC 
{ 
// do something 
}; 

當然上面的代碼不工作(有不是參數類型v)。你有任何想法來解決這個問題嗎?我不希望將變量類型v添加到模板中。

有兩種功能,哪種類型是不同的。如何在下面的類模板中使用這兩個函數?

#include <iostream> 
using namespace std; 
// Types of functions max1 and min1 are different! 
int max1(int a, int b){ return a>b?a:b; } 
int& min1(int a, int b){ return a<b?a:b; } 

template<typename _T, _T(function)(_T,_T)> 
class ABC 
{ 
     public: 
     _T a, b; 
     _T get() 
     { 
       return function(a, b);  
     }   
}; 

ABC <int, max1> abc; // <- If You write "ABC <int, min1> abc;", error comes! How fix this? 

int main() 
    { 
    abc.a = 3; 
    abc.b = 8; 
    cout << abc.get() << '\n';  
    cin.get();  
    return 0;  
    } 
+3

我不明白。如果你告訴我們你想如何使用它,也許它會有所幫助。 –

+0

也許你似乎認爲變量是在'template <...>'中聲明的,函數體放在類體中? – Synxis

+0

如果將_T(函數)(_T,_T)更改爲_T(*)(_T,_T),它會改變什麼? – bstamour

回答

3

似乎是無關緊要的,但問題是在一開始非常不清晰...

template <v> 

必須

template < typename v > 

template < class v > 

typename是優選的。


關於您的編輯:問題是,min1回報&。如果你刪除它,那麼你可能有:

#include <iostream> 

int max1(int a, int b){ return a>b?a:b; } 
int min1(int a, int b){ return a<b?a:b; } 

template<typename _T, _T(*function)(_T,_T)> 
class ABC 
{ 
public: 
     _T a, b; 
     _T get() { return function(a, b); }   
}; 

int main() 
{ 
    ABC <int, max1> abc; 
    ABC <int, min1 > def; 

    abc.a = def.a = 3; 
    abc.b = def.b = 8; 

    std::cout << abc.get() << '\n'; 
    std::cout << def.get() << '\n';  

    return 0;  
} 

,這將打印8 3

+1

在這種使用中,'typename'嚴格等同於'class',儘管我也更喜歡'typename'。 – Synxis

+0

是的,在這種情況下是完全一樣的。這就是爲什麼我寫「更好」 –

+0

我想給變量,而不是類型的變量。 – greego