#include <tuple>
template <class... T>
struct input
{
std::tuple<T...> var;
input(T&&... t) : var(std::forward<T>(t)...) {}
template <
std::size_t N,
typename std::enable_if<(N < std::tuple_size<decltype(var)>::value)>::type* = nullptr
>
auto get()
-> typename std::tuple_element<N, decltype(var)>::type&&
{
return std::move( std::get<N>(var) );
}
template <
std::size_t N,
typename std::enable_if<(N >= std::tuple_size<decltype(var)>::value)>::type* = nullptr
>
void get()
{
static_assert(N < std::tuple_size<decltype(var)>::value, "Out of bounds!");
}
};
template <class... Args>
void f(Args&&... args)
{
auto arguments = input<Args...>(std::forward<Args>(args)...);
arguments.template get<9>(); // returns 2 but I'd rather throw an exception
}
int main()
{
f(2, 4, 6, 8);
}
I2luY2x1ZGUgPHR1cGxlPgoKdGVtcGxhdGUgPGNsYXNzLi4uIFQ+CnN0cnVjdCBpbnB1dAp7CiAgICBzdGQ6OnR1cGxlPFQuLi4+IHZhcjsKICAgIGlucHV0KFQmJi4uLiB0KSA6IHZhcihzdGQ6OmZvcndhcmQ8VD4odCkuLi4pIHt9CgogICAgdGVtcGxhdGUgPAogICAgICAgICAgc3RkOjpzaXplX3QgTiwKICAgICAgICAgIHR5cGVuYW1lIHN0ZDo6ZW5hYmxlX2lmPChOIDwgc3RkOjp0dXBsZV9zaXplPGRlY2x0eXBlKHZhcik+Ojp2YWx1ZSk+Ojp0eXBlKiA9IG51bGxwdHIKICAgICA+CiAgICBhdXRvIGdldCgpCiAgICAgICAgICAtPiB0eXBlbmFtZSBzdGQ6OnR1cGxlX2VsZW1lbnQ8TiwgZGVjbHR5cGUodmFyKT46OnR5cGUmJgogICAgewogICAgICAgIHJldHVybiBzdGQ6Om1vdmUoIHN0ZDo6Z2V0PE4+KHZhcikgKTsKICAgIH0KCiAgICB0ZW1wbGF0ZSA8CiAgICAgICAgICBzdGQ6OnNpemVfdCBOLAogICAgICAgICAgdHlwZW5hbWUgc3RkOjplbmFibGVfaWY8KE4gPj0gc3RkOjp0dXBsZV9zaXplPGRlY2x0eXBlKHZhcik+Ojp2YWx1ZSk+Ojp0eXBlKiA9IG51bGxwdHIKICAgICA+CiAgICAgdm9pZCBnZXQoKQogICAgIHsKICAgICAgICAgc3RhdGljX2Fzc2VydChOIDwgc3RkOjp0dXBsZV9zaXplPGRlY2x0eXBlKHZhcik+Ojp2YWx1ZSwgIk91dCBvZiBib3VuZHMhIik7CiAgICAgfQp9OwoKdGVtcGxhdGUgPGNsYXNzLi4uIEFyZ3M+CnZvaWQgZihBcmdzJiYuLi4gYXJncykKewogICAgYXV0byBhcmd1bWVudHMgPSBpbnB1dDxBcmdzLi4uPihzdGQ6OmZvcndhcmQ8QXJncz4oYXJncykuLi4pOwoKICAgIGFyZ3VtZW50cy50ZW1wbGF0ZSBnZXQ8OT4oKTsgLy8gcmV0dXJucyAyIGJ1dCBJJ2QgcmF0aGVyIHRocm93IGFuIGV4Y2VwdGlvbgp9CgppbnQgbWFpbigpCnsKICAgIGYoMiwgNCwgNiwgOCk7Cn0K
prog.cpp: In instantiation of ‘void input<T>::get() [with unsigned int N = 9u; typename std::enable_if<(N >= std::tuple_size<decltype (((input<T>*)0)->input<T>::var)>::value), void>::type* <anonymous> = 0u; T = {int, int, int, int}]’:
prog.cpp:34:5: required from ‘void f(Args&& ...) [with Args = {int, int, int, int}]’
prog.cpp:39:17: required from here
prog.cpp:25:10: error: static assertion failed: Out of bounds!