在C++中构建一个模板函数的调用表

uek*_*rom 4 c++ templates

我有一个模板函数,其中template参数是一个整数.在我的程序中,我需要使用在运行时确定的小整数来调用该函数.我可以手工制作一张桌子,例如:

void (*f_table[3])(void) = {f<0>,f<1>,f<2>};
Run Code Online (Sandbox Code Playgroud)

并调用我的函数

f_table[i]();
Run Code Online (Sandbox Code Playgroud)

现在,问题是是否有一些自动方式将此表构建为任意顺序.我能想到的最好的就是使用宏

#define TEMPLATE_TAB(n) {n<0>,n<1>,n<2>}
Run Code Online (Sandbox Code Playgroud)

这至少可以避免一遍又一遍地重复功能名称(我的实际功能比"f"具有更长的名称).但是,允许的最大订单仍然是硬编码的.理想情况下,表大小应仅由代码中的单个参数确定.是否可以使用模板解决此问题?

xto*_*ofl 6

它可以通过'递归'调度来完成:模板函数可以检查它的运行时参数是否与它的模板参数匹配,并使用模板参数返回目标函数.

#include <iostream>
template< int i > int tdispatch() { return i; }

// metaprogramming to generate runtime dispatcher of 
// required size:
template< int i > int r_dispatch( int ai ) {
    if( ai == i ) {
      return tdispatch< i > ();
    } else {
      return r_dispatch< i-1 >( ai );
    }
}
template<> int r_dispatch<-1>( int ){ return -1; }

// non-metaprogramming wrapper
int dispatch( int i ) { return r_dispatch<100>(i); }

int main() {
   std::cout << dispatch( 10 );
   return 0;
}
Run Code Online (Sandbox Code Playgroud)