我想创建一个类的实例,并根据类型提供一种调整大小的功能,该功能仅适用于提供这种功能的容器(为简单起见,假设它只是一个 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 a
和doOperation()
内将局部变量创建为wildlyDifferentOperation()
,并将它们传递到单独的方法中,如果它们是容器,它们将被调整大小。为了简化起见,我知道我会得到一个double
或一个容器,但是我不想对容器的模板参数施加任何限制(即,接受std::vector,std::vector等) )如果有一个更清洁的解决方案,不需要模板特化,那也是可以接受的。但是,它应与C++ 14兼容编译器一起使用。
最佳答案
将base::resize
设置为static
或const
。不知道您要在这里做什么的语义,我猜想const
。
关于c++ - 通过具有模板专长的基类以const方法调整本地容器的大小,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58666499/