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)
可以进行任何更改,以便两个断言成立吗?或者需要反思吗?
我没有看到类型或静态成员的方法,但对于常规成员,您可以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)