Шаблоны с переменным числом параметров и кортеж
Есть такой кусочек кода:
...
template<typename ...Types>
double Operations::math(const OpString &op, const Types&... args)
{
std::tuple<Types...> values{args...};
OpAction action = Operations::getAction(op);
switch(action)
{
case OpAction::plus :
return std::get<0>(values) + std::get<1>(values);
...
}
...
}
на вход метод принимает строку с операцией и операнды, например:
op.math("+", 2, 3);
или
op.math("√", 4);
При компиляции компилятор жалуется на выражение:
return std::get<0>(values) + std::get<1>(values);
ошибка: no matching function for call to ‘get<1>(std::tuple<double>&)’ return std::get<0>(values) + std::get<1>(values); ~~~~~~~~~~~^~~~~~~~
ошибка: static assertion failed: tuple index is in range static_assert(__i < tuple_size<tuple<>>::value, ^~~~~~~~~~~~~
При этом если заменить 1 индекс на 0, то компилятор не жалуется:
return std::get<0>(values) + std::get<0>(values);
Также, если вместо распаковки пакета параметров захардкодить какие-то числа, то все работает:
std::tuple<double, double> values{1.2, 2.5};
Также, если заменить кортеж на вектор, то все компилируется:
...
template<typename ...Types>
double Operations::math(const OpString &op, const Types&... args)
{
std::vector<double> values{args...};
OpAction action = Operations::getAction(op);
switch(action)
{
case OpAction::plus :
return values.at(0) + values.at(1);
...
}
...
}
Вопрос: Что не так с вариантом использования кортежа вместо вектора? Буду благодарен за помощь:)