检查成员是否在课堂上宣布

Tob*_*ull 10 c++ sfinae type-traits c++17

是否可以检查给定类中是否声明了成员变量,成员函数或类型定义?

StackOverflow上的各种问题讨论了检查给定类是否只包含一个成员,主要是使用std :: is_detected.但是所有这些解决方案也在派生类中检测成员,这可能不会自己声明成员.

例如,以下内容无法编译.

#include <experimental/type_traits>

struct base
{
  using type = std::true_type;
};

struct derived : public base { };

template<typename T>
using has_type_t = typename T::type;

template<typename T>
constexpr inline bool has_type_v =         
std::experimental::is_detected<has_type_t, T>::value;

int main ()
{
  static_assert (has_type_v<base>);
  static_assert (!has_type_v<derived>);
}
Run Code Online (Sandbox Code Playgroud)

可以进行任何更改,以便两个断言成立吗?或者需要反思吗?

Jar*_*d42 1

我没有看到类型或静态成员的方法,但对于常规成员,您可以base::m区分derived::m

template<typename T>
using has_m_t = decltype(&T::m);

template<typename T>
constexpr inline bool has_m_v =
    std::experimental::is_detected_exact<int (T::*), has_m_t, T>::value;
Run Code Online (Sandbox Code Playgroud)

和测试:

struct base { int m; };
struct derived : public base {};
struct without {};

static_assert( has_m_v<base>);
static_assert(!has_m_v<derived>);
static_assert(!has_m_v<without>);
Run Code Online (Sandbox Code Playgroud)

演示