表示嵌套的C ++模板

时间:2014-01-29 10:42:08

标签: c++ vector cuda thrust

这与previous question I asked类似,但它涉及模板化矢量分量加法函数。

我有一个名为add的函数,它接受两个向量并将它们的加法存储在输出向量中。我正在学习c ++,所以我不知道如何将类型参数设为thrust::plus泛型?问题是Tdevice_vectorhost_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

如何播放加号函数泛型,以便轻松使用Tdevice_vector<T>的{​​{1}}?

2 个答案:

答案 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));   
}