c++ 禁用“动态转换总是失败”警告

csga3l58  于 2022-12-27  发布在  其他
关注(0)|答案(1)|浏览(121)

我的情况类似于dynamic_cast<B *> (&a) gives a warning
我有一个基类和一个派生类:

struct Base {
  virtual ~Base() = default;

  int foo() { return 5; }
};

struct Derived : public Base {
  int bar() { return 10; }
};

我输入了单元测试,检查foo()对于BaseDerived类都返回5,bar()对于Derived类返回10。

...
using Types = ::testing::Types(Base, Derived);

TYPED_TEST(Foo, Bar){
  auto obj = std::make_unique<ParamType>();
  auto *derived = dynamic_cast<Derived*>(obj.get());

  // check logic for Base
  // check logic for Derived if derived != nullptr
}

在使用ParamType等于Base的测试示例化之后,使用dynamic_cast的行生成关于dynamic_cast从未成功的警告,因为它应该成功。
如何在gcc编译器上禁用此警告?

e0bqpujr

e0bqpujr1#

您可以使用if constexpr,沿着:

TYPED_TEST(Foo, Bar){
  auto obj = std::make_unique<ParamType>();

  // TestBase(*obj);
  if constexpr(std::is_same_v<ParamType, Derived>) {
      // auto *derived = dynamic_cast<Derived*>(obj.get()); // No longer needed
      // TestDerived(*obj);
  }
}

相关问题