Są trzy sposoby, które zidentyfikowałem, aby rozwiązać problem z operator<<
.
Pierwszy sposób to dostarczyć operator<<
dla swojego typu. Jest to potrzebne, ponieważ w przypadku niepowodzenia boost_check_equal
rejestruje on również niepowodzenie, wywołując obiekty operator<<
. Zobacz pełny dodatek po przerwie, aby zobaczyć, jak to się naprawdę robi. To jest trudniejsze, niż mogłoby się wydawać.
Drugi sposób to nie rejestrowanie, o którym wspomniałem. Możesz to zrobić przez #definine
ing BOOST_TEST_DONT_PRINT_LOG_VALUE
. Aby wyłączyć rejestrowanie tylko jednego testu, można otoczyć dany test z tego #define
, a następnie natychmiast #undef
go:
#define BOOST_TEST_DONT_PRINT_LOG_VALUE
BOOST_CHECK_EQUAL (first, second);
#undef BOOST_TEST_DONT_PRINT_LOG_VALUE
Trzecim sposobem jest ominąć potrzebę operator<<
który współpracuje z typu, nie porównując jeden element do drugiego, ale tylko sprawdzanie bool:
BOOST_CHECK (first == second);
Wybierz preferowaną metodę.
Moja preferencja jest pierwsza, ale jej realizacja jest zaskakująco trudna. Jeśli po prostu zdefiniujesz operator<<
w zasięgu globalnym, nie będzie działać. Myślę, że powodem tego jest problem z rozpoznawaniem nazw. Jedną z popularnych propozycji naprawienia tego jest umieszczenie operator<<
w przestrzeni nazw . Działa to, przynajmniej w praktyce na niektórych kompilatorach, ale nie podoba mi się to, ponieważ Standard zabrania dodawania czegokolwiek do przestrzeni nazw std
.
Lepszą metodą, jaką znalazłem, jest wdrożenie niestandardowej specjalizacji szablonów klas dla danego typu. print_log_value
jest szablonem używanym do użycia w szablonie klasy przez elementy wewnętrzne Boost.Test w celu wywołania prawidłowego operator<<
dla określonego typu. Deleguje na operator<<
, aby wykonać ciężki lifting. Specjalizacja print_log_value
dla twoich niestandardowych typów jest oficjalnie wspierana przez Boost [potrzebne źródło] i jest realizowana w ten sposób.
Zakładając, że typ nazywany Timestamp
(jest w moim kodu), najpierw zdefiniować globalnego wolnego operator<<
dla Timestamp
:
static inline std::ostream& operator<< (std::ostream& os, const Mdi::Timestamp& ts)
{
os << "Timestamp";
return os;
}
...a następnie dostarczyć specjalizację print_log_value
za to, delegując do operator<<
po prostu zdefiniowane:
namespace boost { namespace test_tools {
template<>
struct print_log_value<Mdi::Timestamp > {
void operator()(std::ostream& os,
Mdi::Timestamp const& ts)
{
::operator<<(os,ts);
}
};
}}
Jakie były błędy? – Dennis
Nie kompiluje ... A ja pracuję w Codeblocks, więc nie mogę skopiować i wkleić błędów. I wszystkie są w pliku test_tools.hpp i naprawdę nie rozumiem o czym są (wspomniałem o pierwszej w poście). Czy powinienem podać więcej przykładów? – Ioana
Skompilowałem z gcc i chciałbym wkleić błędy, ale jest za 11400 znaków zbyt długo na komentarz. – Ioana