Поскольку вы знаете, что будете использовать unsigned
в качестве типа для mask
, нет необходимости полагаться на mask
для выполнения static_assert
. Сделайте это сразу после начала цикла.
SomeType x = getX();
static_assert(sizeof 1u >= sizeof x, "Type of numeric parameter is too long");
for(auto mask = 1u << CHAR_BIT*sizeof x-1; /*...*/; /*...*/)
{
/*...*/
}
Более чистым вариантом будет использование вспомогательной функции.
template <typename RetType, typename SomeType>
RetType make_mask(RetType in, SomeType const& x)
{
static_assert(sizeof in >= sizeof SomeType, "Type of numeric parameter is too long");
return (in << (CHAR_BIT*sizeof SomeType)-1);
}
и используйте
for(auto mask = make_mask(1u, x); /*...*/; /*...*/)
{
/*...*/
}