我有以下包装类:
template <typename T> class Remap { public: Remap(T *data,int *remap) : data(data),remap(remap){}; T &operator[](std::size_t idx) const { return data[remap[idx]]; } private: T *data; int *remap; };
如果我称它为:
Remap<double> remap(data,remap);
其中数据的类型为double *.如果我试图让编译器(intel icc 15.0.3,-std = c 11)推导出模板类型:
Remap remap(data,remap);
argument list for class template "Remap" is missing
解决方法
在C 17之前,没有类模板参数的推论.
解决方法是使用某种生成Remap对象的get_remap模板函数:
template<typename T> Remap<T> get_remap(T* data,int* remap) { return Remap<T>(data,remap); }
然后使用它像:
double* data = nullptr; int* remap = nullptr; auto remap_obj = get_remap(data,remap);
此外,使用C 14支持,get_remap可能会缩短为:
template<typename T> auto get_remap(T* data,remap); }
让编译器推导出一种返回类型.
从C 17开始,您可以使用class template argument deduction并简单地写:
double* data = nullptr; int* remap = nullptr; Remap remap_obj(data,remap);