2016-04-09 18 views
2

Ich habe dieses MakroC++ 11 Auto Transformation

#define DO_ALL_BLEND_INFO(iter) for (iter=s_blend_info.begin(); iter!=s_blend_info.end(); ++iter) 

Und das ist die Hauptfunktion ..

BLEND_ITEM_INFO* blend_info; 
T_BLEND_ITEM_INFO::iterator iter; 

DO_ALL_BLEND_INFO (iter) 
{ 
    blend_info = *iter; 
    if (blend_info->item_vnum == item->GetVnum()) 
    { 

    } 
} 

Was ich es loswerden dieses Makro und zu verwenden, tun wollen Auto. Aber ich kann nicht verstehen, wie man Auto hier benutzt ... Ich möchte dieses Makro entfernen, aber was, wenn ich Auto in Makro direkt hinzufüge?

Antwort

2

Die folgenden, und nichts anderes:

for (const auto &blend_info:s_blend_info) 
{ 
    if (blend_info->item_vnum == item->GetVnum()) 
    { 

    } 
} 

Und ich meine "nichts anderes", außer dass. Keine Makros, keine Deklaration irgendeiner Iteration. Keine Deklaration von blend_info, die Bereich Iteration macht es für Sie.

+0

Warum const? und warum & ? Ist das nicht genug? \t für (auto blend_info: s_blend_info) –

+2

Goldene Faustregel: Wenn Sie nicht beabsichtigen, etwas zu ändern, deklarieren Sie es explizit als const. Sie helfen dem Compiler, Ihren Code zu optimieren, und verhindern, dass Sie unbeabsichtigte Fehler machen. Und die Verwendung einer Referenz vermeidet eine redundante Kopie. Derselbe Grund, warum erfahrene C++ Programmierer 'void foo schreiben (const std :: vector & param);' anstelle von 'void foo (std :: vector param);' –

+0

Danke für die Erklärung @Sam Varshavchik –

1

Hier ist ein anderer Ansatz. Ich ändere zu Code und ersetze s_blend_info durch vector<int>, um eine kompilierbare Lösung zu erhalten.

int main() 
{ 
vector<int> s_blend_info; 
int blend_info; 
vector<int>::iterator iter; 
int item = 10; 
for (auto iter = s_blend_info.begin(); iter != s_blend_info.end(); ++iter) 
{ 
    blend_info = *iter; 
    if (blend_info == item) 
    { 

    } 
} 
for (auto &iter : s_blend_info) 
{ 
    if (blend_info == item) 
    { 

    } 
} 
DO_ALL_BLEND_INFO_GENERIC(s_blend_info, iter) 
{ 
    blend_info = *iter; 
    if (blend_info == item) 
    { 

    } 
} 
} 

#define DO_ALL_BLEND_INFO(iter) for (iter=s_blend_info.begin(); iter!=s_blend_info.end(); ++iter) 
#define DO_ALL_BLEND_INFO_GENERIC(container,iterator) for (iterator=container.begin(); iterator!=container.end(); ++iterator)