указатель на мембер
От: night beast СССР  
Дата: 10.08.06 07:25
Оценка:
Недавно столкнулся с такой непонятной штукой.

Указатель на мембер-функцию не является указателем.

#include <iostream>

#define print(msg) std::cout << msg << std::endl;

template<typename T>
struct is_pointer {
    static const int value=0;
};

template<typename T>
struct is_pointer<T*> {
    static const int value=1;
};

int main (int argv, char * args[] ) {

    std::cout << is_pointer<int (test::*)(void) >::value << std::endl;
    return 0;
}


Какие причины такого решения?
Re: указатель на мембер
От: Bell Россия  
Дата: 10.08.06 08:17
Оценка: +1
Здравствуйте, night beast, Вы писали:

NB>Недавно столкнулся с такой непонятной штукой.


NB>Указатель на мембер-функцию не является указателем.

Да, это более сложная сущность.

NB>Какие причины такого решения?

Ну хотя бы то, что размеры указателя и указателя на член в общем случае не совпадают.
Любите книгу — источник знаний (с) М.Горький
Re[2]: указатель на мембер
От: shank  
Дата: 10.08.06 08:44
Оценка: +1
Здравствуйте, Bell, Вы писали:

NB>>Какие причины такого решения?

B>Ну хотя бы то, что размеры указателя и указателя на член в общем случае не совпадают.

Размеры указателей на int и на double тоже "в общем случае" не совпадают.
Re[2]: указатель на мембер
От: night beast СССР  
Дата: 10.08.06 08:47
Оценка:
Здравствуйте, Bell, Вы писали:

NB>>Недавно столкнулся с такой непонятной штукой.


NB>>Указатель на мембер-функцию не является указателем.

B>Да, это более сложная сущность.

NB>>Какие причины такого решения?

B>Ну хотя бы то, что размеры указателя и указателя на член в общем случае не совпадают.

ну а вот, например, размер указателя и указателя на функцию тоже не обязаны совпадать. однако для указателей на функцию все работает как надо.
Re[3]: указатель на мембер
От: shank  
Дата: 10.08.06 08:59
Оценка:
Здравствуйте, night beast, Вы писали:

NB>>>Какие причины такого решения?

B>>Ну хотя бы то, что размеры указателя и указателя на член в общем случае не совпадают.

NB>ну а вот, например, размер указателя и указателя на функцию тоже не обязаны совпадать. однако для указателей на функцию все работает как надо.


Указатели (на объекты, функции, void) и указатели на нестатические члены класса относятся к разным группам типов, с т.з. стандарта, ничего здесь не поделаешь. Причина этому, наверное, тот факт, что указатели, обычно, представляют собой адрес, тогда как указатели на члены — не совсем.
Re: указатель на мембер
От: zaufi Земля  
Дата: 10.08.06 09:01
Оценка:
Здравствуйте, night beast, Вы писали:

NB>Недавно столкнулся с такой непонятной штукой.


NB>Указатель на мембер-функцию не является указателем.


NB>
NB>#include <iostream>

NB>#define print(msg) std::cout << msg << std::endl;

NB>template<typename T>
NB>struct is_pointer {
NB>    static const int value=0;
NB>};

NB>template<typename T>
NB>struct is_pointer<T*> {
NB>    static const int value=1;
NB>};

template<typename R, typename C>
struct is_pointer<R (C::*)()> {
    static const int value=1;
};

NB>int main (int argv, char * args[] ) {

NB>    std::cout << is_pointer<int (test::*)(void) >::value << std::endl;
NB>    return 0;
NB>}
NB>


добавь выделенную специализацию...
в общем случае нада заспециализироваться для функций с 1,2,3,...,N параметрами...
Re[2]: указатель на мембер
От: night beast СССР  
Дата: 10.08.06 09:05
Оценка:
Здравствуйте, zaufi, Вы писали:

NB>>Недавно столкнулся с такой непонятной штукой.


NB>>Указатель на мембер-функцию не является указателем.


Z>добавь выделенную специализацию...

Z>в общем случае нада заспециализироваться для функций с 1,2,3,...,N параметрами...

именно!
приходится плодить кучу специализаций на ровном месте (добавь еще к ним указатель на постоянную мембер функцию)
это нормально по вашему?
Re[4]: указатель на мембер
От: night beast СССР  
Дата: 10.08.06 09:08
Оценка:
Здравствуйте, shank, Вы писали:

S>Указатели (на объекты, функции, void) и указатели на нестатические члены класса относятся к разным группам типов, с т.з. стандарта, ничего здесь не поделаешь. Причина этому, наверное, тот факт, что указатели, обычно, представляют собой адрес, тогда как указатели на члены — не совсем.


дело в том, что указатель на функцию в общем случае не может быть преобразован к указателю на void (что справедливо для обычных объектов).
и в этом плане он не отличается от указателя на мембер.
Re[3]: указатель на мембер
От: jazzer Россия Skype: enerjazzer
Дата: 10.08.06 09:19
Оценка:
Здравствуйте, night beast, Вы писали:

Z>>в общем случае нада заспециализироваться для функций с 1,2,3,...,N параметрами...


NB>именно!

NB>приходится плодить кучу специализаций на ровном месте (добавь еще к ним указатель на постоянную мембер функцию)
NB>это нормально по вашему?

ну а попробуй написать просто is_pointer_to_function, без функций-членов — получишь то же самое.
Хотя, может быть, тут удастся извратиться методом исключения, но не суть.
jazzer (Skype: enerjazzer) Ночная тема для RSDN
Автор: jazzer
Дата: 26.11.09

You will always get what you always got
  If you always do  what you always did
Re[5]: указатель на мембер
От: shank  
Дата: 10.08.06 09:21
Оценка:
Здравствуйте, night beast, Вы писали:

NB>дело в том, что указатель на функцию в общем случае не может быть преобразован к указателю на void (что справедливо для обычных объектов).

Кстати такое преобразование, по идее, должно давать ошибку компиляции (даже если используются reinterpret_cast или c-cast).

NB>и в этом плане он не отличается от указателя на мембер.

Я о другом, указатель на функцию является "просто" указателем (pointer), как и указатели на объекты, тогда как указатель на функцию-член — это pointer-to-member, совершенно другая группа типов.
Re[4]: указатель на мембер
От: night beast СССР  
Дата: 10.08.06 09:26
Оценка:
Здравствуйте, jazzer, Вы писали:

Z>>>в общем случае нада заспециализироваться для функций с 1,2,3,...,N параметрами...


NB>>именно!

NB>>приходится плодить кучу специализаций на ровном месте (добавь еще к ним указатель на постоянную мембер функцию)
NB>>это нормально по вашему?

J>ну а попробуй написать просто is_pointer_to_function, без функций-членов — получишь то же самое.

J>Хотя, может быть, тут удастся извратиться методом исключения, но не суть.

да. но вопрос то в другом.
тот код отлично работает для указателей на функцию без специализаций.
вот и интересуюсь, в чем причина.
Re[3]: указатель на мембер
От: zaufi Земля  
Дата: 10.08.06 09:31
Оценка:
Здравствуйте, night beast, Вы писали:

NB>Здравствуйте, zaufi, Вы писали:


NB>>>Недавно столкнулся с такой непонятной штукой.


NB>>>Указатель на мембер-функцию не является указателем.


Z>>добавь выделенную специализацию...

Z>>в общем случае нада заспециализироваться для функций с 1,2,3,...,N параметрами...

NB>именно!

NB>приходится плодить кучу специализаций на ровном месте (добавь еще к ним указатель на постоянную мембер функцию)
NB>это нормально по вашему?

если ломно заморачиваться используй boost::type_traits -- не изобретай велосипед... все уже сделано давно до тебя!
--
а вообще такая проблема лекго решается препроцессором генерящим для тебя нужное количество требуемых специализаций
(для чего также удобно использовать BOOST_PP_... макросы
Re[6]: указатель на мембер
От: night beast СССР  
Дата: 10.08.06 09:34
Оценка:
Здравствуйте, shank, Вы писали:

NB>>и в этом плане он не отличается от указателя на мембер.

S>Я о другом, указатель на функцию является "просто" указателем (pointer), как и указатели на объекты, тогда как указатель на функцию-член — это pointer-to-member, совершенно другая группа типов.

"просто" указатель -- низкоуровневая абстракция.
вот лично ты видишь логические основания не считать pointer-to-member указателем?
Re[7]: указатель на мембер
От: valker  
Дата: 10.08.06 09:43
Оценка:
Здравствуйте, night beast, Вы писали:

NB>"просто" указатель -- низкоуровневая абстракция.

NB>вот лично ты видишь логические основания не считать pointer-to-member указателем?

При прочтеннии этой ветки пришла такая мысль, почему бы не трактовать функции-члены, как обычные функции, но с дополнительным параметром в начале списка — аналогом this, передающимся неявно.

код мог бы быть таким:

class A{
public: void f(void);
};

A a;
void (*pfn)(A*) = &A::f;
(*pfn)(&a);
Posted using RSDN@HOME
Re[4]: указатель на мембер
От: night beast СССР  
Дата: 10.08.06 09:46
Оценка:
Здравствуйте, zaufi, Вы писали:

NB>>именно!

NB>>приходится плодить кучу специализаций на ровном месте (добавь еще к ним указатель на постоянную мембер функцию)
NB>>это нормально по вашему?

Z>если ломно заморачиваться используй boost::type_traits -- не изобретай велосипед... все уже сделано давно до тебя!


не ломило (http://www.rsdn.ru/Forum/Message.aspx?mid=2045050&amp;only=1
Автор: night beast
Дата: 07.08.06
)
это просто одна из иллюстраций проблемы.
вот еще:
template<typename T>
void foo ( T * );

template<typename T>
void foo ( const T & );

foo (&test::bar);


Z>--

Z>а вообще такая проблема лекго решается препроцессором генерящим для тебя нужное количество требуемых специализаций
Z>(для чего также удобно использовать BOOST_PP_... макросы

"кто сказал что микроскопом нельзя забивать гвозди? главное колотить сильнее" (с)

не хорошо это, не красиво.
Re[8]: указатель на мембер
От: zaufi Земля  
Дата: 10.08.06 09:47
Оценка: :)
Здравствуйте, valker, Вы писали:

V>Здравствуйте, night beast, Вы писали:


NB>>"просто" указатель -- низкоуровневая абстракция.

NB>>вот лично ты видишь логические основания не считать pointer-to-member указателем?

V>При прочтеннии этой ветки пришла такая мысль, почему бы не трактовать функции-члены, как обычные функции, но с дополнительным параметром в начале списка — аналогом this, передающимся неявно.


V>код мог бы быть таким:


V>
V>class A{
V>public: void f(void);
V>};

V>A a;
V>void (*pfn)(A* const) = &A::f;
V>(*pfn)(&a);
V>



твою мысль украли бустеры ужа давно -- и использовали при реализации boost::bind
Re[3]: указатель на мембер
От: kan_izh Великобритания  
Дата: 10.08.06 09:54
Оценка:
shank wrote:

> NB>>Какие причины такого решения?

> B>Ну хотя бы то, что размеры указателя и указателя на член в общем
> случае не совпадают.
Совпадают.
Posted via RSDN NNTP Server 2.0
но это не зря, хотя, может быть, невзначай
гÅрмония мира не знает границ — сейчас мы будем пить чай
Re[9]: указатель на мембер
От: valker  
Дата: 10.08.06 09:56
Оценка:
Здравствуйте, zaufi, Вы писали:

Z>

Z>твою мысль украли бустеры ужа давно -- и использовали при реализации boost::bind

Ух, ворюги!!! И расписали 16 вариантов, для const/не-const вариантов функций.

Мой вопрос был: почему это не сделано на уровне языка? Вроде бы препятствий нет. Или я их не вижу?
Posted using RSDN@HOME
Re[3]: указатель на мембер
От: Bell Россия  
Дата: 10.08.06 10:03
Оценка: 1 (1)
Здравствуйте, shank, Вы писали:

S>Здравствуйте, Bell, Вы писали:


NB>>>Какие причины такого решения?

B>>Ну хотя бы то, что размеры указателя и указателя на член в общем случае не совпадают.

S>Размеры указателей на int и на double тоже "в общем случае" не совпадают.


Неужели?
Любите книгу — источник знаний (с) М.Горький
Re[4]: указатель на мембер
От: shank  
Дата: 10.08.06 10:16
Оценка: 17 (3)
Здравствуйте, 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*.

Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.