看起来 Visual C++ 中有一个 safe_cast,它类似于 dynamic_cast。
我想知道 safe_cast 是否在标准的 C++ 中?
看起来 Visual C++ 中有一个 safe_cast,它类似于 dynamic_cast。
我想知道 safe_cast 是否在标准的 C++ 中?
safe_cast在C++/CLI中使用。C++中没有这样的标准构造。
safe_cast不是标准的C++类型转换方式。只有4个转换操作符可用。
1.dynamic_cast <new_type> (expression)
2.reinterpret_cast <new_type> (expression)
3.static_cast <new_type> (expression)
4.const_cast <new_type> (expression)
std::move
和std::forward
,它们都是在编译时发生的转换。 - user2485710std::move
非常有用,而且显然是通过转换实现的,但它并不是技术上的转换运算符。 - Alan Stokes#include <iostream>
#include <boost\polymorphic_cast.hpp>
class Base{
public: virtual ~Base() = default;
};
class D1 : public Base{
public: virtual ~D1() = default;
};
class D2 : public Base{
public: virtual ~D2() = default;
};
int main(void)
{
D1 d1;
Base* b = &d1;
Base* b2 = nullptr;
std::cout << "\n---Testing valid cast---\n";
std::cout << "cast from base to d1: " << boost::polymorphic_cast<D1*>(b) << "\n";
try {
std::cout << "\n---Testing invalid cast---\n";
std::cout << "base to d2: " << boost::polymorphic_cast<D2*>(b) << "\n";
}
catch (...) {
std::cout << "cast from based to d2 failed\n";
}
try {
std::cout << "\n---Testing nullptr cast---\n";
std::cout << "null to d1: " << boost::polymorphic_cast<D1*>(b2) << "\n";
}
catch (...) {
std::cout << "cast from null to d1 failed\n";
}
}
输出结果为:
---Testing valid cast---
cast from base to d1: 00AFFBD4
---Testing invalid cast---
cast from based to d2 failed
---Testing nullptr cast---
cast from null to d1 failed
&std::dynamic_cast<D1&>(*b)
?(当然,你得自己处理 NULL 情况)。这并不是真正的 safe_cast
,只是 dynamic_cast
的抛出版本加上了空指针检查。 - Lightness Races in Orbitsafe_cast
的主要区别在于它适用于 C++/CLI 类型 ;) 因此,在 C++ 中并不是真正的因素。无论如何,我想我的观点是 Boost 对此来说过于复杂了;标准库已经有(基本上)可以满足您需求的东西了,虽然包装它以检查 NULL 可能会很有用,并且可以获得您所描述的内容。 - Lightness Races in Orbitdynamic_cast
仍然更清晰明了。 - Lightness Races in Orbit
&dynamic_cast<Foo&>(*p)
- Alan Stokesdynamic_cast
需要RTTI,因此您可能需要处理一些编译器标志以确保获得正确的行为,并且它会在运行时花费一些成本,因为它发生在运行时。 - user2485710