如何避免未评估代码 C++ 的错误?

问题描述

为最含糊和离奇的标题道歉。
假设我们有 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)) {