В настоящее время в игре, над которой я работаю, у меня есть класс окна:
class UserWindow{
*interface here*
};
Я приложил большие усилия, чтобы не раскрывать детали реализации этого окна; в частности, тот факт, что он использует GLFW под капотом. Я не хочу раскрывать какой-либо GLFW клиенту в ситуации, когда я в конечном итоге удалю/заменю его позже. Все хорошо, пока я, наконец, не добрался до обработки клавиш для окна. Видите ли, GLFW использует макросы для идентификации ключей, как показано здесь:
auto GLFWKeyPressCallback(GLFWwindow* wind, int key, int, int, int) -> void {
if(key == GLFW_KEY_???)
*do stuff*
}
Как известно большинству программистов на C++, макросы токсичны, и их следует избегать. Проблема здесь в том, что я предоставляю пользователю интерфейс UserWindowEventListener для подключения и получения событий. Вопрос в том, как я могу раскрыть идентификаторы для этих ключей GLFW, не раскрывая весь API GLFW? Поскольку GLFW использует вышеупомянутые (злые) макросы для их идентификации, они будут просачиваться в глобальное пространство имен, что разрушает идею наличия «внутреннего» пространства имен. Единственным другим решением, о котором я подумал, было иметь простую старую структуру, содержащую статические целые числа для каждого ключа, и назначать их в файле .cpp, например так:
.hpp:
struct UserWindowKey{
static const int up, down, left, right... (repeat ad nauseam)
};
.cpp:
const int UserWindowKey::up = GLFW_KEY_UP...
Однако это кажется утомительным, неуправляемым и, как правило, вообще похоже на плохую практику. Любые идеи?
изменить: некоторые детали реализации в псевдокоде, чтобы устранить любые неясности:
Окно пользователя:
//constructor
UserWindow(){
//key_func just fires the signal that's in the event handler below.
glfwSetKeyCallback(window_handle, key_func);
}
Слушатель UserWindowEventListener:
struct UserWindowEventListener{
key_signal_type key_signal;
};
использование:
auto main() -> int {
UserWindow wind;
wind.event_listener.key_signal.connect(*MY_FUNC*);
wind.event_listener.poll();
}
wind.event_listener.key_signal.connect
, он принимает функцию в качестве параметра. Я предполагаю, что эта функция создана и предоставлена пользователем. Я также предполагаю, что вы хотите, чтобы функция вызывалась, когда GLFW запускает событие нажатия клавиши? Кроме того, правильно ли я понимаю, что подпись этой функции (MY_FUNC) должна содержать информацию о том, какая клавиша была нажата, чтобы пользователь мог включить ее, но вы хотите, чтобы они могли сделать это, не зная ничего о GLFW? - person Micah Zoltu   schedule 04.07.2014GLFW_KEY_
и конвертируя в нижний регистр). - person Tony Delroy   schedule 04.07.2014