c++ - 在 C++ 中构建模板函数的调用表

标签 c++ templates

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

void (*f_table[3])(void) = {f<0>,f<1>,f<2>};

并调用我的函数

f_table[i]();

现在,问题是是否有某种自动方法可以按任意顺序构建此表。我能想到的最好办法是使用宏

#define TEMPLATE_TAB(n) {n<0>,n<1>,n<2>}

这至少避免了一遍又一遍地重复函数名称(我的真实函数的名称比“f”长)。但是,最大允许顺序仍然是硬编码的。理想情况下,表的大小应该只由代码中的一个参数决定。有没有可能使用模板来解决这个问题?

最佳答案

这可以通过“递归”分派(dispatch)来完成:模板函数可以检查它的运行时参数是否匹配它的模板参数,并返回带有模板参数的目标函数。

#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;
}

关于c++ - 在 C++ 中构建模板函数的调用表,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1254116/

相关文章:

c++ - 如何在不等待外部程序退出的情况下运行它?

c++ - 无法推断模板参数 'N'

jquery - jQuery 模板中的条件运算符

c++ - 如何将 "normal"C++ 类转换为模板?

c++ - LoadLibrary 在 Win7 32 位上失败,在 Win XP 32 位上成功

c# - 如何在对话框打开时禁用拖放

c++ - 我是否正确理解指针? C++

C++ 快速百分位数计算

c++ - 将模板函数的范围限制在头文件中

C++ 调用显式模板构造函数