std :: function template syntax

时间:2016-05-02 21:47:16

标签: c++11 lambda std-function

我和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表达式以及为什么会有回报这对我来说很复杂?

我对这段代码非常困惑,任何探索都会受到赞赏

2 个答案:

答案 0 :(得分:1)

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

在您的情况下,derivedAction是一个模板化函数,接受一个参数(模板化名称为Function)并返回一个具有void返回类型并接受两个参数的函数 - - SceneNode&sf::Time

所以回答你的问题。

  

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

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

  

2 - 对我来说,了解lambda表达式以及为什么会有一个返回它对我来说很复杂?

再一次,derivedAction的返回值是一个函数(或rahter,可以调用的东西)。

如果仔细查看derivedAction的代码,您会看到它只包含函数Function fn并进行了一些检查。

答案 1 :(得分:1)

对于你的第一个问题,derivedAction是一个函数,所以你可以像任何其他函数一样定义一个空体{}

至于你的第二个问题,returnderivedAction的回归。 lambda的细分如下:

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

在您的示例中,fnAircraftMover(-playerSpeed, 0)。 playerSpeed的类型为SceneNode&,0的类型为sf::Time。该函数的返回类型为void。因此,所有这一切最终都会根据playerSpeed修改您输入的dt。希望这有道理..!