Если USE_STATIC_ASSERT
is 0
, это работает как ожидается (получение индексированного типа из списка). Если 1 static_assert()
всегда срабатывает. Я бы подумал, что static_assert()
произойдет, только если все typename
с исчерпаны. Почему это не так?Почему «static_assert» всегда вызывается?
#define USE_STATIC_ASSERT 1
template <unsigned int I, typename ...Ts>
struct items;
template <typename T, typename ...Ts>
struct items<0, T, Ts...>
{
typedef T type;
};
template <unsigned int I, typename T, typename ...Ts>
struct items<I, T, Ts...> : items<I-1, Ts...>
{
};
#if USE_STATIC_ASSERT
template <unsigned int I>
struct items<I>
{
static_assert(false, "Ran out of Ts.");
};
#endif
int main()
{
cout << is_same<float, items<1, int, float, double>::type>::value << endl;
}