保存函数指针+;供以后使用的参数 我有一个问题,其中保存C++函数指针,并有一组参数调用它,以便以后调用它。调用代码不知道函数的类型和参数。在我的应用程序中,保存和调用函数指针和参数对性能至关重要。界面应如下所示: void func( int a, char * b ); call_this_later( func, 5, "abc" );

保存函数指针+;供以后使用的参数 我有一个问题,其中保存C++函数指针,并有一组参数调用它,以便以后调用它。调用代码不知道函数的类型和参数。在我的应用程序中,保存和调用函数指针和参数对性能至关重要。界面应如下所示: void func( int a, char * b ); call_this_later( func, 5, "abc" );,c++,c++11,C++,C++11,一个简单的解决方案是将所有这些信息放在一个函子中,每个被调用的函数需要一个不同的typedef。C++11允许我使用可变模板来实现这一点,所以这是可以的 由于在调用时不知道函子的类型,因此似乎有必要为这些函子创建一个虚拟基类,并使用虚拟函数调用来调用函子。虚拟函数调用+堆分配的性能开销太高(我正在用尽可能少的汇编指令来实现这个习惯用法)。所以我需要一个不同的解决方案 有什么想法吗?您需要一个自定义分配器来匹配您的分配模式。或者,使用编译时多态性将functor的类型传递到调用站点。使用/: vo

一个简单的解决方案是将所有这些信息放在一个函子中,每个被调用的函数需要一个不同的typedef。C++11允许我使用可变模板来实现这一点,所以这是可以的

由于在调用时不知道函子的类型,因此似乎有必要为这些函子创建一个虚拟基类,并使用虚拟函数调用来调用函子。虚拟函数调用+堆分配的性能开销太高(我正在用尽可能少的汇编指令来实现这个习惯用法)。所以我需要一个不同的解决方案


有什么想法吗?

您需要一个自定义分配器来匹配您的分配模式。或者,使用编译时多态性将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);};//按值捕获参数
}
需要注意的几点:

  • 我认为你不能在这里使用完美的转发,因为你必须捕获参数
  • < >因为C++不是垃圾收集的,如果参数是指针,那么它们可能指向稍后不存在的东西。例如,如果您的参数是
    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
    }