Вы можете обойти это с помощью одного if
-статирования:
template<typename T>
std::string build_data_from(T val)
{
std::string result;
for (size_t i = 0; i < sizeof(val); i++)
{
result.insert(0, 1, char(val));
if (sizeof (T) > 1)
val = val >> 8;
}
return result;
}
Поскольку условное if (sizeof(T) > 1)
является постоянным для любого T
, компилятор его оптимизирует, поэтому никаких накладных расходов во время выполненияи никаких предупреждений.В случае, если T
является char
, вы даже получите немного более быстрый код, потому что сдвиг оптимизирован.
Кстати: вы должны объявить переменную i
как size_t
, а не int
,результат sizeof()
равен size_t
, и некоторые компиляторы (например, gcc) предупреждают вас, если вы сравниваете целые числа со знаком и без знака.