我有這樣的代碼,我試圖讓編譯時間訪問與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
的手段來得到這個工作?
如何加入'static_assert(IN_RANGE, 「???」);'? – 2013-05-03 19:39:16
我試過了。它不會工作,因爲要這樣做,我會改變'tuple_element''到tuple_element '。這樣的話,會導致編譯錯誤,如果'N'超出範圍(之前它甚至*獲取*評估'static_assert'。 –
2013-05-03 19:41:54
例外是運行時錯誤,而這是一個編譯時錯誤(實際上,它是一個*編程*錯誤,這異常並不意味着處理) – 2013-05-03 19:42:40