2013-03-07 112 views
1

我試圖使用函數指針表編碼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

回答

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