Здравствуйте, VladD2, Вы писали:
ПК>> ПК>> template<unsigned n>
ПК>> struct NBits
ПК>> {
ПК>> enum { value = NBits<(n >> 1)>::value + 1 };
ПК>> };
ПК>> template<>
ПК>> struct NBits<0>
ПК>> {
ПК>> enum { value = 0 };
ПК>> };
ПК>> unsigned iBits = NBits<sizeof(array) / sizeof(array[0])>::value;
ПК>>
V> А зачем нужна специализация? Ну, "NBits<0>"? Это борьба с кем-то или
V> еще что?
Это "терминальное" значение для избежания бесконечной рекурсии.
V> принцип действия
Один в один перенос твоего кода, только выраженный через рекурсию времени компиляции.
Вот примерный ход вычисления NBits<13>::value
NBits<13>::value = NBits<(13 >> 1)>::value + 1
= NBits<6>::value + 1
= NBits<(6 >> 1)>::value + 1 + 1
= NBits<3>::value + 1 + 1
= NBits<(3 >> 1)>::value + 1 + 1 + 1
= NBits<1>::value + 1 + 1 + 1
= NBits<(1 >> 1)>::value + 1 + 1 + 1 + 1
= NBits<0>::value + 1 + 1 + 1 + 1
= 0 + 1 + 1 + 1 + 1
= 4;
Если бы не было специализации NBits<0>, рекурсия бы не закончилась.
V> Кстати, сработало даже в managed-C++.
Прикольно
Легче одурачить людей, чем убедить их в том, что они одурачены. — Марк Твен