2012-09-14 24 views
5

Ecco una semplice domanda relativa alla correttezza delle cost.Corrispondenza di Const per la funzione Getter

ho questa classe:

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]); 
    } 
}; 

Ho poi un funtore che include quanto segue:

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

Ciò che mi confonde è che non posso passare Foo con riferimento a const, dal momento che sto chiamando la funzione getter del membro non const. Per quanto riguarda la sua firma, ciò dà l'impressione che l'operatore() cambi foo.

Devo correggere questo e se sì come?

risposta

9

Il modo usuale è quello di aggiungere un sovraccarico di const per la funzione di membro:

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

Chiamando il membro su un const Foo sceglierà questo sovraccarico; chiamandolo su un numero non const sceglierà quello originale.

Si noti che at() è un'aggiunta abbastanza nuova a std::map. Se sei bloccato con una libreria obsoleta, avrete bisogno di qualcosa di simile:

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

Il const correttezza applica sull'oggetto, il cui metodo si esegue. Quindi:

bool operator()(Foo& foo) const 

significa che operator() non cambierà nulla nella classe funtore, come il _memberName (che sembra essere un membro della classe funtore).

Il modo in cui è definito, è consentito modificare Foo (chiamare metodi non const).

EDIT: risposta s' See Mike Seymour quanto descrive un modo per risolvere il problema. Io personalmente l'ho fatto molto, ma non sembra aver ottenuto esattamente la tua domanda. :)

+0

Ma la domanda è: possiamo organizzare il passaggio di 'foo' da' const' reference? –

Problemi correlati