gpt4 book ai didi

c++ - 如何在不导致段错误的情况下测试 "dynamic_cast"的结果

转载 作者:行者123 更新时间:2023-12-04 15:56:47 38 4
gpt4 key购买 nike

我正在编写一个同时使用多态性和模板的类,就像:


class base {
virtual ~base() = default;
};

template <typename T>
class derived : public base {
T a;
void save(T a_) { a = a_; }
};

所以当我想使用函数 derived::save() 时,基本上,我需要 dynamic_cast,但它无法检查它是好 Actor 还是坏 Actor :

void test() {
base *p = new derived<float>();
// good case
dynamic_cast<derived<float>*>(p)->save(1);
// bad case
dynamic_cast<derived<int>*>(p)->save(1);
}

如您所见,好的案例可以正常工作,但不好的案例会导致在大型项目中难以定位的段故障。

那么,有什么方法可以让我检查 cast,并像这样警告用户:

template <typename T>
class derived : public base {
T a;
using type = T;
/// of course this would not work, but you know want I mean
void save(T a_) {
if (std::is_same< std::decltype(a_), type >::value)
a = a_;
else
throw std::runtime_error("invalid type");
}
};

最佳答案

您可以检查动态转换的结果:

void test() {
base* p = new derived<float>();
// good case
if (auto* d = dynamic_cast<derived<float>*>(p))
d->save(1); // called
if (auto* d = dynamic_cast<derived<int>*>(p))
d->save(1); // not called
delete p;
}

在基类中将 save 设为虚拟似乎更好。

关于c++ - 如何在不导致段错误的情况下测试 "dynamic_cast"的结果,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/68879171/

38 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com