- Это выглядит очень странно
Это слабый аргумент. Выглядит субъективно.
Список параметров функции просто не является опцией для значения, которое необходимо во время компиляции.
- затрудняет индексирование по сгенерированным во время выполнения индексам
Сгенерированные индексы во время выполнения являются трудными независимо, потому что C ++ является статически типизированным языком без отражения во время выполнения (или даже отражения во время компиляции в этом отношении). Рассмотрим следующую программу:
std::tuple<std::vector<C>, int> tuple;
int index = get_at_runtime();
WHATTYPEISTHIS var = get(tuple, index);
Каким должен быть тип возврата get(tuple, index)
? Какой тип переменной вы должны инициализировать? Он не может вернуть вектор, так как index
может быть 1, и не может вернуть целое число, поскольку index
может быть 0. Типы всех переменных известны во время компиляции в C ++.
Конечно, C ++ 17 ввел std::variant
, что является потенциальной опцией в этом случае. Кортеж был представлен еще в C ++ 11, и это было невозможно.
Если вам нужна индексация во время выполнения кортежа, вы можете написать собственный шаблон функции get
, который принимает кортеж и индекс времени выполнения и возвращает std::variant
. Но использование варианта не так просто, как использование типа напрямую. Это стоимость введения типа времени выполнения в статически типизированный язык.