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

问题描述:

我试图使用函数指针表编码DFA。C++函数指针向量的初始化列表11

该表由函数指针填充,以便输出某些东西或移动到表中的另一个状态,全部基于该机器接收的输入。

现在我所能做的就是

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

你有没有考虑升压元状态机器在http://www.boost.org/doc/libs/1_53_0/libs/msm/doc/HTML/index.html – 2013-03-07 21:47:35

+0

我从来没有听说过。我将在今晚晚些时候看看它。谢谢你的链接! – Veaviticus 2013-03-07 22:21:20

+1

“更快”是什么意思?更快写入?更快执行?另外,只要你使用'std :: function',你就不能在编译时进行初始化。 – bames53 2013-03-07 22:39:48

使用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)};