2013-10-04 84 views
-2

我有一些功能,執行復雜的圖紙。 [僞代碼]變量模板循環,非遞歸

template<typename fields...>  // field names of Brush class 
void someFunction(){  
    for(very large loop){ 

    Brush brush = getBrush(); 
    int x; 

    foreach(field : fields){  // <--- this somehow should be replaced 
     x = brush.*field; 
     brush.update(x); 
    } 

    }  
} 

[清單1]

我把它叫做:

someFunction<&Brush::xPos1, &Brush::xPos2, &Brush::xPos3, &Brush::xPos4>() 

而且我想編譯器生成這樣的事情:

void someFunction(){  
    for(very large loop){ 

    Brush brush = getBrush(); 
    int x; 

     x = brush.xPos1; 
     brush.update(x); 

     x = brush.xPos2; 
     brush.update(x); 

     x = brush.xPos3; 
     brush.update(x); 

     x = brush.xPos4; 
     brush.update(x); 

    }  
} 

[上市2 ]

I mea ñ,我想擺脫那個foreach(領域:領域)。


我發現這個可變模板循環實現,但它是遞歸的。出於性能resons這甚至比foreach循環最差

int a; 

template <class T> 
void print(const T msg) 
{ 
    a = msg; 
} 


// And this is the recursive case: 
template <class A, class... B> 
void print(A head, B... tail) 
{ 
    a = head; 
    print(head); 
    print(tail...); 
} 

[上市3]


所以,問題是....是有可能可能才達到的結果在[清單2]?如果是,比如何?

+1

'fields'可變參數組是一組類型,你傳遞指針 – Manu343726

+0

圍棋,瞭解多態性而不是他們不dessigned一種方式使用功能(根本沒有意義)。 – Manu343726

+1

我希望編譯器展開一個4迭代循環。 – jrok

回答

3

我沒有看到這樣做的真正意義。編譯器應該將for循環和遞歸模板都優化爲相同的代碼。在任何情況下,這樣的事情應該工作:

struct Brush { 
    int xPos1, xPos2, xPos3, xPos4; 
    void update(int) {} 
}; 

typedef int Brush::* Field; 

template<Field...fs> 
void Foo() 
{ 
    Brush brush; 
    int a[] = { (brush.update(brush.*fs),0)... }; 
} 

int main() 
{ 
    Foo<&Brush::xPos1, &Brush::xPos2, &Brush::xPos3, &Brush::xPos4>(); 
} 
+0

你知道,我只是意識到,我所有的profilings都處於-O0模式。你是對的 - 它優化了模板遞歸循環。 [鏈接](http://goo.gl/gGpeOa)感謝您指出。 – tower120

+0

哦不,不想優化它http://goo.gl/7T6g5c – tower120

+0

我知道關於int a [] = {fs ...}。但是我第一次看到這個語法。我可以在哪裏閱讀這個語法? int a [] = {(brush.update(brush。* fs),0)...};謝謝。 – tower120