保存函数指针+;供以后使用的参数 我有一个问题,其中保存C++函数指针,并有一组参数调用它,以便以后调用它。调用代码不知道函数的类型和参数。在我的应用程序中,保存和调用函数指针和参数对性能至关重要。界面应如下所示: void func( int a, char * b ); call_this_later( func, 5, "abc" );
一个简单的解决方案是将所有这些信息放在一个函子中,每个被调用的函数需要一个不同的typedef。C++11允许我使用可变模板来实现这一点,所以这是可以的 由于在调用时不知道函子的类型,因此似乎有必要为这些函子创建一个虚拟基类,并使用虚拟函数调用来调用函子。虚拟函数调用+堆分配的性能开销太高(我正在用尽可能少的汇编指令来实现这个习惯用法)。所以我需要一个不同的解决方案保存函数指针+;供以后使用的参数 我有一个问题,其中保存C++函数指针,并有一组参数调用它,以便以后调用它。调用代码不知道函数的类型和参数。在我的应用程序中,保存和调用函数指针和参数对性能至关重要。界面应如下所示: void func( int a, char * b ); call_this_later( func, 5, "abc" );,c++,c++11,C++,C++11,一个简单的解决方案是将所有这些信息放在一个函子中,每个被调用的函数需要一个不同的typedef。C++11允许我使用可变模板来实现这一点,所以这是可以的 由于在调用时不知道函子的类型,因此似乎有必要为这些函子创建一个虚拟基类,并使用虚拟函数调用来调用函子。虚拟函数调用+堆分配的性能开销太高(我正在用尽可能少的汇编指令来实现这个习惯用法)。所以我需要一个不同的解决方案 有什么想法吗?您需要一个自定义分配器来匹配您的分配模式。或者,使用编译时多态性将functor的类型传递到调用站点。使用/: vo
有什么想法吗?您需要一个自定义分配器来匹配您的分配模式。或者,使用编译时多态性将functor的类型传递到调用站点。使用/:
void func(int a,char*b);
boost::函数my_proc=
boost::bind(&func,5,“abc”);
//后来。。。
我的_proc();//调用func(5,“abc”);
您可以使用捕获类型的lambda表达式来实现这一点
template <typename Func, typename Arg1, typename Arg2>
std::function<void(void)> call_this_later(Func f, Arg1 a1, Arg2 a2) {
return [=]() { f(a1, a2); }; // Capture arguments by value
}
模板
std::稍后调用此函数(Func f,Arg1 a1,Arg2 a2){
return[=](){f(a1,a2);};//按值捕获参数
}
需要注意的几点:
const char*
,那么您可以将其与字符串文字一起使用,但如果您传递someStdString.c_str()
并且字符串很快就会消失,则不必这样做
我相信
::boost::function
和::std::tr1::function
正是@Hans不想做的事情。我认为它们使用虚拟函数和动态分配。@Omnifarious:取决于所使用的函数/函子是否有任何动态分配。对于具有少量POD类型的函数,它将使用内部存储,但是,是的,它确实使用(非常深入的)隐藏的虚拟表来实际执行函数调用。
template <typename Func, typename Arg1, typename Arg2>
std::function<void(void)> call_this_later(Func f, Arg1 a1, Arg2 a2) {
return [=]() { f(a1, a2); }; // Capture arguments by value
}