这与previous question I asked类似,但它涉及模板化矢量分量加法函数。
我有一个名为add
的函数,它接受两个向量并将它们的加法存储在输出向量中。我正在学习c ++,所以我不知道如何将类型参数设为thrust::plus
泛型?问题是T
是device_vector
和host_vector
的类型参数;这应该是Vector
的类型参数。
template<typename Vector, typename T>
void add(const Vector& in1, const Vector& in2, Vector& out) {
transform(in1.begin(), in1.end(), in2.begin(), out.begin(), thrust::plus<T>(c));
}
矢量可以是两种类型:
device_vector<T>
host_vector<T>
我的代码没有编译,因为它抱怨:
error: no instance of function template "add" matches the argument list
如何播放加号函数泛型,以便轻松使用T
或device_vector<T>
的{{1}}?
答案 0 :(得分:3)
使用容器的value_type
,并删除第二个模板参数,因为它无法推断:
template<typename Vector>
void add(const Vector& in1, const Vector& in2, Vector& out) {
transform(in1.begin(), in1.end(), in2.begin(), out.begin(),
thrust::plus<typename Vector::value_type>(c));
}
答案 1 :(得分:1)
查阅thrust::host_vector
的文档,了解它是否为其模板参数提供了嵌套的typedef(例如std::vector<T>
提供与std::vector<T>::value_type
相同的T
)。如果确实如此,请使用它(如@ juanchopanza的答案所示)。
然而,我试着简要地看一下推文,但是他们没有列出这样的类型(不幸和令人惊讶,但也许是真的)。如果确实没有提供它,则必须使用模板模板参数:
template<template <typename T, typename A> class Vector>
void add(const Vector<T, A>& in1, const Vector<T, A>& in2, Vector<T, A>& out) {
transform(in1.begin(), in1.end(), in2.begin(), out.begin(), thrust::plus<T>(c));
}
请注意,您不能仅使用T
作为模板模板参数,您必须准确地镜像预期输入类模板的实际模板参数。在C ++ 11中,您可以通过使用可变参数模板来帮助自己:
template<template <typename T, typename... Other> class Vector>
void add(const Vector<T, Other...>& in1, const Vector<T, Other...>& in2, Vector<T, Other...>& out) {
transform(in1.begin(), in1.end(), in2.begin(), out.begin(), thrust::plus<T>(c));
}