C ++ Array или Vector шаблонных классов с различными параметрами шаблона типа значения

Одно приложение должно обрабатывать наборы данных, над которыми могут выполняться некоторые операции. Каждый набор данных содержит массив точек определенного типа данных (int32, int16, float, complex), и те же операции могут выполняться с данными, содержащимися в каждом наборе данных. Например, преобразование Фурье или фильтр. Поэтому в модели данных (используемой в шаблоне модель-представление-контроллер) я хотел сохранить коллекцию открытых наборов данных, каждый со своим собственным типом данных.

Следующий Как поместить разные типы шаблонов в один вектор, Для помещения шаблонов классов с разными параметрами типов могут использоваться варианты наследования или буста.

Я хотел бы избежать использования вариантов, и я хотел бы сохранить тип значения.

То, что я хотел бы, чтобы хранить вектор (если возможно, массив был бы лучше) классов с различными параметрами шаблона:

    template < typename T >
class DataSet {
private:
T data;
// ...
public:
T getData() {return data;}
};

std::vector< DataSet< something > > v;
v.push_back( DataSet<int32_t*>() );
v.push_back( DataSet<float*>()   );
v.push_back( DataSet<int16_t*>() );

Какой правильный подход для этого? Или обрабатывать коллекцию объектов с разными типами значений, над которыми я могу выполнять одни и те же операции?

1

Решение

Если есть фиксированный диапазон, вы можете использовать boost::variantеще посмотрим boost::any,

0

Другие решения

Вы можете сделать что-то вроде этого:

struct Base {};
template <class T> struct Data : public Base { T x; };
vector<Data*> elements;
elements.push_back(new Data<int>{3});
elements.push_back(new Data<char>{'a'});

Причина использования указателя заключается в том, что все векторные элементы должны иметь одинаковый размер, поэтому мы не можем хранить объект напрямую, но вместо этого вынуждены использовать указатель. Вы можете использовать typeid запросить тип элемента

`if (typeid(*elements[0]) == typeid(Data<int>))`

Этот метод влечет за собой штраф за время выполнения, так же, как и использование вариантов наддува. Если вы заранее знаете, какой тип будет иметь каждое поле, было бы разумно использовать tuple вместо.

-2

По вопросам рекламы [email protected]