Jump to content

ConsoleVariable*::setSetFunc prototype


photo

Recommended Posts

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

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;
}

 

 

  • Like 1

How to submit a good bug report
---
FTP server for test scenes and user uploads:

Link to comment
×
×
  • Create New...