templates & char literals
Что нужно подставить вместо ??? чтобы это компилирвалось и для 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""
Re[2]: templates & char literals
Здравствуйте, jazzer, Вы писали:
J>Невозможно, имхо.
Печально, нет?
J>Заверни массив в структуру и специализируй инициализацию.
J>Но вообще если это все, что тебе нужно, то простого static char num[] вполне достаточно.
Да я так и сделал с самого начала. Просто вот по ходу возник вопрос.
J>PS Не забывай, кроме "" и L"" есть еще u"", u8"", U""
Ай лепота...
Re: templates & char literals
Здравствуйте, 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
Вот спасибо.
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
Здравствуйте, 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
Здравствуйте, Кодт, Вы шайтан
Re[3]: templates & char literals
От:
Кодт
Дата: 21.11.13 08:28
Оценка:
Здравствуйте, c-smile, Вы писали:
CS>Здравствуйте, Кодт, Вы шайтан
Искусил чоль?
Перекуём баги на фичи!
Re[4]: templates & char literals
Здравствуйте, Кодт, Вы писали:
К>Здравствуйте, 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 как строку).
--
Не можешь достичь желаемого — пожелай достигнутого.
Пока на собственное сообщение не было ответов, его можно удалить.
Удалить