Понимание «вызываемого» объекта / вещей в этом коде - PullRequest
2 голосов
/ 29 апреля 2020

У меня возникли проблемы с пониманием "Callable" в этом коде. В записках моего учителя нет подробностей об этом.

    template <typename Callable>
    double averageTime(int iterations, Callable func) {
         auto sum = 0.;
         for (int i = 0; i < iterations; i++) {
             auto before = std::chrono::steady_clock::now();
             func();
             std::chrono::duration<double, std::milli> milliseconds{std::chrono::steady_clock::now() - before };
             sum += milliseconds.count();
         }
         return sum / iterations;
     }

1 Ответ

1 голос
/ 29 апреля 2020

Callable - это просто имя.

Это параметр типа шаблона, и в этом контексте предполагается, что он может вызываться без параметров. Это может или не может возвратить что-либо; ваш пример кода ничего не делает с результатом (если есть).

Примеры:

void foo() {std::cout << "Hi!"; } // a function pointer
struct bar { void operator () const { std::cout << "Lo!"; }}; // a struct

double one   = iterations(10, foo);   //
double two   = iterations(10, bar{}); // an object of type bar
double three = iterations(10, []() {std::cout << "Lambda!"; });

Существенным моментом является то, что каждая из этих переданных вещей может быть вызвана с помощью вызова функции синтаксис.

...