簡體   English   中英

C ++ 11中函數指針向量的初始化列表

[英]Initialization list for vector of function pointers in c++11

我正在嘗試使用函數指針表來整理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個不同的動作都綁定到不同的函數,並且我必須定義一個shift函數才能到達每一行。

我正在嘗試使用C ++ 11的初始化功能來完成所有這些工作,因此它是在編譯時而不是在運行時完成的。

是否可以創建宏或執行類似以下內容的操作:

vector<function<token* ()> > S;
for(int i = 0; i < 60; i++){
  function<token* ()> S[i] = bind(S, i);
}

這樣之后我就可以引用S[3]或其他任何東西,它還給我適當綁定的函數指針?

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM