Restituisce dichiarazione di tipo e assegni

4

Ho principalmente programmato PHP e recentemente ho iniziato con C ++.

In PHP, il ritorno di una funzione può essere di qualsiasi tipo, quindi puoi fare controlli come questo:

public function doSomething()
{
    if (! this->userHasAttribute()) {
        return false;
    }
    return "you are logged in.";
}

Quindi in pratica, se l'utente non verrebbe loggato in doSomething restituirebbe false, altrimenti restituirà una stringa.

Dato che in C ++ si restituisce rigorosamente un tipo di dati, come ti avvicineresti a questo?

Come strutturare quegli assegni / politiche, perché chiaramente non vuoi averli all'interno di una funzione stessa (o rilascerai eccezioni ovunque tu faccia un piccolo controllo).

Per favore correggimi se ho detto qualcosa di sbagliato.

Mi sono anche imbattuto in questo post, parlando del perché la nozione Single Entry Single Exit esiste in primo luogo. Qualcuno ha detto che l'argomento più strong a favore o SESE è svanito.

link

    
posta Melvin Koopmans 14.04.2017 - 08:08
fonte

2 risposte

4

Un modo per ottenere questo in C ++ è tramite std::optional (upcomming in C ++ 17 ) o boost::optional (libreria esterna).

Può avvolgere qualsiasi tipo e in pratica consente di controllare se un valore è stato impostato o meno.

#include <iostream>
#include <optional>
#include <string>

std::optional<std::string> doSomething()
{
    if (! userHasAttribute()) {
        return {};
    }
    return "you are logged in.";
}

int main()
{
    auto result = doSomething();
    if (result)
    {
        std::cout << *result;  
    }
}
    
risposta data 14.04.2017 - 11:10
fonte
1

Puoi restituire più di un risultato e amp; tipo di risultato in C & C ++ ma devi farlo in modo diverso, hai un paio di opzioni:

  1. Restituisce un tipo di enumerazione con una voce per ogni risultato possibile e dispone di una funzione di decodifica / registro separata che fornisce il testo del messaggio appropriato. Importante da ricordare: il decodificatore / registro deve essere in grado di gestire valori non validi. Un bel modo per farlo in C ++ è creare un tipo / classe che abbia i valori come un enumerato ma che abbia il proprio decodificatore o metodo di output che cerca il testo da emettere.

  2. Passare ai puntatori della funzione uno, o più, che consentono alla funzione di passare indietro le informazioni supplementari. Nell'esempio sopra riportato restituiresti un bool per il successo o l'insuccesso, ma userai anche un puntatore a stringa passato nella chiamata per passare indietro, al contrario di return , un messaggio di testo di perché questo è stato il risultato. Cose importanti da ricordare in questo caso:

    • Possibili puntatori nulli come input - è necessario verificarli!
    • Tutti i percorsi attraverso il codice dovrebbero impostare sia il valore di ritorno sia il messaggio.
    • Possibile overflow di stringa se scrivi una stringa in una posizione & possibili perdite di memoria se si passa un puntatore a un valore creato dinamicamente.
    • Qualsiasi puntatore che viene passato deve essere contrassegnato come static se non vuoi essere scritto.
    • Cancella commenti e amp; documentazione di ciò che tali indicatori sono, devono indicare, ecc. %codice%
  3. Puoi modificare i membri della classe per fornire risultati più dettagliati o anche, (orrido non farlo), variabili globali.
  4. Puoi anche fare cose cattive come restituire sempre una stringa e quindi analizzare la stringa per contenuti specifici, ad es. il valore restituito inizia con "OK", o anche più cattivo, (ma l'ho visto fare), restituisce una stringa terminata null con il valore del risultato dopo /* Note that the following is very rough and does not have the checks for null pointers, etc. DO NOT USE FOR PRODUCTION CODE you may also need to play about with where the const goes.*/ public function doSomething(const char** Message // pointer to where to pu an Output message to supplement the result ) { bool result = FALSE; if (! this->userHasAttribute()) { *Message = "You are not logged in"; } else { *Message = "you are logged in."; result = TRUE; } return result; } Non consiglio l'uno o l'altro queste opzioni!
risposta data 14.04.2017 - 08:40
fonte

Leggi altre domande sui tag