2012-09-14 20 views
5

Yapı doğruluğu ile ilgili basit bir soru.Getter İşlevi için Const Doğruluğu

bool operator()(Foo& foo) const 
{ 
    std::vector<T> & member = foo.member<T>(_memberName); 

Beni buraya karıştırır I 'olmuş, const referans olarak Foo geçmesi olamaz şudur: O zaman şu içeren bir functor var

template <class T> 
class Foo 
{ 
public: 
    std::map<std::string, boost::any> members; 

    template <typename T> 
    std::vector<T>& member(const std::string& memberName) 
    { 
     return boost::any_cast<std::vector<T>&>(members[memberName]); 
    } 
}; 

:

Bu sınıf var const olmayan üye getter işlevini çağırıyorum. İmzası ile ilgili olarak, operatörün() değiştiğini gösterir.

Bunu düzeltmem gerekiyorsa nasıl yapmalıyım?

cevap

9

zamanki gibi üye işlev için bir const aşırı eklemektir:

template <typename T> 
std::vector<T> const & member(const std::string& memberName) const 
{    ^^^^^           ^^^^^ 
    return boost::any_cast<std::vector<T> const &>(members.at(memberName)); 
}           ^^^^^   ^^ 

bu aşırı seçecektir bir const Foo üzerinde üyesi çağrılması; const numaralı telefondan arama, orijinali seçecektir.

at()'un std::map'a oldukça yeni bir ek olduğunu unutmayın.

std::map<std::string, boost::any>::const_iterator found = members.find(memberName); 
if (found == members.end()) { 
    throw std::runtime_error("Couldn't find " + memberName); 
} 
return boost::any_cast<std::vector<T> const &>(found->second); 
2

const doğruluğu kimin yöntem yürütmek nesne üzerinde geçerlidir: Eğer eski bir kütüphane ile sıkışmış ediyorsanız, böyle bir şey gerekir. Yani:

bool operator()(Foo& foo) const 

operator() (funktoru sınıfın üyesi olarak görünmektedir) _memberName gibi funktoru sınıfında şey değişmeyecektir anlamına gelir.

Tanımlandığı şekilde Foo (const non const) yöntemlerini değiştirebilir.

DÜZENLEME: bunu düzeltmek için bir yol tarif eder şekilde Bkz Mike Seymour 'ın cevabı. Ben şahsen bunu çok yaptım ama tam olarak soruyu almak için görünmüyordu. :)

+0

Ama soru şu ki, 'const' referansıyla foo'yu iletmeyi ayarlayabilir miyiz? –