将模板化类作为参数的C ++方法

时间:2010-04-27 17:01:34

标签: c++

我有一个模板类

Vector<class T, int N> 

其中T是组件的类型(例如,double)和n组件的数量(因此对于3D矢量,N = 3)

现在我想写一个类似

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

我想对三维和更高维矢量也这样做。当然,我可以为更高维度引入更多方法,但这些方法会有很多冗余代码,所以我想要一个更通用的解决方案。有没有办法创建一个方法,它采用模板化的类而不进一步专门化(在这种情况下,不指定T或N)?像

double findStepsize(Vector<T,N> v)

4 个答案:

答案 0 :(得分:11)

是的

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

如果您使用特定Vector<T, N>来调用它,编译器将推断 TN到适当的值。

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

上面的value-parameter与你的例子匹配,但最好通过const引用(Vector<T, N> const&)传递需要在其副本构造函数中工作的用户定义的类。所以你避免复制,但仍然无法改变调用者的参数。

答案 1 :(得分: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
}

答案 2 :(得分:1)

template <typename T, size_t N>
T find_step_size( const Vector<T,N>& v )
{
    return T(); // or something
}

答案 3 :(得分: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