c++ - 通过具有模板专长的基类以const方法调整本地容器的大小

标签 c++ templates c++14 constants specialization

我想创建一个类的实例,并根据类型提供一种调整大小的功能,该功能仅适用于提供这种功能的容器(为简单起见,假设它只是一个 vector )。调整大小是在基类中完成的,因为我有几个具有相同基数但都需要相同功能的类。

以下代码演示了当前的问题

#include <iostream>
#include <vector>

class base {
  public:
    template<typename T>
    void resize(T &var, T &resizer) {
      var.resize(resizer.size());
      std::cout << "resized a vector" << std::endl;
    }

    void resize(double &var, double &resizer) {
      std::cout << "just a double, no resizing done" << std::endl;
    }
};

template<typename T>
class child1 : public base {
  public:
    void doOperation() const {
      T a, b;
      // assume here that b has actually a different size from a
      this->resize(a, b);
    }
};

template<typename T>
class child2 : public base {
  public:
    void wildlyDifferentOperation() const {
      T c, d;
      // assume here that d has actually a different size from c
      this->resize(c, d);
    }
};

int main() {
  child1<std::vector<double>> obj1;
  obj1.doOperation();

  child2<std::vector<int>> obj2;
  obj2.wildlyDifferentOperation();

  child1<double> obj3;
  obj3.doOperation();
  return 0;
}

如此处所示,我使用模板专门化来捕获无法调整大小的类型(并且我知道它将始终是 double 型),并且我对可以调整大小的容器使用模板化版本,因为我不知道该提前调整哪个类型我实际需要的类型(即可能是std::vector<int>std::vector<double>等...)。

当然,如果我从const方法中删除doOperation(),则该代码可以按预期工作,但是使用const时,我会得到一个错误,说error: passing ‘const child1<std::vector<double> >’ as ‘this’ argument discards qualifiers [-fpermissive]并不奇怪(而且child2和wildlyDifferentOperation()的信息类似)。

我现在的问题是如何使用上面的代码使其正常工作?我虽然可以const_cast this->resize中的参数,也可以使用mutable,然后将T a声明为类成员变量,但无济于事。
欢迎提出任何建议,但我希望以下内容保持不变:
  • void doOperation()wildlyDifferentOperation()应该保留为const
  • 我希望能够在T adoOperation()内将局部变量创建为wildlyDifferentOperation(),并将它们传递到单独的方法中,如果它们是容器,它们将被调整大小。为了简化起见,我知道我会得到一个double或一个容器,但是我不想对容器的模板参数施加任何限制(即,接受std::vector,std::vector等) )
  • 我需要能够使用相同的功能来调整来自基类的其他子类的容器大小。

  • 如果有一个更清洁的解决方案,不需要模板特化,那也是可以接受的。但是,它应与C++ 14兼容编译器一起使用。

    最佳答案

    base::resize设置为staticconst。不知道您要在这里做什么的语义,我猜想const

    关于c++ - 通过具有模板专长的基类以const方法调整本地容器的大小,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58666499/

    相关文章:

    c# - ASP.NET MVC 电子邮件

    c++ - 如何更改模板实例化顺序?

    c++ - 关于类模板和函数模板SFINAE的问题

    c++ - 在 `std::future` 中运行循环直到破坏 - 惯用方式?

    java - 从 C++ 调用 Java

    C++ is_trivially_copyable 检查

    c++ - 我一直在尝试实现和 AVL 树,但我不断收到这 2 个错误 C2954 和 C2955,并且不知道如何解决它们

    c++ - 为什么派生模板类的函数不覆盖非模板基类的纯虚函数?

    c++ - 计算 C++ 头文件中的所有宏

    c++ - 简单程序中奇怪的引用传递问题