问题描述
为最含糊和离奇的标题道歉。
假设我们有 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 的那部分从未被评估过。
有人可以提供解决方法吗?
解决方法
有人可以提供解决方法吗?
阅读 someFunction
的声明以查看它返回的内容。如果它不返回 B
,则不要写 obj.hasSmth()
。问题解决了。
现在,让我们稍微改变一下问题。假设您想在不知道返回类型的情况下完成这项工作。也许是因为您实际上编写的不是 main
而是一个适用于不同类型的模板。有多种方法,但函数重载是一种简单的方法:
bool check([[maybe_unused]] const A&) {
return true;
}
bool check(const B& b) {
return b.hasSmth();
}
template<bool returnsA>
void foo() {
auto obj = someTemplate<returnsA>(); // returns A or B
if (check(obj)) {