C++ 在构造函数中选择 class 成员的模板类型

C++ choose template type of class member in constructor

我正在尝试在非模板 class 内部定义模板 class,您可能会在下面看到我实际尝试做的代码(由于显而易见的原因,它无法编译) ).主要问题是如何实现使用 C++11(首选)或 C++14?

  1. 实际上我有使用 std::variant 或 BOOST 库中相同函数的解决方案,但我需要知道另一种解决方法。

  2. 我发现了旧的类似 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;
}

编辑:我已经用复制构造函数更新了答案。