Используйте enum для определения типа возвращаемого результата (взлом с помощью Macro)

У меня есть много типов игровых объектов, которые связаны между собой несколькими способами.
Все отношения осуществляются 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;
}

После некоторого тестирования это работает хорошо. Все довольны волшебным результатом.

Однако мое сознание говорит мне, что это взлом.
Это также немного плохо для контент-ассистента (например, intellisense) и автоматического рефакторинга.
Мне тоже нужно классно взлом X-MACRO если я хочу перенести их реализацию в .cpp,

Вопрос:

  • Есть ли какой-нибудь элегантный (менее хакерский) способ? Что это?
    «Нет» может быть правильным ответом.
  • Является X-MACRO (профессиональный) путь, когда мне нужна такая (странная) функция?

0

Решение

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());
}
1

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]