1

我正在尝试使用函数指针表来编码 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]或其他任何东西,它会给我返回适当绑定的函数指针?

4

1 回答 1

1

使用Boost Preprocessor,您可以轻松地制作一些:

例如:

#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)};
于 2013-03-07T23:13:04.963 回答