1 | ||||||
Выбор кода при компиляции24.06.2014, 13:47. Показов 1632. Ответов 19
Метки нет (Все метки)
Здравствуйте!
Столкнулся с почти аналогичной проблемой, как и описанная в данной статье: http://www.solarix.ru/for_deve... itch.shtml В ней идет разговор о выборе кода при компиляции в зависимости от типа входных данных. Моя же проблема, по сравнению со статьей, усложняется (а может и упрощается) тем, что нужно в зависмости от типа данных передавать в функцию еще и разное число параметров, а не одинаковое их число одинаковых типов как в статье. То есть нужно написать функцию (функции), чтобы алгоритм был примерно такой:
P.S. Только заранее прошу не предлагать мне использовать альтернативные пути решения задачи, а предлагать только решения методами шаблонного программирования )))
0
|
24.06.2014, 13:47 | |
Ответы с готовыми решениями:
19
Выбор кода для компиляции на основании сравнения параметров шаблона Ошибка при компиляции кода Предупреждения при компиляции кода Ошибка при компиляции кода |
В астрале
8049 / 4806 / 655
Регистрация: 24.06.2010
Сообщений: 10,562
|
||||||
25.06.2014, 15:34 | 9 | |||||
Выглядить оно будет как-то так (но можно и через специализации конечно). А дальше нужны уточнения от вас.
0
|
25.06.2014, 17:02 [ТС] | 10 | |||||
Да, наверное, я не совсем точно и не совсем полно указал исходные данные...
Уточню: предложенный Вами метод не будет работать. Связано это с тем, что компилятору же надо оттранслировать обе ветки if-else, а типы T, для которых вся эта бодяга и мутится, фактически делятся на два типа. Допустим, для простоты, что делается это по указанному Вами признаку std::is_integral<T>, хотя это, конечно, не так. Но проблема в том, что для одних типов функция OtherFunction() принимает один аргумент, а для других - два. Текст этих функций будет примерно такой:
Соответственно, здесь будет ошибка компиляции по причинам не соответствия количества аргументов для методов, потому как для одних типов SomeMethod() принимает int в качестве значения, а для других нет. Может так понятнее будет? Вы меня извините, это мой первый опыт шаблонного программирования, и я пока плоховато мыслю в категориях шаблонов))
0
|
3257 / 2059 / 351
Регистрация: 24.11.2012
Сообщений: 4,909
|
||||||
25.06.2014, 18:33 | 11 | |||||
Читаю и все равно ничего не могу понять. Примеры неправдоподобные и надуманные. Могу от фонаря привести такой кусок кода, но более чем уверен, что у Вас случай гораздо проще и, вероятно, есть ошибки в подходе к решению задачи.
0
|
25.06.2014, 22:13 [ТС] | 12 |
Добавлено через 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!
1608 / 1300 / 180
Регистрация: 21.04.2012
Сообщений: 2,729
|
||||||
26.06.2014, 00:25 | 13 | |||||
Сообщение было отмечено Variag как решение
Решение
Variag,
Так?
3
|
18829 / 9832 / 2403
Регистрация: 30.01.2014
Сообщений: 17,270
|
||||||||||||||||
26.06.2014, 04:13 | 14 | |||||||||||||||
Сообщение было отмечено Variag как решение
Решение
Еще как в тему.
Такие вещи через enable_if как раз и делаются. Только предикат нужно другой. Код для С++03 (enable_if в этом случае можно взять из boost, либо написать самому, как я) - реализация через SFINAE:
А вообще я бы сделал так (без шаблонных изысков, старая добрая перегрузка):
Кстати в С++11, есть довольно красивый и простой способ обобщить проверку сигнатуры функции. Ее можно использовать при решении задачи ТС: иллюстрация
6
|
26.06.2014, 08:58 [ТС] | 15 | |||||
Спасибо gray_fox и DrOffset за Ваши решения. Теперь хотелось бы пару комментариев для поднятия образованности. Как я понимаю, здесь ведь enable_if используется для "включения/выключения" возвращаемого значения функции, и таким образом, "включает/выключает" всю функцию?
0
|
3257 / 2059 / 351
Регистрация: 24.11.2012
Сообщений: 4,909
|
||||||
26.06.2014, 10:28 | 16 | |||||
Смотрим на возможный вариант реализации: http://en.cppreference.com/w/cpp/types/enable_if
В специализации для false отсутствует вложенный тип type, следовательно все определение
0
|
В астрале
8049 / 4806 / 655
Регистрация: 24.06.2010
Сообщений: 10,562
|
|||||||||||
26.06.2014, 11:01 | 17 | ||||||||||
В С++11 можно так же развлечься и без создания структур для поиска. Ну это так, на всякий случай, использовать такое не призываю.
Ну и конечно можно без усложнений.
1
|
26.06.2014, 11:27 [ТС] | 18 |
Проверил, все работает. Еще раз спасибо)
Если уж совсем обнахалиться, то вот еще какой вопрос... Есть ли возможность написать функцию SomeFunction() таким образом, чтобы она в зависимости от типа принимала то одно то два значения, дабы не было в программе варнингов из-за лишних аргументов функции? Чтобы вызов функции выглядел как: SomeFunction(t, x); Но для определенных типов t, второй параметр игнорировался бы и варнигов бы не было Хотя... из области фантастики, врят-ли такое возможно)) Но помечтать то можно))
0
|
В астрале
8049 / 4806 / 655
Регистрация: 24.06.2010
Сообщений: 10,562
|
|
26.06.2014, 11:35 | 19 |
Variag, Так он ведь итак игнорируется в тех примерах которые вам давали. Дабы перестали быть ворнинги просто уберите имя переменной в функции, которая ее не использует.
1
|
26.06.2014, 11:41 [ТС] | 20 |
Точно) Просто привык имя переменной всегда писать))
0
|
26.06.2014, 11:41 | |
26.06.2014, 11:41 | |
Помогаю со студенческими работами здесь
20
Ошибка при компиляции кода Ошибка С1083 при компиляции кода Ошибки C2678 и C2679 при компиляции кода Ошибка при компиляции простого кода с указателем Искать еще темы с ответами Или воспользуйтесь поиском по форуму: |