运行时值到类型的分发,具体的,这里就是`N` 到 `void foo<N>(myclass<N>&)`。
这里存在一个问题需要楼主表达清楚,对应类型的参数是如何构造出来的。
这里为作简化`void foo<N>()`
核心逻辑是做一次`int V`到`std::integral_constant<int, V>`的映射,再用 lambda 包装一下原本的`foo<N>`使得能用上推断出来的类型。
```cpp
#define DISPATCH(VALUE) \
case VALUE: \
return f(std::integral_constant<int, VALUE>{});
// trampline function
template <typename F>
auto dispatcher(F&& f, int value) {
switch(value) {
DISPATCH(0x1f0)
DISPATCH(0x1f1)
DISPATCH(0x1f2)
default:
throw std::runtime_error("Unregistered value");
}
}
void foo_wrapper(int num) {
dispatcher([](auto type){
constexpr auto v = decltype(type)::value;
foo<v>();
}, num);
}
```
这里,`dispatcher`是可以完全可以复用的。
[Demo](
https://godbolt.org/z/5TdevE4We)
剩下的就是手动`DISPATCH(N)`来注册你需要的值,也可以使用 BOOST_PP_REPEAT 来生成代码。
[Demo](
https://godbolt.org/z/1893bzEs8)
运行时的类型分发可以参考我的这篇博客,
https://nimrod.blog/posts/cpp-elegant-ways-to-map-runtime-values-to-types