事件与提升::函数
Events vs boost::function
既然代码比文字更好,你会用这个吗:
struct StringEvent
{
const void* source;
const std::string str;
StringEvent(const void* source, const std::string& str)
: source(source), str(str)
{ }
};
class StringEventListener
{
public:
virtual void handler(const StringEvent& event) = 0;
}
class Test : public StringEventListener
{
public:
void handler(const StringEvent& event)
{
std::cout << event.str << std::endl;
}
}
class EventSource
{
public:
EventSource(StringEventListener* listener)
{
listener->handler(StringEvent(this, std::string("foo")));
}
}
int main()
{
Test test;
EventSource(&test);
}
在这上面?
class Test
{
public:
void handler(const std::string& str)
{
std::cout << str << std::endl;
}
};
class EventSource
{
public:
EventSource(const boost::function<void (const std::string&)>& funcPtr)
{
funcPtr(std::string("foo"));
}
};
int main()
{
Test test;
EventSource(boost::bind(&Test::handler, &test, _1));
}
使类事件源调用test.handler("foo")
?
来自 Java/C# 世界,我发现第一种方法更直观,尽管很冗长,但它是否适合在现实生活中使用,或者它是否会导致比它的价值/性能影响更多的问题?
我绝对不会使用第一个版本。这太可怕了。第二个版本要优越得多 - 它可以是lambdas等等。
此外,boost::function
不是函数指针。
IMO 您可以使用带有 Boost/C++ 的"函子"(具有静态方法的对象)来保存回调数据和回调对象(在前面的示例中)。
这是一个风格问题,如果你需要对象来传递数据。
相关文章:
- 返回ERROR_INVALID_PARAMETER的事件日志函数
- 尝试使用 EvtSetChannelConfigProperty() 函数更新最大事件日志文件大小时插入的错误值
- SFML c ++ 当包含文件内游戏中发生事件时,如何使用铃声函数为我的游戏创建声音类?
- 从C++回调函数发出节点.js事件
- 将函数名称传递给事件总线系统中的事件类
- std::函数,带有 SDL 事件回调的 lambda 错误
- 如何将lambda函数排队到Qt的事件循环中?
- 事件与提升::函数
- 键按下事件错误 Qt 实现函数时
- ``pollout''Linux函数中的“ Pollout”事件是什么意思
- C++:使用回调函数作为事件通知程序
- 使用C++11 lambda函数将点击事件连接到函数时出现问题
- 创建指向成员函数的非常量指针,以便进行 SDL 事件筛选
- 在C++中为多个函数和事件重用一个线程(基本上是 POSIX 线程)
- 声明在 Qt 中发生鼠标事件时调用的函数
- 如何在 Windows 窗体中为事件函数定义使用单独的.cpp文件
- 信号处理程序与虚拟函数和继承(事件处理)
- Qt从其他线程向事件循环添加函数调用
- 复制STL:删除元素、用户定义函数作为参数和事件队列
- Nodejs C++事件发射器.加载项错误.MakeCallback中没有函数.method=发出中止陷阱:6