Как улучшить std :: tuple с пустыми полями? - PullRequest
0 голосов
/ 27 апреля 2018

Я думаю, что имеет смысл иметь пустые поля в std :: tuple, если вы не обращаетесь к этому полю - но вы должны иметь возможность создавать экземпляр кортежа. Вот пример:

template <typename... T>
struct Table {
  std::vector<std::tuple<T...>> data;
  std::tuple<std::unordered_map<T, std::vector<size_t>>...> indices;
};

Здесь у нас есть поле в индексах для каждого столбца данных. Предположим, что вы не создаете индексы для каждого столбца. В идеале, я бы не хотел платить за то, чтобы у меня никогда не было пустого std :: unordered_map.

Какие у меня есть альтернативы?

Редактировать: другими словами, как я могу создать что-то вроде разреженный кортеж?

1 Ответ

0 голосов
/ 27 апреля 2018

Технически, потому что типы для кортежа должны быть ссылочными. Семантически, потому что void не является типом полного статуса.

void больше похоже на тип. Вы не можете ссылаться на него, sizeof на самом деле не является законным, и для использования в качестве типа для кортежа это должно быть. Который будет крутить всякие странные вопросы. Так что должно быть sizeof (void)? tuple<int,void> и tuple<int> одинаковы или нет?

Таким образом, идиоматическое решение состоит в том, чтобы использовать фактический тип, назначенный для задания std::ignore, который буквально создан для этого:

Объект неопределенного типа, так что ему может быть присвоено любое значение без эффекта. Предназначен для использования с std::tie при распаковке std::tuple, в качестве заполнителя для аргументов, которые не используются.

Он также определен в tuple, поэтому не создавайте свою собственную структуру, доверьтесь стандартной библиотеке.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...