У меня есть структура, которая хранит некоторые данные в кортеже. Я хочу построить функцию getWithDefault<n>(m)
, которая получает данные из n-го члена, но заменяет их на m, если значение равно 0. Но для этого мне нужно знать правильный тип данных для m в параметре функции: getWithDefault<>(WhichType?)
. Есть ли способ сделать это? Я пробовал с std::tuple_element
, но, похоже, он не работает.
#include <iostream>
#include <tuple>
template <typename... T>
struct C
{
C(T... args) : t(std::make_tuple(args...)) {}
template <int n>
auto get() const
{ return std::get<n>(t); }
template <int n>
auto getWithDefault(std::tuple_element<n, decltype(t)>::type de) // Compiler error: identifier not found
{
const auto v = get<n>();
return v != 0 ? v : de;
}
private:
const std::tuple<T...> t;
};
int main()
{
C<int, int> c(0, 4);
std::cout << c.getWithDefault<0>(5); // this should return 5
return 0;
}
Я понимаю, почему этот код не работает - std::tuple_element
не имеет доступа к переменной-члену изнутри параметр функции. Итак, существует ли реальный способ определения типа термина кортежа из параметра функции?