Get address of const method
c++, decltype, function-pointers, function-qualifier, pointer-to-member
Solution
You can do it like this:
struct A
{
void method() {
cout << "Non const\n";
}
void method() const {
cout << "const function\n";
}
};
int main()
{
typedef void (A::*method_const)() const;
method_const a = &A::method; //address of const method
typedef void (A::*method_nonconst)();
method_nonconst b = &A::method; //address of non const method
A var;
std::invoke(a, var);
std::invoke(b, var);
}
If you want to use `decltype()` to achieve the same thing, you first have to manually select the function you want using `static_cast<>`:
int main()
{
//const
decltype( static_cast <void (A::*)() const> (&A::method) ) a;
//non const
decltype( static_cast <void (A::*)()> (&A::method) ) b;
a = &A::method;
b = &A::method;
A var;
std::invoke(a, var);
std::invoke(b, var);
}
Live on Coliru
Problem
I would like to be able to form a pointer-to-member type knowing only the class itself and method name. Unfortunately I am not able to do so having a const and non-const method variants in my class. Example code snippet: ``` struct A { void method() {} void method() const {} }; int main() { decltype(&A::method) _; } ``` I have also tried the following this but without much success either: ``` decltype(&(std::declval<const A>().method)) _; ``` Both approaches fail as `decltype` cannot resolve this due to ambiguity: `'decltype cannot resolve address of overloaded function'` How can I achieve this in some other way?