136 votes

Valeur par défaut d'un paramètre lors du passage par référence en C++.

Est-il possible de donner une valeur par défaut à un paramètre d'une fonction alors que l'on passe le paramètre par référence ? en C++.

Par exemple, lorsque j'essaie de déclarer une fonction comme :

virtual const ULONG Write(ULONG &State = 0, bool sequence = true);

Lorsque je fais cela, il y a une erreur :

error C2440 : 'default argument' : impossible de convertir 'const int' en 'unsigned long &'. Une référence qui n'est pas à 'const' ne peut pas être liée à une non-valeur.

1voto

wdavilaneto Points 61

Dans le cas de l'OO... Dire qu'une classe donnée a un "Default" signifie que ce Default (valeur) doit être déclaré en conséquence et qu'il peut être utilisé comme un paramètre par défaut, par exemple :

class Pagination {
public:
    int currentPage;
    //...
    Pagination() {
        currentPage = 1;
        //...
    }
    // your Default Pagination
    static Pagination& Default() {
        static Pagination pag;
        return pag;
    }
};

Sur votre Méthode ...

 shared_ptr<vector<Auditoria> > 
 findByFilter(Auditoria& audit, Pagination& pagination = Pagination::Default() ) {

Cette solution est tout à fait adaptée puisque dans ce cas, la "pagination globale par défaut" est une valeur de "référence" unique. Vous aurez également le pouvoir de changer les valeurs par défaut au moment de l'exécution comme une configuration "gobal-level" ex : préférences de navigation de pagination de l'utilisateur et etc.

1voto

vic Points 11

C'est possible avec le qualificatif constant pour l'État :

virtual const ULONG Write(const ULONG &State = 0, bool sequence = true);

0voto

void revealSelection(const ScrollAlignment& = ScrollAlignment::alignCenterIfNeeded, bool revealExtent = false);

0voto

avtomaton Points 11

Il existe également une astuce assez sale pour cela :

virtual const ULONG Write(ULONG &&State = 0, bool sequence = true);

Dans ce cas, vous devez l'appeler avec std::move :

ULONG val = 0;
Write(std::move(val));

C'est seulement une drôle de solution de contournement, je Je ne recommande absolument pas son utilisation dans un code réel !

0voto

Omar Natour Points 91

J'ai une solution de contournement pour cela, voir l'exemple suivant sur la valeur par défaut de la fonction int& :

class Helper
{
public:
    int x;
    operator int&() { return x; }
};

// How to use it:
void foo(int &x = Helper())
{

}

Vous pouvez le faire pour n'importe quel type de données triviales que vous voulez, tel que bool , double ...

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X