[英]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.