| Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате |
| Форум программистов > C/C++: Общие вопросы > (g++)указатель на шаблонную функцию |
| Автор: GoldFinch 27.11.2010, 15:20 | ||||
этот код работает. а если раскомментировать 22ю строчку, то он будет работать в MSVC, а g++ выдаст ошибку
http://codepad.org/CaM2ViIJ, http://ideone.com/8ZJUl при этом на самом деле причина ошибки в том, что g++ считает method_to_fn перегруженной функцией, и по этому нужен static_cast чтобы выбрать "перегрузку". почему так? |
| Автор: Леопольд 27.11.2010, 15:26 |
| Красотища... Чистой воды UB. |
| Автор: boostcoder 27.11.2010, 15:32 |
хз о чем Вы... http://liveworkspace.org/code/f7dde36deec8b68c94dc382d0b33ea77 |
| Автор: GoldFinch 27.11.2010, 15:35 |
| boostcoder, какая там версия гцц? |
| Автор: Леопольд 27.11.2010, 15:37 |
| GoldFinch, пока ещё не смог понять из кода, что именно надо... |
| Автор: GoldFinch 27.11.2010, 15:38 |
| Леопольд, не страшно boostcoder, похоже действительно в 4.5 это починили, это какая-то особенность С++0х |
| Автор: boostcoder 27.11.2010, 15:41 |
4.5.1 |
| Автор: Леопольд 27.11.2010, 15:42 | ||
Может это?
|
| Автор: GoldFinch 27.11.2010, 15:44 |
| Леопольд, не угадали. |
| Автор: Леопольд 27.11.2010, 15:49 |
| Тогда, может объясните по человечески? Потому что, если избавиться от UB, получается именно это... |
| Автор: GoldFinch 27.11.2010, 15:51 | ||||
эээ нееет) это чит потому что когда там обе строчки, версия со статик-кастом позволяет работать версии без статик-каста
http://liveworkspace.org/code/9b7c03115be3f8a042fc50ee142cd60e Добавлено через 2 минуты и 8 секунд Леопольд, this тут вообще ни при чем, а нулевой this - это вроде не UB. В любом случае, это к проблеме отношения не имеет, добавляйте туда объект если хотите. Добавлено через 4 минуты и 8 секунд btw, liveworkspace.org всем хорош, только там табуляция 3 символа =\ хотелось бы 4 %) |
| Автор: GoldFinch 27.11.2010, 16:21 |
| Леопольд, С-style cast тоже ни при чем. Что вы, приведения типов функций никогда чтоле не видели %) |
| Автор: Леопольд 27.11.2010, 16:21 |
| В С++ не видел. Про С не могу сказать, может там это легально. |
| Автор: GoldFinch 27.11.2010, 16:28 | ||
| Леопольд, впрочем, спасибо за подсказку убрал из сигнатуры method_to_fn шаблонный тип, "перегрузки" исчезли, и всё заработало
|
| Автор: Леопольд 27.11.2010, 16:42 | ||
http://liveworkspace.org/code/bf8a2fa6241c39644c42f3af3acb7ab2 |
| Автор: GoldFinch 27.11.2010, 16:47 | ||
| Леопольд, помоему я написал тожесамое Добавлено через 7 минут и 57 секунд Всем спасибо за участие, вопрос решен. --------- собственно ради чего это всё затевалось:
|
| Автор: mes 27.11.2010, 19:10 |
угу.. нажить проблемы : http://liveworkspace.org/code/5b05551a3ef03138d3e10f277664cf41 |
| Автор: Леопольд 27.11.2010, 19:56 | ||
| Не совсем, я показал что не так с static_cast ( mes показал тоже самое). Можно легко получить UB, компилятор ничем не сможет помочь. вот ещё UB, компилятор проглотил не поперхнувшись
Надо написать шаbлон оbёртку, который включит типизацию оbратно. |
| Автор: GoldFinch 27.11.2010, 23:15 |
| mes, зачем было городить такой сложный код, передали бы туда сразу int* например, оно бы вообще упало %) предложите тогда лучший код, чтоб работал в гцц |
| Автор: mes 27.11.2010, 23:25 | ||
так в этом случае Вы могли бы свалить на ССЗБ.. а тут вы вроде и метод правильно получили... да не тот.. Добавлено через 3 минуты и 20 секунд единственный безопасный способ получить void*_адрес метода.. это взять его у статической прокси функции.. (т.е. без лишних телодвижений увы никак).. |
| Автор: GoldFinch 27.11.2010, 23:30 | ||||
| поясню, этот код нужен чтобы передавать коллбэки на С++ в библиотеки с Си-интерфейсом. естественно у function_with_callback будет в сигнатуре void() и void* и на каком-то этапе надо будет привести T* в void* кстати пожалуй более интересный вариант это
Добавлено через 4 минуты и 54 секунды mes, я не понимаю. вы написали
вторым аргументом function_with_callback может быть чтоугодно, по этому подразумевается что пользователь должен сам убедиться что если 1й аргумент это адаптер для T, то 2й аргумент имеет тип T* |
| Автор: mes 27.11.2010, 23:42 | ||
в таком случае у Вас код не будет принимать для наследника, методы определенные в предке.. еще хуже - руки связаны.. Добавлено через 1 минуту и 30 секунд этот уже похож на нормальный.. нужно внимательней посмотреть.. |
| Автор: GoldFinch 27.11.2010, 23:51 | ||||
вот тут вот надо обязательно использовать дополнительную переменную
этим можно воспользоваться, и написать вот так вот:
вроде это наиболее типобезопасный вариант Добавлено через 3 минуты и 24 секунды интересно правда как этот код вообще работает %) я не очень понимаю что есть rvalue-reference, и почему значение этой лямбды продолжает жить %) |
| Автор: mes 27.11.2010, 23:57 |
мне кажется тут еще можно подумать.. Добавлено через 1 минуту и 7 секунд идти не в сторону получения пары, а предоставлении обертки над function_with_callback |
| Автор: GoldFinch 28.11.2010, 00:05 | ||||
| ... и да, использование дополнительной локальной переменной делает всё совершенно неюзабельным =\ проблема в том, что она должна где-то жить, чтобы указатель на нее был валидным. а типичный пример использования это
Добавлено через 1 минуту и 18 секунд пара полезна тем что она гарантирует то, что оба агрумента взяты из одного источника, который может проверить их совместимость Добавлено через 4 минуты и 26 секунд это наиболее очевидный и понятный вариант, но мы его не рассматриваем. мне интересно создание одной реюзабельной функции которая позволила бы делать обертки для методов Добавлено через 12 минут и 11 секунд более того, есть случаи, когда написание обертки практически невозможно
|
| Автор: mes 28.11.2010, 00:26 | ||||
ну а что мешает сделать это проксю единой для всех подходящих функций ? Добавлено @ 00:28
ну еллипсис впринципе можно тоже разгрузить.. другой вопрос - нужно ли это.. |
| Автор: mes 28.11.2010, 00:54 | ||
вот примерно о чем я предлагал (на основе вашего кода)
fcb - function_with_callback |
| Автор: Леопольд 28.11.2010, 00:59 |
| mes, думается, это надо для реального проекта. Навряд ли rvalue ссылки можно в нём использовать. Правда, ничто не мешает из заменить на оbычные... |
| Автор: mes 28.11.2010, 01:02 |
я их у тс перенял Добавлено @ 01:03 тем более они к теме напрямую не относятся.. и вопрос о надежности уже был также поднят тс.. но я например не в состоянии на него ответить.. поэтому пока беру как есть Добавлено @ 01:04 суть в самом вызове proxy, чтоб не приходилось в ручную заниматься "подбором" параметров.. |
| Автор: GoldFinch 28.11.2010, 01:06 |
| не, в реальной ситуации у function_with_callback будет еще куча параметров, так что никакой реюзабельности не получится |
| Автор: mes 28.11.2010, 01:56 | ||||||
ну да, а bind тогда нам зачем ?! допустим fcb имеет такой вид :
тогда вызов может иметь такой вид :
где 4,6.3,8 значения параметров, которые мы должны передать функции помимо колбяка.. |
| Автор: GoldFinch 28.11.2010, 02:23 |
| м.. ну да.. только выглядит ужасно =\ |
| Автор: mes 28.11.2010, 02:40 | ||||
..
ну не знаю какой из кодов выглядит ужасней |