Edited at

Variadic Templatesをstd::getでもってくる

More than 3 years have passed since last update.

#include <type_traits>

#include <tuple>
#include <iostream>

//C++11 後置版
template<std::size_t index, typename... Args>
auto variadic_get(Args&&... args)
-> typename std::remove_reference<decltype(std::get<index>(std::make_tuple(args...)))>::type
{
auto&& tuple = std::forward_as_tuple(args...);
return std::get<index>(tuple);
}

//C++11 前置版
template<std::size_t index, typename... Args>
typename std::remove_reference<decltype(std::get<index>(std::make_tuple(std::declval<Args>()...)))>::type
variadic_get(Args&&... args)
{
auto&& tuple = std::forward_as_tuple(args...);
return std::get<index>(tuple);
}

int main() {
auto&& r = variadic_get<2>(1, 'c', "aaaa");
std::cout << r << std::endl;

return 0;
}

make_tupleはコピーが、tieはそもそもrvalueからlvalueへの変換が行われる...というかできないのでダメ

前置はどうしてもdeclvalが入ってくるので見づらいなあ