std :: funcion vs plantilla

Gracias a C ++ 11 recibimos elstd::function Familia de envoltorios de functor. Desafortunadamente, sigo escuchando solo cosas malas sobre estas nuevas adiciones. Lo más popular es que son terriblemente lentos. Lo probé y realmente apestan en comparación con las plantillas.

#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 frente a 1241 ms. Supongo que esto se debe a que las plantillas pueden estar bien alineadas, mientras quefunctions cubrir las partes internas a través de llamadas virtuales.

Obviamente las plantillas tienen sus problemas como yo las veo:

deben proporcionarse como encabezados, lo que no es algo que no desee hacer al liberar su biblioteca como un código cerrado,pueden hacer que el tiempo de compilación sea mucho más largo a menos queextern template-como se introduce la política,no hay (al menos que yo sepa) una forma clara de representar los requisitos (¿conceptos, alguien?) de una plantilla, menos un comentario que describa qué tipo de functor se espera.

¿Puedo asumir así quefunctions se puede utilizar comode facto ¿Estándar de los funtores de paso, y en lugares donde se espera un alto rendimiento, deberían usarse plantillas?

Editar:

Mi compilador es el Visual Studio 2012.sin CTP.

Respuestas a la pregunta(7)

Su respuesta a la pregunta