Ответ 1
Вы хотите:
typedef void (K::*MemFuncType)() const;
Если вы хотите по-прежнему основывать MemFuncType
на FuncType
, вам нужно изменить FuncType
:
typedef void FuncType() const;
typedef FuncType K::* MemFuncType;
Я знаю, что можно разделить, чтобы создать указатель на функцию-член, подобную этой
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 как функцию подписи с константой, только что вставленной в конец. Если сделать это в коде, он будет жаловаться, что вы не можете иметь квалификаторы для типа функции. Похоже, это должно быть возможно как-то потому, что дедукция работает.
Вы хотите:
typedef void (K::*MemFuncType)() const;
Если вы хотите по-прежнему основывать MemFuncType
на FuncType
, вам нужно изменить FuncType
:
typedef void FuncType() const;
typedef FuncType K::* MemFuncType;
Небольшое уточнение, показывающее, как это сделать без 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);
Другой более прямой способ сделать это (избегая 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
.