2013-06-16 6 views
6

Nel codice di test unitario in C++, quando devo confrontare due vettori, creo il vettore temporaneo per memorizzare i valori previsti.Creazione di un contenitore senza nome in C++ per il confronto temporaneo nel test dell'unità

std::vector<int> expected({5,2,3, 15}); 
EXPECT_TRUE(Util::sameTwoVectors(result, expected)); 

Posso fare una riga? In python, posso generare una lista con "[...]".

sameTwoVectors(members, [5,2,3,15]) 
+0

Stai cercando un vettore letterale. [Questo] (http://stackoverflow.com/questions/758118/c-vector-literals-or-signhing-like-them) risponde alla guida? –

risposta

3

Da std::vector include un initializer-list constructor che prende un std::initializer_list è possibile utilizzare la sintassi di inizializzazione uniforme finché la funzione sameTwoVectors accetta un vettore in base al valore, valore di riferimento o riferimento const.

namespace Util 
{ 
    bool sameTwoVectors(
     const std::vector<int>& result, 
     const std::vector<int>& expected) 
     { 
      return result == expected; 
     } 
} 


int main() 
{ 
    std::vector<int> result; 

    EXPECT_TRUE(Util::sameTwoVectors(result, {5,2,3,15})); 
} 

In alternativa, se sameTwoVectors fa solo un semplice confronto è possibile eliminarlo. Basta usare un'espressione di confronto al suo posto quando si chiama EXPECT_TRUE. Il compromesso è che devi specificare std::vector<int> esplicitamente invece di fare affidamento sul costruttore implicito di conversione. Sono un paio di caratteri in meno e un po 'più chiaro quale sia il risultato previsto.

EXPECT_TRUE(result == std::vector<int>({5,2,3,15})); 
+0

Vale la pena notare che esiste un termine specifico per questo. Ha un costruttore di inizializzatore-lista. Vedi N3485 § 8.5.4/2. – chris

+0

@chris grazie, aggiornato. –

1

Se Util::sameTwoVectors aspetta riferimento const o solo un valore che si può (supponendo C++11 supporto) scrivono così

EXPECT_TRUE(Util::sameTwoVectors(result, std::vector<int>{5, 2, 3, 15}));