Это именно тот случай, когда auto
значительно облегчает жизнь. Вы можете просто сделать:
template <size_t I, typename... T>
void docase(std::tuple<T...> &t) {
auto sc = std::get<I>(t);
auto& ti = sc.param;
sc.pc(std::move(ti));
}
Если вы хотите, чтобы ti
была копией sc.param
, вы можете просто опустить ссылку из auto
:
template <size_t I, typename... T>
void docase(std::tuple<T...> &t) {
auto sc = std::get<I>(t);
auto ti = sc.param;
sc.pc(std::move(ti));
}
Если вы необходимо иметь отдельное объявление и присваивание, тогда вы можете использовать decltype
вместо auto
:
template <size_t I, typename... T>
void docase(std::tuple<T...> &t) {
auto sc = std::get<I>(t);
decltype(sc.param) ti;
ti = sc.param;
sc.pc(std::move(sc.param));
}
Если вам нужно использовать тип несколько раз, вы можете использовать decltype
вместе с using
:
template <size_t I, typename... T>
void docase(std::tuple<T...> &t) {
auto sc = std::get<I>(t);
using casetype = decltype(sc);
typename casetype::type ti;
ti = sc.param;
sc.pc(std::move(sc.param));
}
В качестве альтернативы вы можете просто полностью пропустить ti
и передать param
непосредственно на sc.pc
:
template <size_t I, typename... T>
void docase(std::tuple<T...> &t) {
auto sc = std::get<I>(t);
sc.pc(std::move(sc.param));
}