在编译时链接到动态可用的函数

时间:2014-10-08 17:35:39

标签: c++ templates c++11 compile-time

假设我有以下核心类:

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的来源,甚至不必再次触摸它们。

1 个答案:

答案 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)

使用此功能,您无需触摸核心类甚至包含核心类的文件。您可以在其他文件中定义句柄功能,但要注意句柄功能的可见性模式。您的句柄功能将自行注册,然后接受可以调用已注册的功能。