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 是一个函数,因此您可以定义一个空主体 {}
,就像任何其他函数一样。
关于你的第二个问题,return
是derivedAction
的return。 lambda的分解如下:
[=]
指示通过复制来捕获任何引用的变量
(SceneNode& node, sf::Time dt)
描述了 lambda 函数的输入参数
- 在 lambda 的主体中,lambda 函数对 fn() 进行操作。它将
node
转换为不同的类型并修改 node
对象。
在您的示例中,fn
是 AircraftMover(-playerSpeed, 0)
。 playerSpeed是SceneNode&
类型,0是sf::Time
类型。该函数的 return 类型是 void
。所以,所有这一切最终所做的就是根据 dt
修改你输入的 playerSpeed
。希望这是有道理的..!
我很熟悉 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 是一个函数,因此您可以定义一个空主体 {}
,就像任何其他函数一样。
关于你的第二个问题,return
是derivedAction
的return。 lambda的分解如下:
[=]
指示通过复制来捕获任何引用的变量(SceneNode& node, sf::Time dt)
描述了 lambda 函数的输入参数- 在 lambda 的主体中,lambda 函数对 fn() 进行操作。它将
node
转换为不同的类型并修改node
对象。
在您的示例中,fn
是 AircraftMover(-playerSpeed, 0)
。 playerSpeed是SceneNode&
类型,0是sf::Time
类型。该函数的 return 类型是 void
。所以,所有这一切最终所做的就是根据 dt
修改你输入的 playerSpeed
。希望这是有道理的..!