通过回调提供数据服务
Class serving data via callbacks
我最近在c上进行了一段时间的编程后返回了Visual C ,回调要容易得多。
我有一个控制0 ..*连接设备的单例类。我的想法是在此类中创建一个函数,该函数将在连接的设备并通过回调将其发布给可能需要的任何内容。
,例如
Singleton class
typedef void (CALLBACK * PortListCallback_t)(ptrConstCComPortInfo_t);
.
.
.
void CCommsMgr::listPorts(PortListCallback_t cb)
{
PortInfoSetConstIter_t i;
for (i = m_setPorts.begin(); i != m_setPorts.end(); i++)
{
cb(*i);
}
}
在第一例中,消费者是一个MFC对话框类,如果回调为静态,则可以正常工作。但是,为了访问对话框类的成员数据/功能,我需要将"此"传递给Singleton类,并将其反射回。
,例如
Singleton class
typedef void (CALLBACK * PortListCallback_t)(void *, ptrConstCComPortInfo_t);
.
.
.
void CCommsMgr::listPorts(void *pObj, PortListCallback_t cb)
{
PortInfoSetConstIter_t i;
for (i = m_setPorts.begin(); i != m_setPorts.end(); i++)
{
cb(pObj, *i);
}
}
Dialog Class
static void CALLBACK getPorts(void *obj, ptrConstCComPortInfo_t port);
.
.
.
void CALLBACK CMFC_iTFTPDlg::getPorts(void *obj, ptrConstCComPortInfo_t port)
{
CMFC_iTFTPDlg *pThis = (CMFC_iTFTPDlg*)obj;
// do something with it
}
我的问题 - 有更好的方法吗?静态功能感觉就像是一个kludge,我不希望Singleton类的使用方式来限制。如果我删除getports上的静态,则不会编译。重复自己,单身班应该不知道它的消费者。
在Whozcraig的出色提示的帮助下,这就是我想到的:
#include <functional> // std::function, std::bind, std::placeholders
#include <iostream>
#include <vector>
class ConstCComPortInfo {};
using ptrConstCComPortInfo_t = ConstCComPortInfo*;
using callback_t = void(void*, ptrConstCComPortInfo_t);
using function_t = std::function<callback_t>;
// an example class with a member function to call
class foo {
public:
foo(const std::string& name) : instance_name(name) {}
void bar(void* something, ptrConstCComPortInfo_t c) {
std::cout << "foo::bar(" << instance_name << ") calledn"
"void* = " << something << "n"
"ptrConstCComPortInfo_t = " << c << "n";
}
private:
std::string instance_name;
};
// and a free function to call
void free_func(void* something, ptrConstCComPortInfo_t c) {
std::cout << "free_func_calledn"
"void* = " << something << "n"
"ptrConstCComPortInfo_t = " << c << "n";
}
int main() {
// some instances of the class
foo via_bind("called_via_bind");
foo via_lambda("called_via_lambda");
ptrConstCComPortInfo_t bork = nullptr; // dummy value
// a vector of callback subscribers
std::vector<function_t> subscribers{
&free_func,
std::bind(&foo::bar, &via_bind, std::placeholders::_1, std::placeholders::_2),
[&via_lambda](void* p, ptrConstCComPortInfo_t c) { via_lambda.bar(p, c); }
};
// perform callbacks
for(auto& cb : subscribers) {
cb(nullptr, bork);
}
}
输出:
free_func_called
void* = 0
ptrConstCComPortInfo_t = 0
foo::bar(called_via_bind) called
void* = 0
ptrConstCComPortInfo_t = 0
foo::bar(called_via_lambda) called
void* = 0
ptrConstCComPortInfo_t = 0
相关文章:
- 创建服务失败0x6f7存根收到错误数据
- 提供对不同类型的数据(建议、代码审查)的线程安全访问的类
- 在 C++ 中,默认情况下构造函数为类的数据成员提供的值是多少?
- 访问与使用 TraceLoggingWrite 提供的事件关联的用户数据
- 引用类型的数据成员提供有关恒常正确性"loophole"
- 如果类在 C++ 中具有常量或引用类型的非静态数据成员,为什么编译器不提供默认赋值运算符?
- 为什么不能使用"( )"为类的非静态数据成员提供默认值?
- DDS C++ - 数据分发服务
- C++ QTextDocument::contentChange() 信号提供无效的输入数据
- 向不可变纹理存储提供数据
- 固定大小的容器,其中元素被排序,并可以为C 中的数据提供原始指针
- 是否有一种简单的方法可以从普通的 win32 C++代码向应用程序见解提供数据?
- 如何通过 COM3 提供数据
- cpp 中是否存在一种数据结构,可以轻松地提供一种基于已存在的实例构建新结构的方法
- 通过回调提供数据服务
- 直接提供数据而不是文件路径
- async_read on async_pipe子进程没有提供数据
- 如何将 Crypto++ RSA 与 C# RSA 加密服务提供商同步
- HOWTO:C 应用程序作为Web服务提供商和Java应用程序作为Web服务客户端
- 服务加载程序找不到服务提供程序类,即使类与 META-INF/services 位于同一 JAR 文件中也是如此