2013-06-16 14 views
6

W teście kodu jednostkowego w C++, gdy potrzebuję porównać dwa wektory, tworzę tymczasowy wektor do przechowywania oczekiwanych wartości.Tworzenie nienazwanego kontenera w języku C++ do tymczasowego porównania w teście jednostkowym

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

Czy mogę zrobić jedną linię? W pythonie mogę wygenerować listę z "[...]".

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

Szukasz literału wektorowego. Czy odpowiedź [this] (http://stackoverflow.com/questions/758118/c-vector-literals-or-something-like-them) pomaga? –

Odpowiedz

3

Od std::vector zawiera initializer-list constructor że bierze std::initializer_list można użyć jednolitego składni inicjalizacji tak długo, jak funkcja sameTwoVectors akceptuje wektor według wartości, referencji rvalue lub referencji 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})); 
} 

Ewentualnie, jeśli sameTwoVectors robi tylko prostego porównania można go wyeliminować. Po prostu użyj wyrażenia porównawczego na swoim miejscu, gdy zadzwonisz pod numer EXPECT_TRUE. Kompromis polega na tym, że musisz wyraźnie określić std::vector<int> zamiast polegać na niejawnym konstruktorze konwersji. Jest to o kilka znaków mniej i bardziej zrozumiały jest oczekiwany rezultat.

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

Warto zauważyć, że jest to określony termin. Ma konstruktor listy inicjalizacyjnej. Patrz N3485 § 8.5.4/2. – chris

+0

@chris dzięki, zaktualizowany. –

1

Jeśli Util::sameTwoVectors oczekuje const odniesienia lub po prostu wartość można (zakładając C++11 wsparcia) napisać to tak

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