pointer to const member function typedef
Solution 1
You want this:
typedef void (K::*MemFuncType)() const;
If you want to still base MemFuncType
on FuncType
, you need to change FuncType
:
typedef void FuncType() const;
typedef FuncType K::* MemFuncType;
Solution 2
A slight refinement showing how to do it without a typedef. In a deduced context like the following, you can't use a typedef.
template <typename Class, typename Field>
Field extract_field(const Class& obj, Field (Class::*getter)() const)
{
return (obj.*getter)();
}
applied to some class with a const getter:
class Foo {
public:
int get_int() const;
};
Foo obj;
int sz = extract_field(obj, &Foo::get_int);
Solution 3
Another more direct way to do it (avoiding using
and typedef
s) is this:
#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
is a const method pointer to Object
.
Admin
Updated on July 13, 2022Comments
-
Admin almost 2 years
I know it's possible to separate to create a pointer to member function like this
struct K { void func() {} }; typedef void FuncType(); typedef FuncType K::* MemFuncType; MemFuncType pF = &K::func;
Is there similar way to construct a pointer to a const function? I've tried adding const in various places with no success. I've played around with gcc some and if you do template deduction on something like
template <typename Sig, typename Klass> void deduce(Sig Klass::*);
It will show Sig with as a function signature with const just tacked on the end. If to do this in code it will complain that you can't have qualifiers on a function type. Seems like it should be possible somehow because the deduction works.
-
Admin almost 14 yearsYes you are right it works! I thought I tried this second one, but guess not, that was another machine though maybe old compiler. Will have to check again tomorrow.