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 `static constexpr` 14 : * variable, optionally also checking its type. 15 : * 16 : * To generate the corresponding `_v` metafunction, call 17 : * `CREATE_HAS_STATIC_MEMBER_VARIABLE` first and then 18 : * `CREATE_HAS_STATIC_MEMBER_VARIABLE_V`. 19 : * 20 : * \example 21 : * \snippet Test_CreateHasStaticMemberVariable.cpp CREATE_HAS_EXAMPLE 22 : * 23 : * \see `CREATE_IS_CALLABLE` 24 : */ 25 : // Use `NoSuchType*****` to represent any `VariableType`, i.e. not checking the 26 : // variable type at all. If someone has that many pointers to a thing that isn't 27 : // useful, it's their fault... 28 1 : #define CREATE_HAS_STATIC_MEMBER_VARIABLE(CONSTEXPR_NAME) \ 29 : template <typename CheckingType, typename VariableType = NoSuchType*****, \ 30 : typename = std::void_t<>> \ 31 : struct has_##CONSTEXPR_NAME : std::false_type {}; \ 32 : \ 33 : template <typename CheckingType, typename VariableType> \ 34 : struct has_##CONSTEXPR_NAME<CheckingType, VariableType, \ 35 : std::void_t<std::remove_const_t<decltype( \ 36 : CheckingType::CONSTEXPR_NAME)>>> \ 37 : : std::bool_constant<std::is_same_v<VariableType, NoSuchType*****> or \ 38 : std::is_same_v<std::remove_const_t<decltype( \ 39 : CheckingType::CONSTEXPR_NAME)>, \ 40 : VariableType>> {}; 41 : 42 : // Separate macros to avoid compiler warnings about unused variables 43 1 : #define CREATE_HAS_STATIC_MEMBER_VARIABLE_V(CONSTEXPR_NAME) \ 44 : template <typename CheckingType, typename VariableType = NoSuchType*****> \ 45 : static constexpr const bool has_##CONSTEXPR_NAME##_v = \ 46 : has_##CONSTEXPR_NAME<CheckingType, VariableType>::value; 47 : /// @}