2013-04-01 110 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