std::function 模板语法

std::function template syntax

我很熟悉 std::function ,但我正在读一本书,里面有这样的代码:

template<typename GameObject, typename Function>
std::function<void(SceneNode&, sf::Time)> derivedAction(Function fn)
{
    return [=](SceneNode& node, sf::Time dt)
    {
        assert(dynamic_cast<GameObject *>(&node) != nullptr);

        fn(static_cast<GameObject *>(&node), dt)
    }
}

然后本书使用这样的模板:

Command moveLeft;//command is a structure
moveLeft.action//action is a std::function object 
= derivedAction<Aircraft>(AircraftMover(-playerSpeed, 0));
//derivedAction specify<Aircraft> ??? 

我的问题是:

1-derivedAction 必须是 std::function 的对象,我已经检查了参考资料,但我没有找到这种使用 {} 的初始化,这是如何工作的?

2-理解 lambda 表达式对我来说很复杂,为什么有一个 return?

我对这段代码很困惑,任何解释都将不胜感激

std::function 是任何可以调用的包装器(即,您可以在其上使用 operator())。这是指向函数的指针,class 具有 operator() 重载或 lambda 表达式。

在你的例子中,derivedAction 是一个模板函数,接受一个参数(模板类型的名称 Function)和 returning 一个具有 void 的函数return 输入并接受两个参数 -- SceneNode&sf::Time.

所以回答你的问题。

1-derivedAction must be an object of std::function , i have checked references but i haven't found this kind of initialazation with {} , how this works ?

不,derivedAction 本身就是一个函数,就像任何其他函数一样(即 int foo(){ return 0; })。

2-it is complicated to me , to understand the lambda expression , and why there is a return for it ?

再一次,derivedAction 的 return 值是一个函数(或者更确切地说,是可调用的东西)。

如果您仔细查看 derivedAction 的代码,您会发现它只用一些检查包装了一个函数 Function fn

对于您的第一个问题,derivedAction 是一个函数,因此您可以定义一个空主体 {},就像任何其他函数一样。

关于你的第二个问题,returnderivedAction的return。 lambda的分解如下:

  • [=] 指示通过复制来捕获任何引用的变量
  • (SceneNode& node, sf::Time dt) 描述了 lambda 函数的输入参数
  • 在 lambda 的主体中,lambda 函数对 fn() 进行操作。它将 node 转换为不同的类型并修改 node 对象。

在您的示例中,fnAircraftMover(-playerSpeed, 0)。 playerSpeed是SceneNode&类型,0是sf::Time类型。该函数的 return 类型是 void。所以,所有这一切最终所做的就是根据 dt 修改你输入的 playerSpeed。希望这是有道理的..!