复制交换习惯用法-我们可以在这里使用动态强制转换操作吗
Copy swap idiom - Can we use a dynamic cast operation here?
我读到了关于复制交换习惯用法的文章,在一个示例中,交换方法以以下方式实现:
class Derived : public Base
{
public:
std::string title = "";
details *detail = nullptr;
void swap(Derived& lhs, Derived& rhs)
{
using std::swap;
Base& lb = static_cast<Base&>(lhs);
Base& rb = static_cast<Base&>(rhs);
std::swap(lb,rb);
std::swap(lhs.title, rhs.title);
std::swap(lhs.detail, rhs.detail);
}
//Regular Contructor
Derived() { /*...*/ }
....
}
现在在交换方法中有一个特殊的原因是使用了static_cast
。使用像这样的动态投射是否安全
Base* lb = dynamic_cast<Base*>(&lhs)
Base* rb = dynamic_cast<Base*>(&rhs)
std::swap(*lb,*rb);
您可以始终将static_cast
转换为明确可见的基类。dynamic_cast
的使用方向相反——从基类指针/引用转换为可能无效的派生类。这里完全没有必要,但是的,它是安全的,因为它将具有与static_cast
相同的效果。
看看这里的第三点。
3(如果
new_type
是指向Base
的指针或引用表达式是指向Derived
的指针或引用,其中Base
是Derived
的唯一、可访问基类,结果是指针或引用Derived
对象中的Base
类子对象通过表达指向或识别。(注意:隐式强制转换和static_cast
也可以执行这种转换。(
相关文章:
- 如何将这个C++哈希表转换为动态扩展和收缩,而不是使用硬设置的最大值
- 重构使用动态强制转换的 std::set 的比较运算符
- 指针类型类成员的动态强制转换的恒定性是什么?
- 调用不在基类中的派生类函数而不进行动态强制转换,以最大程度地提高性能
- 虚拟成员函数的定义是否强制在同一转换单元中动态初始化静态数据成员?
- 为了访问方法,从基类动态转换为派生类
- 如何对以下程序使用静态或动态转换
- 使用静态转换,因为动态转换失败.不好的做法?
- 动态转换 qspinbox 到 qdoublespinbox
- C++动态转换失败/子对象被视为父对象
- 关于带有模板类的C++动态转换
- 将基体动态转换为派生对象
- sharedptr的动态转换
- 如何动态转换模板类
- 动态转换中的错误
- 如何从另一个kext动态转换类
- Xerces.动态转换DOMNode指针到DOMElement返回一个nullptr
- 难以理解c风格的类型转换和动态转换
- 引用的动态转换
- 是否可以在c++中的类似接口的体系结构中使用动态转换