假设我有以下核心类:链接到在编译时动态地可用的功能
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的源,甚至不必再次触摸它们。
为什么你不能定义一个有很多'void handle(int par)的头文件;无效句柄(double par); void handle(foo_class par);'重载?恐怕我不太明白你的要求和目标是什么。 – dyp 2014-10-08 21:58:54
作为上面的注释,没有理由有这个奇怪的工厂,从类型映射到功能。你可以根据呼叫类型做功能重载,它会做你想做的一切。 – 2014-10-08 22:09:07