Преобразование указателя функции класса в void * или наоборот - PullRequest
0 голосов
/ 31 октября 2010

Я пытаюсь сравнить адрес двух функций на равенство. Тип моей хранимой функции известен. Эта система нормально работает, рассмотрим следующий код (написанный как пример, а не из программы):

virtual bool compare(void *fn2) {
  void (*fn)(int);

  if(fn==fn2)
     return true;
}

Однако, когда учитываются функции класса, тот же метод не работает.

virtual bool compare(void *fn2) {
  void(__thiscall myclass::*fn)(int);
  void *fn2;

  if(fn==fn2)  //error C2440 type cast: cannot convert void* to void(__thiscall...
     return true;
}

Эти функции переопределяют чисто виртуальную функцию общего базового класса, подобную следующей:

virtual bool compare(void*) = 0;

Поскольку я не могу использовать шаблон <> в виртуальных функциях, у меня нет выбора. Есть ли способ (во всяком случае) объединить функции класса и обычные функции?

Спасибо заранее, Cem

Ответы [ 2 ]

5 голосов
/ 31 октября 2010

Posix требует умения конвертировать указатели функций в void*.Стандарт C ++ не поддерживает его.

Указатели на функции-члены не являются в обычном смысле указателями, они больше похожи на смещения (даже для не виртуальной функции-члена).

Обе реализации выshow for compare будет иметь неопределенное поведение, даже если сравнение и приведение были действительными, потому что они ничего не возвращают в случае, когда указатели не сравниваются одинаково.Вместо if(blah == bag){ return true; } просто сделайте return (blah == bah);.

Проблемы связаны с отбрасыванием необходимой информации о типе.Это вообще не очень хорошая идея.Почему вы отбрасываете информацию о типе, которая вам нужна?

Решение: (1) не отбрасывайте необходимую информацию о типе, и (2) измените дизайн, чтобы избавиться от этого compare функция.Также обратите внимание на комментарий Роджера Пейта о том, что, похоже, вы спрашиваете о конкретной попытке решения, а не о проблеме.В чем проблема?

Приветствия & hth.,

2 голосов
/ 31 октября 2010

Это не работает, потому что указатели на функции-члены не могут быть преобразованы в обычные указатели - их размер не определен.В некоторых реализациях некоторых иерархий классов указатель на функцию-член может быть в пять раз больше обычного указателя.Как это будет работать со сравнением с void *?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...