У меня есть следующая иерархия. Файл:
vector<Dataset<here lies the problem!!!>>
то я хочу, чтобы каждый Dataset был:
vector<Record>
но Record - это тип шаблона, то есть вы создаете набор данных следующим образом:
Dataset<Record> dataset;
Мне нужно иметь возможность перебора наборов данных, а затем для каждого набора данных перебирать записи, но я не могу, потому что у каждого набора данных есть своя собственная запись, поэтому в основе каждого набора данных лежит другой тип, и я не могу иметь разные типы в векторе.
Дополнительные разъяснения:
Набор данных - это набор данных CSV, под которым я подразумеваю больше строк CSV. Запись - это в основном одна строка CSV, но представленная пользователем структура.
И это не так много об итерации, так же как и о хранении. У нас может быть что-то вроде 20 наборов данных, и мы хотим хранить их в одной структуре, как вектор или что-то в этом роде. Так что речь идет не только об итерации.
Если они имеют разные типы, итерация над ними не имеет смысла; какой код будет работать на каждом типе набора данных?
Как только вы найдете ответ на этот вопрос, отвлеките эту информацию и либо используйте в качестве интерфейса, либо наделите Datasets наследством или используйте некоторое стирание типа TMP.
class Apple { ... };
class Pear { ... };
vector<SomeTypeThatCanHoldApplesAndPears> v;
for (x : v) {
// what do you want to do with x?
}
И пример, который полностью заполняет это:
// They are both fruits and have a color!
class Fruit { public: virtual Color getColor() = 0; }
class Apple : public Fruit { /* implement getColor */ };
class Pear : public Fruit { /* implement getColor */ };
Теперь используйте только vector
указателя ссылочного типа обложек или стирания стилей, который может содержать Fruit
s:
for (fruit : v) {
fruit.getColor();
}
Вы можете использовать Boost.TypeErasure
и создать концепцию, которая будет иметь поведение, которое вы хотите.
Вот что вы можете сделать:
template <typename R>
struct DataSet
{
typedef R record_type;
};
int main()
{
std::vector<boost::variant<DataSet<int>, DataSet<std::string>>> datasets;
}
см. здесь для получения дополнительной информации http://www.boost.org/doc/libs/1_55_0/doc/html/variant.html
variant
не очень подходит, потому что вы не знаете типы заранее. В противном случае, конечно, используйте его.
Dataset
иRecord
? Как они объявлены?