Подтвердить что ты не робот

Указатель на функцию const member typedef

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

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

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

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

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

4b9b3361

Ответ 1

Вы хотите:

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

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

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

Ответ 2

Небольшое уточнение, показывающее, как это сделать без 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);

Ответ 3

Другой более прямой способ сделать это (избегая using и typedef s) - это:

#include <iostream>

class Object
{
    int i_;
public:
    int j_;
    Object()
        : Object(0,0)
    {}
    Object(int i, int j)
        : i_(i),
        j_(j)
    {}

    void printIplusJplusArgConst(int arg) const
    {
        std::cout << i_ + j_ + arg << '\n';
    }
};

int main(void)
{
    void (Object::*mpc)(int) const = &Object::printIplusJplusArgConst;

    Object o{1,2};
    (o.*mpc)(3);    // prints 6

    return 0;
}

mpc - указатель на метод const для Object.