Необходимо структурировать это вопросы с точки зрения повторного использования кода и надежности кода (иначе удобочитаемость). Так или иначе нет действительно никакого увеличения производительности.
Я бы действительно посоветовал взглянуть на Google C ++ Mocking Framework . Даже если вы не хотите ничего высмеивать, он позволяет с легкостью писать довольно сложные утверждения.
Например
//checks that vector v is {5, 10, 15}
ASSERT_THAT(v, ElementsAre(5, 10, 15));
//checks that map m only have elements 1 => 10, 2 => 20
ASSERT_THAT(m, ElementsAre(Pair(1, 10), Pair(2, 20)));
//checks that in vector v all the elements are greater than 10 and less than 20
ASSERT_THAT(v, Each(AllOf(Gt(10), Lt(20))));
//checks that vector v consist of
// 5, number greater than 10, anything.
ASSERT_THAT(v, ElementsAre(5, Gt(10), _));
Существует множество сопоставителей для всевозможных ситуаций, и вы можете комбинировать их для достижения почти всего.
Я говорил вам, что ElementsAre
требует для работы только итераторов
и size ()
метода в классе? Таким образом, он работает не только с любым контейнером из STL, но и с пользовательскими контейнерами.
Google Mock утверждает, что он почти такой же переносимый, как и Google Test, и, честно говоря, я не понимаю, почему вы не стали бы его использовать. Это просто потрясающе.
У меня был точно такой же вопрос, поэтому я написал пару макросов, которые сравнивают два общих контейнера. Он расширяется до ЛЮБОГО контейнера, имеющего const_iterator
, begin
и end
. В случае неудачи он отобразит подробное сообщение о том, где произошла ошибка в массиве, и будет делать это для каждого элемента, который выходит из строя; это обеспечит одинаковую длину; и место в вашем коде, которое он сообщает как сбой, совпадает с той же строкой, где вы вызываете EXPECT_ITERABLE_EQ (std :: vector
.
//! Using the google test framework, check all elements of two containers
#define EXPECT_ITERABLE_BASE( PREDICATE, REFTYPE, TARTYPE, ref, target) \
{ \
const REFTYPE& ref_(ref); \
const TARTYPE& target_(target); \
REFTYPE::const_iterator refIter = ref_.begin(); \
TARTYPE::const_iterator tarIter = target_.begin(); \
unsigned int i = 0; \
while(refIter != ref_.end()) { \
if ( tarIter == target_.end() ) { \
ADD_FAILURE() << #target " has a smaller length than " #ref ; \
break; \
} \
PREDICATE(* refIter, * tarIter) \
<< "Containers " #ref " (refIter) and " #target " (tarIter)" \
" differ at index " << i; \
++refIter; ++tarIter; ++i; \
} \
EXPECT_TRUE( tarIter == target_.end() ) \
<< #ref " has a smaller length than " #target ; \
}
//! Check that all elements of two same-type containers are equal
#define EXPECT_ITERABLE_EQ( TYPE, ref, target) \
EXPECT_ITERABLE_BASE( EXPECT_EQ, TYPE, TYPE, ref, target )
//! Check that all elements of two different-type containers are equal
#define EXPECT_ITERABLE_EQ2( REFTYPE, TARTYPE, ref, target) \
EXPECT_ITERABLE_BASE( EXPECT_EQ, REFTYPE, TARTYPE, ref, target )
//! Check that all elements of two same-type containers of doubles are equal
#define EXPECT_ITERABLE_DOUBLE_EQ( TYPE, ref, target) \
EXPECT_ITERABLE_BASE( EXPECT_DOUBLE_EQ, TYPE, TYPE, ref, target )
Надеюсь, это сработает для вас (и что вы действительно проверяете этот ответ через два месяца после того, как ваш вопрос был отправлен).