【发布时间】:2014-10-08 17:35:39
【问题描述】:
假设我有以下核心类:
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); void handle(double par); void handle(foo_class par);重载的头文件?恐怕我不太明白您的要求和目标是什么。 -
正如上面的 dyp 所说,没有理由让这个奇怪的工厂从类型映射到功能。你可以根据调用类型做函数重载,它会做你想做的一切。
标签: c++ templates c++11 compile-time