Skip to content

File ducktyping_traits_pp.hpp

File List > backends > cxx > include > zmbt > reflect > ducktyping_traits_pp.hpp

Go to the documentation of this file

#ifndef ZMBT_REFLECT_DUCKTYPING_TRAITS_MACROS_HPP_
#define ZMBT_REFLECT_DUCKTYPING_TRAITS_MACROS_HPP_

#define CAT(a, b) a##b

#define ZMBT_TRAIT_HAS_TYPE(trait, name)     \
    template <class T, class = void>         \
    struct trait : std::false_type {};       \
    template <class T>                       \
    struct trait<                            \
        T, zmbt::void_t<typename T::name>>   \
    : std::true_type {};


#define ZMBT_TRAIT_HAS_MEMBER(trait, name)           \
    template <class T, class = void>                 \
    struct trait : std::false_type {};               \
    template <class T>                               \
    struct trait<T,                                  \
    zmbt::void_t<decltype(std::declval<T>().name())>>\
    : std::true_type {};


#define ZMBT_HAS_TYPE(name) ZMBT_TRAIT_HAS_TYPE(CAT(has_type_, name), name)
#define ZMBT_HAS_MEMBER(name) ZMBT_TRAIT_HAS_MEMBER(CAT(has_member_, name), name)




#endif // ZMBT_REFLECT_DUCKTYPING_TRAITS_MACROS_HPP_