假设我有以下核心类:
class Core {
public:
template<typename T>
void accept(T object);
}
我现在希望能够编写这样的方法:
void handle(int par);
并在链接/编译阶段将其注册某处,并在Core.accept(T)
方法中调用为某些typename注册的正确方法。例如打电话
在Core.accept(5)
以某种方式注册后,5
会将handle(int)
移交给template<typename T>
void Core::accept(T par) {
// constexpr std::map<std::type_info, Function> type_func_mapping;
auto it = type_func_mapping.get(typeid(T)); // Should be constexpr
static_assert (it != type_func_mapping.end(), "No handler found for typename " + typeid(T).name())
auto function = *it; // Also constexpr
function(par);
}
函数。这样的事情(不是可编译的例子):
{{1}}
这种方法有什么问题/确实存在更好的方法吗?
注意:我希望能够以一种我可以将它们存储在只读标头/源文件中的方式提取类Core的来源,甚至不必再次触摸它们。
答案 0 :(得分:0)
您可以使用指向函数的指针来存储已注册的函数。
static void (*reg_func)(args);
static void register(void (*func)(args)){
reg_func = func;
}
//registration part
register(handle);
//function call inside accept,use can use some sanity checks also
reg_func(5 or whatever)
使用此功能,您无需触摸核心类甚至包含核心类的文件。您可以在其他文件中定义句柄功能,但要注意句柄功能的可见性模式。您的句柄功能将自行注册,然后接受可以调用已注册的功能。