- 01
- 02
- 03
- 04
- 05
- 06
- 07
- 08
- 09
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
- 23
- 24
- 25
- 26
- 27
- 28
- 29
- 30
- 31
- 32
- 33
- 34
- 35
- 36
- 37
- 38
- 39
- 40
- 41
- 42
- 43
- 44
- 45
- 46
- 47
- 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]
interested 04.07.2012 18:51 # 0
kovyl2404 04.07.2012 22:08 # +2
Говно ради красоты. Так и работаем.
defecate-plusplus 04.07.2012 22:31 # 0
говно вышло в том, что пришлось написать еще 4 не самых тривиальных шаблона
никто кроме меня их, конечно, сопровождать не будет, но чувство прекрасного пострадало
Vindicar 04.07.2012 23:56 # +1
Вот что меня доставало в лабах на си.
Fai 07.07.2012 08:19 # 0
defecate-plusplus 07.07.2012 10:00 # 0
тем более, что они назначались не столько для конструкторов - каждый класс имеет пару методов типа get_native_string и get_utf8_string - просто именно для конструкторов понадобились 4 лишних шаблона для тривиальных литералов
roman-kashitsyn 12.11.2014 17:31 # 0
Ура, в c++11 наследуются конструкторы.
Правда, как всегда, с оговорками.
defecate-plusplus 12.11.2014 17:55 # +2
в прошлой жизни
hack2root 12.11.2014 17:07 # 0
roman-kashitsyn 12.11.2014 17:31 # +4
Анонимус 12.11.2014 22:10 # +2
inkanus-gray 12.11.2014 22:12 # +1
Анонимус 12.11.2014 22:13 # +2
3.14159265 12.11.2014 22:12 # +3
http://i.stack.imgur.com/ssRUr.gif
inkanus-gray 12.11.2014 22:14 # 0
Анонимус 13.11.2014 13:16 # +1