【发布时间】:2021-04-11 06:05:58
【问题描述】:
为最模棱两可和离奇的标题道歉。
假设我们有 2 个类 A 和 B。
B 类有接口 hasSmth 但 A 类没有。
如何让这段代码在没有编译错误的情况下进行评估?
class A {
//..implementation
int id() { return 1; }
};
class B {
//..implementation
int id() { return 2; }
bool hasSmth() { return true; }
};
int main()
{
auto obj = someFunction();//returns A or B
if (obj.id() == 1 || (obj.id() == 2 && obj.hasSmth())) {
...
}
}
如果函数返回 B 类型的 obj,那么我们很好。
但是如果它返回 A 类型的 obj,编译器会抱怨 A 没有 hasSmth,不管 if 从未被评估过的那部分。
有人可以提供解决方法吗?
【问题讨论】:
-
“返回 A 或 B”是不可能的。所有函数的返回类型必须在编译时已知。
-
这看起来可能是 XY 问题的情况:xyproblem.info
-
@Someprogrammerdude 在这种情况下,它将返回
std::variant...并且问题可能可以通过visit或其他方式解决。但是在 OP 指定someFunction之前无法回答这个问题 -
我同意@jjramsey 和@MSalters,根据“类型”(您的
id确实是)选择代码路径几乎总是一种反模式。您尝试使用这样的代码解决的实际问题是什么? -
“someFunction() 与问题无关” - 它是问题的确切根源。如果不是这样,这个问题甚至不会在这里。这以某种方式返回了两种可能不同的类型,这一事实首先使这个动物园成为了拱顶。如果我们没有完全了解您在做什么,我们就无法安排可能的解决方案
标签: c++ c++11 expression-evaluation