templates & char literals
От: c-smile Канада http://terrainformatica.com
Дата: 20.11.13 00:33
Оценка:
Что нужно подставить вместо ??? чтобы это компилирвалось и для char и для wchar_t

template <typename CHAR_TYPE> 
  inline void itos(CHAR_TYPE *out, int n) {
  
    static CHAR_TYPE num[] = ??? "0123456789abcdefghijklmnopqrstuvwxyz";
    ....
  
  }
Re: templates & char literals
От: jazzer Россия Skype: enerjazzer
Дата: 20.11.13 02:00
Оценка:
Здравствуйте, c-smile, Вы писали:

CS>Что нужно подставить вместо ??? чтобы это компилирвалось и для char и для wchar_t


CS>
CS>template <typename CHAR_TYPE> 
CS>  inline void itos(CHAR_TYPE *out, int n) {
  
CS>    static CHAR_TYPE num[] = ??? "0123456789abcdefghijklmnopqrstuvwxyz";
CS>    ....
  
CS>  }
CS>


Невозможно, имхо.
Заверни массив в структуру и специализируй инициализацию.
Но вообще если это все, что тебе нужно, то простого static char num[] вполне достаточно.

PS Не забывай, кроме "" и L"" есть еще u"", u8"", U""
jazzer (Skype: enerjazzer) Ночная тема для RSDN
Автор: jazzer
Дата: 26.11.09

You will always get what you always got
  If you always do  what you always did
Re[2]: templates & char literals
От: c-smile Канада http://terrainformatica.com
Дата: 20.11.13 03:42
Оценка: +1
Здравствуйте, jazzer, Вы писали:

J>Невозможно, имхо.


Печально, нет?

J>Заверни массив в структуру и специализируй инициализацию.

J>Но вообще если это все, что тебе нужно, то простого static char num[] вполне достаточно.

Да я так и сделал с самого начала. Просто вот по ходу возник вопрос.

J>PS Не забывай, кроме "" и L"" есть еще u"", u8"", U""


Ай лепота...
Re: templates & char literals
От: Alexander G Украина  
Дата: 20.11.13 06:25
Оценка: 42 (1)
Здравствуйте, c-smile,

Разве что используя такую избыточную запись:
template <typename CHAR_TYPE> 
inline void itos(CHAR_TYPE *out, int n) {
  
   static CHAR_TYPE num[] = { '0', '1', '2', '3', '4', /*...*/ };
    ....
  
}
Русский военный корабль идёт ко дну!
Re[2]: templates & char literals
От: c-smile Канада http://terrainformatica.com
Дата: 20.11.13 07:40
Оценка:
Вот спасибо.

AG>Разве что используя такую избыточную запись:

AG>
AG>template <typename CHAR_TYPE> 
AG>inline void itos(CHAR_TYPE *out, int n) {
  
AG>   static CHAR_TYPE num[] = { '0', '1', '2', '3', '4', /*...*/ };
AG>    ....
  
AG>}
AG>


Для ascii подмножества сработает конечно...
А собственно не для ascii оно и смысла не имеет (для templates).
Re: templates & char literals
От: Кодт Россия  
Дата: 20.11.13 09:08
Оценка: 28 (2)
Здравствуйте, c-smile, Вы писали:

CS>Что нужно подставить вместо ??? чтобы это компилирвалось и для char и для wchar_t


В приступе безумия:
template<> struct literal<char>
{
  template<int N> static constexpr auto take(char const (&s)[N], wchar_t const*) -> decltype(s) { return s; }
};
template<> struct literal<wchar_t>
{
  template<int N> static constexpr auto take(char const*, wchar_t const (&s)[N]) -> decltype(s) { return s; }
};

#define LITERAL(C,S)  (literal<C>::take(S, L##S))

Для С++<11 достаточно убрать constexpr и красиво инфиксно расписать тип функции: char const (&take(.....))[N], либо вообще упростить до char const* take(.....)
Перекуём баги на фичи!
Re[2]: templates & char literals
От: c-smile Канада http://terrainformatica.com
Дата: 21.11.13 01:19
Оценка:
Здравствуйте, Кодт, Вы шайтан
Re[3]: templates & char literals
От: Кодт Россия  
Дата: 21.11.13 08:28
Оценка: :)
Здравствуйте, c-smile, Вы писали:

CS>Здравствуйте, Кодт, Вы шайтан

Искусил чоль?
Перекуём баги на фичи!
Re[4]: templates & char literals
От: c-smile Канада http://terrainformatica.com
Дата: 22.11.13 21:22
Оценка:
Здравствуйте, Кодт, Вы писали:

К>Здравствуйте, c-smile, Вы писали:


CS>>Здравствуйте, Кодт, Вы шайтан

К>Искусил чоль?

Угу.
А на словах "красиво инфиксно расписать тип функции" так и вообще... скажем ... экстаз поймал.
Re: templates & char literals
От: rg45 СССР  
Дата: 22.11.13 22:15
Оценка:
Здравствуйте, c-smile, Вы писали:

CS>Что нужно подставить вместо ??? чтобы это компилирвалось и для char и для wchar_t


CS>
CS>template <typename CHAR_TYPE> 
CS>  inline void itos(CHAR_TYPE *out, int n) {
  
CS>    static CHAR_TYPE num[] = ??? "0123456789abcdefghijklmnopqrstuvwxyz";
CS>    ....
  
CS>  }
CS>



Если нужно остаться в рамках С++03, можно вынести этот статический массив в шаблон функции или класса и предоставить соответствующие специализации:

template <typename CHAR_TYPE>
struct ItosNum {
   static CHAR_TYPE value[];
};

template <> char ItosNum<char>::value[] = "0123456789abcdefghijklmnopqrstuvwxyz";
template <> wchar_t ItosNum<wchar_t>::value[] = L"0123456789abcdefghijklmnopqrstuvwxyz";

template <typename CHAR_TYPE>
void itos(CHAR_TYPE *out, int n) {
   *out = ItosNum<CHAR_TYPE>::value[n];
}

Избежать дублирования можно при помощи макроса. (Но как по мне, лучше уж дублирование, чем макрос)
--
Не можешь достичь желаемого — пожелай достигнутого.
Re[2]: templates & char literals
От: rg45 СССР  
Дата: 23.11.13 10:17
Оценка:
Здравствуйте, Alexander G, Вы писали:


AG>Разве что используя такую избыточную запись:

AG>
AG>template <typename CHAR_TYPE> 
AG>inline void itos(CHAR_TYPE *out, int n) {
AG>   static CHAR_TYPE num[] = { '0', '1', '2', '3', '4', /*...*/ };
AG>    ....
AG>}
AG>



При этом нужно не забыть о нулевом символе в конце (если, конечно, планируется использовать num как строку).
--
Не можешь достичь желаемого — пожелай достигнутого.
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.