【发布时间】:2016-12-19 06:32:28
【问题描述】:
假设我们有
template <unsigned N> foo() { /* ... */ }
定义。现在,我要实现
do_foo(unsigned n);
调用foo() 的相应变体。这不仅仅是一个综合的例子——这确实发生在现实生活中(当然,不一定有 void-to-void 函数和一个模板参数,但我正在简化。当然,在 C++ 中,我们不能有以下几点:
do_foo(unsigned n) { foo<n>(); }
而我现在做的是
do_foo(unsigned n) {
switch(n) {
case n_1: foo<n_1>(); break;
case n_2: foo<n_2>(); break;
/* ... */
case n_k: foo<n_k>(); break;
}
}
当我知道 n 有效地限制在 n_1,...,n_k 的范围内时。但这很不合时宜,当调用时间较长并且我需要多次复制一长串模板和常规参数时更是如此。
我正要开始编写一个宏来生成这些 switch 语句,这时我想也许有人已经在某个库中进行了此工作并且可以分享他们所做的。如果不是,也许仍然可以使用某种 C++ 构造,该构造采用任意函数,具有任何模板和非模板参数序列,包括一些数字模板参数,以及某种形式的值序列,以生成包装器可以将该模板参数作为附加的运行时参数,例如
auto& transformed_foo = magic<decltype(foo)>(foo)::transformed;
【问题讨论】:
标签: c++ templates reflection idioms