我有一个模板类
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)
答案 0 :(得分:11)
是的
template<typename T, int N>
double findStepsize(Vector<T,N> v)
{..}
如果您使用特定Vector<T, N>
来调用它,编译器将推断 T
和N
到适当的值。
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
)