我正在使用 C++11 开发一个小型数学优化框架,我想知道用户提供特定于域的逻辑的最佳方式是什么。我可以强迫她使用可由框架调用的钩子方法来定义类,但我希望保持精简并尽可能利用新的 C++11 设施。因此,我正在考虑接受
std::function
对象(可能从 lambda 表达式实例化)作为参数,并在需要时调用它们。我唯一想知道的是编译器(在我的例子中是 gcc,但我也想了解 Xcode 和 Visual C++)是否能够获取 std::function 对象并内联函数定义,以便它们与其余代码一起优化。
PS:从评论来看,我的问题的第一次修订版对于大多数用户来说似乎很晦涩,可能是我使用了不正确的语言的错。所以我重新表述了它,我希望有人能够理解我在这里试图传达的概念(并可能提出一个解决方案)。
PPS:有人建议使用模板,这是我考虑过的一个想法,但我想知道是否有替代方案。我对模板没有任何反对意见,但我计划在这个版本运行后立即制作一个基于模板的版本,因为我发现根据动态对象进行推理更容易。
std::function
是一个可调用对象,可以存储任何可调用对象。它的设计尽可能灵活。然而这种设计也有缺点。因为 function
可以包含几乎任何东西(可调用),所以它们必须能够使用 anything。
在内部,
function
在编译时不知道它可能存储什么。由于此确定是在运行时做出的,因此大多数普通编译器几乎不可能内联它。通过函数指针内联是可能的,但前提是本地知道该指针的值是什么。 function
比单纯的函数指针复杂得多。
理论上可以内联这样的东西,但只能作为某种配置文件引导优化系统的一部分,其中代码的重复执行能够确定某些
function
对象将始终与某些内容一起使用,因此内联它们。但即便如此
如果您想内联任意可调用对象,您应该使用模板函数,而不是
std::function
。 function
适用于当你不能使用模板时(可能是因为你需要在容器中存储多个函数,或者因为你不想破坏封装,或者其他原因),但仍然需要存储任意可调用对象。