Amerio.Stephane Posted March 27, 2023 Share Posted March 27, 2023 Hi, ConsoleVariable*::setSetFunc takes a void(*func)(type) but I can't find a way to assign a class member function. How would you do it? Similarly for the setGetFunc. Why didn't you use a CallbackBase here, or better a std::function object? Link to comment
silent Posted March 28, 2023 Share Posted March 28, 2023 Hi Stephane, Unfortunately, there is no easy way to do it. Spoiler #define VAR_OBJ_SET(VAR_NAME, VAR_TYPE, ARG_TYPE, OBJ_TYPE) \ template<typename T> \ struct VAR_NAME##_setter \ { \ VAR_NAME##_setter() = delete; \ VAR_NAME##_setter(const VAR_NAME##_setter&) = delete; \ VAR_NAME##_setter(ConsoleVariable##VAR_TYPE &var) \ { \ var.setSetFunc(internal_set); \ } \ void set(T *obj, void(T:: *set_func)(ARG_TYPE value)) \ { \ obj_ptr = obj; \ set_func_ptr = set_func; \ } \ private: \ static void internal_set(ARG_TYPE value) \ { \ if (obj_ptr != nullptr && set_func_ptr != nullptr) \ (*obj_ptr.*set_func_ptr)(value); \ } \ static T *obj_ptr; \ static void(T:: *set_func_ptr)(ARG_TYPE value); \ }; \ template<typename T> \ T *VAR_NAME##_setter<T>::obj_ptr; \ template<typename T> \ void(T:: *VAR_NAME##_setter<T>::set_func_ptr)(ARG_TYPE value);\ VAR_NAME##_setter<OBJ_TYPE> VAR_NAME##_set(VAR_NAME); \ #define VAR_OBJ_GET(VAR_NAME, VAR_TYPE, ARG_TYPE, OBJ_TYPE) \ template<typename T> \ struct VAR_NAME##_getter \ { \ VAR_NAME##_getter() = delete; \ VAR_NAME##_getter(const VAR_NAME##_getter&) = delete; \ VAR_NAME##_getter(ConsoleVariable##VAR_TYPE &var) \ { \ var.setGetFunc(internal_get); \ } \ void set(T *obj, ARG_TYPE(T:: *get_func)()) \ { \ obj_ptr = obj; \ get_func_ptr = get_func; \ } \ private: \ static ARG_TYPE internal_get() \ { \ if (obj_ptr != nullptr && get_func_ptr != nullptr) \ return (*obj_ptr.*get_func_ptr)(); \ return ARG_TYPE(); \ } \ static T *obj_ptr; \ static ARG_TYPE(T:: *get_func_ptr)(); \ }; \ template<typename T> \ T *VAR_NAME##_getter<T>::obj_ptr; \ template<typename T> \ ARG_TYPE(T:: *VAR_NAME##_getter<T>::get_func_ptr)();\ VAR_NAME##_getter<OBJ_TYPE> VAR_NAME##_get(VAR_NAME); \ ConsoleVariableInt a_variable("a_variable", "A Variable", 0, 0, 0, 1); VAR_OBJ_SET(a_variable, Int, int, ObjectA); VAR_OBJ_GET(a_variable, Int, int, ObjectA); ObjectA a_obj; int AppSystemLogic::init() { a_variable_set.set(&a_obj, &ObjectA::setFuncA); a_variable_get.set(&a_obj, &ObjectA::getFuncA); return 1; } 1 How to submit a good bug report --- FTP server for test scenes and user uploads: ftp://files.unigine.com user: upload password: 6xYkd6vLYWjpW6SN Link to comment
Amerio.Stephane Posted March 28, 2023 Author Share Posted March 28, 2023 Can we expect an API evolution so we could pass a callback as for the rest of the API? Link to comment
silent Posted March 28, 2023 Share Posted March 28, 2023 Right now (2.17.x-2.18.x) no changes to console variables are planned, maybe in the distant future. How to submit a good bug report --- FTP server for test scenes and user uploads: ftp://files.unigine.com user: upload password: 6xYkd6vLYWjpW6SN Link to comment
Recommended Posts