我和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表达式以及为什么会有回报这对我来说很复杂?
我对这段代码非常困惑,任何探索都会受到赞赏
答案 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是一个函数,所以你可以像任何其他函数一样定义一个空体{}
。
至于你的第二个问题,return
是derivedAction
的回归。 lambda的细分如下:
[=]
指示通过制作副本来捕获任何引用的变量(SceneNode& node, sf::Time dt)
描述了lambda函数的输入参数node
转换为其他类型并修改node
对象。在您的示例中,fn
为AircraftMover(-playerSpeed, 0)
。 playerSpeed的类型为SceneNode&
,0的类型为sf::Time
。该函数的返回类型为void
。因此,所有这一切最终都会根据playerSpeed
修改您输入的dt
。希望这有道理..!