Обновление : Вы сказали нам, что вы хотите. Я нашел этот вопрос здесь на SO: Лучший метод для хранения этого указателя для использования в WndProc . Я не программист Windows, но парень Адам Розенфилд, кажется, прав в использовании SetWindowLongPtr и GetWindowLongPtr. Итак, вы используете это так:
LRESULT CALLBACK my_callback(HWND hwnd, UINT ui, WPARAM wp, LPARAM lp) {
Window * self = reinterpret_cast<Window*>(
GetWindowLongPtr(hwnd, 0));
return self->update(hwnd, ui, wp, lp); // handle it.
}
Зарегистрируйте эту функцию как wnd-proc и сохраните указатель this
вашего объекта Window, используя SetWindowLongPtr. В структуре WNDCLASSEX
есть поле cbWndExtra
, которому вы назначаете sizeof(Window*)
, что достаточно для хранения указателя this. Тогда вы можете позвонить
SetWindowLongPtr(my_hwnd, 0, reinterpret_cast<LONG_PTR>(this));
чтобы поместить указатель this в этот регион. Затем получите его, как указано выше, и передайте реальную функцию-член. Теоретически вы также можете использовать статическую функцию-член. Но вы должны быть осторожны. Вызов статической функции-члена из кода C может привести к ошибкам, потому что соглашение о вызовах может отличаться для кода C и кода C ++. Для Windows это может не быть проблемой - я не знаю. Так что лучше проверь себя дополнительно.
То, что вы пытаетесь, недопустимо. Вы пытаетесь вернуть указатель на оператор вызова функции, но при вызове объект не предоставляется, кроме того, что ваш оператор преобразования имеет неправильный тип. Тип, который возвращает оператор преобразования, имеет тип указателя на функцию, но не тип указателя на функцию-член. Самое близкое, что вы можете получить, это использовать правильный тип:
struct adder;
typedef int (adder::*int_to_int)(int);
struct adder {
int n_;
adder (int n) : n_(n) {}
int operator() (int x) { return x + n_; }
operator int_to_int () {
return &adder::operator();
}
};
Теперь ваш оператор преобразования даже не рассматривается, потому что он должен называться так:
adder a(10); cout << (a.*(int_to_int)a)(2); // expected: 12
И вручную вот так:
// note, we just get the member function pointer using the conversion operator.
// Nothing is related to the actual temporary adder object.
int_to_int i = adder(5);
cout << (adder(10).*i)(2); // expected: 12
Обычный синтаксис вызова функции не справляется с этим. Короче, то, что вы пытаетесь, невозможно.
Я думаю, что другой вопрос, почему, черт возьми, ты хочешь это сделать? Я думаю, что мы можем помочь вам лучше, когда узнаем, в чем заключается изначальная проблема Если вы пытаетесь заставить его выглядеть и работать как вызов функции, вам вообще не нужны операторы преобразования:
struct adder {
int n_;
adder (int n) : n_(n) {}
int operator() (int x) { return x + n_; }
};
adder a(10); cout << a(2); // expected: 12