指向数据类型的指针的类模板推导

时间:2018-01-19 08:10:17

标签: c++ c++11 templates c++14 type-deduction

我有以下包装类:

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原则,因此想解决这个问题。

1 个答案:

答案 0 :(得分:10)

C ++ 17 之前,没有扣除类模板参数。

解决方法是使用某种get_remap模板函数生成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);

Example

此外,使用 C ++ 14 支持get_remap可能会缩短为:

template<typename T>
auto get_remap(T* data, int* remap) {
    return Remap<T>(data, remap);
}

让编译器推导出一种返回类型。

C ++ 17 开始,您可以使用class template argument deduction并简单地写一下:

double* data = nullptr;
int* remap = nullptr;

Remap remap_obj(data, remap);

Example