在C++中实现回调函数时,我是否还应该使用C风格的函数指针:
void (*callbackFunc)(int);
Run Code Online (Sandbox Code Playgroud)
或者我应该使用std :: function:
std::function< void(int) > callbackFunc;
Run Code Online (Sandbox Code Playgroud) 我知道什么是仿函数以及何时将它们与stl algos一起使用.但不明白他在这个主题中的意思:
任何人都可以解释什么是什么std,什么std::bind时候应该使用,新手的一些例子?
与函数指针相比,std :: function的表示法非常好.但是,除此之外,我找不到一个用指针无法替换的用例.那么它只是函数指针的语法糖吗?
我正在讨论在C++中实现策略模式的最佳方法.到目前为止,我一直使用标准方式,其中上下文具有指向基本策略类的指针,如下所示:
class AbstractStrategy{
public:
virtual void exec() = 0;
}
class ConcreteStrategyA{
public:
void exec();
}
class ConcreteStrategyB{
public:
void exec();
}
class Context{
public:
Context(AbstractStrategy* strategy):strategy_(strategy){}
~Context(){
delete strategy;
}
void run(){
strategy->exec();
}
private:
AbstractStrategy* strategy_;
Run Code Online (Sandbox Code Playgroud)
由于有指向对象的指针可能会导致不良行为,我一直在寻找一种更安全的方式来实现这种模式,我发现这个问题在哪里std::function被提议作为处理这种模式的更好方法.
有人可以更好地解释一下如何std::function运作,也许有一个战略模式的例子?
我正在为游戏引擎创建消息传递系统,其中引擎的最终用户可以创建消息对象并将其传递给游戏对象,以由包含附加到游戏对象的组件的侦听器对象进行解释.如果消息与侦听器正在侦听的消息匹配,则侦听器应调用函数指针并将其传递给已接收的消息.基本结构看起来像这样:
class Message
{
std::string message;
};
class Listener
{
std::string target;
void (*fn)(Message*);
};
Run Code Online (Sandbox Code Playgroud)
使用游戏对象的代码来接收如下所示的消息:
//if the queue is empty then dont do anything
if (messageQueue.empty())
{
return;
}
//else grab the front of the queue
Message* newMessage = messageQueue.front();
//pop our message from the queue
messageQueue.pop();
//for each component in our list
for (std::vector<Component*>::iterator i = ComponentList.begin(); i < ComponentList.end(); i++)
{
Component* itemp = *i;
//for each message in its listener list
for (std::vector<Listener*>::iterator j = itemp->Listeners.begin(); …Run Code Online (Sandbox Code Playgroud) 亲爱的stackoverflow用户.
我试图找到优点std::function,为什么我应该使用它而不是函子或指针来运行.可悲的是,我找不到令人满意的答案.
这就是为什么我会非常感激,如果你能告诉我什么是优点,什么std::function时候我应该使用它.希望我的问题能够帮助其他人.