gpt4 book ai didi

c++ - 使用 enum 来确定返回结果的类型(使用 Macro 的 hack)

转载 作者:行者123 更新时间:2023-11-28 05:10:45 25 4
gpt4 key购买 nike

我有很多类型的游戏对象,它们以某种方式关联在一起。
所有关系由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);
}

这是它的使用方法 ( full demo ):-

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,我还需要 awesome hacking X-MACRO .

问题:

  • 是否有任何优雅(更少黑客)的方式?这是什么?
    “否”可以是一个有效的答案。
  • 当我需要这种(奇怪的)功能时,X-MACRO 是(专业)方法吗?

最佳答案

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

关于c++ - 使用 enum 来确定返回结果的类型(使用 Macro 的 hack),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43556687/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com