![]() |
|
Модераторы: Daevaorn |
![]()
|
|
| Zerstroer |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 285 Регистрация: 8.8.2007 Где: Алма-Ата Репутация: нет Всего: 3 |
Здравствуйте.
Можно ли в шаблонных функциях вызывать не шаблонные функции, работающие с параметрами конкретных типов? По логике - нельзя, так как компилятор создает копии шаблонной функции при компиляции и, естественно, ругается. Есть ли способ это обойти? Вот наглядный пример:
-------------------- In silico |
|||
|
||||
| Randajad |
|
|||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 295 Регистрация: 15.3.2012 Репутация: 8 Всего: 8 |
Можно. Почему нельзя?
В данном примере value должно быть типа string, string &, иначе будет ошибка компиляции. Сами подумайте: компилятор ничего не проверяет и передает в stringF то, что вы сунули в шаблонную функцию. Если же вам нужно сделать шаблонные функции для определенных типов аргументов, то тоже можно. http://en.cppreference.com/w/cpp/types/enable_if |
|||
|
||||
| boostcoder |
|
||||
![]() pattern`щик ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 5458 Регистрация: 1.4.2010 Репутация: 49 Всего: 110 |
можно.
следить за соблюдением conversion должен ты сам. задачу объясни более развернуто. |
||||
|
|||||
| Zerstroer |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 285 Регистрация: 8.8.2007 Где: Алма-Ата Репутация: нет Всего: 3 |
Объясняю задачу более развернуто: Есть шаблонная функция, в примере представлена как:
Она принимает параметры: 1. Над которым будет производиться операция. (в примере Anytype value) 2. Параметр, контролирующий, какая именно операция будет производиться (в примере это bool b, в реальной программе я использую перечисление) По идее, при вызове шаблонной функции, я контролирую conversion за счет передачи кроме типа Anytype, еще и управляющего параметра, но при компилляции нарываюсь на invalid conversion. Не знаю, как это обойти. Если есть необходимость, могу привести блок кода из реальной программы C std::enable_if, который предложил Randajad, я не знаком. Мне кажется, что это именно то, что нужно. Это сообщение отредактировал(а) Zerstroer - 26.6.2012, 13:45 -------------------- In silico |
|||
|
||||
| borisbn |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 4875 Регистрация: 6.2.2010 Где: Ростов-на-Дону Репутация: 22 Всего: 135 |
специализация в помощь - http://liveworkspace.org/code/2083d4c60654...346db847d7f2929
-------------------- Женщины отличаются от программистов тем, что у них чары состоят из стрингов |
|||
|
||||
| Zerstroer |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 285 Регистрация: 8.8.2007 Где: Алма-Ата Репутация: нет Всего: 3 |
borisbn,
Добавлено через 9 минут и 56 секунд borisbn, ага... Понятно, это получается не особая шаблонная -------------------- In silico |
|||
|
||||
| borisbn |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 4875 Регистрация: 6.2.2010 Где: Ростов-на-Дону Репутация: 22 Всего: 135 |
обычно делают именно как я тебе показал - всё общее для всех типов выносят в некую общую функцию (xxx_common или xxx_helper), а в специализации для конкретного типа делают свои черные дела и вызывают эту общую функцию -------------------- Женщины отличаются от программистов тем, что у них чары состоят из стрингов |
|||
|
||||
| Zerstroer |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 285 Регистрация: 8.8.2007 Где: Алма-Ата Репутация: нет Всего: 3 |
borisbn, вообще, приведенное вами решение мне нравится, но у меня есть опасения, что в моем случае, в рабочей программе, оно не совсем уместно по причине того, что слишком объемная шаблонная функция, к тому же внутри неё вызываются другие шаблонные функции.
Вот код из рабочей программы:
Мне неудобно будет распиливать это на две шаблонных функции. Нахожусь в процессе ознакомления с std::enable_if, предложенным Randajad, она since C++11, надеюсь, получится скомпилировать в gcc 4.4. Это сообщение отредактировал(а) Zerstroer - 26.6.2012, 14:51 -------------------- In silico |
|||
|
||||
| Randajad |
|
|||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 295 Регистрация: 15.3.2012 Репутация: 8 Всего: 8 |
А что мешает gcc обновить?
4.8 на дворе. |
|||
|
||||
| Zerstroer |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 285 Регистрация: 8.8.2007 Где: Алма-Ата Репутация: нет Всего: 3 |
Randajad, не подскажете, как с помощью std::enable_if выполнить проверку на принадлежность типа к std::string?
-------------------- In silico |
|||
|
||||
| Zerstroer |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 285 Регистрация: 8.8.2007 Где: Алма-Ата Репутация: нет Всего: 3 |
borisbn, в моей рабочей программе шаблон использовался как метод класса. Сейчас пробую, согласно вашему совету определить частный случай шаблона. При компилляции получаю ошибку:
В классе нельзя определять 2 шаблонных метода с одинаковым именем? Это сообщение отредактировал(а) Zerstroer - 26.6.2012, 16:16 -------------------- In silico |
|||
|
||||
| boostcoder |
|
|||
![]() pattern`щик ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 5458 Регистрация: 1.4.2010 Репутация: 49 Всего: 110 |
так: http://en.cppreference.com/w/cpp/types/enable_if |
|||
|
||||
| Zerstroer |
|
||||||||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 285 Регистрация: 8.8.2007 Где: Алма-Ата Репутация: нет Всего: 3 |
Наблудил с синтаксисом частной реализации метода. Сперва хотел, как в примере borisbnа:
Компилятор ругнулся. В итоге шаблонный метод переопределил таким образом:
Добавлено через 2 минуты и 26 секунд
Или мне не по глазам, или там все таки нету проверки на принадлежность к string. Там в первую очередь смотрел - не нашел. -------------------- In silico |
||||||||
|
|||||||||
| borisbn |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 4875 Регистрация: 6.2.2010 Где: Ростов-на-Дону Репутация: 22 Всего: 135 |
можно использовать параметры шаблона по-умолчанию http://liveworkspace.org/code/f34fa82a7fad...f9eaae0283471fe для этого есть http://en.cppreference.com/w/cpp/types/is_same
-------------------- Женщины отличаются от программистов тем, что у них чары состоят из стрингов |
|||
|
||||
| Zerstroer |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 285 Регистрация: 8.8.2007 Где: Алма-Ата Репутация: нет Всего: 3 |
Как раз именно так я и поступил. Каюсь is_same упустил из внимания. С использованием частной реализации шаблонного метода у меня все получилось. Пробую с использованием enable_if. -------------------- In silico |
|||
|
||||
![]()
|
| Правила форума "С++:Общие вопросы" | |
|
|
Добро пожаловать!
Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Earnest Daevaorn |
| 0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей) | |
| 0 Пользователей: | |
| « Предыдущая тема | C/C++: Общие вопросы | Следующая тема » |
|
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |