Здравствуйте, night beast, Вы писали:
NB>Недавно столкнулся с такой непонятной штукой.
NB>Указатель на мембер-функцию не является указателем.
Да, это более сложная сущность.
NB>Какие причины такого решения?
Ну хотя бы то, что размеры указателя и указателя на член в общем случае не совпадают.
Здравствуйте, Bell, Вы писали:
NB>>Какие причины такого решения? B>Ну хотя бы то, что размеры указателя и указателя на член в общем случае не совпадают.
Размеры указателей на int и на double тоже "в общем случае" не совпадают.
Здравствуйте, Bell, Вы писали:
NB>>Недавно столкнулся с такой непонятной штукой.
NB>>Указатель на мембер-функцию не является указателем. B>Да, это более сложная сущность.
NB>>Какие причины такого решения? B>Ну хотя бы то, что размеры указателя и указателя на член в общем случае не совпадают.
ну а вот, например, размер указателя и указателя на функцию тоже не обязаны совпадать. однако для указателей на функцию все работает как надо.
Здравствуйте, night beast, Вы писали:
NB>>>Какие причины такого решения? B>>Ну хотя бы то, что размеры указателя и указателя на член в общем случае не совпадают.
NB>ну а вот, например, размер указателя и указателя на функцию тоже не обязаны совпадать. однако для указателей на функцию все работает как надо.
Указатели (на объекты, функции, void) и указатели на нестатические члены класса относятся к разным группам типов, с т.з. стандарта, ничего здесь не поделаешь. Причина этому, наверное, тот факт, что указатели, обычно, представляют собой адрес, тогда как указатели на члены — не совсем.
Здравствуйте, zaufi, Вы писали:
NB>>Недавно столкнулся с такой непонятной штукой.
NB>>Указатель на мембер-функцию не является указателем.
Z>добавь выделенную специализацию... Z>в общем случае нада заспециализироваться для функций с 1,2,3,...,N параметрами...
именно!
приходится плодить кучу специализаций на ровном месте (добавь еще к ним указатель на постоянную мембер функцию)
это нормально по вашему?
Здравствуйте, shank, Вы писали:
S>Указатели (на объекты, функции, void) и указатели на нестатические члены класса относятся к разным группам типов, с т.з. стандарта, ничего здесь не поделаешь. Причина этому, наверное, тот факт, что указатели, обычно, представляют собой адрес, тогда как указатели на члены — не совсем.
дело в том, что указатель на функцию в общем случае не может быть преобразован к указателю на void (что справедливо для обычных объектов).
и в этом плане он не отличается от указателя на мембер.
Здравствуйте, night beast, Вы писали:
Z>>в общем случае нада заспециализироваться для функций с 1,2,3,...,N параметрами...
NB>именно! NB>приходится плодить кучу специализаций на ровном месте (добавь еще к ним указатель на постоянную мембер функцию) NB>это нормально по вашему?
ну а попробуй написать просто is_pointer_to_function, без функций-членов — получишь то же самое.
Хотя, может быть, тут удастся извратиться методом исключения, но не суть.
Здравствуйте, night beast, Вы писали:
NB>дело в том, что указатель на функцию в общем случае не может быть преобразован к указателю на void (что справедливо для обычных объектов).
Кстати такое преобразование, по идее, должно давать ошибку компиляции (даже если используются reinterpret_cast или c-cast).
NB>и в этом плане он не отличается от указателя на мембер.
Я о другом, указатель на функцию является "просто" указателем (pointer), как и указатели на объекты, тогда как указатель на функцию-член — это pointer-to-member, совершенно другая группа типов.
Здравствуйте, jazzer, Вы писали:
Z>>>в общем случае нада заспециализироваться для функций с 1,2,3,...,N параметрами...
NB>>именно! NB>>приходится плодить кучу специализаций на ровном месте (добавь еще к ним указатель на постоянную мембер функцию) NB>>это нормально по вашему?
J>ну а попробуй написать просто is_pointer_to_function, без функций-членов — получишь то же самое. J>Хотя, может быть, тут удастся извратиться методом исключения, но не суть.
да. но вопрос то в другом.
тот код отлично работает для указателей на функцию без специализаций.
вот и интересуюсь, в чем причина.
Здравствуйте, night beast, Вы писали:
NB>Здравствуйте, zaufi, Вы писали:
NB>>>Недавно столкнулся с такой непонятной штукой.
NB>>>Указатель на мембер-функцию не является указателем.
Z>>добавь выделенную специализацию... Z>>в общем случае нада заспециализироваться для функций с 1,2,3,...,N параметрами...
NB>именно! NB>приходится плодить кучу специализаций на ровном месте (добавь еще к ним указатель на постоянную мембер функцию) NB>это нормально по вашему?
если ломно заморачиваться используй boost::type_traits -- не изобретай велосипед... все уже сделано давно до тебя!
--
а вообще такая проблема лекго решается препроцессором генерящим для тебя нужное количество требуемых специализаций
(для чего также удобно использовать BOOST_PP_... макросы
Здравствуйте, shank, Вы писали:
NB>>и в этом плане он не отличается от указателя на мембер. S>Я о другом, указатель на функцию является "просто" указателем (pointer), как и указатели на объекты, тогда как указатель на функцию-член — это pointer-to-member, совершенно другая группа типов.
"просто" указатель -- низкоуровневая абстракция.
вот лично ты видишь логические основания не считать pointer-to-member указателем?
Здравствуйте, night beast, Вы писали:
NB>"просто" указатель -- низкоуровневая абстракция. NB>вот лично ты видишь логические основания не считать pointer-to-member указателем?
При прочтеннии этой ветки пришла такая мысль, почему бы не трактовать функции-члены, как обычные функции, но с дополнительным параметром в начале списка — аналогом this, передающимся неявно.
код мог бы быть таким:
class A{
public: void f(void);
};
A a;
void (*pfn)(A*) = &A::f;
(*pfn)(&a);
Здравствуйте, zaufi, Вы писали:
NB>>именно! NB>>приходится плодить кучу специализаций на ровном месте (добавь еще к ним указатель на постоянную мембер функцию) NB>>это нормально по вашему?
Z>если ломно заморачиваться используй boost::type_traits -- не изобретай велосипед... все уже сделано давно до тебя!
)
это просто одна из иллюстраций проблемы.
вот еще:
template<typename T>
void foo ( T * );
template<typename T>
void foo ( const T & );
foo (&test::bar);
Z>-- Z>а вообще такая проблема лекго решается препроцессором генерящим для тебя нужное количество требуемых специализаций Z>(для чего также удобно использовать BOOST_PP_... макросы
"кто сказал что микроскопом нельзя забивать гвозди? главное колотить сильнее" (с)
Здравствуйте, valker, Вы писали:
V>Здравствуйте, night beast, Вы писали:
NB>>"просто" указатель -- низкоуровневая абстракция. NB>>вот лично ты видишь логические основания не считать pointer-to-member указателем?
V>При прочтеннии этой ветки пришла такая мысль, почему бы не трактовать функции-члены, как обычные функции, но с дополнительным параметром в начале списка — аналогом this, передающимся неявно.
V>код мог бы быть таким:
V>
shank wrote:
> NB>>Какие причины такого решения? > B>Ну хотя бы то, что размеры указателя и указателя на член в общем > случае не совпадают.
Совпадают.
Posted via RSDN NNTP Server 2.0
но это не зря, хотя, может быть, невзначай
гÅрмония мира не знает границ — сейчас мы будем пить чай
Здравствуйте, shank, Вы писали:
S>Здравствуйте, Bell, Вы писали:
NB>>>Какие причины такого решения? B>>Ну хотя бы то, что размеры указателя и указателя на член в общем случае не совпадают.
S>Размеры указателей на int и на double тоже "в общем случае" не совпадают.
Здравствуйте, Bell, Вы писали:
S>>Размеры указателей на int и на double тоже "в общем случае" не совпадают.
B>Неужели?
Угу.
Единственное, что гарантируется касательно размеров указателей, это то, что размер void* достаточен для того, чтобы "вместить" указатель на объект любого типа, а также то что sizeof(void*) == sizeof(char*). Больше никаких гарантий. (Это объяснялось где-то Steve'ом Clamage'ом, если мне склероз не изменяет).
3.9.2/4
Objects of cv-qualified (3.9.3) or cv-unqualified type void* (pointer to void), can be used to point to
objects of unknown type. A void* shall be able to hold any object pointer. A cv-qualified or cv-
unqualified (3.9.3) void* shall have the same representation and alignment requirements as a cv-qualified
or cv-unqualified char*.