Одно приложение должно обрабатывать наборы данных, над которыми могут выполняться некоторые операции. Каждый набор данных содержит массив точек определенного типа данных (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*>() );
Какой правильный подход для этого? Или обрабатывать коллекцию объектов с разными типами значений, над которыми я могу выполнять одни и те же операции?
Если есть фиксированный диапазон, вы можете использовать boost::variant
еще посмотрим boost::any
,
Вы можете сделать что-то вроде этого:
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
вместо.