本篇转载至我的知乎回答。
看到大家在讨论 C++ 的反射,我提供一个使用 Qt 实现 C++ 反射的方案。注意,并不代表我认同在游戏服务器里面使用反射——我没有这方面的经验,所以不会给出任何建议——只是顺便说一下 C++ 是可以实现反射的。
首先看一下使用我弄的 RPC. 实现 C++ 服务器供客户端调用是怎么样的:
// server.cpp
class Hello: public QObject {
public slots:
QString sayHello(const QString &name) {
return QStringLiteral("Hello, %1").arg(name);
}
};
int main(int argc, char **argv) {
QSharedPointer<Rpc> rpc = RpcBuilder(MessagePack).create();
QSharedPointer<Hello> hello(new Hello());
rpc->registerInstance(hello, "demo");
rpc->startServer("tcp;//127.0.0.1:8002");
return 0;
}
客户端用 python 实现更简单一些
# client.py
from lafrpc import Rpc
rpc = Rpc.use("thread", "msgpack")
peer = rpc.connect("tcp;//127.0.0.1:8002")
demo = peer.as_proxy().demo
print(demo.sayHello("World"))
主要是看服务端那里的代码,可以看到调用的时候使用根据客户传过来的方法名,即可找到要被调用的函数。
这里使用的是就是 Qt 的反射能力。只要使用 slots来描述类的方法,Qt 就会生成一些额外的代码用于 C++ 反射,包含函数名、参数类型、返回值类型等等。服务器取到调用函数名之后,即可反推使用哪个函数来调用。Qt 内部用的一个 switch/case 来转发请求速度还挺快。
后注:删除了无关紧要的部分代码。tcp; 需要换成 tcp:
【 在 slimcan 的大作中提到: 】
: 我怎么感觉这些新特性让屎山代码概率更大了?一个好的设计里为啥需要反射?有人能举个必须要反射才行的例子吗
--
修改:hgoldfish FROM 110.84.122.*
FROM 110.84.122.*