sch*_*312 7 c++ templates c++11 type-deduction c++14
我有以下包装类:
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;
};
Run Code Online (Sandbox Code Playgroud)
如果我称它为:
Remap<double> remap(data, remap);
Run Code Online (Sandbox Code Playgroud)
数据的类型double *.如果我试图让编译器(intel icc 15.0.3,-std = c ++ 11)推导出模板类型:
Remap remap(data, remap);
Run Code Online (Sandbox Code Playgroud)
它失败并显示错误消息:
argument list for class template "Remap" is missing
我尽量不违反DRY原则,因此想解决这个问题.
Edg*_*jān 10
在C++ 17之前,没有类模板参数的推论.
解决方法是使用某种get_remap模板函数生成Remap对象:
template<typename T>
Remap<T> get_remap(T* data, int* remap) {
return Remap<T>(data, remap);
}
Run Code Online (Sandbox Code Playgroud)
然后使用它像:
double* data = nullptr;
int* remap = nullptr;
auto remap_obj = get_remap(data, remap);
Run Code Online (Sandbox Code Playgroud)
此外,使用C++ 14支持get_remap可能会缩短为:
template<typename T>
auto get_remap(T* data, int* remap) {
return Remap<T>(data, remap);
}
Run Code Online (Sandbox Code Playgroud)
让编译器推导出一种返回类型.
从C++ 17开始,您可以使用类模板参数推导并简单地写:
double* data = nullptr;
int* remap = nullptr;
Remap remap_obj(data, remap);
Run Code Online (Sandbox Code Playgroud)