旧的 c++ 精密工厂
Old c++ Sophisticated Factory
我需要用 C++03 编写一个像这样工作的工厂:
1) 创建的元素是对象块
2) 工厂保存对所有此类子对象的引用。
3) 块是可缩放的
含义:
class Block{
MemberType member1;
MemberType member2;
MemberType member3;
Block(){...}
}
class Factory{
set<MemberType*> members1;
set<MemberType*> members2;
set<MemberType*> members3;
Block& makeBlockInstance(){
Block& currentBlock = *(new Block());
members1.push_back(&(currentBlock.member1));
members2.push_back(&(currentBlock.member2));
members3.push_back(&(currentBlock.member3));
return currentBlock;
}
}
- 请不要介意语法错误或小细节,代码是为了说明问题。
我需要的是一种从 Block
添加或删除成员的方法,这种方法会自动创建或删除 set<MemberType*> members#
和 members#.push_back(...)
。
这可能吗?
这似乎是通过反射完成的,但我想要一些非反射的方式来静态地做到这一点。
我很乐意看到一种非预处理器的方式来做到这一点。
在那之前(如果有的话)- 这里是如何使 X 宏扩展有条件的
我认为最干净的方法是使用 X Macro 实现:
#define MEMBERS \
X(member1)
X(member2)
#define X(m) MemberType m;
MEMBERS
#undefine X
#define X(m) set<MemberType*> m;
MEMBERS
#undefine X
#define X(m) m.push_back(&(currentBlock.m));
MEMBERS
#undefine X
如果您希望成员具有不同的类型,您可以将其更改为:
#define MEMBERS \
X(int, member1)
X(vector<char>, member2)
#define X(t, m) t m;
MEMBERS
#undefine X
#define X(t, m) set<t *> m;
MEMBERS
#undefine X
#define X(t, m) m.push_back(&(currentBlock.m));
MEMBERS
#undefine X
我需要用 C++03 编写一个像这样工作的工厂:
1) 创建的元素是对象块
2) 工厂保存对所有此类子对象的引用。
3) 块是可缩放的
含义:
class Block{
MemberType member1;
MemberType member2;
MemberType member3;
Block(){...}
}
class Factory{
set<MemberType*> members1;
set<MemberType*> members2;
set<MemberType*> members3;
Block& makeBlockInstance(){
Block& currentBlock = *(new Block());
members1.push_back(&(currentBlock.member1));
members2.push_back(&(currentBlock.member2));
members3.push_back(&(currentBlock.member3));
return currentBlock;
}
}
- 请不要介意语法错误或小细节,代码是为了说明问题。
我需要的是一种从 Block
添加或删除成员的方法,这种方法会自动创建或删除 set<MemberType*> members#
和 members#.push_back(...)
。
这可能吗? 这似乎是通过反射完成的,但我想要一些非反射的方式来静态地做到这一点。
我很乐意看到一种非预处理器的方式来做到这一点。
在那之前(如果有的话)- 这里是如何使 X 宏扩展有条件的
我认为最干净的方法是使用 X Macro 实现:
#define MEMBERS \
X(member1)
X(member2)
#define X(m) MemberType m;
MEMBERS
#undefine X
#define X(m) set<MemberType*> m;
MEMBERS
#undefine X
#define X(m) m.push_back(&(currentBlock.m));
MEMBERS
#undefine X
如果您希望成员具有不同的类型,您可以将其更改为:
#define MEMBERS \
X(int, member1)
X(vector<char>, member2)
#define X(t, m) t m;
MEMBERS
#undefine X
#define X(t, m) set<t *> m;
MEMBERS
#undefine X
#define X(t, m) m.push_back(&(currentBlock.m));
MEMBERS
#undefine X