Сообщение Re: Мета-рекурсия от 03.08.2015 12:51
Изменено 03.08.2015 19:23 watchmaker
Здравствуйте, Шахтер, Вы писали:
Ш>Считаем число бит в беззнаковом типе.
Не считает:
Ш>Теперь некоторые вещи можно упростить.
Вот сначала приведи в соответствие со стандартом предыдущий код, а потом сравни простоту и понятность с тем же
Ш>Считаем число бит в беззнаковом типе.
Не считает:
error: recursive template instantiation exceeded maximum depth
А всё из-за того, что из Bits<T, 0> идёт бесконечно рекурсивный вызов к Bits<T, 0>. Если бы это были обычные функции, то такой рекурсивный вызов не происходил бы из-за условия в тернарном операторе, но для шаблонов соответствующую ветку компилятор всё равно обязан рассмотреть.Ш>Теперь некоторые вещи можно упростить.
Вот сначала приведи в соответствие со стандартом предыдущий код, а потом сравни простоту и понятность с тем же
template <class UInt> constexpr auto BitsOf = std::numeric_limits<UInt>::digits;
Re: Мета-рекурсия
Здравствуйте, Шахтер, Вы писали:
Ш>Считаем число бит в беззнаковом типе.
Не считает:
Ш>Теперь некоторые вещи можно упростить.
Вот сначала приведи в соответствие со стандартом предыдущий код, а потом сравни простоту и понятность с тем же
Ну или с вариантом, завёрнутым в свой шаблон с аналогичным твоему именем:
Ш>Считаем число бит в беззнаковом типе.
Не считает:
error: recursive template instantiation exceeded maximum depth
А всё из-за того, что из Bits<T, 0> идёт бесконечно рекурсивный вызов к Bits<T, 0>. Если бы это были обычные функции, то такой рекурсивный вызов не происходил бы из-за условия в тернарном операторе, но для шаблонов соответствующую ветку компилятор всё равно обязан рассмотреть.Ш>Теперь некоторые вещи можно упростить.
Вот сначала приведи в соответствие со стандартом предыдущий код, а потом сравни простоту и понятность с тем же
std::numeric_limits<UInt>::digits
Ну или с вариантом, завёрнутым в свой шаблон с аналогичным твоему именем:
template <class UInt> constexpr auto BitsOf = std::numeric_limits<UInt>::digits;