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

时间:2013-03-07 21:20:18

标签: c++ c++11 initialization function-pointers

我正在尝试使用函数指针表编写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]或者其他什么它会让我回到适当绑定的函数指针?

1 个答案:

答案 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)};