1. C++ / Говнокод #27398

    0

    1. 01
    2. 02
    3. 03
    4. 04
    5. 05
    6. 06
    7. 07
    8. 08
    9. 09
    10. 10
    11. 11
    12. 12
    13. 13
    14. 14
    15. 15
    16. 16
    17. 17
    18. 18
    19. 19
    20. 20
    21. 21
    22. 22
    23. 23
    24. 24
    25. 25
    26. 26
    27. 27
    28. 28
    29. 29
    30. 30
    31. 31
    32. 32
    33. 33
    34. 34
    35. 35
    36. 36
    37. 37
    38. 38
    39. 39
    40. 40
    41. 41
    42. 42
    43. 43
    template<typename T>
    struct method_traits;
    
    template<typename T, typename RetT, typename... Args>
    struct method_traits<RetT(T::*)(Args...)> {
        using this_type = T;
        using ret_type = RetT;
    
        template<size_t ArgIdx>
        using arg_type = typename std::tuple_element<ArgIdx, std::tuple<Args...>>::type;
    
        static constexpr size_t args_count = sizeof...(Args);
        static constexpr bool is_const = false;
        static constexpr bool is_lvalue = false;
        static constexpr bool is_rvalue = false;
    };
    
    template<typename T, typename RetT, typename... Args>
    struct method_traits<RetT(T::*)(Args...) const> : public method_traits<RetT(T::*)(Args...)> {
        static constexpr bool is_const = true;
    };
    
    template<typename T, typename RetT, typename... Args>
    struct method_traits<RetT(T::*)(Args...) &> : public method_traits<RetT(T::*)(Args...)> {
        static constexpr bool is_lvalue = true;
    };
    
    template<typename T, typename RetT, typename... Args>
    struct method_traits<RetT(T::*)(Args...) &&> : public method_traits<RetT(T::*)(Args...)> {
        static constexpr bool is_rvalue = true;
    };
    
    template<typename T, typename RetT, typename... Args>
    struct method_traits<RetT(T::*)(Args...) const &> : public method_traits<RetT(T::*)(Args...)> {
        static constexpr bool is_const = true;
        static constexpr bool is_lvalue = true;
    };
    
    template<typename T, typename RetT, typename... Args>
    struct method_traits<RetT(T::*)(Args...) const &&> : public method_traits<RetT(T::*)(Args...)> {
        static constexpr bool is_const = true;
        static constexpr bool is_rvalue = true;
    };

    А вдруг в новом стандарте ещё модификаторов в тип завезут? Страшня стало...

    Запостил: PolinaAksenova, 07 Мая 2021

    Комментарии (5) RSS

    • Получение типов аргументов выглядит загадочня:
      using FunctorArg = typename functor_traits<F>::template arg_type<0>;
      Ответить
      • почти как https://www.typescriptlang.org/docs/handbook/utility-types.html#parameterstype
        Ответить
    • жду когда gcc сможет в C++20 .. там концепты есть - крутая вешь

      template <class T>
      concept ArithmeticOrEnum = (std::is_arithmetic_v<T> || std::is_enum_v<T>) && !std::is_same_v<T, bool> && !std::is_same_v<T, char_t>;
      //...
          template <typename N = void> requires ArithmeticOrEnum<N>
          bool operator==(N n) const;
      //...
      Ответить
      • gcc 10 с поддержкой концептов вышел 7 мая 2020 года.
        (•ิ_•ิ)?
        Ответить
        • в последний раз у меня не помпилился. так что не знаю что там изменилось
          Ответить

    Добавить комментарий