2011-08-10 2 views
0

Peut this solution être transformé en une macro pour que je l'appelle quelque chose le long des lignes de:solution macro pour les getters dupliqués, const et non-const?

CALL_CONST_FUNC(objToReturn, thisPtr)->SomeConstFunc(); 

Pour les fonctions qui retournent une valeur et une autre pour les fonctions qui ne sont pas. Mes compétences de jeton de macro ne sont pas très bonnes alors j'ai pensé que peut-être quelqu'un ici pourrait en trouver un (ou me dire que ce n'est pas possible). En fin de compte, l'objectif est d'éviter d'écrire la doublure laide et de la remplacer par quelque chose qui est facile sur les yeux et non sujettes aux erreurs.

+0

Cela ne semble pas plus joli? Combien de surcharges avez-vous besoin de toute façon? – UncleBens

+2

Je préfère rendre plus difficile d'écrire beaucoup de getters et setters. –

+0

@UncleBens: Vraiment? Ce n'est peut-être pas joli mais il est certainement plus précis que celui de la solution de l'autre question. – Samaursa

Répondre

0

Si une fonction ne renvoie pas de valeur (référence ou pointeur), avez-vous besoin de surcharges constantes en premier lieu? Il semble que la seule raison d'en avoir deux est d'obtenir une référence const ou non-const hors de la classe. Sinon, la version const seule devrait suffire.

Quant à faire le plus doux idiome, que diriez-vous quelques aides de modèle au lieu de faire la déduction de type pour vous:

template <class T> 
const T& add_const(T& t) { return t; } 

template <class T> 
T& remove_const(const T& t) { return const_cast<T&>(t); } 

class Foo 
{ 
    int foo; 
public: 
    const int& get() const 
    { 
     //non-trivial work 
     return foo; 
    } 

    int& get() 
    { 
     return remove_const(add_const(*this).get()); 
    } 
}; 

L'avantage est plus grand si les noms de type sont plus longs.

+0

'Si une fonction ne renvoie pas de valeur (référence ou pointeur), avez-vous besoin de surcharges const en premier lieu?' Bon point! ... et j'aime cette solution (+1) – Samaursa

+0

Si votre version const de la fonction retourne quelque chose qui est supposé être protégé en écriture, vous devrez rendre accidentellement accessible tout ce qui est retourné en tirant cette astuce. – HelloGoodbye

Questions connexes