我有这段代码,我正在尝试使用std::get
. 当用户在元组中输入一个超出范围的数字时,我想抛出一个异常。不幸的是,我无法让它工作,所以我让代码返回数组中的第一个元素,如果它超出范围。
#include <tuple>
template <class... T>
struct input
{
std::tuple<T...> var;
input(T&&... t) : var(std::forward<T>(t)...) {}
template <
std::size_t N,
bool in_range = 0 <= N && N < std::tuple_size<decltype(var)>::value
>
auto get()
-> typename std::tuple_element<in_range ? N : 0, decltype(var)>::type&&
{
return std::move( std::get<in_range ? N : 0>(var) );
}
};
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);
}
我怎样才能抛出异常或者至少使用一个static_assert
技巧来让它工作?