の問題を解決するために私が特定した 3 つの方法がありますoperator<<
。
最初の方法はoperator<<
、タイプに を提供することです。これが必要なのは、失敗した場合、オブジェクトboost_check_equal
を呼び出して失敗もログに記録するためです。operator<<
これが実際にどのように達成されるかを確認するには、休憩の後の詳細な補遺を参照してください。見た目よりも難しいです。
2 番目の方法は、先ほど述べたロギングを行わないことです。#definine
ingでこれを行うことができますBOOST_TEST_DONT_PRINT_LOG_VALUE
。1 つのテストだけのロギングを無効にするには、問題のテストを this で囲み、#define
すぐ#undef
に次のようにします。
#define BOOST_TEST_DONT_PRINT_LOG_VALUE
BOOST_CHECK_EQUAL (first, second);
#undef BOOST_TEST_DONT_PRINT_LOG_VALUE
operator<<
3 番目の方法は、ある項目を別の項目と比較するのではなく、bool をチェックするだけで、型で動作する の必要性を回避することです。
BOOST_CHECK (first == second);
ご希望の方法をお選びください。
私の好みは最初ですが、それを実装するのは驚くほど困難です。グローバル スコープで定義するだけoperator<<
では機能しません。名前解決の問題が原因だと思います。これを修正するための一般的な提案の 1 つは、名前空間に を配置することoperator<<
ですstd
。これは、少なくとも一部のコンパイラでは実際に機能しますが、標準ではstd
名前空間に何かを追加することを禁止しているため、好きではありません。
私が見つけたより良い方法は、型のカスタムprint_log_value
クラス テンプレートの特殊化を実装することです。 print_log_value
Boost.Test の内部で使用されるクラス テンプレートoperator<<
で、指定された型の正しいものを実際に呼び出します。operator<<
重いものを持ち上げるために委任します。カスタム タイプの特殊化print_log_value
は、Boost [要出典] によって公式にサポートされており、このようにして達成されます。
あなたのタイプが呼び出されたと仮定するとTimestamp
(それは私のコードにあります)、最初にグローバルな free operator<<
for を定義しますTimestamp
:
static inline std::ostream& operator<< (std::ostream& os, const Mdi::Timestamp& ts)
{
os << "Timestamp";
return os;
}
...そして、定義したばかりprint_log_value
に委譲して、その専門化を提供します。operator<<
namespace boost { namespace test_tools {
template<>
struct print_log_value<Mdi::Timestamp > {
void operator()( std::ostream& os,
Mdi::Timestamp const& ts)
{
::operator<<(os,ts);
}
};
}}