У меня есть этот кусок кода и хочу, чтобы понять:Понять, как вычислить сумму во время компиляции
template <unsigned...>
struct sum;
template<unsigned size>
struct sum<size>
{
enum {value = size};
};
template<unsigned size, unsigned... sizes>
struct sum<size, sizes...>
{
enum { value = size + sum<sizes...>::value };
};
int _tmain(int argc, _TCHAR* argv[])
{
sum<1, 2>::value;
return 0;
}
Я не понимаю, почему невыполненная сумма (которая принимает беззнаковую ... так же, как последний STRUCT специализацию , не конфликт?) должен присутствовать на всех и как можно специализироваться сумму, используя те же параметры из шаблона части (e.g. sum<size, sizes...>
же, как template <unsigned size, sizes...>
. Почему ниже просто не работает?
template<unsigned size>
struct sum
{
enum {value = size};
};
template<unsigned size, unsigned... sizes>
struct sum
{
enum { value = size + sum<sizes...>::value; };
};
Да, я понимаю, что касается именования. Но как получается, что первая нереализованная сумма не затухает (неоднозначна) с последней? Когда пользователь называет сумму <1, 2>, она должна соответствовать как нереализованной, так и последней специализации – Gmt
@Gmt: Это правда, но специализации имеют приоритет. Я добавил к этому сообщение об этом. –