Qual è il modo migliore per recuperare un valore e uno stato [chiuso]

2

Dato che tutto il resto è uguale, e non ci sono standard di codifica che definiscono l'approccio migliore, quale sarebbe il modo raccomandato in C ++ per verificare che esista un valore e restituirlo se lo fa?

Ad esempio, qualcosa come una di queste dichiarazioni:

bool getMethod(double& ret);

double getMethod(bool& ok);

void getMethod(bool& ok, double& ret);

pair<bool, double> getMethod();

bool checkMethod(); // eg if (checkMethod())
double getMethod(); //        result = getMethod();

o qualcos'altro, come restituire una struct

Il valore può esistere circa il 50% delle volte.

Il codice esistente fa già un sacco dell'ultimo metodo, ad esempio utilizzando un metodo checkMethod (), ma mi chiedevo se fosse davvero un modo efficace per farlo - tramite due chiamate (metà del tempo).

    
posta Roger Attrill 24.01.2014 - 12:25
fonte

3 risposte

4

Given that all else is equal, and there are no coding standards defining the best approach, what would be the recommended way in C++ to check that a value exists and return it if it does?

A partire da C ++ 14, puoi usare std :: facoltativo . (fino ad allora, puoi usare boost :: opzionale ) .

La classe si comporta come un puntatore, ma non alloca memoria dinamica ed esprime esplicitamente il fatto che il valore può essere mancante:

I seguenti frammenti di codice hanno la stessa funzione:

bool getMethod(double& ret); // from your code
// client code:
double result = 0.;
if(getMethod(result)) {
    // result has a valid value
}

e

#include <optional>
std::optional<double> getMethod();
if(auto result = getMethod()) {
    // *result is a valid value
}
    
risposta data 24.01.2014 - 12:57
fonte
1

Non ricordo di aver mai visto nessuno dei

double getMethod(bool& ok);
void getMethod(bool& ok, double& ret);

e mi sembrano brutti.

Il primo

bool getMethod(double& ret);

sembra il più ovvio e autoesplicativo, ma ho visto

std::pair<bool, double> getMethod();

fatto anche, ma non aggiunge nulla alla prima versione.

    
risposta data 24.01.2014 - 12:58
fonte
0

Il problema qui è che stai cercando di creare una funzione che faccia 2 cose. Controlla se esiste un valore. Restituisce un valore esistente. Il miglior consiglio che posso dare è quello di separare le tue preoccupazioni. Scrivi funzioni che fanno solo una cosa. In questo caso potresti avere le giuste funzioni come:

bool HasValue()const; // returns true if the value exists
double GetValue()const; // returns the value, and throws an exception if the value does not exist.

In questo modo hai 2 metodi chiari che fanno esattamente quello che dicono di fare. Ognuno di loro fa 1 compito.

    
risposta data 27.01.2014 - 17:54
fonte

Leggi altre domande sui tag