указатель на функцию-член const typedef - PullRequest
21 голосов
/ 16 июня 2010

Я знаю, что можно разделить создание указателя на функцию-член, например:

struct K { void func() {} };
typedef void FuncType();
typedef FuncType K::* MemFuncType;
MemFuncType pF = &K::func;

Существует ли аналогичный способ создания указателя на функцию const?Я пытался добавить const в разных местах безуспешно.Я немного поигрался с gcc, и если вы сделаете вывод шаблона на чем-то вроде

template <typename Sig, typename Klass>
void deduce(Sig Klass::*);

, он покажет Sig с сигнатурой функции с константой, только что прикрепленной в конце.Если сделать это в коде, он будет жаловаться, что вы не можете иметь классификаторы для типа функции.Кажется, это должно быть как-то возможно, потому что вычет работает.

Ответы [ 2 ]

33 голосов
/ 16 июня 2010

Вы хотите это:

typedef void (K::*MemFuncType)() const;

Если вы хотите использовать MemFuncType на FuncType, вам нужно изменить FuncType:

typedef void FuncType() const;
typedef FuncType K::* MemFuncType;
8 голосов
/ 25 февраля 2012

Небольшое уточнение, показывающее, как это сделать без typedef.В выведенном контексте, подобном следующему, вы не можете использовать typedef.

template <typename Class, typename Field>
Field extract_field(const Class& obj, Field (Class::*getter)() const)
{
   return (obj.*getter)();
}

, примененный к некоторому классу с использованием метода get const:

class Foo {
 public:
  int get_int() const;
};

Foo obj;
int sz = extract_field(obj, &Foo::get_int);
...