2010-04-27 17 views
4

方法我有一個模板類C++,其採取模板類作爲參數

Vector<class T, int N> 

其中T是各組分的類型(雙例如)和正分量的數目(因此N = 3用於3D矢量)

現在我想寫一個方法類似

double findStepsize(Vector<double,2> v) 
{..} 

我想這樣做,也爲三年高維向量。當然,我可以引入更高維的更多方法,但這些方法會有很多冗餘代碼,所以我想要一個更通用的解決方案。有沒有辦法創建一個方法,該方法不需要進一步專門化模板類(在這種情況下,不指定T或N)?像

double findStepsize(Vector<T,N> v) 

+0

當然n應是'size_t'或'在unsigned'最小。負面的組件不應該被允許。 – GManNickG 2010-04-27 17:28:54

+0

Thx的提示,size_t是什麼? – Nils 2010-04-27 17:34:35

回答

11

是的,它是

template<typename T, int N> 
double findStepsize(Vector<T,N> v) 
{..} 

如果你有一個特定的Vector<T, N>調用它,編譯器將推斷TN爲適當的值。

Vector<int, 2> v; 
// ... fill ... 
findStepsize(v); /* works */ 

上述數值參數的例子相匹配,但它是更好的傳遞需要通過const引用(Vector<T, N> const&代替)做工作,在他們的拷貝構造函數用戶定義的類。所以你避免複製,但仍然不能改變調用者的論點。

1

這種方式實現:

template <typename A, int B> 
class Vector { 

}; 

template <typename T, int N> 
void foo(Vector<T, N>& v) { 

} 

template <> 
void foo(Vector<int, 3>& v) { 
    // your specialization 
} 
1
template <typename T, size_t N> 
T find_step_size(const Vector<T,N>& v) 
{ 
    return T(); // or something 
} 
0

你的第二個問題的答案:

你不能有一個模板函數指針,那是沒有意義的。 但是你可以做的是

#include <vector> 

template <typename T> 
void foo(const std::vector<T>& v) { 
    // do something 
} 

void (*ptr_foo)(const std::vector<int>&) = &foo<int>; 

(這裏的函數指針模板化的功能,模板參數明確設置爲int