我有以下包装类:
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
我尽量不违反DRY原则,因此想解决这个问题.
解决方法
在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);
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。