【问题标题】:Class template deduction for a pointer to a datatype指向数据类型的指针的类模板推导
【发布时间】:2018-06-28 10:21:27
【问题描述】:

我有以下包装类:

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, with -std=c++11)推断模板类型:

Remap remap(data, remap);

失败并显示错误消息:

argument list for class template "Remap" is missing

我尽量不违反DRY 原则,因此想解决这个问题。

【问题讨论】:

  • 升级到C++17,支持类模板参数推导。

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


【解决方案1】:

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);

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

【讨论】:

  • 哈,我也正要写,只是有一点不同:auto make_remap(...)
  • @Aconcagua 和 auto 更好:)
  • (+1) for make_remap,有很多 make_... 函数设计或多或少具有相同的意图,这使得它们的名称有点惯用。
  • @Aconcagua:函数返回类型推导需要C++14,不过OP目前使用C++11。
猜你喜欢
  • 2021-06-22
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-12-16
  • 1970-01-01
相关资源
最近更新 更多