Итераторы и шаблоны в c ++

0

У меня есть следующая иерархия. Файл:

vector<Dataset<here lies the problem!!!>>

то я хочу, чтобы каждый Dataset был:

vector<Record>

но Record - это тип шаблона, то есть вы создаете набор данных следующим образом:

Dataset<Record> dataset;

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

Дополнительные разъяснения:

Набор данных - это набор данных CSV, под которым я подразумеваю больше строк CSV. Запись - это в основном одна строка CSV, но представленная пользователем структура.

И это не так много об итерации, так же как и о хранении. У нас может быть что-то вроде 20 наборов данных, и мы хотим хранить их в одной структуре, как вектор или что-то в этом роде. Так что речь идет не только об итерации.

  • 4
    Вы должны предоставить больше контекста. Как связаны Dataset и Record ? Как они объявлены?
  • 0
    Я добавил уточнение :)
Показать ещё 1 комментарий
Теги:
c++11

2 ответа

2
Лучший ответ

Если они имеют разные типы, итерация над ними не имеет смысла; какой код будет работать на каждом типе набора данных?

Как только вы найдете ответ на этот вопрос, отвлеките эту информацию и либо используйте в качестве интерфейса, либо наделите 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 и создать концепцию, которая будет иметь поведение, которое вы хотите.

  • 0
    На самом деле нам действительно нужно иметь возможность перебирать наборы данных, а затем и записи в наборе данных.
  • 0
    Это ничего не меняет в том, что вам нужно делать.
Показать ещё 2 комментария
0

Вот что вы можете сделать:

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

  • 0
    Поскольку это «заданная пользователем структура», variant не очень подходит, потому что вы не знаете типы заранее. В противном случае, конечно, используйте его.
  • 1
    @BartekBanachewicz «У нас может быть что-то вроде 20 наборов данных» <- казалось, что типы были известны

Ещё вопросы

Сообщество Overcoder
Наверх
Меню