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

    +318

    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
    template<typename Char, typename Allocator> struct CommonTypeRef<GenericStringView<Char>, GenericString<Char, Allocator>> {typedef GenericString<Char, Allocator> _;};
    template<typename Char, typename Allocator> struct CommonTypeRef<GenericStringView<Char>&, GenericString<Char, Allocator>> {typedef GenericString<Char, Allocator> _;};
    template<typename Char, typename Allocator> struct CommonTypeRef<GenericStringView<Char>&&, GenericString<Char, Allocator>> {typedef GenericString<Char, Allocator> _;};
    template<typename Char, typename Allocator> struct CommonTypeRef<const GenericStringView<Char>&, GenericString<Char, Allocator>> {typedef GenericString<Char, Allocator> _;};
    
    template<typename Char, typename Allocator> struct CommonTypeRef<GenericStringView<Char>, GenericString<Char, Allocator>&> {typedef GenericString<Char, Allocator> _;};
    template<typename Char, typename Allocator> struct CommonTypeRef<GenericStringView<Char>&, GenericString<Char, Allocator>&> {typedef GenericString<Char, Allocator> _;};
    template<typename Char, typename Allocator> struct CommonTypeRef<GenericStringView<Char>&&, GenericString<Char, Allocator>&> {typedef GenericString<Char, Allocator> _;};
    template<typename Char, typename Allocator> struct CommonTypeRef<const GenericStringView<Char>&, GenericString<Char, Allocator>&> {typedef GenericString<Char, Allocator> _;};
    
    template<typename Char, typename Allocator> struct CommonTypeRef<GenericStringView<Char>, GenericString<Char, Allocator>&&> {typedef GenericString<Char, Allocator> _;};
    template<typename Char, typename Allocator> struct CommonTypeRef<GenericStringView<Char>&, GenericString<Char, Allocator>&&> {typedef GenericString<Char, Allocator> _;};
    template<typename Char, typename Allocator> struct CommonTypeRef<GenericStringView<Char>&&, GenericString<Char, Allocator>&&> {typedef GenericString<Char, Allocator> _;};
    template<typename Char, typename Allocator> struct CommonTypeRef<const GenericStringView<Char>&, GenericString<Char, Allocator>&&> {typedef GenericString<Char, Allocator> _;};
    
    template<typename Char, typename Allocator> struct CommonTypeRef<GenericStringView<Char>, const GenericString<Char, Allocator>&> {typedef GenericString<Char, Allocator> _;};
    template<typename Char, typename Allocator> struct CommonTypeRef<GenericStringView<Char>&, const GenericString<Char, Allocator>&> {typedef GenericString<Char, Allocator> _;};
    template<typename Char, typename Allocator> struct CommonTypeRef<GenericStringView<Char>&&, const GenericString<Char, Allocator>&> {typedef GenericString<Char, Allocator> _;};
    template<typename Char, typename Allocator> struct CommonTypeRef<const GenericStringView<Char>&, const GenericString<Char, Allocator>&> {typedef GenericString<Char, Allocator> _;};
    
    
    
    template<typename Char, typename Allocator> struct CommonTypeRef<GenericString<Char, Allocator>, GenericStringView<Char>> {typedef GenericString<Char, Allocator> _;};
    template<typename Char, typename Allocator> struct CommonTypeRef<GenericString<Char, Allocator>, GenericStringView<Char>&> {typedef GenericString<Char, Allocator> _;};
    template<typename Char, typename Allocator> struct CommonTypeRef<GenericString<Char, Allocator>, GenericStringView<Char>&&> {typedef GenericString<Char, Allocator> _;};
    template<typename Char, typename Allocator> struct CommonTypeRef<GenericString<Char, Allocator>, const GenericStringView<Char>&> {typedef GenericString<Char, Allocator> _;};
    
    template<typename Char, typename Allocator> struct CommonTypeRef<GenericString<Char, Allocator>&, GenericStringView<Char>> {typedef GenericString<Char, Allocator> _;};
    template<typename Char, typename Allocator> struct CommonTypeRef<GenericString<Char, Allocator>&, GenericStringView<Char>&> {typedef GenericString<Char, Allocator> _;};
    template<typename Char, typename Allocator> struct CommonTypeRef<GenericString<Char, Allocator>&, GenericStringView<Char>&&> {typedef GenericString<Char, Allocator> _;};
    template<typename Char, typename Allocator> struct CommonTypeRef<GenericString<Char, Allocator>&, const GenericStringView<Char>&> {typedef GenericString<Char, Allocator> _;};
    
    template<typename Char, typename Allocator> struct CommonTypeRef<GenericString<Char, Allocator>&&, GenericStringView<Char>> {typedef GenericString<Char, Allocator> _;};
    template<typename Char, typename Allocator> struct CommonTypeRef<GenericString<Char, Allocator>&&, GenericStringView<Char>&> {typedef GenericString<Char, Allocator> _;};
    template<typename Char, typename Allocator> struct CommonTypeRef<GenericString<Char, Allocator>&&, GenericStringView<Char>&&> {typedef GenericString<Char, Allocator> _;};
    template<typename Char, typename Allocator> struct CommonTypeRef<GenericString<Char, Allocator>&&, const GenericStringView<Char>&> {typedef GenericString<Char, Allocator> _;};
    
    template<typename Char, typename Allocator> struct CommonTypeRef<const GenericString<Char, Allocator>&, GenericStringView<Char>> {typedef GenericString<Char, Allocator> _;};
    template<typename Char, typename Allocator> struct CommonTypeRef<const GenericString<Char, Allocator>&, GenericStringView<Char>&> {typedef GenericString<Char, Allocator> _;};
    template<typename Char, typename Allocator> struct CommonTypeRef<const GenericString<Char, Allocator>&, GenericStringView<Char>&&> {typedef GenericString<Char, Allocator> _;};
    template<typename Char, typename Allocator> struct CommonTypeRef<const GenericString<Char, Allocator>&, const GenericStringView<Char>&> {typedef GenericString<Char, Allocator> _;};

    Кто-нибудь знает, как сократить этот комбинаторный взрыв частичных специализаций без макросов?

    Запостил: gammaker, 18 Августа 2016

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

    • внутри GenericString и GenericStringView определены тайпдефы для Char/Allocator?
      Ответить
      • Короче. Вот такая вот лабутэнь может сработать (а может и нет, лень тестить) в зависимости от общей специализации CommonTypeRef:
        template  <
            typename Char,
            typename Allocator,
            typename String,
            typename View,
            typename = std_enable_if_t<
                std::is_same<std::decay_t<String>, GenericString<Char,Allocator>>::value
                && std::is_same<std::decay_t<StringView>,GenericStringView<Char>>::value
            >
        >
        struct CommonTypeRef { typedef GenericString<Char, Allocator> _; };
        Ответить
        • Проблема в том, что у меня в посте только частичные специализации. А вообще это универсальный variadic шаблон, который определён через тернарный оператор и который ничего не знает про строки. А вот это вот всё нужно было, чтобы доопределить его для работы со строками, потому что тернарный оператор в этом случае выдаст ошибку.
          Ответить
    • template<class T1, class T2>
      struct CommonTypeRef {
          typedef Govno<std::decay_t<T1>, std::decay_t<T2>>::type _;
      };
      
      template<class Char, class Allocator>
      struct Govno<GenericString<Char, Allocator>, GenericStringView<Char>> {
          typedef GenericString<Char, Allocator> type;
      };


      Тебе ведь это надо?
      Ответить
      • нет. decay надо вызывать над строкой/вьюшкой, а не над чаром/аллокатором
        Ответить
        • показать все, что скрытоСтрока и вьюшка - параметры CommonTypeRef, над ними и вызывается.
          Ответить
          • а я не по русски то же самое что ли написал?
            Ответить
            • Тебе там спермой глаза забрызгало?
              > decay надо вызывать над строкой/вьюшкой, а не над чаром/аллокатором
              > decay надо вызывать над строкой/вьюшкой
              > Строка и вьюшка - параметры CommonTypeRef, над ними и вызывается
              > над ними и вызывается
              Над ними и вызывается. Над строкой и вьюшкой.
              Ответить
            • показать все, что скрытоДавайте в глаза няшиться.
              Ответить
    • Как сократить...
      mmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmm
      mmmmmmmmmmmmmmmmmmmmmmdhyso+ommmmmmmdhysymmmmmmdyhmmmmmmmmmmmmmm
      mmmmmmmmmmmmmmmmmmmmho///++oymmmmmyo+o//ohmmmho//:+dmmmmmmmmmmmm
      mmmmmmmmmmmmmmmmmmmyo++//+sdmmmdo/://++sdmmho+++//ommmmmmmmmmmmm
      mmmmmmmmmmmmmmmmmmhsosooydmmmho+::::/ohmmh+/+o++osdmmmmmmmmmmmmm
      mmmmmmmmmmmmmmmmmmmdhhdmmmmddyoo///ohmmho::::/+oymmmmmmmmmmmmmmm
      mmmmmmmmmmmmmddmmmmmmmmmmmmmdysyyohmmds+/////+sdmmmmmmmmdydmmmmm
      mmmmmmmmmmmmy+/+oymmmmmmmmmmmmmmmmmmdyssyoosydmmmmmmdhs/::/dmmmm
      mmmmmmmmmds///+++oymmmyooydmmmmmmmmmmdhsyhyhmmmmmmhsooo///ommmmm
      mmmmmmmdo::::::///+o+++++soymmmmmmmmmmmmdmmmmmmds///+++oosdmmmmm
      mmmmmms/:::::/::::/+++///:/yhs+/sohmmmmmmmmmmhyoo+/:/++shmmmmmmm
      mmmmd+/:::::::::://///:////::::ooo:hmmmmmmmmhyss+o///shmmmmmmmmm
      mmmy/::::::::::::::///::::::::://++ymmmmmmmmdhssyo+sdmmmmmmmmmmm
      md+:::::::::::::::///:::::::::/++odmmdhdmmmmmmdddhmmmmmmmmmmmmmm
      /:::::::::::::::::::::::::::::///shyoo+oymmmmmmmmmmmmmmmmmmmmmmm
      --::::::::/:::::::://::::::::::///////++ohmmmmmmmmmmmmmmmmmmmmmm
      :::::::::::::::::::::::::::::::::::::/+/symmmmmmmmmmmmmmmmmmmmmm
      ::://:::::::::::::::::::::::::::::::///ydmmmmmmmmmmmmmmmmmmmmmmm
      :://///////::::::::::::-:-::::::::///sdmmmmmmmmmmmmmmmmmmmmmmmmm
      ::::////:::::::::::::::::::::::::/oydmmmmmmmmmmmmmmmmmmmmmmmmmmm
      :::::///:::::::::::::::::::::::::smmmmmmmmmmmmmmmmmmmmmmmmmmmmmm
      ::::::::::::::::::::::::::::::::+mmmmmmmmmmmmmmmmmmmmmmmmmmmmmmm
      //:::::::::::::::::::::::::::::+dmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmm
      /////:/::::::/:::::/:::::::::/++hmmmmmmmmmddhyyyhhdmmmmmmmmmmmmm
      /////////::/:::://////::::////://+ooooo++///:::::///ohmmmmmmmmmm
      ////////+++++++++///////////::-::::::::::::::::::/:---smmmmmmmmm
      ++oooooooooooosoooooo++//////::::::::::::///////////+sdmmmmmmmmm
      dddmmmmmdhysssooooooooooooo+++///////+//++++++syhddmmmmmmmmmmmmm
      Ответить

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