std::is_polymorphic 如何识别多态性?

sri*_*ana 6 c++ std

我试图理解 C++ 中的工作原理std::is_polymorphc。这是定义在type_traits.h

template <class _Ty>
struct is_polymorphic : bool_constant<__is_polymorphic(_Ty)> {}; // determine whether _Ty is a polymorphic type

template <class _Ty>
_INLINE_VAR constexpr bool is_polymorphic_v = __is_polymorphic(_Ty);
Run Code Online (Sandbox Code Playgroud)

我无法找到 的源代码__is_polymorphic。有人可以帮助我了解如何__is_polymorphic工作吗?

bol*_*lov 10

__is_polymorphic是一个保留关键字,因此它是内置于编译器中的,即它不在库中实现,而是直接在编译器中实现。所以,没有源代码可看,除非你看编译器的源代码。

cppreference上,您可以看到可能的实现:

namespace detail {

template <class T>
std::true_type detect_is_polymorphic(
    decltype(dynamic_cast<const volatile void*>(static_cast<T*>(nullptr)))
);
template <class T>
std::false_type detect_is_polymorphic(...);

} // namespace detail

template <class T>
struct is_polymorphic : decltype(detail::detect_is_polymorphic<T>(nullptr)) {};
Run Code Online (Sandbox Code Playgroud)

这是通过使用需要多态类型才能编译的事实dynamic_cast来实现的。detect_is_polymorphic是一个重载函数,它使用 SFINAE 检查dynamic_cast在 上是否有效T

  • @SilvioMayolo 它之所以有效,是因为 `dynamic_cast&lt;void*&gt;` 被定义为仅适用于多态类型。因此,这使用了该事实以及重载解析规则,以便对于多态类型,选择第一个“detect_is_polymorphic”重载,但对于非多态类型,它会被 SFINAE 删除,然后选择第二个。 (3认同)