Вот есть такая штука:
template<class F>
void foo(F f) {
    for(int i = 0; i < 100; i++)
    f(i);
}Наверное, это очевидно, но gcc не инлайнит¹ вызов f, если f - это функция. Поэтому приходится писать
template <void f(int)>
void foo() { /* ... */ }Либо оборачивать f в какую-нибудь лямбду или класс с оператором ().
1) На самом деле инлайнит, если foo() используется только один раз в коде.
 
