Можете ли вы использовать несколько std :: t ie в объявлении / инициализации переменной без повторения std :: t ie? - PullRequest
0 голосов
/ 01 апреля 2020

Я использую std::tie для инициализации некоторых переменных из кортежа, подобного этому:

int a1, a2;
std::tie(a1, a2) = tupleA;

Мне интересно, возможно ли это сделать с несколькими кортежами? без повтор std::tie, что-то вроде этого:

int a1, a2, b1, b2;
std::tie(a1, a2) = tupleA,
  (b1, b2) = tupleB;

Приведенный выше код не компилируется . Я хочу получить следующее без повторения std::tie:

int a1, a2, b1, b2;
std::tie(a1, a2) = tupleA;
std::tie(b1, b2) = tupleB;

Другие типы

Если я хочу сделать то же самое с int в качестве примера, Я мог бы легко сделать это:

int a = 1,
  b = 3;

Мне не нужно писать int b; b одного достаточно.

Есть ли способ сделать это с std::tie?

Ответы [ 2 ]

2 голосов
/ 02 апреля 2020

Прежде всего, я ненавижу кортежи.
ИМО (должен подчеркнуть, что это мое личное мнение), они чрезмерно используются, что приводит к гораздо менее читаемому коду.
Даже в текущем проекте, когда я сталкиваюсь с кортежем как типом возврата Я должен проверить реализацию вызываемой функции, чтобы понять, что означает некоторая часть кортежа.

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

В топи c:

Вы можете объединить кортежи :

auto [a1, a2, b1, b2] = std::tuple_cat(tupleA, tupleB);

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

2 голосов
/ 01 апреля 2020

Нет способа сделать это с std::tie. std::tie - это функция, а не тип, поэтому вы не можете использовать «грамматику создания переменных» (int a = 1, b = 3;) с ней.

Если вы можете обновить до C ++ 17, вы можете использовать структурированное связывание для преобразования

int a1, a2, b1, b2;
std::tie(a1, a2) = tupleA;
std::tie(b1, b2) = tupleB;

в

auto [a1, a2] = tupleA;
auto [b1, b2] = tupleB;

, что экономит Вы немного печатаете.

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