2014-10-08 62 views
0

假设我有以下核心类:链接到在编译时动态地可用的功能

class Core { 
public: 
    template<typename T> 
    void accept(T object); 
} 

我现在希望能够写这样的方法:

void handle(int par); 

和地方注册它们期间链接/编译阶段并调用Core.accept(T)方法中某个类型名称注册的正确方法。例如,在以某种方式注册之后,呼叫 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); 
} 

这种方法有什么问题/确实存在更好的吗?

注意:我希望能够以可以将它们存储在只读标头/源文件中的方式提取类Core的源,甚至不必再次触摸它们。

+1

为什么你不能定义一个有很多'void handle(int par)的头文件;无效句柄(double par); void handle(foo_class par);'重载?恐怕我不太明白你的要求和目标是什么。 – dyp 2014-10-08 21:58:54

+0

作为上面的注释,没有理由有这个奇怪的工厂,从类型映射到功能。你可以根据呼叫类型做功能重载,它会做你想做的一切。 – 2014-10-08 22:09:07

回答

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) 

有了这个,你不必触碰你的核心类甚至是包含核心类的文件。您可以在其他文件中定义句柄功能,但是可以处理句柄功能的可见性模式。您的句柄功能将自行注册,然后接受可以调用注册的功能。

+0

这是编译时静态的吗?我怀疑。这是否适用于一次注册多个函数(因此不同的模板类型名称会调用不同的函数)?我看不到那个。随意给我一个惊喜。 – WorldSEnder 2014-10-08 18:45:31

+0

如果你希望它是编译时静态的,Core的代码没有办法“有效地”改变。我的意思是,你可以保持Core.h和Core.cpp一致,但Core.h必须包含一些文件,indirect.h,在添加新类型的句柄函数时必须对其进行修改。最终,我真正想说的是:当你添加新的句柄时,如果你想要编译时静态的话,你将需要重新编译Core.o ...这是完全不可避免的。 – 2014-10-08 22:12:17

相关问题