Модераторы: bsa

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Строка в параметре шаблона, Как передать строку как параметр шаблона 
:(
    Опции темы
avnemchenko
  Дата 28.7.2009, 15:09 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 14
Регистрация: 10.7.2009

Репутация: нет
Всего: нет



Добрый день!

Не могу откомпилировать простейшую программку:

Код

template <const char *SomeString>
struct Str
{
    Str()    {}
    const char *ret (void) const    { return SomeString; }
};


void main (void)
{
    Str <"Some string"> t;
    const char *p = t.ret ();
}


VC++2008 ругается страшно и пророчит мне первые места в аду  smile  . 

Насколько я понял - я неправильно передаю строку как параметр шаблона. Потратил уйму времени и так и не понял  smile  - КАК ИСПОЛЬЗОВАТЬ СТРОКУ КАК ПАРАМЕТР ШАБЛОНА???

Если это существенно - вот что он мне выдает:
  • ... main.cpp(11) : error C2762: 'Str' : invalid expression as a template argument for 'SomeString'
            ... main.cpp(3) : see declaration of 'Str'
  • ... main.cpp(11) : error C2133: 't' : unknown size
  • ... main.cpp(11) : error C2512: 'Str' : no appropriate default constructor available

P. S. А задача была грандиозная - хочется мне попробовать создать парсер текстовых файлов, которому задается задание в виде строкового параметра шаблона. Строка (строки) - нечто вроде БНФ. Да-да, я знаю, есть куча программ, которые создают такие парсеры, но тут дело принципа  smile - начитавшись Александреску, хочется придумать что-то свое smile.
PM ICQ   Вверх
azesmcar
Дата 28.7.2009, 15:26 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


uploading...
****


Профиль
Группа: Участник Клуба
Сообщений: 6291
Регистрация: 12.11.2004
Где: Армения

Репутация: 52
Всего: 211



Цитата(avnemchenko @  28.7.2009,  15:09 Найти цитируемый пост)

Насколько я понял - я неправильно передаю строку как параметр шаблона. Потратил уйму времени и так и не понял  smile  - 

Ситаксически все правильно, но так нельзя. Указатели и строковые литералы не могут быть аргументами шаблона.


Это сообщение отредактировал(а) azesmcar - 28.7.2009, 15:28
PM   Вверх
bsa
Дата 28.7.2009, 15:27 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Модератор
Сообщений: 9185
Регистрация: 6.4.2006
Где: Москва, Россия

Репутация: 85
Всего: 196



Лучше не придумывать свое, а использовать готовое - boost::spirit...
А Александреску ты, видимо, рано прочитал. Думаю, сначала надо почитать про шаблоны.
PM   Вверх
avnemchenko
Дата 28.7.2009, 15:36 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 14
Регистрация: 10.7.2009

Репутация: нет
Всего: нет



Цитата

Ситаксически все правильно, но так нельзя. Указатели и строковые литералы не могут быть аргументами шаблона.


Допустим. Но как-то можно передавать строку как параметр шаблона??? Посимвольно - можно, я пробовал. Может, есть какая-то хитрость, которая строку разобъет на список символов?

Цитата

Лучше не придумывать свое, а использовать готовое - boost::spirit...


Насколько я понял, там передается строка функции - значит, построение алгоритма парсинга создается не при компиляции, а уже потом, при выполнении. Я же думаю о том, можно ли такое сделать на этапе компиляции (чем шаблоны и хороши).

Цитата

А Александреску ты, видимо, рано прочитал. Думаю, сначала надо почитать про шаблоны. 


Понемногу я шаблоны использую (сделал свою реализацию умных указателей, массивов и т. п.). В Александреску же - совсем другое, метапрограммирование. Я так понял, это одна из самых лучших книг на эту тему. Вот и решил разобраться smile
Нашел в И-нете книженцию "Шаблоны С++: справочник разработчика" Вандевурта и Джосаттиса - думаю, тоже неплохая вещь.

Это сообщение отредактировал(а) avnemchenko - 28.7.2009, 15:40
PM ICQ   Вверх
azesmcar
Дата 28.7.2009, 15:54 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


uploading...
****


Профиль
Группа: Участник Клуба
Сообщений: 6291
Регистрация: 12.11.2004
Где: Армения

Репутация: 52
Всего: 211



Цитата(avnemchenko @  28.7.2009,  15:36 Найти цитируемый пост)
Допустим. Но как-то можно передавать строку как параметр шаблона??? Посимвольно - можно, я пробовал. Может, есть какая-то хитрость, которая строку разобъет на список символов?

Не думаю что это как-то можно реализовать. А что это предположительно даст?
Цитата

Указатели и строковые литералы

тут опечатка, немного непонятно написано. Речь шла только об этом "string" а не об указателях вообще.

Это сообщение отредактировал(а) azesmcar - 28.7.2009, 16:01
PM   Вверх
avnemchenko
Дата 28.7.2009, 15:58 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 14
Регистрация: 10.7.2009

Репутация: нет
Всего: нет



Цитата(azesmcar @ 28.7.2009,  15:54)
Не думаю что это как-то можно реализовать. А что это предположительно даст?

Где-то я видел упоминание о реализации такой вещи - какие-то списки символов...

А даст это возможность потом делать что-то вроде:

Код

template <char Smb>
class Something { /*...*/};

template <> class Something<'a'> { /*...*/ };

template <> class Something<'b'> { /*...*/ };

template <> class Something<'+'> { /*...*/ };



То бишь, можно потом разбирать посимвольно строку на этапе компиляции. 
PM ICQ   Вверх
bsa
Дата 28.7.2009, 16:06 (ссылка) |    (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Модератор
Сообщений: 9185
Регистрация: 6.4.2006
Где: Москва, Россия

Репутация: 85
Всего: 196



Цитата(avnemchenko @ 28.7.2009,  15:36)
Цитата

Лучше не придумывать свое, а использовать готовое - boost::spirit...


Насколько я понял, там передается строка функции - значит, построение алгоритма парсинга создается не при компиляции, а уже потом, при выполнении. Я же думаю о том, можно ли такое сделать на этапе компиляции (чем шаблоны и хороши).

Ты понял неверно. Читай документацию по boost::spirit. Там строки, в качестве шаблонов, не передаются. Там шаблоны составляются из парсеров:
Код
ch_p[&var] >> '=' >> int_p[&val] >> end_p;
Этот шаблон для парсинга строк вида:
Код
A = 10
B = 15
C = -1


Или ты хочешь парсить строку на этапе компиляции?
PM   Вверх
W4FhLF
Дата 28.7.2009, 16:09 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


found myself
****


Профиль
Группа: Участник Клуба
Сообщений: 2831
Регистрация: 2.12.2006

Репутация: 2
Всего: 121





--------------------
"Бог умер" © Ницше
"Ницше умер" © Бог
PM ICQ   Вверх
azesmcar
Дата 28.7.2009, 16:11 (ссылка) |    (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


uploading...
****


Профиль
Группа: Участник Клуба
Сообщений: 6291
Регистрация: 12.11.2004
Где: Армения

Репутация: 52
Всего: 211



avnemchenko

Что-то ты загнул, прочитал Александреску и думаешь что можешь сделать что-то лучше чем в бусте? smile

Добавлено через 1 минуту и 6 секунд
Цитата(W4FhLF @  28.7.2009,  16:09 Найти цитируемый пост)
Variadic templates? 

да, но надо бы указать что этого еще нет в компиляторах, да и сам стандарт пока не готов.
PM   Вверх
GoldFinch
Дата 28.7.2009, 18:40 (ссылка) |    (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата



****


Профиль
Группа: Завсегдатай
Сообщений: 2141
Регистрация: 30.11.2008

Репутация: 6
Всего: 26



можно разбить строку по 4 байта и передавать в int
'qwer','tyui',...
но зачем %)
PM MAIL ICQ   Вверх
avnemchenko
Дата 29.7.2009, 11:10 (ссылка)    | (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 14
Регистрация: 10.7.2009

Репутация: нет
Всего: нет



Цитата

Или ты хочешь парсить строку на этапе компиляции? 

Да, мне интересно именно это.

Это сообщение отредактировал(а) avnemchenko - 29.7.2009, 11:15
PM ICQ   Вверх
mes
Дата 29.7.2009, 11:47 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


любитель
****


Профиль
Группа: Участник Клуба
Сообщений: 7954
Регистрация: 14.1.2006

Репутация: 79
Всего: 250



Цитата(avnemchenko @  29.7.2009,  10:10 Найти цитируемый пост)
Да, мне интересно именно это.

работать с целой строкой без ухищрений не получится, так как на этапе компиляции Вы не можете провести с ней никаких нужных для этой задачи действий.

Цитата(avnemchenko @  28.7.2009,  14:58 Найти цитируемый пост)
Где-то я видел упоминание о реализации такой вещи - какие-то списки символов...

вот с набором чаров получится работать. Только они не должны быть представлены строковым литералом.

определяете для каждого символа тип, и можно сделать макрос для удобного составления такого списка,
т.е. в итоге у Вас строка будет типа такого :
Код

typedef LISTOFCHARS_7(m,y,s,t,r,i,n,g) mystring;

с чем можно уже будет спокойно работать..


P.S. предложения составлены так, чтоб тс. легче было понять. 



--------------------
PM MAIL WWW   Вверх
avnemchenko
Дата 29.7.2009, 12:12 (ссылка)    | (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 14
Регистрация: 10.7.2009

Репутация: нет
Всего: нет



Цитата(mes @ 29.7.2009,  11:47)
определяете для каждого символа тип, и можно сделать макрос для удобного составления такого списка,
т.е. в итоге у Вас строка будет типа такого :
Код

typedef LISTOFCHARS_7(m,y,s,t,r,i,n,g) mystring;

с чем можно уже будет спокойно работать..

Немного не догоняю...

Насколько я понял, речь идет о чем-то вроде такого?
Код

typedef LISTOFCHARS_7(m,y,s,t,r,i,n,g) mystring;
// ...
extern mystring Str = "123456";


И тогда что такое LISTOFCHARS_7? Макрос, который раскидывает 7 символов куда-то? Не могли бы Вы привести пример его реализации?



Это сообщение отредактировал(а) avnemchenko - 29.7.2009, 12:13
PM ICQ   Вверх
mes
Дата 29.7.2009, 13:02 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


любитель
****


Профиль
Группа: Участник Клуба
Сообщений: 7954
Регистрация: 14.1.2006

Репутация: 79
Всего: 250



Цитата(avnemchenko @  29.7.2009,  11:12 Найти цитируемый пост)
Насколько я понял, речь идет о чем-то вроде такого?

нет. mystring это список типов и к нему можно применять операции описанные у Александреску.

Цитата(avnemchenko @  29.7.2009,  11:12 Найти цитируемый пост)
И тогда что такое LISTOFCHARS_7? Макрос, который раскидывает 7 символов куда-то? Не могли бы Вы привести пример его реализации?

вот на скорую руку :
Код


// алфавит символов
#define char_a  'a'
#define char_b  'b'
#define char_comma ','

// тип элемента списка символов
template<char c> struct char_type_t;

#define CHAR_TYPE(a) char_type_t < char_ ## a > a;
#define LIST_OF_CHARS_3(a,b,c) TYPE_LIST_3(CHAR_TYPE (a), CHAR_TYPE(b), CHAR_TYPE (c))  // TYPE_LIST... - это набор шаблонов Александреску (правописание может быть не точное)

// в итоге 
 LIST_OF_CHARS_3(a,comma,b) 
// даст 
TYPE_LISТ_3 (char_type_t<'a'>, char_type_t<','>, char_type<'b'>)


Это сообщение отредактировал(а) mes - 29.7.2009, 13:03


--------------------
PM MAIL WWW   Вверх
azesmcar
Дата 29.7.2009, 14:09 (ссылка) |    (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


uploading...
****


Профиль
Группа: Участник Клуба
Сообщений: 6291
Регистрация: 12.11.2004
Где: Армения

Репутация: 52
Всего: 211



Цитата(avnemchenko @  29.7.2009,  12:12 Найти цитируемый пост)
И тогда что такое LISTOFCHARS_7? Макрос, который раскидывает 7 символов куда-то? 

А ты точно читал Александреску? smile 
PM   Вверх
Ответ в темуСоздание новой темы Создание опроса
Правила форума "C/C++: Для новичков"
JackYF
bsa

Запрещается!

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делиться вскрытыми компонентами

  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Вопросы по реализации алгоритмов рассматриваются здесь


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, JackYF, bsa.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: Для новичков | Следующая тема »


 




[ Время генерации скрипта: 0.0604 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.