Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
 Аватар для SomniPhobia
602 / 439 / 137
Регистрация: 22.11.2017
Сообщений: 1,407

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

21.08.2023, 07:38. Показов 532. Ответов 3
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Всем привет!
Как объяснить компилятору, чтобы он при инстанцировании шаблона не брал часть кода?

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
33
34
35
36
37
#include <iostream>
#include <string>
#include <limits>
 
template <class T>
T convert(const double value);
 
int main()
{
    const double v = 124.45;
    const std::string s = convert<std::string>(v);
    std::cout << s << "\n";
 
    return 0;
}
 
template <class T>
T convert(const double value)
{
    static double inf = std::numeric_limits<double>::infinity();
    if (typeid(T) == typeid(int))
    {
        return static_cast<int>(value);
    }
    else if (typeid(T) == typeid(std::string))
    {
        return std::to_string(value);
    }
    else if (typeid(T) == typeid(double))
    {
        return value;
    }
    else
    {
        return inf;
    }
}
Так выдаёт ошибку на всех return, кроме того типа, к которому инстанцирует
0
Лучшие ответы (1)
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
21.08.2023, 07:38
Ответы с готовыми решениями:

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

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

Шаблонная функция
Помогите понять почему когда вызываешь функцию уже для конкретного типа (int,char*,double и т.п.)выдает ошибку: Error C2440 'type cast':...

3
Неэпический
 Аватар для Croessmah
18149 / 10731 / 2067
Регистрация: 27.09.2012
Сообщений: 27,035
Записей в блоге: 1
21.08.2023, 08:13
Лучший ответ Сообщение было отмечено SomniPhobia как решение

Решение

constexpr if
2
99 / 74 / 28
Регистрация: 30.03.2023
Сообщений: 206
21.08.2023, 08:51
C++
1
2
3
4
if constexpr( std::is_same<T, CMyClass>::value )
{
...
}
Работает, если не ошибаюсь, с 17го стандарта
1
19500 / 10105 / 2461
Регистрация: 30.01.2014
Сообщений: 17,818
21.08.2023, 09:27
SomniPhobia, до с++17 можно было пойти тремя путями:
1) Сделать специализации (ну, здесь понятно; для функций работает только полная специализация)
2) Сделать перегрузки (по Tag-типу, например, или c SFINAE через enable_if)
3) Использовать pattern matching
Кликните здесь для просмотра всего текста

https://wandbox.org/permlink/hhZhBazSYdHuC6Gp
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
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
template <typename T, bool = false>
class Pattern;
    
template <typename T>
class Pattern<T, true>
{
public:
    explicit Pattern(T const & x) 
        : m_value(x) 
    { }
    
    template <typename T1>
    Pattern & match(T1 const &)
    {
        return *this;
    }
    
    operator T const &() const
    {
        return m_value;
    }
    
private:
    T const & m_value;
};
 
template <typename T>
class Pattern<T, false>
{
public:
    template <typename T1>
    Pattern & match(T1 const &)
    {
        return *this;
    } 
    Pattern<T, true> match(T const & x)
    {
        return Pattern<T, true>(x);
    }
    
    operator T() const
    {
        return T();
    }
};
 
#include <iostream>
#include <string>
#include <limits>
 
template <class T>
T convert(const double value);
 
int main()
{
    const double v = 124.45;
    const std::string s = convert<std::string>(v);
    std::cout << s << "\n";
    const int i = convert<int>(v);
    std::cout << i << "\n";
    const double d = convert<double>(v);
    std::cout << d << "\n";
    
    return 0;
}
 
template <class T>
T convert(const double value)
{
    return Pattern<T>()
              .match(value)
              .match(static_cast<int>(value))
              .match(std::to_string(value))
              .match(std::numeric_limits<double>::infinity()); 
// обращаю внимание, что в последнем кейсе double конвертится в T,
// так же, как и у ТС в оригинальном коде
}
3
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
21.08.2023, 09:27
Помогаю со студенческими работами здесь

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

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

Шаблонная функция
У меня есть две функции и в зависимости от введенных данных должна вызваться определенная функция. Нужно создать шаблонную функцию для...

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

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


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

Или воспользуйтесь поиском по форуму:
4
Ответ Создать тему
Новые блоги и статьи
Символические и жёсткие ссылки в Linux.
algri14 15.03.2026
Существует два типа ссылок — символические и жёсткие. Ссылка в Linux — это запись в каталоге, которая может указывать либо на inode «файла-ИСТОЧНИКА», тогда это будет «жёсткая ссылка» (hard link),. . .
[Owen Logic] Поддержание уровня воды в резервуаре количеством включённых насосов: моделирование и выбор регулятора
ФедосеевПавел 14.03.2026
Поддержание уровня воды в резервуаре количеством включённых насосов: моделирование и выбор регулятора ВВЕДЕНИЕ Выполняя задание на управление насосной группой заполнения резервуара,. . .
делаю науч статью по влиянию грибов на сукцессию
anaschu 13.03.2026
прикрепляю статью
SDL3 для Desktop (MinGW): Создаём пустое окно с нуля для 2D-графики на SDL3, Си и C++
8Observer8 10.03.2026
Содержание блога Финальные проекты на Си и на C++: hello-sdl3-c. zip hello-sdl3-cpp. zip Результат:
Установка CMake и MinGW 13.1 для сборки С и C++ приложений из консоли и из Qt Creator в EXE
8Observer8 10.03.2026
Содержание блога MinGW - это коллекция инструментов для сборки приложений в EXE. CMake - это система сборки приложений. Здесь описаны базовые шаги для старта программирования с помощью CMake и. . .
Как дизайн сайта влияет на конверсию: 7 решений, которые реально повышают заявки
Neotwalker 08.03.2026
Многие до сих пор воспринимают дизайн сайта как “красивую оболочку”. На практике всё иначе: дизайн напрямую влияет на то, оставит человек заявку или уйдёт через несколько секунд. Даже если у вас. . .
Модульная разработка через nuget packages
DevAlt 07.03.2026
Сложившийся в . Net-среде способ разработки чаще всего предполагает монорепозиторий в котором находятся все исходники. При создании нового решения, мы просто добавляем нужные проекты и имеем. . .
Модульный подход на примере F#
DevAlt 06.03.2026
В блоге дяди Боба наткнулся на такое определение: В этой книге («Подход, основанный на вариантах использования») Ивар утверждает, что архитектура программного обеспечения — это структуры,. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru