std :: function vs template

Dzięki C ++ 11 otrzymaliśmystd::function rodzina owijek functor. Niestety, wciąż słyszę tylko złe rzeczy na temat tych nowych dodatków. Najbardziej popularne jest to, że są strasznie powolne. Przetestowałem to i naprawdę są do bani w porównaniu z szablonami.

#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. Zakładam, że to dlatego, że szablony mogą być ładnie podkreślonefunctions pokrycie wewnętrznych poprzez wirtualne połączenia.

Oczywiście szablony mają swoje problemy, tak jak je widzę:

muszą być dostarczone jako nagłówki, co nie jest czymś, czego nie chcesz robić, gdy uwalniasz swoją bibliotekę jako kod zamknięty,mogą wydłużyć czas kompilacji, chyba żeextern templatepodobnie jak polityka,nie ma (przynajmniej mi wiadomo) czystego sposobu reprezentowania wymagań (pojęć, kogokolwiek?) szablonu, baru komentarz opisujący jakiego rodzaju funktora jest oczekiwany.

Czy mogę to założyć?functions mogą być używane jakode facto standard przechodzących funktorów, aw miejscach, gdzie oczekuje się wysokiej wydajności, należy stosować szablony?

Edytować:

Moim kompilatorem jest Visual Studio 2012bez CTP.

questionAnswers(7)

yourAnswerToTheQuestion