Liczenie użycia funkcji

3

W ramach mocno nadmiarowych zabaw w templatki ;P
https://godbolt.org/z/Ph97ce97r

4

Też zrobiłem, wchodzę wkleić a tu już jest :D

#include <iostream>
#include <cmath>
using namespace std;

#define M_PI 3.14159265358979323846

template<auto *Func> struct CallCalc;

template<typename Ret,typename ...Args,Ret (*func)(Args...)>
struct CallCalc<func>
{
    private:
    static size_t &callcount()
    {
        static size_t cnt=0;
        return cnt;
    }
    public:
    static size_t count() { return callcount(); }   
    Ret operator()(Args&&... args)
    {
        ++callcount();
        return func(std::forward<Args>(args)...);
    }
};

namespace alt
{
    CallCalc<::foo> foo;    
    CallCalc<::sin> sin;
    CallCalc<::cos> cos;
    CallCalc<::pow> pow;
}

int main()
{
    cout<<alt::sin(0)<<endl;
    cout<<alt::sin(M_PI/6)<<endl;
    cout<<alt::sin(M_PI/4)<<endl;
    cout<<alt::sin(0)<<endl;

    cout<<alt::cos(0)<<endl;
    cout<<alt::cos(M_PI/6)<<endl;
    cout<<alt::cos(M_PI/4)<<endl;

    cout<<alt::pow(2,3)<<endl;
    cout<<alt::pow(3,2)<<endl;

    cout<<"sin count: "<<alt::sin.count()<<endl;
    cout<<"cos count: "<<alt::cos.count()<<endl;
    cout<<"pow count: "<<alt::pow.count()<<endl;
    return 0;
}
4

@xan922: Dostałeś pytanie o powód liczenia funkcji, bo może się okazać, że to w swoim programie nie jest potrzebne. Gdybyś opisał do czego wykorzystujesz informację o liczbie wywołań, byłoby łatwiej.

3

Wersja w której można użyć wyrażeń typu lambda.

#include <iostream>
#include <functional>

using namespace std;

template< typename R , typename... Args >
struct Fn
{
    Fn( function<R(Args...)> _F ): F{_F} {} function<R(Args...)> F;

    R operator()( Args&&... a )
    {
        ++calls;
        return F(forward<Args>(a)...);
    }

    size_t calls {0};
};

template<class R, class... Args>
Fn(R(*)(Args...)) -> Fn<R,Args...>;

int p2( int a ){ return a*a; }

int main()
{
   Fn f1 {p2};

   cout << "value = " << f1(5) << endl;
   cout << "calls = " << f1.calls << endl;
   cout << "value = " << f1(1) << endl;
   cout << "value = " << f1(2) << endl;
   cout << "calls = " << f1.calls << endl << endl;

   Fn f2 {function{[](int d){ return to_string(d)+"_text";}}};

   cout << "value = " << f2(5) << endl;
   cout << "calls = " << f2.calls << endl;
   cout << "value = " << f2(1) << endl;
   cout << "value = " << f2(2) << endl;
   cout << "calls = " << f2.calls << endl;
}

https://godbolt.org/z/rq1q8TofG

1 użytkowników online, w tym zalogowanych: 0, gości: 1, botów: 0