2011-07-24 16 views
8

8 yıllık kodlama deneyimim var, ancak işlev tanımına parametre olarak [] numaralı operatörün geçtiğini hiç görmedim.Strange C++ sözdizimi

Örneğin, (bir açık kaynak projesinden) şu kodu: benim kodlama hayatı boyunca

bree::porder(m_root, [] (treenode* node) { delete node; }); 

, hep bir parametre olarak, bir operatör overloader olarak [] tanımladık.

Peki bu yeni sözdizimi neyi gösterir?

Visual Studio 2003 ile birlikte gelen derleyiciyi kullanıyorum. Yukarıdaki kodu VS 2003'te derleyecek şekilde nasıl değiştirebilirim?

+0

(http://www.codeproject.com/KB/cpp/cpp10.aspx) – Ajay

cevap

16

Bu bir C++ lambda olduğu gibi, kodu aynı tanımın bir işlev nesnesiyle değiştirebilirsiniz. Bağlantı, biri Functor kullanan ve bir tanesi lambda kullanan iki örnek göstermektedir.

+0

Yani lambda fonksiyonlar C++ 'a geliyor ... ilginç. Sözdizimi özellikle güzel veya anlaşılır olduğunu söyleyebilirim, ancak – crasic

+0

Evet ve [bunlar en azından kısmen Visual Studio 2010 tarafından desteklenmektedir] (http://stackoverflow.com/questions/4855153/visual-c-anonymous-methods). Derleyicileri şimdi yükseltmek için iyi bir sebep; 2003 dişte oldukça uzuyor. –

+1

@crasic: sözdizimi ([] en azından) çoğunlukla kaçınılmazdır, çünkü her bir değişkenin referansa veya değere göre mi çekileceğini belirtmeniz gerekir. (eğer her şey dolaylı bir şekilde referans olarak görüldüyse, lambda'muzu çağırdığınızda, lambda, kapsam dışı kalmış nesneler için referanslar taşıdığı için her türlü soruna rastlarsınız. – jalf

5

diğer cevaplar C++ 0x lambas desteklemek için, onun yepyeni sözdizimi söylediğim gibi bir anonymous function

5

için C++0x sözdizimi benziyor. Visual Studio'nun herhangi bir sürümünde VS 2010'dan önce desteklenmez; bu nedenle, bu kod parçacığının VS 2003'te çalışması için bir işlevi veya functor nesnesini kullanmak için kodu reddetmeniz gerekir.

Ben aşağıdaki gibi bir şey sizin için işe yarayabilecek düşünüyorum: [. Daha iyi bir okuma]

// somewhere where it would be syntactically valid to 
// define a function 
void treenode_deleter(treenode* node) 
{ 
    delete node; 
} 


// ... 

bree::porder(m_root, treenode_deleter);