Кресты / Говнокод #11359 Ссылка на оригинал

0

  1. 1
  2. 2
  3. 3
  4. 4
  5. 5
  6. 6
  7. 7
  8. 8
  9. 9
  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 defecate-plusplus, (Updated )

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

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

      тем более, что они назначались не столько для конструкторов - каждый класс имеет пару методов типа get_native_string и get_utf8_string - просто именно для конструкторов понадобились 4 лишних шаблона для тривиальных литералов
      Ответить
      • > конструкторы не наследуются
        Ура, в c++11 наследуются конструкторы.
        Правда, как всегда, с оговорками.
        Ответить
  • а boost использовать не было никакой возможности? или STL?
    Ответить

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

Семь раз отмерь — один отрежь, guest!

    А не использовать ли нам bbcode?


    8