Любитель чаепитий
|
|||||||||||
1 | |||||||||||
Сломался шаблон класса ini_file22.08.2016, 14:06. Просмотров 628. Ответов 24
Метки нет Все метки)
(
Добрый день. В общем изучал я себе шаблоны, изучал, и вдруг решил попробовать переписать свой старый класс ini_file, чтобы он мог работать не только с
std::string , но и с std::wstring . Написал я, конечно, говнокод, но мне в голову не идет, почему выдает ошибку о том, что такой специализации нет и как её исправить?Вот код: ini.hpp
main.cpp
Так же мне бы хотелось, чтобы мне подсказали, как мне уменьшить данный код. Просто где-то в глубине души я понимаю, что код этот очень большой, но уменьшить его можно, только я ещё пока не знаю -- как.
0
|
|
22.08.2016, 14:06 | |
Шаблон родительского класса и шаблон класса потомка Шаблоны функций, Ошибка: для использования класса шаблон требуется список аргументов шаблон Шаблон класса, параметром которого должны являться наследники определённого класса
|
|
13692 / 7320 / 1746
Регистрация: 30.01.2014
Сообщений: 12,261
|
|
22.08.2016, 14:27 | 2 |
1
|
![]() 8274 / 3850 / 837
Регистрация: 15.11.2014
Сообщений: 8,726
|
|
22.08.2016, 14:29 | 3 |
1
|
13692 / 7320 / 1746
Регистрация: 30.01.2014
Сообщений: 12,261
|
|
22.08.2016, 15:54 | 5 |
Тут переписать надо, а не уменьшать.
Велосипедный find выкинуть - заменить на стандартный. define убрать - заменить на enum Проверок добавить, а то на некоторых входных данных будем влетать в UB. Статический объект в качестве флага ошибки тоже убрать бы - как ты предлагаешь проверять, что произошло? Брать адрес? Но и это тут не получится, т.к. объект приватный - до него не добраться.
1
|
Любитель чаепитий
|
||||||
22.08.2016, 15:58 [ТС] | 6 | |||||
DrOffset, Флаг ошибки тут для того, чтобы возвращать из функции, где возвращается ссылка на некоторую строку.
Добавлено через 1 минуту Это ок. Тоже ок. Где? Хотя бы номера строк.
0
|
![]() 8274 / 3850 / 837
Регистрация: 15.11.2014
Сообщений: 8,726
|
|
22.08.2016, 15:59 | 7 |
сначала доведите до компилябельного состояния:
http://rextester.com/RKIRO65951 потом можно будет думать что можно улучшить.
0
|
Любитель чаепитий
|
|
22.08.2016, 16:03 [ТС] | 8 |
0
|
13692 / 7320 / 1746
Регистрация: 30.01.2014
Сообщений: 12,261
|
||||||
22.08.2016, 16:05 | 9 | |||||
GbaLog-, давай начнем с другого. У тебя реально есть необходимость менять строку, которую возвращает твой класс?
Т.е. вот это - нормальный сценарий??
Потом он создаст еще один объект ini_file, но с другим файлом, в котором элемента some тоже нет, и запросит его. Ему вернется, тем не менее, строка "something". Чудеса. Не говоря уж про то, как это будет работать в разных потоках. Если же строку внутри менять не надо, то и думать тут нечего - возвращай по значению. Добавлено через 1 минуту Так не интересно. Если я все расскажу, то опыта ты не получишь ![]() Попробуй скармливать своему парсеру разные некорректные файлы.
0
|
Любитель чаепитий
|
||||||
22.08.2016, 16:45 [ТС] | 10 | |||||
Да, иначе зачем он ещё нужен?
Вы натолкнули меня на очень интересную мысль, а что если сделать так же, как в
std::map ? То есть если объекта нет, то мы его создадим. Тогда и флаг ошибки не понадобится вовсе, по крайней мере для того, чтобы возвращать его.Не хочу думать. ![]() ![]() Добавлено через 23 минуты DrOffset, Обезопасился как мог. Или нет. Все Ваши советы учёл, ну и реализовал то, что предлагал выше. http://rextester.com/SZO8022 Кликните здесь для просмотра всего текста
0
|
![]() 8274 / 3850 / 837
Регистрация: 15.11.2014
Сообщений: 8,726
|
|
22.08.2016, 17:00 | 11 |
GbaLog-,
1. сделайте так, что бы шаблон параметризовался не типом строки а типом символа: char или wchar_t 2. избавьтесь от std::vector вместо него используйте std::unordered_map 3. лучше заранее приучать себя к кодестайлам, которые используется в реальных компаниях. этот дикий ужасс в духе господина MrX что вы демонстрируете в своём коде не пройдет ни одно ревью.
1
|
13692 / 7320 / 1746
Регистрация: 30.01.2014
Сообщений: 12,261
|
|
22.08.2016, 17:02 | 12 |
Надо сказать, обычно такое как раз не требуется. Обычно конфиги только читают, редко записывают.
Если и надо записывать, то это делается отдельными функциями, а не неявно через ссылки. Посмотри на дизайн библиотеки libconfig. Она хоть и сишная, но все основные идеи подобных инструментов отражает. Этот вариант приемлемый. Смотри справку по regex_search и smatch, а то это просто ужас ![]() Но место ты нашел правильно. Пофиксил только неправильно, от UB не защитился.
1
|
![]() 8274 / 3850 / 837
Регистрация: 15.11.2014
Сообщений: 8,726
|
|
22.08.2016, 17:06 | 13 |
либо создаем по дефолту если дефолтное значение было заявлено.
либо бросаем эксепшен Добавлено через 2 минуты
0
|
Любитель чаепитий
|
|
22.08.2016, 17:12 [ТС] | 14 |
Типа через
std::basic_string<T> ? Что-то даже не представляю, как это сделать. Разве что заменить в коде все объявления std::string на std::basic_string<T> и std::basic_fstream<T> , но это геморрой ещё тот.Мне важно, чтобы сохранялся порядок переменных, потому что в них могут присутствовать комментарии, а std::unordered_map не гарантирует того, что порядок останется таким, каким и был.Найти бы их ещё где-нибудь. Ибо Google C++ Style Guide на английском, а я с ним хоть и пытаюсь дружить, да он со мной не хочет. Так-то с каждым днём понимаю, что такой стиль очень сложно поддерживать. Так и сделаю, пожалуй. Сейчас посмотрю.
0
|
![]() 8274 / 3850 / 837
Регистрация: 15.11.2014
Сообщений: 8,726
|
|
22.08.2016, 17:19 | 15 |
ага
жизнь - боль и страдания. ваша текущая версия ещё гемморней. понятна.
1
|
Любитель чаепитий
|
||||||
22.08.2016, 17:36 [ТС] | 16 | |||||
В общем по
std::smatch единственное, что нашёл, так это то, что я не проверяю match_var на готовность, то есть:
std::regex_search() я так и не понял, может с регуляркой что не так?Ну ладно. ![]()
0
|
13692 / 7320 / 1746
Регистрация: 30.01.2014
Сообщений: 12,261
|
|
22.08.2016, 18:04 | 17 |
0
|
Любитель чаепитий
|
|
22.08.2016, 18:11 [ТС] | 18 |
DrOffset, Странно, а ведь я уже начал было писать
if( std::regex_search... , но почему-то передумал. Да и как я уже говорил, у меня с английским туго, неправильно перевел я это, наверное. А даже если и правильно, то вряд ли это натолкнуло бы меня на мысль, что там что-то не так.
0
|
13692 / 7320 / 1746
Регистрация: 30.01.2014
Сообщений: 12,261
|
|
22.08.2016, 18:18 | 19 |
Есть вот такой вариант в этом случае: http://www.williamspublishing.... 837-6.html
0
|
Любитель чаепитий
|
|
22.08.2016, 18:24 [ТС] | 20 |
Я её всю прочитал, кроме разделов про потоки и локализацию.
И я даже знал, что std::regex_search возвращает bool , но забыл, зачем надо это проверять.
0
|
22.08.2016, 18:24 | |
Заказываю контрольные, курсовые, дипломные и любые другие студенческие работы здесь. Шаблон класса (параметризация класса) Создать шаблон некоторого класса, возможно, реализованного с применением некоторого серверного класса Шаблон класса Шаблон класса Искать еще темы с ответами Или воспользуйтесь поиском по форуму: |