Как передать указатель на функцию-член перегруженному методу в шаблонной функции? - PullRequest
2 голосов
/ 17 июня 2011

Я ссылался на этот несколько похожий вопрос .Однако здесь сценарий другой:

struct A
{
  void foo (int i) {} // choice
  void foo (double i) {}
};

template<typename ObjType, typename FuncPtr>
void ReceiveFuncPtr (ObjType o, FuncPtr pf)
{
 (o.*pf)(1);
}

int main ()
{
  A obj;
  ReceiveFuncPtr(obj, &A::foo); // don't want typecast here
}

В приведенном выше тестовом коде у меня перегружено foo внутри A.Если бы был только 1 foo, то код работает нормально.Но в случае перегрузки компилятор выдает следующее сообщение:

ошибка: отсутствует функция сопоставления для вызова `ReceiveFuncPtr (A &, [неразрешенный тип перегруженной функции]) '

вместоявное приведение типов при вызове ReceiveFuncPtr(), есть ли способ внести некоторые изменения в его параметр template и разрешить ему всегда получать версию foo(int) для любого аналогичного class A?

Edit : Идея заключается в , чтобы не беспокоиться о типе при вызове функции.Это должно быть так же просто, как, ReceiveFuncPtr(obj, &A::foo); И пусть template сделает свою работу.

Ответы [ 2 ]

4 голосов
/ 17 июня 2011

как насчет этого:

template<typename ObjType>
void ReceiveFuncPtr (ObjType o, void (ObjType::*pf)(int))
{
 (o.*pf)(1);
}
4 голосов
/ 17 июня 2011

Вы можете написать шаблон функции как:

template<typename ObjType>
void ReceiveFuncPtr (ObjType o, void (ObjType::*pf)(int) )
{
   (o.*pf)(1);
}

Этот шаблон функции автоматически выберет void foo (int i).


Мой предыдущий ответ (не удаляя его, поскольку это может быть полезно для других) :

Ваша проблема:

ReceiveFuncPtr(obj, &A::foo); // don't want typecast here

Вы можете сделать это:

void (A::*pFun)(int) = &A::foo; // No casting here!
ReceiveFuncPtr(obj, pFun);      // No casting here!

pFun - указатель на void A::f(int)


Вы также можете использовать typedef как:

typedef void (A::*FunDouble)(double);
typedef void (A::*FunInt)(int);

FunInt pFun  = &A::foo;    // No casting here!
ReceiveFuncPtr(obj, pFun); // No casting here!
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...