c++11中函数指针向量的初始化列表

Initialization list for vector of function pointers in c++11

本文关键字:初始化 列表 向量 指针 函数 c++11      更新时间:2023-10-16

我正在尝试使用函数指针表编写DFA。

表由函数指针填充,这些函数指向表中输出内容或移动到另一个状态的函数,所有这些都基于机器接收到的输入。

现在我能做的是

function<token* ()> A1 = bind(A, &data);
function<token* ()> A2 = bind(B, &data);
function<token* ()> S1 = bind(S, 1);
function<token* ()> S2 = bind(S, 2);
vector< function<token* ()> > _table = { A1, A2, S1, S2 };

创建一个2x2的"表",其中[0][0]执行操作A1,[0][1]执行操作A2,[1][0]移动到第1行,[1][1]移动到第2行…等等。

我的问题是,在c++11中,是否有更快的方法来做到这一点?我的状态表已经增长到60x150,我有50个不同的操作都绑定到不同的函数,我必须定义一个移位函数来访问每一行。

我试图在c++ 11的初始化功能中完成这一切,因此它是在编译时而不是在运行时完成的。

是否可以创建一个宏或执行如下操作:

vector<function<token* ()> > S;
for(int i = 0; i < 60; i++){
  function<token* ()> S[i] = bind(S, i);
}

之后,我可以引用S[3]或其他什么,它给了我适当的绑定函数指针?

使用Boost预处理器您可以轻松地制作一些:

例如:

#include <vector>
#include <functional>
#include <boost/preprocessor/repetition.hpp>
#include <boost/preprocessor/punctuation/comma_if.hpp>
struct token{};
token* S(int){return new token;}
#define MAKE_FUNCT(z, n, unused)         
BOOST_PP_COMMA_IF(n)                     
std::bind(S, n)                          
int main()
{
   std::vector<std::function<token* ()>> table = 
                  {BOOST_PP_REPEAT(10, MAKE_FUNCT, ~)};
}

这里是一个例子,传递-E标志我得到:

std::vector<std::function<token* ()>> table = { std::bind(S, 0) , std::bind(S, 1) , std::bind(S, 2) , std::bind(S, 3) , std::bind(S, 4) , std::bind(S, 5) , std::bind(S, 6) , std::bind(S, 7) , std::bind(S, 8) , std::bind(S, 9)};