C++ 在构造函数中选择 class 成员的模板类型
C++ choose template type of class member in constructor
我正在尝试在非模板 class 内部定义模板 class,您可能会在下面看到我实际尝试做的代码(由于显而易见的原因,它无法编译) ).主要问题是如何实现使用 C++11(首选)或 C++14?
实际上我有使用 std::variant 或 BOOST 库中相同函数的解决方案,但我需要知道另一种解决方法。
我发现了旧的类似 question,Anne Quinn 的回答听起来很有价值(他建议为我需要的每种类型声明 subclasses),但如何申请在代码中是这样吗?
代码:
#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 class.
检索我的缓冲区
UPD2: shared_ptr 解决了复制问题,但是复制会存储相同的对象,如果您想独立修改它们,请使用复制构造函数,如下所示回答。至于访问原始缓冲区,void pointer 允许您检索指向 vector 的指针,那么您应该 static_cast 将其设置为您的类型。
谢谢!
拥有一个基础 class,具有 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;
}
编辑:我已经用复制构造函数更新了答案。
我正在尝试在非模板 class 内部定义模板 class,您可能会在下面看到我实际尝试做的代码(由于显而易见的原因,它无法编译) ).主要问题是如何实现使用 C++11(首选)或 C++14?
实际上我有使用 std::variant 或 BOOST 库中相同函数的解决方案,但我需要知道另一种解决方法。
我发现了旧的类似 question,Anne Quinn 的回答听起来很有价值(他建议为我需要的每种类型声明 subclasses),但如何申请在代码中是这样吗?
代码:
#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 class.
检索我的缓冲区UPD2: shared_ptr 解决了复制问题,但是复制会存储相同的对象,如果您想独立修改它们,请使用复制构造函数,如下所示回答。至于访问原始缓冲区,void pointer 允许您检索指向 vector 的指针,那么您应该 static_cast 将其设置为您的类型。
谢谢!
拥有一个基础 class,具有 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;
}
编辑:我已经用复制构造函数更新了答案。