【发布时间】:2015-12-09 20:58:47
【问题描述】:
我有一些不同类型的数据希望能够添加到对象(这里称为“A”和“B”)。如果我为两个不同的对象以相同的顺序添加它们,将一个复制到另一个可以正常工作(例如A<B<Point> > abPoint1; A<B<Point> > abPoint2 = abPoint1;)。但是,如果我以不同的顺序添加它们(例如A<B<Point> > abPoint; B<A<Point> > baPoint = abPoint; // compiler error),因为类型签名不一样。有没有办法在不明确处理指数数量的 mixin 组合的情况下做到这一点?
这是一个用于测试的 MWE:
// Standard point representation
struct Point
{
double x,y,z;
};
// A mixin to add an 'A' value to a point
template<class Base>
class A : public Base
{
public:
double a;
};
// A mixin to add an 'B' value to a point
template<class Base>
class B : public Base
{
public:
double b;
};
int main()
{
A<Point> aPoint;
B<Point> bPoint;
// A<Point> a2Point = bPoint; // obviously we can't do this
A<B<Point> > abPoint;
B<A<Point> > baPoint;
abPoint = baPoint; // Something like this seems like it should be possible
return 0;
}
更好的是,有没有办法只复制“可用”的数据片段?那就是:
A<B<C<D<Point>>>> abcdPoint;
A<C<Point>> acPoint;
abcdPoint = acPoint;
只会复制 A 和 C 的成员。
【问题讨论】:
-
stackoverflow.com/questions/33789582/…。引用CRTP的这个问题的答案可能会对您有所帮助。它将允许您重铸 'this' 和其他参数以测试它们是否具有您需要的数据,并编写一个 operator = 来执行操作。
-
嗯,我不确定我是否遵循这一点。所以在这里我需要模板点?那么我会为哪个类写一个operator=?每个人都只是复制自己的数据吗(它们会自动称为“递归”吗?)?
-
hmm.. 假设你有一个类 C : public Base 有一个成员变量 double a;然后你做了- A
aPoint; C cPoint; cPoint = aPoint -
@KorreyD 不完全——它实际上比这更强大。如果我有一个 A
> acPoint 和一个 A aPoint,我希望 acPoint = aPoint 复制 A 类中的所有内容,因为这是它们唯一的共同点。同样,acPoint = point 只会复制 Point 的成员。但它需要扩展,比如 A>>> abcdPoint; A > acPoint; abcdPoint = acPoint 只会复制 A 和 C 的成员。明白我的意思吗?我已将此描述添加到问题中,因为这确实是我想要的。