我希望有一个可以摄取对象的容器,并将其不同部分存储到不同的内部容器中。
类似这样的东西:
// Pseudo-code
template<typename A, typename B, typename C>
class Container {
std::vector<B> vb;
std::vector<C> vc;
public:
void push_back(const A &a) {
vb.push_back(a);
vc.push_back(a);
}
};
class AA {
int a;
std::string s;
};
class BB {
int a;
};
class CC {
std::string s;
};
Container<AA, BB, CC> cont;
AA aa;
cont.push_back(aa);
我希望对象vb
获得类A和B(切片)之间的共同点,而对象vc
也是如此。
理想情况下,AA,BB和CC类不应处于层次关系。我希望编译器能够按成员类型匹配成员。
我希望解决方案的性能损失较小。
答案 0 :(得分:4)
在AA
继承BB
和CC
的情况下,您的伪代码容器已经可以使用,因为切片允许从派生到基数的隐式转换。但是,您的实现方式不限于此类情况。只需要将AA
隐式转换为BB
和CC
。继承就足够了,但不是必须的。
您可以通过定义转换运算符使一个类可转换为其他类:
struct AA {
operator BB() const { return {a}; }
operator CC() const { return {s}; }
int a;
std::string s;
};
或者,如果您希望依赖关系以另一种方式运行,则可以将转换构造函数添加到BB
和/或CC
中:
struct BB {
BB(const AA& aa) : a(aa.a) {}
int a;
};
但是请注意,缩小这种隐式转换可能会导致某些错误被忽略。
答案 1 :(得分:2)
您可以使用标签分发对类型进行分类并有条件地选择其成员。一个例子:
{{1}}