Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
 
Рейтинг 4.80/5: Рейтинг темы: голосов - 5, средняя оценка - 4.80
0 / 0 / 2
Регистрация: 24.02.2017
Сообщений: 15

Шаблонная функция

20.09.2017, 15:41. Показов 1349. Ответов 26
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Всем привет. Пытаюсь реализовать простенький парсер. Суть в том, что у меня есть ini файл с различными параметрами. Я все секции с параметрами и их значения сохраняю в мой класс. Мне нужно написать функции для получения значений параметров. все параметры и их значения хранятся в мэпе в качестве строк.Значение может быть строчное, целочисленное и число с плавающей точкой.
я написал вот такие три функции:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
int IniParser::GetValueInt(const char* section_name, const char* param_name) {
    if (!IsHaveParam(section_name,param_name)) return 0;
    else
        return stoi(((Sections.find(section_name)->second.find(param_name))->second));
}
double IniParser::GetValueDouble(const char* section_name, const char* param_name) {
    if (!IsHaveParam(section_name, param_name)) return 0;
    else
        return stod(((Sections.find(section_name)->second.find(param_name))->second));
}
string IniParser::GetValueString(const char* section_name, const char* param_name) {
    if (!IsHaveParam(section_name, param_name)) return 0;
    else
        return (((Sections.find(section_name)->second.find(param_name))->second));
}
Вопрос, а как сделать их шаблонными, чтобы у функции было одно название и выбирался один из вариантов в зависимости от возвращаемого значения.
Сразу извините за безграмотность :}
0
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
20.09.2017, 15:41
Ответы с готовыми решениями:

Шаблонная функция
Дорогие форумчане, нуждаюсь в вашей помощи: имеется несколько функций, с большим объемом кода. Чтоб не повторять код для функций с другим...

Шаблонная функция
Учу c++, в книге приводится вот такой листинг примера работы шаблонной функции, однако он не компилится, выдает ошибку error C2668: swap:...

Шаблонная функция
Как "научить" шаблонную функцию отличать массив от контейнера, то есть если написать: template <class contains, class type> type...

26
Котовчанин
942 / 482 / 200
Регистрация: 16.02.2010
Сообщений: 3,338
Записей в блоге: 35
20.09.2017, 16:18
tomas0808,
C++
1
2
3
4
5
6
template<typename T>
T IniParser::GetValue(const char* section_name, const char* param_name) {
    if (!IsHaveParam(section_name, param_name)) return 0;
    else
        return stod(((Sections.find(section_name)->second.find(param_name))->second));
}
Только дёргать функцию тогда таким образом
C++
1
parser.GetValue<Int>(...)
0
82 / 82 / 44
Регистрация: 14.07.2013
Сообщений: 410
20.09.2017, 16:21
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
template <class ReturnType>
struct Value { };
 
template <>
struct Value<int> {
    static int Get( const char* section_name, const char* param_name ) {
        if (!IsHaveParam( section_name, param_name )) return 0;
        else
            return std::stoi( ((Sections.find( section_name )->second.find( param_name ))->second) );
    }
};
template <>
struct Value<double> {
    static double Get( const char* section_name, const char* param_name ) {
        if (!IsHaveParam( section_name, param_name )) return 0;
        else
            return std::stod( ((Sections.find( section_name )->second.find( param_name ))->second) );
    }
};
template <>
struct Value<std::string> {
    static std::string Get( const char* section_name, const char* param_name ) {
        if (!IsHaveParam( section_name, param_name )) return 0;
        else
            return ( ((Sections.find( section_name )->second.find( param_name ))->second) );
    }
};
только дёргать через
C++
1
Get::Value<int>(...)
0
Котовчанин
942 / 482 / 200
Регистрация: 16.02.2010
Сообщений: 3,338
Записей в блоге: 35
20.09.2017, 16:22
А стоп... У Вас же ещё разный возврат... Пардон, не заметила сразу. Тогда можно попробовать так же, но возврат через stringstream
0
Эксперт С++
 Аватар для hoggy
8973 / 4319 / 960
Регистрация: 15.11.2014
Сообщений: 9,760
20.09.2017, 16:24
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
template<class ret, class s1, class s2>
ret GetValueInt(const s1& section_name, const s2& param_name) {
 
    // времени компиляции, убедимся, 
    // что строка s1 и s2 - совместимы
    // что бы не получилось так, что section_name - char
    // а param_name - wchar,
    // например.
    dmust_be_compatible(s1, section_name, s2, param_name);
 
    // теперь по типу входной строки определим тип символы
    // которой оперирует строка
    using char_t = tools::deduce_character<s1>::type;
 
    const auto found_section = Sections.find(section_name);
    if(NotFound(found_section, Sections)
        return ret{};
 
    const auto found_param = found_section->second.find(param_name);
    if(NotFound(found_param , found_section->second)
        return ret{};
 
    // ну а теперь извлекаем объект нужного типа
    std::basic_stringstream<char_t> ss;
    assert(ss);
    ss << found_param ->second;
    assert(ss);        
    ret result;
    ss >> result;
    assert(ss);
    return result;
}
0
0 / 0 / 2
Регистрация: 24.02.2017
Сообщений: 15
20.09.2017, 16:24  [ТС]
я пытался сделать так, но почему-то ошибки линковщика выпадают, не подскажите, как тогда их решить?
Ошибка LNK2001 неразрешенный внешний символ ""public: int __thiscall IniParser::GetValueDouble<int>(char const *,char const *)" (??$GetValueDouble@H@IniParser@@QAEHPBD0 @Z)" ConsoleApplication11 C:\Users\tomas\Documents\Visual Studio 2017\Projects\ConsoleApplication11\Conso leApplication11\Source.obj 1

Ошибка MSB6006 "link.exe" завершилась с кодом 1120. ConsoleApplication11 C:\Program Files\Microsoft Visual Studio\2017\Community\Common7\IDE\VC\VCT argets\Microsoft.CppCommon.targets 647

Ошибка LNK1120 неразрешенных внешних элементов: 1 ConsoleApplication11 C:\Users\tomas\Documents\Visual Studio 2017\Projects\ConsoleApplication11\Relea se\ConsoleApplication11.exe 1
0
Эксперт С++
 Аватар для hoggy
8973 / 4319 / 960
Регистрация: 15.11.2014
Сообщений: 9,760
20.09.2017, 16:24
Цитата Сообщение от Тамика Посмотреть сообщение
stod
не взлетит.
0
82 / 82 / 44
Регистрация: 14.07.2013
Сообщений: 410
20.09.2017, 16:26
Тамика, там от типа зависит какой метод вызывается stod, stoi и т.д. так что без частичной специализации не обойтись
0
Эксперт С++
 Аватар для hoggy
8973 / 4319 / 960
Регистрация: 15.11.2014
Сообщений: 9,760
20.09.2017, 16:28
Цитата Сообщение от IchimaruGin Посмотреть сообщение
без частичной специализации не обойтись
нафиг не нужна.
3
Котовчанин
942 / 482 / 200
Регистрация: 16.02.2010
Сообщений: 3,338
Записей в блоге: 35
20.09.2017, 16:34
IchimaruGin, точно?

Вообще у меня такой вариант... Интересно узнать чем он плох? Я только не могу решить проблему с возвращаемым значением... Разве что его передавать как параметр тоже.
C++
1
2
3
4
5
6
7
8
9
10
template<typename T>
T IniParser::GetValue(const char* section_name, const char* param_name) {
    std::stringstram ss;
    T temp;
    if (!IsHaveParam(section_name, param_name)) return 0;
    else
        ss << (((Sections.find(section_name)->second.find(param_name))->second));
        ss >> temp;
        return temp;
}
0
20.09.2017, 16:40

Не по теме:

Тамика, ну может немного не точно)

0
Котовчанин
942 / 482 / 200
Регистрация: 16.02.2010
Сообщений: 3,338
Записей в блоге: 35
20.09.2017, 16:47
Во
C++
1
2
3
4
5
6
7
8
9
10
template<typename T>
T IniParser::GetValue(const char* section_name, const char* param_name, T default = T()) {
    if (!IsHaveParam(section_name, param_name))
      return T;
      std::stringstream ss;
     T temp;
      ss « (((Sections.find(section_name)->second.find(param_name))->second));
      ss » temp;
      return temp;
}
0
Эксперт С++
 Аватар для hoggy
8973 / 4319 / 960
Регистрация: 15.11.2014
Сообщений: 9,760
20.09.2017, 16:58
Цитата Сообщение от Тамика Посмотреть сообщение
T default
так не нужно делать.
к тому же, оно у вас дальше нигде не используется.

Цитата Сообщение от Тамика Посмотреть сообщение
return T;
не скомпилиццо.
0
Котовчанин
942 / 482 / 200
Регистрация: 16.02.2010
Сообщений: 3,338
Записей в блоге: 35
20.09.2017, 17:03
Цитата Сообщение от hoggy Посмотреть сообщение
не скомпилиццо.
Да, ошибочка. Там
C++
1
return default;
Цитата Сообщение от hoggy Посмотреть сообщение
так не нужно делать.
Почему?
0
Эксперт С++
 Аватар для hoggy
8973 / 4319 / 960
Регистрация: 15.11.2014
Сообщений: 9,760
20.09.2017, 17:07
Цитата Сообщение от Тамика Посмотреть сообщение
Почему?
список ключевых слов с++
http://ru.cppreference.com/w/cpp/keyword

использование ключевого слова не по назначению - UB

исключением из этого правила являются только
override(C++11)
final(C++11)
0
Котовчанин
942 / 482 / 200
Регистрация: 16.02.2010
Сообщений: 3,338
Записей в блоге: 35
20.09.2017, 17:09
hoggy,
C++
1
2
3
4
5
6
7
8
9
10
template<typename T>
T IniParser::GetValue(const char* section_name, const char* param_name, T ret = T()) {
    if (!IsHaveParam(section_name, param_name))
      return ret;
      std::stringstream ss;
     T temp;
      ss « (((Sections.find(section_name)->second.find(param_name))->second));
      ss » temp;
      return temp;
}
0
Эксперт С++
 Аватар для hoggy
8973 / 4319 / 960
Регистрация: 15.11.2014
Сообщений: 9,760
20.09.2017, 17:12
Цитата Сообщение от Тамика Посмотреть сообщение
IsHaveParam(section_name, param_name)
Цитата Сообщение от Тамика Посмотреть сообщение
(((Sections.find(section_name)->second.find(param_name))->second));
вам не кажется,
что здесь вы два раза делаете одну и туже работу?
0
Котовчанин
942 / 482 / 200
Регистрация: 16.02.2010
Сообщений: 3,338
Записей в блоге: 35
20.09.2017, 17:15
hoggy, эт не я, это ТС ))
0
Эксперт С++
 Аватар для hoggy
8973 / 4319 / 960
Регистрация: 15.11.2014
Сообщений: 9,760
20.09.2017, 17:17
Цитата Сообщение от Тамика Посмотреть сообщение
эт не я, это ТС
ну тогда ладно)
сойдёт для сельской местности
0
Котовчанин
942 / 482 / 200
Регистрация: 16.02.2010
Сообщений: 3,338
Записей в блоге: 35
20.09.2017, 17:23
Цитата Сообщение от hoggy Посмотреть сообщение
сойдёт для сельской местности
А как сойдёт для городской элиты? Я ж хочу знать
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
20.09.2017, 17:23
Помогаю со студенческими работами здесь

Шаблонная функция
Нужно создать шаблонную функцию, в которой массив сортируется пузырьком, поиск максимального и минимального значения! Вот с поиском...

Шаблонная функция
Всем привет! Подскажите пожалуйста, почему не работает следующее объявление функции-шаблона? template &lt;class T&gt; class Base ...

шаблонная функция С++
написать шаблонную функцию что подсчитывает сколько в массиве пар соседних элементов с одинаковыми значениями. буду признателен ))

Шаблонная функция С++
Помогите пожалуйсто понять ошибку Используется шаблонная функция в первом вызове она отображает значение типа int во втором типа double...

Шаблонная функция
Необходимо сделать шаблонную функцию, в которой x заменяется на y, а y заменяется на x: void f(int *x, float *y) Помогите...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
Новые блоги и статьи
SDL3 для Web (WebAssembly): Работа со звуком через SDL3_mixer
8Observer8 08.02.2026
Содержание блога Пошагово создадим проект для загрузки звукового файла и воспроизведения звука с помощью библиотеки SDL3_mixer. Звук будет воспроизводиться по клику мышки по холсту на Desktop и по. . .
SDL3 для Web (WebAssembly): Основы отладки веб-приложений на SDL3 по USB и Wi-Fi, запущенных в браузере мобильных устройств
8Observer8 07.02.2026
Содержание блога Браузер Chrome имеет средства для отладки мобильных веб-приложений по USB. В этой пошаговой инструкции ограничимся работой с консолью. Вывод в консоль - это часть процесса. . .
SDL3 для Web (WebAssembly): Обработчик клика мыши в браузере ПК и касания экрана в браузере на мобильном устройстве
8Observer8 02.02.2026
Содержание блога Для начала пошагово создадим рабочий пример для подготовки к экспериментам в браузере ПК и в браузере мобильного устройства. Потом напишем обработчик клика мыши и обработчик. . .
Философия технологии
iceja 01.02.2026
На мой взгляд у человека в технических проектах остается роль генерального директора. Все остальное нейронки делают уже лучше человека. Они не могут нести предпринимательские риски, не могут. . .
SDL3 для Web (WebAssembly): Вывод текста со шрифтом TTF с помощью SDL3_ttf
8Observer8 01.02.2026
Содержание блога В этой пошаговой инструкции создадим с нуля веб-приложение, которое выводит текст в окне браузера. Запустим на Android на локальном сервере. Загрузим Release на бесплатный. . .
SDL3 для Web (WebAssembly): Сборка C/C++ проекта из консоли
8Observer8 30.01.2026
Содержание блога Если вы откроете примеры для начинающих на официальном репозитории SDL3 в папке: examples, то вы увидите, что все примеры используют следующие четыре обязательные функции, а. . .
SDL3 для Web (WebAssembly): Установка Emscripten SDK (emsdk) и CMake для сборки C и C++ приложений в Wasm
8Observer8 30.01.2026
Содержание блога Для того чтобы скачать Emscripten SDK (emsdk) необходимо сначало скачать и уставить Git: Install for Windows. Следуйте стандартной процедуре установки Git через установщик. . . .
SDL3 для Android: Подключение Box2D v3, физика и отрисовка коллайдеров
8Observer8 29.01.2026
Содержание блога Box2D - это библиотека для 2D физики для анимаций и игр. С её помощью можно определять были ли коллизии между конкретными объектами. Версия v3 была полностью переписана на Си, в. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru