Сначала позвольте мне высказать несколько вещей о смене, который является источником вашей проблемы:
Нет гарантии, что long int
на самом деле 64-битный.
Самый общий способ, которым я могу думать, - использовать std::numeric_limits
:
static_cast(1) << (std::numeric_limits::digits - 1);
Теперь вы можете даже сделать эту шаблонную функцию constexpr:
template
constexpr Integer foo()
{
return static_cast(1) << (std::numeric_limits::digits - 1);
}
Таким образом, заменяя сдвиг с static_cast
исправит вашу проблему, однако есть намного лучший способ:
std::numeric_limits
включает в себя кучу полезных вещей, в том числе:
std::numeric_limits::max(); // the maximum value T can hold
std::numeric_limits::min(); // the minimum value T can hold
std::numeric_limits::digits; // the number of binary digits
std::numeric_limits::is_signed(); // well, do I have to explain? ;-)
См. cppreference.com для полного списка. Вы должны предпочесть возможности, предоставляемые стандартной библиотекой, потому что у нее, скорее всего, будет меньше ошибок, и другие разработчики сразу это узнают.