【发布时间】:2017-12-07 18:53:11
【问题描述】:
我有两个可以互换的课程。 A 可以转换为 B,B 可以转换为 A。我想要的是一种指定 A 转换为 B 是首选的方法,但仍然可以执行以下操作:
B b = A();
B b; b = A();
我试图避免的是这个问题: 乙 b = q ? A() : B();
错误:条件表达式不明确; 'A'可以转换为'B',反之亦然
我尝试了一系列显式设置,但我无法确定这是否可行。我宁愿不必在这些上调用 static_cast。
struct B;
struct A {
int a;
A () {
}
A (B b);
explicit operator B ();
};
struct B {
int b;
B () {
}
B (A a);
explicit operator A ();
};
A::A (B b) {
}
A::operator B () {
B b;
return b;
}
B::B (A a) {
}
B::operator A () {
A a;
return a;
}
int main () {
int q;
A a;
B b;
A ab = q ? a : b;
B b2 = a;
}
【问题讨论】:
-
解决办法就是这样做
A ab = q ? (A)a : (A)b; -
拥有两种相互了解且可相互转换的类型往往是次优设计。 Scala 有一些这样的类型,现在他们建议不要这样做。推理起来要容易得多。