[英]C++ choose template type of class member in constructor
我正在尝试在非模板类内部定义模板类,下面您可能会看到我实际上在尝试执行的代码(由于明显的原因,它无法编译)。 主要问题是我如何才能意识到使用C ++ 11(首选)或C ++ 14?
实际上,我已经从BOOST库中使用std :: variant或相同函数获得了解决方案,但是我需要知道另一种解决方案。
我发现了一个类似的老问题 ,并且Anne Quinn的回答听起来很有价值(他建议为我需要的每种类型声明子类),但是如何在代码中正确地应用它呢?
码:
#include <vector>
#include <cstdint>
enum Type {
INT16,
UINT32
};
template<typename T>
class Buffer {
public:
Buffer(uint32_t paramSize) {
buffer.resize(paramSize);
}
private:
std::vector<T> buffer;
};
class Foo {
public:
Foo(Type paramType, uint32_t paramSize) {
switch(paramType) {
case UINT32:
buffer = Buffer<uint32_t>(paramSize);
break;
case INT16:
buffer = Buffer<int16_t>(paramSize);
break;
}
}
private:
Buffer buffer;
};
int main() {
Foo var(INT16, 30);
return 0;
}
UPD1: @ user2308211的回答似乎可行,但是我遇到了两个问题。 如果我要复制对象Foo且原始对象由于某种原因(例如,移出范围)而被破坏,则复制将保留指向无处的指针。 第二个是如何通过Foo类检索我的缓冲区。
UPD2: shared_ptr解决了复制问题,但是如果您想独立修改它们,则复制将存储相同的对象,请使用答案中所示的复制构造函数。 至于访问原始缓冲区,可以使用void指针检索指向vector的指针,然后应将其static_cast转换为您的类型。
谢谢!
具有一个基本类,其中包含Buffer
作为纯虚拟的所有必需功能。
#include <vector>
#include <cstdint>
enum Type {
INT16,
UINT32
};
class BufferBase {
public:
virtual void someFn()=0;
virtual ~BufferBase() {}
};
template<typename T>
class Buffer:public BufferBase {
public:
Buffer(uint32_t paramSize) {
buffer.resize(paramSize);
}
void someFn() override {
//functionality.
}
~Buffer() {}
private:
std::vector<T> buffer;
};
class Foo {
public:
Foo(Type paramType, uint32_t paramSize) {
this->bufferType = paramType;
switch(paramType) {
case UINT32:
buffer = new Buffer<uint32_t>(paramSize);
break;
case INT16:
buffer = new Buffer<int16_t>(paramSize);
break;
}
}
~Foo() {
delete this->buffer;
}
Foo &operator=(const Foo &other) {
this->bufferType = other.bufferType;
switch(bufferType) {
case UINT32:
buffer = new Buffer<uint32_t>(*static_cast<Buffer<uint32_t>*>(other.buffer));
break;
case INT16:
buffer = new Buffer<int16_t>(*static_cast<Buffer<int16_t>*>(other.buffer));
break;
}
return *this;
}
Foo(const Foo &other) {
*this=other;
}
private:
BufferBase *buffer;
Type bufferType;
};
int main() {
Foo var1(INT16, 30), var2(UINT32, 25);
var1 = var2;
return 0;
}
编辑:我已经用副本构造函数更新了答案。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.