std :: function vs template

Graças ao C ++ 11, recebemos ostd::function família de wrappers functor. Infelizmente, continuo ouvindo apenas coisas ruins sobre essas novas adições. O mais popular é que eles são terrivelmente lentos. Eu testei e eles realmente sugam em comparação com modelos.

#include <iostream>
#include <functional>
#include <string>
#include <chrono>

template <typename F>
float calc1(F f) { return -1.0f * f(3.3f) + 666.0f; }

float calc2(std::function<float(float)> f) { return -1.0f * f(3.3f) + 666.0f; }

int main() {
    using namespace std::chrono;

    const auto tp1 = system_clock::now();
    for (int i = 0; i < 1e8; ++i) {
        calc1([](float arg){ return arg * 0.5f; });
    }
    const auto tp2 = high_resolution_clock::now();

    const auto d = duration_cast<milliseconds>(tp2 - tp1);  
    std::cout << d.count() << std::endl;
    return 0;
}

111 ms vs 1241 ms. Presumo que seja porque os modelos podem ser bem alinhados, enquantofunctions cobrir os internos através de chamadas virtuais.

Obviamente, os modelos têm seus problemas quando os vejo:

eles têm que ser fornecidos como cabeçalhos, o que não é algo que você não deseje fazer ao liberar sua biblioteca como um código fechado,eles podem tornar o tempo de compilação muito mais longo a menos queextern templatecomo política é introduzida,não há (pelo menos conhecido para mim) uma maneira limpa de representar requisitos (conceitos, alguém?) de um modelo, barra um comentário descrevendo que tipo de functor é esperado.

Posso assim supor quefunctions pode ser usado comode fato padrão de passagem de functores, e em locais onde o alto desempenho é esperado modelos devem ser usados?

Editar:

Meu compilador é o Visual Studio 2012sem CTP.

questionAnswers(7)

yourAnswerToTheQuestion