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

How avoid error on not evaluated code C++?

为最含糊和离奇的标题道歉。
假设我们有 2 classes A 和 B.
class B 有接口 hasSmth 但 class 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())) {
        ...
    }
}

如果函数returnsobj是B类型的,那我们就可以了
但是如果它 returns 类型为 A 的 obj,编译器会抱怨 A 没有 hasSmth,而不管 if 的那部分从未被评估过。

有人可以提供解决方法吗?

Can someone give a workaround please?

阅读 someFunction 的声明以了解它 return 的内容。如果不是returnB,那就不要写obj.hasSmth()。问题已解决。

现在,让我们稍微改变一下问题。假设您想在不知道 return 类型的情况下完成这项工作。也许是因为您实际上可能正在编写一个适用于不同类型的模板,而不是 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)) {