![]() |
|
Модераторы: Daevaorn |
![]()
|
|
| GoldFinch |
|
||||
![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 2141 Регистрация: 30.11.2008 Репутация: 15 Всего: 26 |
этот код работает. а если раскомментировать 22ю строчку, то он будет работать в MSVC, а g++ выдаст ошибку
link1, link2 при этом на самом деле причина ошибки в том, что g++ считает method_to_fn перегруженной функцией, и по этому нужен static_cast чтобы выбрать "перегрузку". почему так? |
||||
|
|||||
| Леопольд |
|
|||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 943 Регистрация: 17.6.2009 Репутация: 10 Всего: 13 |
Красотища...
Чистой воды UB. Это сообщение отредактировал(а) Леопольд - 27.11.2010, 15:38 -------------------- вопросов больше чем ответов |
|||
|
||||
| boostcoder |
|
|||
![]() pattern`щик ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 5458 Регистрация: 1.4.2010 Репутация: 49 Всего: 110 |
||||
|
||||
| GoldFinch |
|
|||
![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 2141 Регистрация: 30.11.2008 Репутация: 15 Всего: 26 |
boostcoder, какая там версия гцц?
|
|||
|
||||
| Леопольд |
|
|||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 943 Регистрация: 17.6.2009 Репутация: 10 Всего: 13 |
GoldFinch, пока ещё не смог понять из кода, что именно надо...
-------------------- вопросов больше чем ответов |
|||
|
||||
| GoldFinch |
|
|||
![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 2141 Регистрация: 30.11.2008 Репутация: 15 Всего: 26 |
Леопольд, не страшно
boostcoder, похоже действительно в 4.5 это починили, это какая-то особенность С++0х |
|||
|
||||
| boostcoder |
|
|||
![]() pattern`щик ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 5458 Регистрация: 1.4.2010 Репутация: 49 Всего: 110 |
||||
|
||||
| Леопольд |
|
|||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 943 Регистрация: 17.6.2009 Репутация: 10 Всего: 13 |
Может это?
Это сообщение отредактировал(а) Леопольд - 27.11.2010, 15:47 -------------------- вопросов больше чем ответов |
|||
|
||||
| GoldFinch |
|
|||
![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 2141 Регистрация: 30.11.2008 Репутация: 15 Всего: 26 |
Леопольд, не угадали.
|
|||
|
||||
| Леопольд |
|
|||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 943 Регистрация: 17.6.2009 Репутация: 10 Всего: 13 |
Тогда, может объясните по человечески? Потому что, если избавиться от UB, получается именно это...
-------------------- вопросов больше чем ответов |
|||
|
||||
| GoldFinch |
|
||||
![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 2141 Регистрация: 30.11.2008 Репутация: 15 Всего: 26 |
эээ нееет) это чит потому что когда там обе строчки, версия со статик-кастом позволяет работать версии без статик-каста
http://liveworkspace.org/code/9b7c03115be3...2fc50ee142cd60e Добавлено через 2 минуты и 8 секунд Леопольд, this тут вообще ни при чем, а нулевой this - это вроде не UB. В любом случае, это к проблеме отношения не имеет, добавляйте туда объект если хотите. Добавлено через 4 минуты и 8 секунд btw, liveworkspace.org всем хорош, только там табуляция 3 символа =\ хотелось бы 4 %) |
||||
|
|||||
| Леопольд |
|
||||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 943 Регистрация: 17.6.2009 Репутация: 10 Всего: 13 |
UB приводить указатели на функцию, static_cast неспроста не даёт этого делать. Это UB в действии http://liveworkspace.org/code/9b7c03115be3...2fc50ee142cd60e Использовать С-ишное приведение в С++, зачем?
Наверное, это ближе всех: http://liveworkspace.org/code/c631f5ef9be4...477373840e60b9a static_cast из void * , тоже самое что и reinterpret_cast. Только выглядит безобиднее. На мой взгляд, не особо много смысла. Зачем это надо? Это сообщение отредактировал(а) Леопольд - 27.11.2010, 16:34 -------------------- вопросов больше чем ответов |
||||
|
|||||
| GoldFinch |
|
|||
![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 2141 Регистрация: 30.11.2008 Репутация: 15 Всего: 26 |
Леопольд, С-style cast тоже ни при чем. Что вы, приведения типов функций никогда чтоле не видели %)
|
|||
|
||||
| Леопольд |
|
|||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 943 Регистрация: 17.6.2009 Репутация: 10 Всего: 13 |
В С++ не видел. Про С не могу сказать, может там это легально.
Это сообщение отредактировал(а) Леопольд - 27.11.2010, 16:24 -------------------- вопросов больше чем ответов |
|||
|
||||
| GoldFinch |
|
|||
![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 2141 Регистрация: 30.11.2008 Репутация: 15 Всего: 26 |
Леопольд, впрочем, спасибо за подсказку
убрал из сигнатуры method_to_fn шаблонный тип, "перегрузки" исчезли, и всё заработало
|
|||
|
||||
| Леопольд |
|
|||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 943 Регистрация: 17.6.2009 Репутация: 10 Всего: 13 |
http://liveworkspace.org/code/bf8a2fa6241c...c42f3af3acb7ab2 Это сообщение отредактировал(а) Леопольд - 27.11.2010, 16:45 -------------------- вопросов больше чем ответов |
|||
|
||||
| GoldFinch |
|
|||
![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 2141 Регистрация: 30.11.2008 Репутация: 15 Всего: 26 |
Леопольд, помоему я написал тожесамое
Добавлено через 7 минут и 57 секунд Всем спасибо за участие, вопрос решен. --------- собственно ради чего это всё затевалось:
|
|||
|
||||
| mes |
|
|||
|
любитель ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 7954 Регистрация: 14.1.2006 Репутация: 144 Всего: 250 |
||||
|
||||
| Леопольд |
|
|||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 943 Регистрация: 17.6.2009 Репутация: 10 Всего: 13 |
Не совсем, я показал что не так с static_cast ( mes показал тоже самое). Можно легко получить UB, компилятор ничем не сможет помочь.
вот ещё UB, компилятор проглотил не поперхнувшись
Надо написать шаbлон оbёртку, который включит типизацию оbратно. Это сообщение отредактировал(а) Леопольд - 27.11.2010, 19:59 -------------------- вопросов больше чем ответов |
|||
|
||||
| GoldFinch |
|
|||
![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 2141 Регистрация: 30.11.2008 Репутация: 15 Всего: 26 |
mes, зачем было городить такой сложный код, передали бы туда сразу int* например, оно бы вообще упало %)
предложите тогда лучший код, чтоб работал в гцц |
|||
|
||||
| mes |
|
|||
|
любитель ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 7954 Регистрация: 14.1.2006 Репутация: 144 Всего: 250 |
так в этом случае Вы могли бы свалить на ССЗБ.. а тут вы вроде и метод правильно получили... да не тот.. Добавлено через 3 минуты и 20 секунд единственный безопасный способ получить void*_адрес метода.. это взять его у статической прокси функции.. (т.е. без лишних телодвижений увы никак).. |
|||
|
||||
| GoldFinch |
|
||||
![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 2141 Регистрация: 30.11.2008 Репутация: 15 Всего: 26 |
поясню, этот код нужен чтобы передавать коллбэки на С++ в библиотеки с Си-интерфейсом.
естественно у function_with_callback будет в сигнатуре void() и void* и на каком-то этапе надо будет привести T* в void* кстати пожалуй более интересный вариант это
Добавлено через 4 минуты и 54 секунды mes, я не понимаю. вы написали
вторым аргументом function_with_callback может быть чтоугодно, по этому подразумевается что пользователь должен сам убедиться что если 1й аргумент это адаптер для T, то 2й аргумент имеет тип T* |
||||
|
|||||
| mes |
|
|||
|
любитель ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 7954 Регистрация: 14.1.2006 Репутация: 144 Всего: 250 |
в таком случае у Вас код не будет принимать для наследника, методы определенные в предке.. еще хуже - руки связаны.. Добавлено через 1 минуту и 30 секунд этот уже похож на нормальный.. нужно внимательней посмотреть.. |
|||
|
||||
| GoldFinch |
|
||||
![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 2141 Регистрация: 30.11.2008 Репутация: 15 Всего: 26 |
вот тут вот надо обязательно использовать дополнительную переменную
этим можно воспользоваться, и написать вот так вот:
вроде это наиболее типобезопасный вариант Добавлено через 3 минуты и 24 секунды интересно правда как этот код вообще работает %) я не очень понимаю что есть rvalue-reference, и почему значение этой лямбды продолжает жить %) |
||||
|
|||||
| mes |
|
|||
|
любитель ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 7954 Регистрация: 14.1.2006 Репутация: 144 Всего: 250 |
мне кажется тут еще можно подумать.. Добавлено через 1 минуту и 7 секунд идти не в сторону получения пары, а предоставлении обертки над function_with_callback |
|||
|
||||
| GoldFinch |
|
||||
![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 2141 Регистрация: 30.11.2008 Репутация: 15 Всего: 26 |
... и да, использование дополнительной локальной переменной делает всё совершенно неюзабельным =\
проблема в том, что она должна где-то жить, чтобы указатель на нее был валидным. а типичный пример использования это
Добавлено через 1 минуту и 18 секунд пара полезна тем что она гарантирует то, что оба агрумента взяты из одного источника, который может проверить их совместимость Добавлено через 4 минуты и 26 секунд это наиболее очевидный и понятный вариант, но мы его не рассматриваем. мне интересно создание одной реюзабельной функции которая позволила бы делать обертки для методов Добавлено через 12 минут и 11 секунд более того, есть случаи, когда написание обертки практически невозможно
|
||||
|
|||||
| mes |
|
||||
|
любитель ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 7954 Регистрация: 14.1.2006 Репутация: 144 Всего: 250 |
ну а что мешает сделать это проксю единой для всех подходящих функций ? Добавлено @ 00:28
ну еллипсис впринципе можно тоже разгрузить.. другой вопрос - нужно ли это.. Это сообщение отредактировал(а) mes - 28.11.2010, 00:34 |
||||
|
|||||
| mes |
|
|||
|
любитель ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 7954 Регистрация: 14.1.2006 Репутация: 144 Всего: 250 |
вот примерно о чем я предлагал (на основе вашего кода)
fcb - function_with_callback |
|||
|
||||
| Леопольд |
|
|||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 943 Регистрация: 17.6.2009 Репутация: 10 Всего: 13 |
mes, думается, это надо для реального проекта. Навряд ли rvalue ссылки можно в нём использовать. Правда, ничто не мешает из заменить на оbычные...
-------------------- вопросов больше чем ответов |
|||
|
||||
| mes |
|
|||
|
любитель ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 7954 Регистрация: 14.1.2006 Репутация: 144 Всего: 250 |
я их у тс перенял Добавлено @ 01:03 тем более они к теме напрямую не относятся.. и вопрос о надежности уже был также поднят тс.. но я например не в состоянии на него ответить.. поэтому пока беру как есть Добавлено @ 01:04 суть в самом вызове proxy, чтоб не приходилось в ручную заниматься "подбором" параметров.. Это сообщение отредактировал(а) mes - 28.11.2010, 01:05 |
|||
|
||||
| GoldFinch |
|
|||
![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 2141 Регистрация: 30.11.2008 Репутация: 15 Всего: 26 |
не, в реальной ситуации у function_with_callback будет еще куча параметров, так что никакой реюзабельности не получится
|
|||
|
||||
| mes |
|
||||||
|
любитель ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 7954 Регистрация: 14.1.2006 Репутация: 144 Всего: 250 |
ну да, а bind тогда нам зачем ?! допустим fcb имеет такой вид :
тогда вызов может иметь такой вид :
где 4,6.3,8 значения параметров, которые мы должны передать функции помимо колбяка.. |
||||||
|
|||||||
| GoldFinch |
|
|||
![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 2141 Регистрация: 30.11.2008 Репутация: 15 Всего: 26 |
м.. ну да.. только выглядит ужасно =\
|
|||
|
||||
| mes |
|
||||
|
любитель ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 7954 Регистрация: 14.1.2006 Репутация: 144 Всего: 250 |
..
ну не знаю какой из кодов выглядит ужасней Это сообщение отредактировал(а) mes - 28.11.2010, 02:41 |
||||
|
|||||
![]()
|
| Правила форума "С++:Общие вопросы" | |
|
|
Добро пожаловать!
Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Earnest Daevaorn |
| 0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей) | |
| 0 Пользователей: | |
| « Предыдущая тема | C/C++: Общие вопросы | Следующая тема » |
|
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |