Форум программистов, компьютерный форум, киберфорум
Наши страницы

С++ для начинающих

Войти
Регистрация
Восстановить пароль
 
 
popelyuk
8 / 8 / 1
Регистрация: 04.12.2012
Сообщений: 130
#1

Шаблонные функции только для определённых типов! - C++

20.01.2013, 12:20. Просмотров 927. Ответов 18
Метки нет (Все метки)

Как сделать чтобы для шаблонной функции генерировались только экземпляры для нескольких заданных типов, а остальные не генерировались?
Следующее определение не помогает (в конце кода):
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 <typename str_type>
double strToDouble(str_type *in_add, const str_type decimal_separator='.');
 
template <typename str_type>
double strToDouble(str_type *in_add, const str_type decimal_separator) {
    auto_arr<str_type> str=cloneStr(in_add); // for sake able to modify
    str_type *int_pos(str), *fract_pos(0), *exp_pos(0);
    if((*str=='+')||(*str=='-')) str++;
    bool is_hex((str[0]=='0')&&(str[1]=='x'));
    while(*str!=0) {
        if((*str==decimal_separator)&&(fract_pos==0)) *str=0, fract_pos=++str;
        if(((*str=='e')||(*str=='E'))&&(exp_pos==0)) {
            if(is_hex&&((str[1]!='0')||(str[2]!='x'))) continue;
            *str=0; exp_pos=++str; break;
        }
    }
    // check here that the fractional, integer and exponential part not equal zero !!
    double out_number=strToInt(int_pos);
    if(fract_pos) {
        out_number;
    }
    if(exp_pos)
    return out_number;
}
 
template double strToDouble(char *in_add, const char decimal_separator);
template double strToDouble(wchar_t *in_add, const wchar_t decimal_separator);
проблема состоит в том что если вызвать функцию как:
C++
1
std::cout<<"strToDouble="<<strToDouble("k")<<std::endl;
то подставляется const char вместо str_type, а надо просто char, потому что тогда всё что внутри объявлено с типом str_type нельзя изменять что никоим образом мне не подходит! Помогает:
C++
1
std::cout<<"strToDouble="<<strToDouble<char>("k")<<std::endl;
но это не удобно постоянно писать тип при вызове функции, теряется весь смысл "template'ности" ))
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
20.01.2013, 12:20
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Шаблонные функции только для определённых типов! (C++):

Можно ли сделать шаблон функции только для определенных типов? - C++
Например template&lt;typename T&gt; void func(T x){} Где T может быть только int,double и float

Шаблонные функции для заполнения массива - C++
Здравствуйте, уважаемое сообщество. Пожалуйста, помогите с решением задачи. Тема - шаблонные функции. Нужно написать функции для...

Шаблонные классы. Присвоение к указателю и приведение типов - C++
Добрый вечер, ув. форум, есть к вам вопрос. Есть род. абстрактный класс: ParentAbstact Есть два наследника: ChildOne : public...

Шаблонные функции для нахождения минимального и максимального элемента пары чисел - C++
Описать функции-шаблоны для нахождения минимального и максимального элемента пары чисел. Задано два целых и два действительные числа....

Написать шаблонные, перегруженные функции для ввода и вывода на экран массивов и матриц - C++
Добрый вечер всем! Помогите написать написать шаблонные, перегруженные функции input и output для ввода и вывода на экран массивов и...

Шаблонные функции - C++
Доброго времени суток. Есть шаблонная функция(двоичный сумматор прямого кода): template &lt;class T&gt; void Main_register::badc(T *regist, T...

18
popelyuk
8 / 8 / 1
Регистрация: 04.12.2012
Сообщений: 130
20.01.2013, 16:02  [ТС] #16
Цитата Сообщение от Nick Alte Посмотреть сообщение
Так то ж из C++11. Попробуй без слова extern.
да, теперь всё компилируется, но наверно я всё же чего-то не понимаю, а самое главное не понимаю чего именно я не понимаю! Я просто думал что определения темплейт функций должны быть всегда в хедерах и никогда в .cpp файлах, иначе что-то будет, а что будет? Подскажите ,пожалуйста, что мне прочитать чтобы "получить просветление" так сказать???

Добавлено через 1 минуту
только не советуйте "курить стандарт", как мне где-то тут или не тут советовали, чего-то не очень длинное желательно
0
DU
1484 / 1130 / 45
Регистрация: 05.12.2011
Сообщений: 2,279
20.01.2013, 16:05 #17
вот на мой взгляд одна из лучших книг по шаблонам в плюсах:
http://www.ozon.ru/context/detail/id/3960662/
хоть и до новостандартная, все равно очень хорошая.
в ней есть в частности глава 10 про инстанцирование.
1
Nick Alte
Эксперт С++
1644 / 1016 / 120
Регистрация: 27.09.2009
Сообщений: 1,945
Завершенные тесты: 1
20.01.2013, 16:46 #18
Цитата Сообщение от popelyuk Посмотреть сообщение
Я просто думал что определения темплейт функций должны быть всегда в хедерах и никогда в .cpp файлах, иначе что-то будет, а что будет?
Это не религиозная догма. Содержимое шаблонов быть в заголовках, чтобы их можно было инстанциировать: для этого ведь необходимо знать содержимое шаблона. Ведь что такое инстанциация? Берём шаблон void printf<T>(T) (который сам по себе не функция, а только заготовка для создания функций), подставляем туда конкретные типы (ну или константы) и на выходе получаем конкретный тип или конкретную функцию: void print<int>(int). А потом - другую функцию, формально совершенно независимую от первой: void print<double>(double).

То есть, мы выносим определение шаблона в отдельный файл и там же инстанциируем всё, что нам нужно. В результате этот файл по сути содержит набор уже окончательных функций. Обращение к таким функциям происходит как и к любым другим, через механизм связывания (через линкер). Для обращения к функции надо лишь знать типы аргументов и возвращаемого значения: объявление этой функции.

Так что при определении шаблонов внутри .cpp это "иначе что-то будет" сводится к невозможности инстанциировать шаблоны вне тех .cpp, в которых они объявлены. Что обычно противоречит нашим намерениям, но в данном случае - именно то, что доктор прописал.
1
popelyuk
8 / 8 / 1
Регистрация: 04.12.2012
Сообщений: 130
20.01.2013, 16:51  [ТС] #19
Цитата Сообщение от Nick Alte Посмотреть сообщение
Это не религиозная догма. Содержимое шаблонов быть в заголовках, чтобы их можно было инстанциировать: для этого ведь необходимо знать содержимое шаблона. Ведь что такое инстанциация? Берём шаблон void printf<T>(T) (который сам по себе не функция, а только заготовка для создания функций), подставляем туда конкретные типы (ну или константы) и на выходе получаем конкретный тип или конкретную функцию: void print<int>(int). А потом - другую функцию, формально совершенно независимую от первой: void print<double>(double).

То есть, мы выносим определение шаблона в отдельный файл и там же инстанциируем всё, что нам нужно. В результате этот файл по сути содержит набор уже окончательных функций. Обращение к таким функциям происходит как и к любым другим, через механизм связывания (через линкер). Для обращения к функции надо лишь знать типы аргументов и возвращаемого значения: объявление этой функции.

Так что при определении шаблонов внутри .cpp это "иначе что-то будет" сводится к невозможности инстанциировать шаблоны вне тех .cpp, в которых они объявлены. Что обычно противоречит нашим намерениям, но в данном случае - именно то, что доктор прописал.
теперь всё понятно, спасибо за уделённое время!
0
20.01.2013, 16:51
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
20.01.2013, 16:51
Привет! Вот еще темы с ответами:

шаблонные функции - C++
доброго времени суток уважаемые форумчане, помогите пожалуйста разобраться с шаблонными функциями, читал про них много но так и не понял...

Шаблонные функции - C++
Такой код работает. #include &lt;iostream&gt; #include &lt;string&gt; #include &lt;cstring&gt; using namespace std; template &lt;typename T&gt; T...

Шаблонные функции - C++
1) Написать шаблонную функцию для нахождения минимального из трех передаваемых чисел (для чисел типа int, double, char). В функции...

Шаблонные функции в C++ - C++
Каждый раз когда вижу код, который должен быть простым и понятным, я понимаю его немного хуже. Вот наш код: template &lt;typename T,...


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

Или воспользуйтесь поиском по форуму:
19
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2018, vBulletin Solutions, Inc.
Рейтинг@Mail.ru