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

    +19

    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
    44. 44
    45. 45
    46. 46
    47. 47
    48. 48
    // хелпер чтобы конвертить типы строк
    template <class S1, class S2>
    struct str_convert {
    	static S1 conv(S2 const & s2) { return str_convert<S2, S1>::conv(s2); }		// по умолчанию ищет специализацию для пары S2, S1
    	static S2 conv(S1 const & s1) { return str_convert<S2, S1>::conv(s1); }
    };
    
    // специализация, чтобы не конвертить одно в одно
    template <class S>
    struct str_convert<S, S> {
    	static S const & conv(S const & s) { return s; };
    };
    
    // специализация, чтобы конвертить std::string <-> std::wstring
    template <>
    struct str_convert<std::string, std::wstring> {
    	static std::string conv(std::wstring const & ws) { return boost::locale::conv::utf_to_utf<char>(ws); }
    	static std::wstring conv(std::string const & s)  { return boost::locale::conv::utf_to_utf<wchar_t>(s); }
    };
    
    // специализация QString <-> std::string
    // skipped
    
    template <class StringType = std::string>
    struct some 
    {
    	typedef StringType		string_type;
    	typedef std::string		utf8_string_type;
    
    	some(string_type const & s = string_type())
    		: inner_string_(s)
    	{}
    
    	template <class S>
    	some(S const & s)
    		: inner_string_(str_convert<S, string_type>::conv(s))
    	{}
    
    	string_type inner_string_;
    };
    
    int main()
    {
    	std::string s = "hello!";
    	some<> test0(s);		  // ok
    	some<> test2("hello!"); // ха-ха, вот еще, пытаться самостоятельно привести к std::string, пиши специализацию для массивов, сука!
    	return 0;
    }

    сегодня ради красоты передачи "literal" в конструктор писал говноспециализации для PodType[N]

    Запостил: defecate-plusplus, 04 Июля 2012

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

    • Я как-то тоже перемудрил и напоролся на неявное приведение типа в шаблонах, точнее на отсутствие оного.
      Ответить
    • > ради красоты .... писал говноспециализации
      Говно ради красоты. Так и работаем.
      Ответить
      • ага
        говно вышло в том, что пришлось написать еще 4 не самых тривиальных шаблона
        никто кроме меня их, конечно, сопровождать не будет, но чувство прекрасного пострадало
        Ответить
    • СТРОКОПРОБЛЕМЫ.
      Вот что меня доставало в лабах на си.
      Ответить
    • Кстати, а что мешает сделать пару-другую конструкторов, чтобы любой тип хавать, вместо этого безобразия?
      Ответить
      • там получилось немало классов в семействе (порядка 10), я посчитал что мне будет проще один раз напрячься и выписать шаблоны - конструкторы не наследуются

        тем более, что они назначались не столько для конструкторов - каждый класс имеет пару методов типа get_native_string и get_utf8_string - просто именно для конструкторов понадобились 4 лишних шаблона для тривиальных литералов
        Ответить
        • > конструкторы не наследуются
          Ура, в c++11 наследуются конструкторы.
          Правда, как всегда, с оговорками.
          Ответить
    • а boost использовать не было никакой возможности? или STL?
      Ответить
      • признайся, ты спросил наугад?
        Ответить
        • Если ты не знаешь С++, и хочешь показаться умным в среде крестовиков, то скажи любую фразу в которой есть слова boost и STL. Можно еще policy-based с Александреску упомянуть.
          Ответить
          • Можно ещё после двух плюсов добавить цифры и спросить, а почему бы не использовать их возможности.
            Ответить
        • Напомнило.
          http://i.stack.imgur.com/ssRUr.gif
          Ответить
          • Видел где-то энтерпрайзную библиотеку с ООП головного мозга, единственным назначением которой было сложение двух целых чисел. Увы, потерял ссылку.
            Ответить
          • А мне напомнило http://xkcd.com/451/
            Ответить

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