【发布时间】:2017-11-03 05:40:46
【问题描述】:
我正在尝试在非模板类中定义模板类,您可能会在下面看到我实际尝试执行的代码(由于显而易见的原因,它无法编译)。主要问题是我如何才能意识到使用 C++11(首选)或 C++14?
实际上,我已经使用std::variant 或 BOOST 库中的相同函数获得了解决方案,但我需要知道另一种解决方法。
我发现了类似的 question,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指针允许您检索指向向量的指针,然后您应该将其静态转换为您的类型。
谢谢!
【问题讨论】:
-
您可以使您的
Buffer多态并从单个非模板库继承它。 -
@HolyBlackCat 我需要看一些实现的例子,对我来说听起来很新鲜
标签: c++ class c++11 templates dynamictype