C++传递成员函数
c++ pass member function
我正在尝试制作一个 class 可以 运行 一个函数多次并告诉我该函数执行所需的平均时间。
我的解决方案使用
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');
但是如果我尝试传入一个对象的 public 函数,例如
class Object{
public:
void func(){
// code
};
}
Object obj;
functionTimer("TimingForObjFunc", obj.func, 1000);
我收到错误
A pointer to a bound function may only be used to call the 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;
}
我正在尝试制作一个 class 可以 运行 一个函数多次并告诉我该函数执行所需的平均时间。
我的解决方案使用
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');
但是如果我尝试传入一个对象的 public 函数,例如
class Object{
public:
void func(){
// code
};
}
Object obj;
functionTimer("TimingForObjFunc", obj.func, 1000);
我收到错误
A pointer to a bound function may only be used to call the 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;
}