C++ 评估另一个类';不带模板的动态函数指针

C++ 评估另一个类';不带模板的动态函数指针,c++,function-pointers,templating,dynamic-function,C++,Function Pointers,Templating,Dynamic Function,我有一个类可以自动插值二维函数(非常满意)。它接受指向被插值方法的动态函数指针。由于我需要对象实例和指针,所以我不得不对类进行模板化 我可以避免将类模板化吗?或者我需要继续这样做才能接受对象实例作为参数?基类可能吗?(我对c++相当陌生) 我的方式是(缩写): 模板 类插值{ 内插(double(F::*F)(double,double),F&obj,…{ ... 双值=(object.*f)(x,y); ... } } 正如注释中指出的,您也可以使用std::function。这为std::b

我有一个类可以自动插值二维函数(非常满意)。它接受指向被插值方法的动态函数指针。由于我需要对象实例和指针,所以我不得不对类进行模板化

我可以避免将类模板化吗?或者我需要继续这样做才能接受对象实例作为参数?基类可能吗?(我对c++相当陌生)

我的方式是(缩写):

模板
类插值{
内插(double(F::*F)(double,double),F&obj,…{
...
双值=(object.*f)(x,y);
...
}
}

正如注释中指出的,您也可以使用std::function。这为std::bind提供了更大的灵活性。另一方面,std::function可能会在堆上分配结果函数,这会导致很大的开销(使用std::cref()可以避免这种情况)。关于std::function与模板在执行时间上的差异的一个非常有趣的讨论可以在上找到


“请注意,std::function能够存储不同类型的可调用对象。因此,它必须对存储执行某种类型擦除魔术。通常,这意味着动态内存分配(默认情况下通过调用new)。众所周知,这是一个非常昂贵的操作。”Cassio Neri-这里是std::cref可以提供帮助的地方,特别是因为在我刚刚编写的链接中讨论的示例中,在没有std::cref的情况下,std::function的堆分配将程序的速度降低了10倍

您可以使用
std::function
std::bind
,但这比您现有的成本更高。您还可以绑定到抽象接口(要调用的方法是纯虚拟的)并将模板参数固定到该特定接口。std::function的成本会高多少?而且,什么时候第一次使用还是每次使用会很昂贵?有趣的是,我似乎可以在编译时和运行时之间进行选择?不一定。对于小函数,编译器可以优化分配(“标准(20.8.11.2.1/5)鼓励实现,以避免对小对象进行动态内存分配,幸运的是,VS2012确实如此”),对于较大的函数,std::cref可以大大减少开销。它不会像模板那样快(通常,规则模板解决方案是最快的方法,因为工作是在编译时完成的)。只有当std::function wrap fast exec时,这才是关键的。函数,并被多次调用(+-类似于虚拟函数开销问题)当类加载windows DLL进行评估时,使用GCC(在linux中运行)如何?这些函数本身相对昂贵,所以我试图了解性能会受到哪些影响。只在建筑上就可以了-在评估上,不。好问题。它应该很容易检查。但是该链接的一个要点是,如果不通过引用传递函数(使用std::ref或std::cref),那么即使对于昂贵的函数,std::函数的开销也会很大。这是一个警告,我认为很少有人意识到。谢谢你的回答
template<class F>
class Interpolate {
   Interpolate(double (F::*f)(double, double), F & obj, ...) { 
      ...
      double value = (object.*f)(x,y);
      ...
   }
}