如何在不导致段错误的情况下测试“dynamic_cast”的结果

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


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

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

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

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在基类的虚似乎更BTW。


以上是如何在不导致段错误的情况下测试“dynamic_cast”的结果的全部内容。
THE END
分享
二维码
< <上一篇
下一篇>>