如何在不导致段错误的情况下测试 "dynamic_cast" 的结果
how can I test the result of "dynamic_cast" without causing segment fault
我正在写一个 class 同时使用多态和模板,就像:
class base {
virtual ~base() = default;
};
template <typename T>
class derived : public base {
T a;
void save(T a_) { a = a_; }
};
所以当我想使用函数 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;
}
在基础 class 中使 save
虚拟化似乎更好顺便说一句。
我正在写一个 class 同时使用多态和模板,就像:
class base {
virtual ~base() = default;
};
template <typename T>
class derived : public base {
T a;
void save(T a_) { a = a_; }
};
所以当我想使用函数 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;
}
在基础 class 中使 save
虚拟化似乎更好顺便说一句。