我有许多类型的游戏对象在某些方面相关联。
所有关系都由 实现Map<K1,K2>
。
#include <vector>
using namespace std;
template<class K1,class K2> class Map{ //N:N relation
public: std::vector<K2*> getK2(K1* k1){/* some code */return std::vector<K2*>();}
public: std::vector<K1*> getK1(K2* k2){/* some code */return std::vector<K1*>();}
//... various function ...
};
GameRelation
这是方便所有关系查询的中心类:-(
只是一个示例,无需关注所有细节)
class Human{}; class House{}; class Dog{};
class GameRelation{
public:
#define RELATION(A,B,EnumName) Map<A,B> Map##EnumName; \
enum EnumName##Enum{EnumName}; \
std::vector<B*> getAllRight(EnumName##Enum e,A* a){ \
return Map##EnumName.getK2(a); \
}
//... various function ...
RELATION(Human,House,Own)
//I can insert any relation that I want
};
上面的宏扩展为:-
Map<Human,House> MapOwn;
enum OwnEnum{Own};
std::vector<House*> getAllRight(OwnEnum e,Human* a){
return MapOwn.getK2(a);
}
以下是它的使用方法(完整演示):-
int main() {
GameRelation gameRelation;
std::vector<House*> houses=gameRelation.getAllRight(GameRelation::Own,new Human());
//get all "House" that is "Own" by a "Human"
return 0;
}
经过一些测试,它工作得很好。每个人都对神奇的结果感到满意。
但是,我有意识地告诉我,这是一个 hack。
这对于内容辅助(例如智能感知)和自动重构也有点不利。
如果我想将他们的实现迁移到..cpp
问题:
- 有什么优雅(少黑客)的方式吗?它是什么?
“否”可以是一个有效的答案。 - 当我需要这种(奇怪的)功能时, X-MACRO是(专业的)方式吗?