У меня есть класс, который мой клиент использует для получения () пакета. Пакет содержит std :: vector, тип которого неизвестен до тех пор, пока пакет не будет сгенерирован внутренне в моем классе интерфейса (в этом примере это зависит от переменной Packet :: type).
Мне было интересно, можно ли использовать шаблон для этого, поскольку класс Packet - это просто обобщенный класс, тип которого может быть почти любым.
Проблема с этим, насколько я могу судить, заключается в том, что клиент не имеет ни малейшего представления, какой это тип пакета, пока не получит пакет и не посмотрит на элемент Packet :: type. Таким образом, это не будет работать, потому что он не сможет объявить переменную, которую Get () вернет (?)
Может ли шаблон элегантно использоваться в этом случае?
Одна альтернатива, о которой я мог подумать, - это определить базовый класс и создать дочерний класс для каждого типа. Затем метод Get () может вернуть указатель на базовый класс. Затем клиент может просто посмотреть на Packet :: type (packet-> type) и привести его к соответствующему дочернему классу. Но это немного грязно? Есть ли более элегантное решение?
Код ниже примерно демонстрирует сценарий:
enum
{
T_FLOAT,
T_COMPLEX
} TYPE_ENUM;
// T can either be of type float or std::complex
template<typename T>
class Packet
{
public:
TYPE_ENUM type;
std::vector<T> data;
};
class Interface
{
public:
// Method that client calls to obtain the packet
Packet<> Get()
{
return queue.pop(); // return current packet in queue
}
private:
Queue<Packet> queue;
};