Przekazanie nazwy metody jako parametr szablonu

Odpowiedz Nowy wątek
2017-04-21 11:58
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);
}

Pozostało 580 znaków

2017-04-21 12:09
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.
edytowany 1x, ostatnio: Drajwer, 2017-04-21 12:10

Pozostało 580 znaków

2017-04-21 12:11
kq
2

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


Pozostało 580 znaków

2017-04-21 12:15
0

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

 gJumpBtnWindow->subscribeEvent(/**/,CEGUI::Event::Subscriber(&OurPlayer::Jump,this));
edytowany 1x, ostatnio: patryj1083, 2017-04-21 12:18

Pozostało 580 znaków

2017-04-21 12:58
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;
}
edytowany 2x, ostatnio: spartanPAGE, 2017-04-21 12:59

Pozostało 580 znaków

Odpowiedz
Liczba odpowiedzi na stronę

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