可以查询所有继承类的同名方法吗?
Can you query same named methods of all inherited classes?
我正在研究一个基于节点的结构来定义一个生物。身体的每个部位都有"插座",你可以把东西放在那里,比如四肢、爪子或其他什么东西。为了方便将来的开发,如果我能把部分类拼凑在一起,并让它们的方法一起工作,那就太好了。例如:
struct Generic {
vector<Generic*> GetSockets() {return vector<Generic*>();}
}
typedef Generic* GenSock;
struct Bipedal {
GenSock LeftLeg;
GenSock RightLeg;
vector<Generic*> GetSockets() {
vector<Generic*> ret;
ret.push_back(RightLeg);
ret.push_back(LeftLeg);
return ret;
}
}
struct TripleHeaded {
GenSock Head1;
GenSock Head2;
GenSock Head3;
vector<Generic*> GetSockets() {
vector<Generic*> ret;
ret.push_back(Head1);
ret.push_back(Head2);
ret.push_back(Head3);
return ret;
}
}
struct CrazyAlienTorso : Generic, Bipedal, Tripleheaded {
vector<Generic*> GetSockets() {
somehow call getsockets from all inherited classes and combine the vector for a single output
}
}
这有可能吗?
否则我当然可以手动写出每个传单类上的套接字,但是当我对抽象更具体时,这可能会变得非常繁琐。
也许这样的东西对你有用?
struct CrazyAlienTorso : Generic, Bipedal, Tripleheaded {
vector<Generic*> GetSockets() {
vector<Generic*> v1 = Bipedal::GetSockets();
vector<Generic*> v2 = TripleHeaded::GetSockets();
v1.insert(v1.end(), v2.begin(), v2.end());
return v1;
}
}
没有办法枚举类的所有直接基(据我所知,尽管他们可能正在为以后的c++版本开发一个)。除此之外,库皮亚科斯的回答应该还不错。如果您需要多次执行此类操作,并且需要合并大量基类,则可以进行一些模板元编程,以获得更简洁的快捷方式:
template <typename Base, typename... OtherBases>
struct socket_collector {
template <typename Derived>
static void add_sockets(Derived* obj, vector<Generic*>& sockets) {
socket_collector<OtherBases...>::add_sockets(obj, sockets);
auto new_sockets = static_cast<Base*>(obj)->GetSockets();
sockets.insert(end(sockets), begin(new_sockets), end(new_sockets));
}
};
template <typename Base> struct socket_collector<Base> {
template <typename Derived>
static void add_sockets(Derived* obj, vector<Generic*>& sockets) {
auto new_sockets = static_cast<Base*>(obj)->GetSockets();
sockets.insert(end(sockets), begin(new_sockets), end(new_sockets));
}
};
template <typename... Bases, typename Derived>
vector<Generic*> collect_sockets(Derived* obj) {
vector<Generic*> sockets;
socket_collector<Bases...>::add_sockets(obj, sockets);
return sockets;
}
//...
vector<Generic*> CrazyAlienTorso::GetSockets() {
return collect_sockets<Generic, Bipedal, TripleHeaded>(this);
}
当然,主要问题是GetSockets
的预期用途是什么:根据您要完成的任务,可能有更好的方法来构建代码,而不涉及太多有问题的OOP
相关文章:
- 为不同配置设置MSVC_RUNTIME_LIBRARY的正确方法是什么
- Mongodb c++驱动程序:如何查询元素的数组
- 通过方法访问结构
- 最小硬币更换问题(自上而下方法)
- C++为构建时间获取QDateTime的可靠方法
- 在C#中处理C++指针而不使用unsafe的最佳方法
- 处理多个异常集合的C++方法
- 在 c++ 中解决段树以外的范围查询的有效方法是什么?
- MySQL c++ 连接器:使用 SetBlob() 在查询中设置多个 blob 数据的正确方法是什么?
- 查询数据库以在 C++ 中创建自定义类集合的最佳方法
- 在 MySQL 连接器C++ API 中使用一个函数调用执行多个查询的正确方法是什么?
- 检查从查询返回的任何行是否包含在字符串中的最高性能方法?
- 当有多个查询时,检查某些子数组是否排序的有效方法是什么?
- 在QT列表中存储DB的查询结果的更好方法
- C++ 编程(由 ref 和 by val 的优势)查询?/ 编辑 byRef 以外的结构的方法
- MongoDB:查询单个随机文档的最有效方法是什么?
- 可以查询所有继承类的同名方法吗?
- 在运行时查询模板专门化的方法/避免大的切换
- 查询相似句子的有效方法
- 是否有标准的方法来查询EGL错误字符串