Шаблоны с переменным числом параметров и кортеж

Есть такой кусочек кода:

...
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);
        ...
    }
    ...
}

Вопрос: Что не так с вариантом использования кортежа вместо вектора? Буду благодарен за помощь:)


Ответы (0 шт):