我正在尝试使用函数指针表编写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]
或者其他什么它会让我回到适当绑定的函数指针?
答案 0 :(得分: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, ~)};
}
这是一个example,传递了-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)};