Цитата(Petka @ Nov 29 2010, 13:47)

Можно проще и на чистом си:
Код
inline void unroll_out(uint8_t count, uint8_t value)
{
PORTB = value;
value <<= 1;
if(count) unroll_out(count-1, value);
}
void foo(uint8_t v)
{
unroll_out(8, v);
}
Есть принципиальная разница: шаблонный вариант всегда разворачивается на этапе компиляции, а сишный содержит рантаймное условие. И тут уже от компилятора зависит, развернет или нет.
Цитата(Petka @ Nov 29 2010, 16:34)

А вот это, кстати, хорошо. Пишешь просто код, который тебе нужен, а если нужна мега оптимизация по скорости просто включаешь её в компиляторе.
Вот ничего хорошего тут нет - поведение непредсказуемое, зависящее от ключей компилятора, от сборки, от версии и ещё бог знает от чего.
Цитата(Petka @ Nov 29 2010, 16:34)

ИМХО код на шаблонах в этом смысле менее гибок получился.
Код на шаблонах получается предсказуемым с гарантированным поведением. Если мне нужен именно unroll, то я его и применяю. И ожидаю, что это будет именно разворачивание. Если мне не нужно разворачивать, то не применяю это. Согласитесь, что вызывать функцию unroll, которая не делает unroll, как-то странно.