struct test
{
void f() {};
};
test t1;
using memfun_t = void (test::*)();
memfun_t mf = &test::f;
auto a1 = &test::f; // OK
auto a2 = t1.*mf; // error
auto a3 = &(t1.*mf); // still no luck
Любые идеи, почему это невозможно вывести? Я был бы признателен за ответы, ссылающиеся на Стандарт.авто не удается вывести?
Edit:
Я нашел расширение RAD Studio язык под названием __closure, который, как представляется, будет решение этой проблемы. 1 Вот код:
class base {
public:
void func(int x) {
};
};
typedef void(base::*pBaseMember)(int);
class derived : public base {
public:
void new_func(int i) {
};
};
int main(int argc, char * argv[]) {
derived derivedObject;
void(__closure * derivedClosure)(int);
// Get a pointer to the ‘new_func’ member.
// Note the closure is associated with the
// particular object, ‘derivedObject’.
derivedClosure = derivedObject.new_func;
derivedClosure(3); // Call ‘new_func’ through the closure.
return 0;
}
http://docwiki.embarcadero.com/RADStudio/Seattle/en/Closure
Ну вот и вопрос, не так ли? Почему он не может выводить указатель на функцию-член? – Lenz
@Lenz, это был бы вопрос, если 'mf' не был частью сообщения. –
@Lenz: он не может выводить указатель на функцию-член, потому что могут быть выведены только допустимые выражения, и это не является допустимым выражением. Почему это не действительное выражение? Потому что это правила функций-членов C++ и указатели-члены. –