Я пытаюсь определить класс шаблона внутри класса, не являющегося шаблоном, ниже вы можете увидеть код того, что я на самом деле пытаюсь сделать (он не компилируется по очевидной причине). Главный вопрос заключается в том, как я могу реализовать это с помощью С++ 11 (предпочтительнее) или С++ 14?
На самом деле у меня есть решение, использующее std::variant или ту же функцию из BOOST, но мне нужно знать другой способ решить эту проблему.
Я нашел старый похожий вопрос и ответил Энн Куинн звучит ценно (он предлагает объявить подклассы для каждого типа, который мне нужен), но как правильно применить это в коде?
Код:
#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 позволяет вам получить указатель на вектор, тогда вы должны static_cast его привести к вашему типу.
Спасибо!
Buffer
полиморфным и наследовать его от одной базы, не являющейся шаблоном. - person HolyBlackCat   schedule 02.06.2017