Przekazanie nazwy metody jako parametr szablonu

0

Witam,
w jaki sposób mogę przekazać metodę, która zajmuje się obsługą wejścia z klawiatury? Wiem, że nie wyraziłem się jasno dlatego pokażę na przykładzie o co mi chodzi.

class Demo
{
	void init();
	void input(GLFWwindow *win,int k,int s,int a,int m){}
};

void Demo::init()
{
	//zamiast wywołania 'key_input' chcę by wywołana została metoda 'input' zdefiniowana przez użytkownika 
	bindKeyboard(this,input,window);
}
template<class T>
void bindKeyboard(T* app, GLFWwindow *win )
{
	glfwSetWindowUserPointer(win,app);
	auto func = [](GLFWwindow *w,int k,int s,int a,int m)
	{
		static_cast<T*>(glfwGetWindowUserPointer(w))->key_input(w,k,s,a,m);
	};
	glfwSetKeyCallback(win, func);
}
0

Dobrze kombinujesz, chociaż nie do końca jasne jest co chcesz osiągnąć.

  1. GLFwindow powinien być stworzony najlepiej w konstruktorze (lub funkcji inicjalizującej) - tam przypisujesz this do tego obiektu za pomocą funkcji glfwSetWindowUserPointer. Tam też przypisujesz wszystkie callbacki do utworzonego obiektu.
  2. W klasie Demo stwórz metodę statyczną, prywatną która odpowiada sygnaturze parametru glfwSetKeyCallback
  3. W tej metodzie statycznej weź user pointer, i wykonaj metodę publiczną która będzie twoją implementacją tak jak chciałeś.
  4. Funkcja bindKeyboard nie jest potrzebna.
2

Nie do końca rozumiem problem. Wygląda jak zadanie dla wskaźnika na funkcję lub std::function<>.

0

Przykład z tej strony idealnie przedstawia to co chcę osiągnąć http://cegui.org.uk/wiki/CEGUI_In_Practice_-_A_push_button a konkretnie ten fragment.

 gJumpBtnWindow->subscribeEvent(/**/,CEGUI::Event::Subscriber(&OurPlayer::Jump,this));
1

W glut'cie:

#pragma once
#include <functional>

namespace scaffolding {
    namespace input {
        enum state: bool { down, up };
        using keyboard_func = std::function<void(char, state)>;

        void setup(keyboard_func f);
    }
}
#include "input.hpp"
#include "GL/freeglut.h"

scaffolding::input::keyboard_func global_keyboard_func = nullptr;

void scaffolding::input::setup(keyboard_func f) {
    global_keyboard_func = f;

    glutKeyboardFunc([](unsigned char c, int, int) {
        global_keyboard_func(static_cast<char>(c), state::down);
    });

    glutKeyboardUpFunc([](unsigned char c, int, int) {
        global_keyboard_func(static_cast<char>(c), state::up);
    });
}
struct application {
    void on_key_event(char c, scaffolding::input::state button_state) {
        //...
    }
};
int main(int argc, char **argv) {
    using namespace scaffolding;

    opengl::setup(argc, argv, 640, 480, "hello world");

    application app {};

    input::setup([&app](char c, input::state state) { 
        app.on_key_event(c, state); 
    });

    opengl::run();

    return 0;
}

1 użytkowników online, w tym zalogowanych: 0, gości: 1