2010-04-27 33 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

相关问题