Voglio sovraccaricare una funzione con lo stesso parametro di tipo; cosa dovrei fare?

4

Sto creando un'API e voglio sovraccaricare una funzione per strip :

QString MyClass::strip();
QString MyClass::strip(QRegularExpression open);
QString MyClass::strip(QRegularExpression close);
QString MyClass::strip(QRegularExpression open, QRegularExpression close);

Ovviamente il secondo e il terzo conflitto.

Qual è lo stile consigliato per i programmatori C ++ e Qt per ristrutturare questo?

    
posta Akiva 13.01.2016 - 13:46
fonte

3 risposte

6

Che ne pensi di creare una classe per contenere i tuoi argomenti? Questa classe conterrà entrambi i parametri open e close e uno di essi potrebbe essere NULL . Quindi, ci sarà solo un metodo strip con sopra la classe come argomento e il metodo deciderà se vuole usare open / close se sono impostati.

    
risposta data 13.01.2016 - 14:16
fonte
5

Ci sono molte opzioni, è il tuo compromesso che devi prendere:

Decisione in fase di esecuzione:

  1. Aggiungi un argomento bool predefinito:

    QString MyClass::strip(QRegularExpression regex, bool close=false);
    // Mimic the two-regex-variants interface as good as possible
    
  2. Usa enum scopato e nessun valore predefinito come variante su 1 che è più descrittivo:

    enum class option { open, close };
    QString MyClass::strip(QRegularExpression regex, option open_close);
    
  3. Utilizza std::experimental::optional o qualcosa del genere, forse da boost .

  4. Scopri che una regex specifica non fa nulla e la documenta come predefinita no-op.

Decisione al compiletime:

  1. Utilizza i sovraccarichi sostituendo un argomento con std::nullptr_t :

    QString MyClass::strip(std::nullptr_t open, QRegularExpression close);
    QString MyClass::strip(QRegularExpression open, std::nullptr_t close = {});
    
  2. Utilizza i tag per evitare sovraccarichi:

    constexpr struct open_t {} open;
    constexpr struct close_t {} close;
    QString MyClass::strip(open_t, QRegularExpression regex);
    QString MyClass::strip(close_t, QRegularExpression regex);
    
    // Call it like this:
    object.strip(object.open, regex);
    
  3. Mordere il punto elenco e denominare le funzioni in modo diverso:

    QString MyClass::strip_open(QRegularExpression regex);
    QString MyClass::strip_close(QRegularExpression regex);
    
  4. Considera se rendere l'enigma aperto e l'espressione regex di tipo diverso hanno senso. Per essere sinceri, ne dubito, ma se appropriato è l'opzione migliore.

risposta data 13.01.2016 - 18:41
fonte
4

Suggerirei

QString MyClass::strip();
QString MyClass::strip(QRegularExpression regex, bool opening=false); 
QString MyClass::strip(QRegularExpression open, QRegularExpression close);

e forse

QString MyClass::strip_open(QRegularExpression regex);
QString MyClass::strip_close(QRegularExpression regex);

o sostituisci bool opening con ad esempio

enum stripping_mode {Strip_Open, Strip_Close};;

o rendi persino un class enum

    
risposta data 13.01.2016 - 14:16
fonte

Leggi altre domande sui tag