2010-11-22 11 views
6

Son zamanlarda akıllı göstericilerin bir vektörü içine bir işaretçi vektörünü değiştirme kararını aldım, ancak bu akıllı göstericiler STL uyumlu olsa da, bunları kullanmak için bazı algoritmaları dönüştüremedim .akıllı göstericilerin kapsayıcısı için mem_fun() kullanarak

Bunu nasıl içine

bool is_any_valid(vector< Base* > v) 
{ 
    return v.end() != 
     find_if(v.begin(), v.end(), mem_fun(&Base::valid)); 
} 

dönüştürebilirim bir

class Base 
{ 
    ... 
    virtual bool valid(); 
}; 

düşünün?

bool is_any_valid(vector< my_smart_ptr<Base> v) 
{ 
    // mem_fun() fails, because valid() is not a member of my_smart_ptr<Base> !!! 
    // return v.end() != 
    // find_if(v.begin(), v.end(), mem_fun(&Base::valid)); 
} 

O my_smart_pointer < varsayabiliriz> shared_ptr <>, olarak temelde aynı arayüze sahip ama benim projede destek kullanamaz.

Mem_fun veya mem_fun_ref dosyasının çalışmasına izin vermek için yazabileceğim bir (genel) bağdaştırıcı var mı? bu çizgilerin pek çoğunda benzer durumlar vardır, çünkü

find_if(v.begin(), v.end(), mem_fun(some_adapter(&Base::valid))); 

: I, tercihen gibi bir hat-içi eriyik.

cevap

4

Boost mem_fn'i kullanmak istediğinizde tam olarak istediğiniz gibi kullanın. Bu bağlantıya, özellikle AMAÇ bölümüne bakın.

http://www.boost.org/doc/libs/1_45_0/libs/bind/mem_fn.html

BTW, (aynı zamanda olmalıdır() ve geçerli const) is_any_valid bütün vektör const bir başvuru geçirmeden değil edilmelidir.

+0

'mem_fn' ayrıca MSVC++, http://msdn.microsoft.com/en-us/library/bb982851.aspx –

+0

adresinde mevcuttur, tam olarak neye ihtiyacım var. Sadece (kodu okuduktan sonra) neden bir non-const davası için referansı uyguladıklarını anlayamıyorum! –

İlgili konular