#include <iostream>
#include <chrono>
using namespace std;
template<typename TimeT = std::chrono::milliseconds>
struct measure
{
template<typename F, typename ...Args>
static typename TimeT::rep execution(F func, Args&&... args)
{
auto start = std::chrono::system_clock::now();
// Now call the function with all the parameters you need.
func(std::forward<Args>(args)...);
auto duration = std::chrono::duration_cast< TimeT>(std::chrono::system_clock::now() - start);
return duration.count();
}
};
struct functor
{
int state;
functor(int state) : state(state) {}
void operator()() const
{
std::cout << "In functor run for ";
}
};
void func()
{
std::cout << "In function, run for " << std::endl;
}
void func(int arg) {}
int main()
{
int dummy(1);
std::cout << measure<>::execution( [&]() {
func(dummy);
}) << std::endl;
std::cout << measure<>::execution(functor(dummy)) << std::endl;
std::cout << measure<>::execution(func);
return 0;
}
I2luY2x1ZGUgPGlvc3RyZWFtPgojaW5jbHVkZSA8Y2hyb25vPgoKdXNpbmcgbmFtZXNwYWNlIHN0ZDsKCnRlbXBsYXRlPHR5cGVuYW1lIFRpbWVUID0gc3RkOjpjaHJvbm86Om1pbGxpc2Vjb25kcz4Kc3RydWN0IG1lYXN1cmUKewogICAgdGVtcGxhdGU8dHlwZW5hbWUgRiwgdHlwZW5hbWUgLi4uQXJncz4KICAgIHN0YXRpYyB0eXBlbmFtZSBUaW1lVDo6cmVwIGV4ZWN1dGlvbihGIGZ1bmMsIEFyZ3MmJi4uLiBhcmdzKQogICAgewogICAgICAgIGF1dG8gc3RhcnQgPSBzdGQ6OmNocm9ubzo6c3lzdGVtX2Nsb2NrOjpub3coKTsKCiAgICAgICAgLy8gTm93IGNhbGwgdGhlIGZ1bmN0aW9uIHdpdGggYWxsIHRoZSBwYXJhbWV0ZXJzIHlvdSBuZWVkLgogICAgICAgIGZ1bmMoc3RkOjpmb3J3YXJkPEFyZ3M+KGFyZ3MpLi4uKTsKCiAgICAgICAgYXV0byBkdXJhdGlvbiA9IHN0ZDo6Y2hyb25vOjpkdXJhdGlvbl9jYXN0PCBUaW1lVD4oc3RkOjpjaHJvbm86OnN5c3RlbV9jbG9jazo6bm93KCkgLSBzdGFydCk7CgogICAgICAgIHJldHVybiBkdXJhdGlvbi5jb3VudCgpOwogICAgfQp9OwoKc3RydWN0IGZ1bmN0b3IKewogICAgaW50IHN0YXRlOwogICAgZnVuY3RvcihpbnQgc3RhdGUpIDogc3RhdGUoc3RhdGUpIHt9CiAgICB2b2lkIG9wZXJhdG9yKCkoKSBjb25zdAogICAgewogICAgICAgIHN0ZDo6Y291dCA8PCAiSW4gZnVuY3RvciBydW4gZm9yICI7CiAgICB9Cn07Cgp2b2lkIGZ1bmMoKQp7CiAgICBzdGQ6OmNvdXQgPDwgIkluIGZ1bmN0aW9uLCBydW4gZm9yICIgPDwgc3RkOjplbmRsOwp9Cgp2b2lkIGZ1bmMoaW50IGFyZykge30KCmludCBtYWluKCkKewogICAgaW50IGR1bW15KDEpOwoKICAgIHN0ZDo6Y291dCA8PCBtZWFzdXJlPD46OmV4ZWN1dGlvbiggWyZdKCkgeyAgCiAgICAgICAgZnVuYyhkdW1teSk7CiAgICB9KSA8PCBzdGQ6OmVuZGw7CgogICAgc3RkOjpjb3V0IDw8IG1lYXN1cmU8Pjo6ZXhlY3V0aW9uKGZ1bmN0b3IoZHVtbXkpKSA8PCBzdGQ6OmVuZGw7CnN0ZDo6Y291dCA8PCBtZWFzdXJlPD46OmV4ZWN1dGlvbihmdW5jKTsKCiAgICByZXR1cm4gMDsKfQ==
prog.cpp: In function ‘int main()’:
prog.cpp:49:39: error: no matching function for call to ‘measure<>::execution(<unresolved overloaded function type>)’
std::cout << measure<>::execution(func);
^
prog.cpp:49:39: note: candidate is:
prog.cpp:10:32: note: template<class F, class ... Args> static typename TimeT::rep measure<TimeT>::execution(F, Args&& ...) [with F = F; Args = {Args ...}; TimeT = std::chrono::duration<long long int, std::ratio<1ll, 1000ll> >]
static typename TimeT::rep execution(F func, Args&&... args)
^
prog.cpp:10:32: note: template argument deduction/substitution failed:
prog.cpp:49:39: note: couldn't deduce template parameter ‘F’
std::cout << measure<>::execution(func);
^