Выбор кода при компиляции24.06.2014, 13:47. Показов 2086. Ответов 19
Метки нет (Все метки)
Здравствуйте!
Столкнулся с почти аналогичной проблемой, как и описанная в данной статье: http://www.solarix.ru/for_deve... itch.shtml В ней идет разговор о выборе кода при компиляции в зависимости от типа входных данных. Моя же проблема, по сравнению со статьей, усложняется (а может и упрощается) тем, что нужно в зависмости от типа данных передавать в функцию еще и разное число параметров, а не одинаковое их число одинаковых типов как в статье. То есть нужно написать функцию (функции), чтобы алгоритм был примерно такой:
P.S. Только заранее прошу не предлагать мне использовать альтернативные пути решения задачи, а предлагать только решения методами шаблонного программирования )))
0
|
||||||
| 24.06.2014, 13:47 | |
|
Ответы с готовыми решениями:
19
Выбор кода для компиляции на основании сравнения параметров шаблона Ошибка при компиляции кода
|
|
Почетный модератор
7393 / 2639 / 281
Регистрация: 29.07.2006
Сообщений: 13,696
|
|
| 24.06.2014, 13:54 | |
|
Если в зависимости от типа нужно выполнять определенный код, то просто специализируй шаблон функции. Безо всяких if внутри.
0
|
|
|
Почетный модератор
7393 / 2639 / 281
Регистрация: 29.07.2006
Сообщений: 13,696
|
||
| 24.06.2014, 13:59 | ||
|
0
|
||
|
Почетный модератор
7393 / 2639 / 281
Регистрация: 29.07.2006
Сообщений: 13,696
|
|
| 24.06.2014, 14:18 | |
|
0
|
|
|
Почетный модератор
7393 / 2639 / 281
Регистрация: 29.07.2006
Сообщений: 13,696
|
|
| 25.06.2014, 11:30 | |
|
Variag, ты вопрос задай по-нормальному. Не понятно, что тебе нужно. Написал ты свой пример того, как собираешься делать. И в чем вопрос-то? Чем тебя твой "алгоритм" конкретно не устраивает?
0
|
|
|
В астрале
8049 / 4806 / 655
Регистрация: 24.06.2010
Сообщений: 10,562
|
||||||
| 25.06.2014, 15:34 | ||||||
|
Выглядить оно будет как-то так (но можно и через специализации конечно). А дальше нужны уточнения от вас.
0
|
||||||
| 25.06.2014, 17:02 [ТС] | ||||||
|
Да, наверное, я не совсем точно и не совсем полно указал исходные данные...
Уточню: предложенный Вами метод не будет работать. Связано это с тем, что компилятору же надо оттранслировать обе ветки if-else, а типы T, для которых вся эта бодяга и мутится, фактически делятся на два типа. Допустим, для простоты, что делается это по указанному Вами признаку std::is_integral<T>, хотя это, конечно, не так. Но проблема в том, что для одних типов функция OtherFunction() принимает один аргумент, а для других - два. Текст этих функций будет примерно такой:
Соответственно, здесь будет ошибка компиляции по причинам не соответствия количества аргументов для методов, потому как для одних типов SomeMethod() принимает int в качестве значения, а для других нет. Может так понятнее будет? Вы меня извините, это мой первый опыт шаблонного программирования, и я пока плоховато мыслю в категориях шаблонов))
0
|
||||||
|
3258 / 2060 / 351
Регистрация: 24.11.2012
Сообщений: 4,909
|
||||||
| 25.06.2014, 18:33 | ||||||
|
Читаю и все равно ничего не могу понять. Примеры неправдоподобные и надуманные. Могу от фонаря привести такой кусок кода, но более чем уверен, что у Вас случай гораздо проще и, вероятно, есть ошибки в подходе к решению задачи.
0
|
||||||
| 25.06.2014, 22:13 [ТС] | ||
Добавлено через 40 минут Уж коли пошла такая пьянка, сформулирую еще раз проблему: Есть у меня классы: ClassA, ClassB, ClassC, ClassD, ... ClassZ. В каждом из этих классов есть метод. Только в одних классах он параметров не принимает и выглядит как void SomeMethod(), а в других принимает int и выглядит как void SomeMethod(int x). Задача: Написать глобальную шаблонную функцию template < typename T > void SomeFunction(T t, int x), которая будет в зависимости от типа T вызывать соответствующий этому типу метод SomeMethod(), либо с параметром, либо без. Надеюсь, стало понятнее)) Еще раз извиняюсь, если раньше было менее понятно. И прошу, все-таки не обсуждать мой подход к решению задачи. Я пробовал и все классы унаследовать от базового, и наследовать от двух базовых, и много чего еще, но все это мне не подходит по разным причинам. Так что давайте все-таки сосредоточимся на предлагаемой мной задаче, а не будем переписывать условие)))
0
|
||
|
What a waste!
1610 / 1302 / 180
Регистрация: 21.04.2012
Сообщений: 2,733
|
||||||
| 26.06.2014, 00:25 | ||||||
Сообщение было отмечено Variag как решение
Решение
Variag,
Так?
3
|
||||||
|
19500 / 10105 / 2461
Регистрация: 30.01.2014
Сообщений: 17,816
|
|||||||||||||||||
| 26.06.2014, 04:13 | |||||||||||||||||
Сообщение было отмечено Variag как решение
РешениеТакие вещи через enable_if как раз и делаются. Только предикат нужно другой. Код для С++03 (enable_if в этом случае можно взять из boost, либо написать самому, как я) - реализация через SFINAE:
А вообще я бы сделал так (без шаблонных изысков, старая добрая перегрузка):
Кстати в С++11, есть довольно красивый и простой способ обобщить проверку сигнатуры функции. Ее можно использовать при решении задачи ТС: иллюстрация
6
|
|||||||||||||||||
| 26.06.2014, 08:58 [ТС] | |||||||
Спасибо gray_fox и DrOffset за Ваши решения. Теперь хотелось бы пару комментариев для поднятия образованности. Как я понимаю, здесь ведь enable_if используется для "включения/выключения" возвращаемого значения функции, и таким образом, "включает/выключает" всю функцию?
0
|
|||||||
|
3258 / 2060 / 351
Регистрация: 24.11.2012
Сообщений: 4,909
|
|||||||
| 26.06.2014, 10:28 | |||||||
|
В специализации для false отсутствует вложенный тип type, следовательно все определение
0
|
|||||||
|
В астрале
8049 / 4806 / 655
Регистрация: 24.06.2010
Сообщений: 10,562
|
|||||||||||
| 26.06.2014, 11:01 | |||||||||||
|
В С++11 можно так же развлечься и без создания структур для поиска. Ну это так, на всякий случай, использовать такое не призываю.
Ну и конечно можно без усложнений.
1
|
|||||||||||
| 26.06.2014, 11:27 [ТС] | |
|
Проверил, все работает. Еще раз спасибо)
Если уж совсем обнахалиться, то вот еще какой вопрос... Есть ли возможность написать функцию SomeFunction() таким образом, чтобы она в зависимости от типа принимала то одно то два значения, дабы не было в программе варнингов из-за лишних аргументов функции? Чтобы вызов функции выглядел как: SomeFunction(t, x); Но для определенных типов t, второй параметр игнорировался бы и варнигов бы не было Хотя... из области фантастики, врят-ли такое возможно)) Но помечтать то можно))
0
|
|
|
В астрале
8049 / 4806 / 655
Регистрация: 24.06.2010
Сообщений: 10,562
|
|
| 26.06.2014, 11:35 | |
|
Variag, Так он ведь итак игнорируется в тех примерах которые вам давали. Дабы перестали быть ворнинги просто уберите имя переменной в функции, которая ее не использует.
1
|
|
| 26.06.2014, 11:41 [ТС] | |
|
Точно) Просто привык имя переменной всегда писать))
0
|
|
| 26.06.2014, 11:41 | |
|
Помогаю со студенческими работами здесь
20
Ошибка при компиляции кода
Ошибка С1083 при компиляции кода
Ошибка при компиляции простого кода с указателем Искать еще темы с ответами Или воспользуйтесь поиском по форуму: |
|
Новые блоги и статьи
|
|||
|
SDL3 для Web (WebAssembly): Реализация движения на Box2D v3 - трение и коллизии с повёрнутыми стенами
8Observer8 20.02.2026
Содержание блога
Box2D позволяет легко создать главного героя, который не проходит сквозь стены и перемещается с заданным трением о препятствия, которые можно располагать под углом, как верхнее. . .
|
Конвертировать закладки radiotray-ng в m3u-плейлист
damix 19.02.2026
Это можно сделать скриптом для PowerShell. Использование
. \СonvertRadiotrayToM3U. ps1 <path_to_bookmarks. json>
Рядом с файлом bookmarks. json появится файл bookmarks. m3u с результатом.
# Check if. . .
|
Семь CDC на одном интерфейсе: 5 U[S]ARTов, 1 CAN и 1 SSI
Eddy_Em 18.02.2026
Постепенно допиливаю свою "многоинтерфейсную плату". Выглядит вот так:
https:/ / www. cyberforum. ru/ blog_attachment. php?attachmentid=11617&stc=1&d=1771445347
Основана на STM32F303RBT6.
На борту пять. . .
|
Камера Toupcam IUA500KMA
Eddy_Em 12.02.2026
Т. к. у всяких "хикроботов" слишком уж мелкий пиксель, для подсмотра в ESPriF они вообще плохо годятся: уже 14 величину можно рассмотреть еле-еле лишь на экспозициях под 3 секунды (а то и больше),. . .
|
|
И ясному Солнцу
zbw 12.02.2026
И ясному Солнцу,
и светлой Луне.
В мире
покоя нет
и люди
не могут жить в тишине.
А жить им немного лет.
|
«Знание-Сила»
zbw 12.02.2026
«Знание-Сила»
«Время-Деньги»
«Деньги -Пуля»
|
SDL3 для Web (WebAssembly): Подключение Box2D v3, физика и отрисовка коллайдеров
8Observer8 12.02.2026
Содержание блога
Box2D - это библиотека для 2D физики для анимаций и игр. С её помощью можно определять были ли коллизии между конкретными объектами и вызывать обработчики событий столкновения. . . .
|
SDL3 для Web (WebAssembly): Загрузка PNG с прозрачным фоном с помощью SDL_LoadPNG (без SDL3_image)
8Observer8 11.02.2026
Содержание блога
Библиотека SDL3 содержит встроенные инструменты для базовой работы с изображениями - без использования библиотеки SDL3_image. Пошагово создадим проект для загрузки изображения. . .
|