我必须使用一个对象工厂来创建多种类型的新对象,每种类型都派生自多态基类。每个对象的类型是事先已知的,但工厂返回基类上的指针。因此,在构造之后,我需要将该指针向下转换为特定对象类的类型。大多数情况下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/