繁体   English   中英

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

[英]C++ choose template type of class member in constructor

我正在尝试在非模板类内部定义模板类,下面您可能会看到我实际上在尝试执行的代码(由于明显的原因,它无法编译)。 主要问题是我如何才能意识到使用C ++ 11(首选)或C ++ 14?

  1. 实际上,我已经从BOOST库中使用std :: variant或相同函数获得了解决方案,但是我需要知道另一种解决方案。

  2. 我发现了一个类似的老问题 ,并且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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM