2014-06-24 101 views
0

可以說我有長度的MPL序列typesN
(例如boost::variant<int,string,double>和類型boost::variant::types序列):MPL序列和遞歸代碼生成

我想遞歸地產生用於每一個可能的索引下面的代碼。 正是通過if語句運行,直到w==N

void make(int w){ 

    if(w == 0){ 
     typename boost::mpl::at_c<types,0>::type t; 
     // Some code 
    }else if (w==1){ 
     typename boost::mpl::at_c<types,1>::type t; 
     // Some code 
    }... 
    . 
    . 
    . 
    }else if(w==N){ 
     typename boost::mpl::at_c<types,2>::type t; 
     // Some code 
    }else{ 
     // Runtime ERROR 
    } 
} 

我怎樣才能做到這一點?

回答

1

作爲一般的經驗法則,由於您試圖在編譯時執行某些操作,因此遞歸也是編譯時間。這立即意味着你需要一個實現遞歸和停止條件的靜態(類型)函數。

如果要實現類似於您的僞代碼顯示的代碼,可以使用Boost Fusion,其中包含模仿熟悉的運行時算法的算法,如boost::fusion::for_each

Fusion還具有可能適合您的用例的關聯集合(boost::fusion::map<...>)。

+0

(發佈這個已經是時間不夠了,我可能會找點時間來詳細說明一下例子) – sehe

+0

那真的很有幫助! – Gabriel

0
template <int N>                                               
void make(int w)                                               
{                                                   
    if(w>N)                                                 
    {                                                  
    make<-1>(w);                                              
    }                                                  
    if(w==N)                                                 
    {                                                  
    typename boost::mpl::at_c<types, N>::type t;                                      
    // Some code                                            
    }                                                  
    else                                                  
    make<N-1>(w);                                               
}                                                   

template <>                                                
void make<-1>(int w)                                              
{                                                   
    // Runtime ERROR                           
} 

編輯:納入sehe的評論。

+1

你可以通過調用'make <-1>(0)'來刪除重複,如果'(w> N) – sehe