如何使用模板化函数作为Boost::Unit-test的自定义谓词
How to use a templated function as custom predicate for Boost::Unit-test
我试图为BOOST_CHECK_PREDICATE构建一个自定义谓词,其中谓词本身是一个模板化函数。我的示例如下:
#define BOOST_TEST_MODULE Module
#define BOOST_TEST_MAIN
#include <boost/test/unit_test.hpp>
// custom predicate
template <typename U, typename V>
bool is_close_enough(const U& a, const V& b)
{
return std::abs(a-b) < 2.0;
}
BOOST_AUTO_TEST_SUITE(boostUnitTestLearningTests)
BOOST_AUTO_TEST_CASE(Test_Templated_Predicate)
{
BOOST_CHECK_PREDICATE(is_close_enough, (4)(6));
BOOST_CHECK_PREDICATE(is_template_close_enough, (4.0)(6.5));
}
BOOST_AUTO_TEST_SUITE_END()
用MS Visual c++ 2010编译会产生以下错误:
3>..boost_testtestSystem.cpp(42):错误C2780: 'bool .boost:: test_tools:: tt_detail:: check_frwd (Pred, constboost:: unit_test:: lazy_ostream, boost:: test_tools:: constrongtring size_t, boost:: test_tools:: tt_detail: tool_level boost:: test_tools:: tt_detail: check_type, constArg0 &,const char *,const Arg1 &,const char *,const Arg2 &,const Arg3 &,const char *,const Arg4 &,const char *)':期望16个参数-提供10个参数3>
C:Boostinclude Boost -1_51 Boost/test/test_tools.hpp(523):见声明'boost::test_tools::tt_detail::check_frwd'3>..boost_testtestSystem.cpp(42):错误C2780: 'boolboost:: test_tools:: tt_detail:: check_frwd (Pred, constboost:: unit_test:: lazy_ostream, boost:: test_tools:: constrongtring size_t, boost:: test_tools:: tt_detail: tool_level boost:: test_tools:: tt_detail: check_type, constArg0 &,const char *,const Arg1 &,const char *,const Arg2 &C:Boostinclude Boost -1_51 Boost/test/test_tools.hpp(523):见声明'boost::test_tools::tt_detail::check_frwd'3>..boost_testtestSystem.cpp(42):错误C2780: 'boolboost:: test_tools:: tt_detail:: check_frwd (Pred, constboost:: unit_test:: lazy_ostream, boost:: test_tools:: constrongtring size_t, boost:: test_tools:: tt_detail: tool_level boost:: test_tools:: tt_detail: check_type, constArg0 &,const char *,const Arg1 &,const char *,const Arg2 &)':期望12个参数-提供10个参数3> C:Boostinclude Boost -1_51 Boost/test/test_tools.hpp(523):见声明'boost::test_tools::tt_detail::check_frwd'3>..boost_testtestSystem.cpp(42):错误C2896: 'boolboost:: test_tools:: tt_detail:: check_frwd (Pred, constboost:: unit_test:: lazy_ostream, boost:: test_tools:: constrongtring size_t, boost:: test_tools:: tt_detail: tool_level boost:: test_tools:: tt_detail: check_type, constArg0 &,const char *,const Arg1 &,const char *)':不能使用function模板'bool is_close_enough(const U &,const V &)'作为函数参数3> ..boost_testtestSystem.cpp(18):见boost_testtestSystem.cpp(42):错误C2784: 'bool boost::test_tools::tt_detail::check_frwd(Pred,constboost:: unit_test:: lazy_ostream, boost:: test_tools:: constrongtring size_t, boost:: test_tools:: tt_detail: tool_level boost:: test_tools:: tt_detail: check_type, constArg0 &,const char *,const Arg1 &,const char *)':无法推断来自'overloaded '的'重载函数类型'的模板参数函数类型' 3>
C:Boostinclude Boost -1_51 Boost/test/test_tools.hpp(523):见声明'boost::test_tools::tt_detail::check_frwd'3>..boost_testtestSystem.cpp(42):错误C2780: 'boolboost:: test_tools:: tt_detail:: check_frwd (Pred, constboost:: unit_test:: lazy_ostream, boost:: test_tools:: constrongtring size_t, boost:: test_tools:: tt_detail: tool_level boost:: test_tools:: tt_detail: check_type, constArg0 &,const char *)':期望8个参数-提供10个
你知道我哪里做错了吗?
在Visual Studio 2012和g++ 4.8.1上的Boost 1.53.0下可以正常工作。我认为,如果你想使用模板化的函数,你需要显式地指定模板参数。由于这个原因,我更倾向于使用函子的解。
#define BOOST_TEST_MODULE Module
#define BOOST_TEST_MAIN
#include <boost/test/unit_test.hpp>
template <typename U, typename V>
bool is_close_enough(const U& a, const V& b)
{
return std::abs(a-b) < 2.0;
}
struct is_close_enough_functor
{
template <typename U, typename V>
bool operator()(const U& a, const V& b) const
{
return std::abs(a-b) < 2.0;
}
};
BOOST_AUTO_TEST_SUITE(boostUnitTestLearningTests)
BOOST_AUTO_TEST_CASE(Test_Templated_Predicate)
{
BOOST_CHECK_PREDICATE((is_close_enough<int,int>), (4)(6)); //extra parentheses needed to avoid a problem with the comma inside the macro
BOOST_CHECK_PREDICATE(is_close_enough_functor(), (4)(6));
BOOST_CHECK_PREDICATE(is_close_enough_functor(), (4.0)(6.5));
}
BOOST_AUTO_TEST_SUITE_END()
- Boost.TEST with CLion: "Test framework quit unexpectedly"
- 使用 C++ Boost.Test 组织单元测试?
- Boost.Test - 如何在交叉点上检查两个向量
- 在 Boost.Test 中异常时双倍释放
- 数据集(和样本)何时在 boost::test 中销毁?
- 抑制boost.test中的退出信号
- 静态链接再次链接boost.test和cmake在Windows上的mingw
- 我应该使用boost.test分别测试不同类别的类别
- Boost.Test 显示测试持续时间
- 在哪里可以找到Eclipse中解析的Boost.Test输出
- 在BOOST test中添加测试套件而不是测试用例
- GCC 地址清理器 - 将库功能列入黑名单(特别是 boost::test)
- Debugging Boost.Test in Eclipse:debugger 不会在断点处停止
- Boost.Test Custom Type using decorator boost::unit_test::tol
- Boost.Test 使用正则表达式测试文件内容
- 如何将Boost.Test输出记录到HRF中的stdout和XML中的文件中
- 为什么我不能在 Boost.Test 测试用例中创建线程?
- Boost.Test吐出垃圾,而不是可读的错误消息
- Boost.test cannot find main
- 如何使用模板化函数作为Boost::Unit-test的自定义谓词