2013-03-07 3 views
1

함수 포인터 테이블을 사용하여 DFA를 성문화하려고합니다.함수 포인터 벡터 벡터에 대한 초기화 목록 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 }; 

는 2 × 2 [1] 작업 A2를 수행 [0] [0] [0] 액션 A1을 수행 "표"를, 만들려면 [1] 0]은 행 1로 이동하고, [1] [1]은 행 2로 이동합니다.

제 질문은 C++ 11에서 더 빠른 방법이 있습니까? 내 상태 테이블은 60x150으로 늘어 났으며, 50 개의 다른 액션이 모두 서로 다른 함수에 묶여 있으며, 각 행에 도달하기 위해서는 시프트 함수를 정의해야합니다.

이 모든 것을 C++ 11의 초기화 기능에서 수행하려고하므로 런타임이 아닌 컴파일 타임에 완료됩니다.

는 같은 것을 수행하는 매크로 나 뭔가 만들 수 있습니다 : 그래서 그 후 나는 S[3] 또는 무엇이든을 참조 할 수 있습니다

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

을 그리고 그것은 적절하게 결합 된 함수 포인터를 나에게 다시 제공?

+1

은 당신이 부스트 메타 상태를 생각 해 봤나 machine at http://www.boost.org/doc/libs/1_53_0/libs/msm/doc/HTML/index.html –

+0

전에 들어 본 적이 없었습니다. 나는 오늘 밤 나중에 그것을 들여다 볼 것이다. 링크 주셔서 감사합니다! – Veaviticus

+1

'빠름'이란 무엇을 의미합니까? 쓰기가 더 빠릅니까? 실행 속도는 더 빠릅니까? 또한'std :: function'을 사용하는 한 컴파일 타임에 초기화를 수행 할 수 없습니다. – bames53

답변

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