Line data Source code
1 0 : // Distributed under the MIT License. 2 : // See LICENSE.txt for details. 3 : 4 : #pragma once 5 : 6 : #include <type_traits> 7 : 8 : #include "Utilities/NoSuchType.hpp" 9 : 10 : /// @{ 11 : /*! 12 : * \ingroup TypeTraitsGroup 13 : * \brief Generate a type trait to check if a class has a type alias with a 14 : * particular name, optionally also checking its type. 15 : * 16 : * To generate the corresponding `_v` metafunction, call 17 : * `CREATE_HAS_TYPE_ALIAS` first and then `CREATE_HAS_TYPE_ALIAS_V`. 18 : * 19 : * \example 20 : * \snippet Test_CreateHasTypeAlias.cpp CREATE_HAS_TYPE_ALIAS 21 : * 22 : * \see `CREATE_IS_CALLABLE` 23 : */ 24 : // Use `NoSuchType*****` to represent any `AliasType`, i.e. not checking the 25 : // alias type at all. If someone has that many pointers to a thing that isn't 26 : // useful, it's their fault... 27 1 : #define CREATE_HAS_TYPE_ALIAS(ALIAS_NAME) \ 28 : template <typename CheckingType, typename AliasType = NoSuchType*****, \ 29 : typename = std::void_t<>> \ 30 : struct has_##ALIAS_NAME : std::false_type {}; \ 31 : \ 32 : template <typename CheckingType, typename AliasType> \ 33 : struct has_##ALIAS_NAME<CheckingType, AliasType, \ 34 : std::void_t<typename CheckingType::ALIAS_NAME>> \ 35 : : std::bool_constant< \ 36 : std::is_same_v<AliasType, NoSuchType*****> or \ 37 : std::is_same_v<typename CheckingType::ALIAS_NAME, AliasType>> {}; 38 : // Separate macros to avoid compiler warnings about unused variables 39 1 : #define CREATE_HAS_TYPE_ALIAS_V(ALIAS_NAME) \ 40 : template <typename CheckingType, typename AliasType = NoSuchType*****> \ 41 : static constexpr const bool has_##ALIAS_NAME##_v = \ 42 : has_##ALIAS_NAME<CheckingType, AliasType>::value; 43 : /// @}