簡體   English   中英

c++ 通會員 function

[英]c++ pass member function

我正在嘗試制作一個 class 可以多次運行 function 並告訴我 function 執行的平均時間。

我的解決方案使用

template<class T_ret = void, class... T_args> void RunNewTiming(string outputFileName, T_ret(*function)(T_args...), int iterations = 1, T_args... otherArgs);

它適用於這樣的全局函數

void foo(){
    // code
}

bool bar(int & a, char b){
    // more code
}

FunctionTimer functionTimer;

functionTimer.RunNewTiming("TimingForFoo", &foo, 1000);

functionTimer.RunNewTiming<bool, int , char>("TimingForBar", &bar, 1000, 5, 'h');

但是,如果我嘗試傳遞 object 之類的公共 function

class Object{
public:
    void func(){
        // code
    };
}

Object obj;

functionTimer("TimingForObjFunc", obj.func, 1000);

我得到錯誤

指向綁定 function 的指針只能用於調用 function

在我嘗試查找此錯誤的任何地方,只會讓人們在嘗試調用 function 時意外丟失() ,並且人們指出他們不小心錯過了()作為解決方案,我在這種情況下找不到解決方案。

有可能像這樣傳遞一個非靜態成員 function 嗎? 還是有一些更深層次的原因導致這不起作用

更新:

我實際上找到了解決這個問題的方法,我需要傳入調用者類型和這個 object 的實例

然后我可以使用該類型對正確的 function, T_caller::*function進行范圍操作

template<class T_caller, class T_ret = void, class ... T_args >
auto RunNewTiming(string name, T_ret(T_caller::*function)(T_args ...), T_caller*, int iterations = 1, T_args ... otherArgs);

然后像這樣稱呼它

    ft.RunNewTiming<Object>("objTime", &Object::func, &obj, 1000);

我也提出以下解決方案:

bool bar(int & a, char b) 
{
   return true;
}

class FunctionTimer
{
public:

   double my_foo(double a)
   {
      return a + 10;
   };

   template<typename Func, typename... Args>
   void RunNewTimingEx(std::string output_file_name, int iterations, Func f, Args... args)
   {
      f(args...);
   };
};

int main()
{
   FunctionTimer test;
   auto f_1 = std::bind(std::mem_fn(&FunctionTimer::my_foo), test, std::placeholders::_1);
   auto f_2 = std::bind(&bar, std::placeholders::_1, std::placeholders::_2);

   test.RunNewTimingEx("TimingForMyFoo", 1000, f_1, 2.0);
   test.RunNewTimingEx("TimingForBar", 100, f_2, 2, 'h');

   return 0;
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM