私はいくつかの方法で互いに関連している多くのタイプのゲームオブジェクトを持っています。
すべての関係は によって実装され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;
}
いくつかのテストの後、うまく機能します。誰もが魔法のような結果に満足しています。
しかし、私の意識はそれがハックだと教えてくれます。
また、コンテンツ アシスト (インテリセンスなど) や自動リファクタリングにも少し悪いです。実装を に移動したい場合は、素晴らしいハッキングX-MACRO
も必要です。.cpp
質問:
- エレガントな(ハックの少ない)方法はありますか?それは何ですか?
「いいえ」は有効な答えです。 - X-MACROは、そのような (奇妙な) 機能が必要な場合の (プロフェッショナルな) 方法ですか?