0

私はいくつかの方法で互いに関連している多くのタイプのゲームオブジェクトを持っています。
すべての関係は によって実装され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は、そのような (奇妙な) 機能が必要な場合の (プロフェッショナルな) 方法ですか?
4

1 に答える 1

1
struct GameRelation{
    template <typename A, typename B>
    struct Relation {
        std::vector<B*> getAllRight(A* a) {
            return map.getK2(a);
        }

    private:
        Map<A, B> map;
    };

    Relation<Human, House> own;
};

int main() {
    GameRelation gameRelation;
    std::vector<House*> houses = gameRelation.own.getAllRight(new Human()); 
}
于 2017-04-22T08:45:13.317 に答える