c++ - 在 static_cast 和dynamic_cast 之间自动选择以获得最佳性能

标签 c++ dynamic-cast static-cast virtual-inheritance

我必须使用一个对象工厂来创建多种类型的新对象,每种类型都派生自多态基类。每个对象的类型是事先已知的,但工厂返回基类上的指针。因此,在构造之后,我需要将该指针向下转换为特定对象类的类型。大多数情况下static_cast完美地完成了它的工作,但在虚拟继承的情况下 dynamic_cast必须用于向下转型。同时我不想使用dynamic_cast对于由于运行时开销而从基类进行非虚拟继承的简单类型。

换句话说,我想找到或制作一个可以转换 From 的函数。 -输入To -类型使用 static_cast如果它可用于此转换(例如 To 不是从 From 派生出来的)或 dynamic_cast否则。

预期用例:

template <typename To, typename From>
To fastest_cast( From && from );

struct A { virtual ~A() = default; };
struct B : A {};
struct C : virtual A {};

int main()
{
    B b;
    fastest_cast<B*>( (A*)&b ); //expected static_cast inside

    C c;
    fastest_cast<C*>( (A*)&c ); //expected dynamic_cast inside
}

有没有类似fastest_cast的东西在 std 库中还是在 boost 库中?还是需要自己实现转换功能(请建议如何实现)?

最佳答案

概念std::derived_from似乎涵盖了您想要 static_cast 的情况,我们只需删除它的引用或指针即可。

template <typename To, typename From>
concept castable = (std::is_pointer_v<To> && std::is_pointer_v<std::remove_cvref_t<From>>) || (std::is_reference_v<To>)

template <typename From, typename To>
concept castable_from = std::derived_from<From, std::remove_cv_t<std::remove_pointer_t<To>>> || std::derived_from<From, std::remove_cvref_t<To>>

template <typename To, castable_from<To> From>
To fastest_cast(From&& from) requires castable<To, From>
{
    return static_cast<To>(from);
}

template <typename To, typename From>
To fastest_cast(From&& from) requires castable<To, From>
{
    return dynamic_cast<To>(from);
}

关于c++ - 在 static_cast 和dynamic_cast 之间自动选择以获得最佳性能,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/68036796/

相关文章:

C++ 如何访问另一个类的对象?

c++ - dynamic_cast 解决实现困境

c++ - Tcl C++ API - 如何类型安全地转换一个空指针

C++:不寻常的运算符重载

c++ - 为什么我不能使用 static_cast<int&> 将整数引用参数传递给 C++ 中的函数?

c++ - 我应该使用它还是 static_cast<void*> 然后 static_cast<myType*> 来避免重新解释?

c++ - 如何禁用 QWizard 中的下一步按钮

c++ - C 全局静态 - 在线程之间共享?

scala - 包装 isInstanceOf[] 调用的正确方法是什么?

c++ - 无序映射会创建零初始化结构吗?