如何避免未评估代码 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)) {
为最含糊和离奇的标题道歉。
假设我们有 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)) {