-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathP434.DetectingNontypeMembers.cpp
More file actions
40 lines (32 loc) · 1 KB
/
Copy pathP434.DetectingNontypeMembers.cpp
File metadata and controls
40 lines (32 loc) · 1 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
#include <type_traits>
#include <utility>
#include <vector>
#define DEFINE_HAS_MEMBER(Member)\
template<typename, typename = std::void_t<>>\
struct HasMember_##Member : public std::false_type {};\
template<typename T>\
struct HasMember_##Member<T, std::void_t<decltype(&T::Member)>> : public std::true_type {};\
template<typename T>\
constexpr bool HasMember_##Member##_v = HasMember_##Member<T>::value;
DEFINE_HAS_MEMBER(a)
DEFINE_HAS_MEMBER(b)
DEFINE_HAS_MEMBER(type);
struct X
{
int a;
int b();
using type = int;
};
template<typename, typename = std::void_t<>>
struct Has_begin : public std::false_type {};
template<typename T>
struct Has_begin<T, std::void_t<decltype(std::declval<T>().begin())>> : public std::true_type {};
template<typename T>
constexpr bool Has_begin_t = Has_begin<T>::value;
int main(int argc, char const *argv[])
{
static_assert(HasMember_a_v<X>);
static_assert(HasMember_b_v<X>);
static_assert(Has_begin_t<std::vector<int>>);
return 0;
}