首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何使用模板函数作为Boost::Unit-test的自定义谓词

如何使用模板函数作为Boost::Unit-test的自定义谓词
EN

Stack Overflow用户
提问于 2013-06-10 15:30:28
回答 1查看 595关注 0票数 4

我试图为BOOST_CHECK_PREDICATE构建一个自定义谓词,其中谓词本身是一个模板函数。我的示例如下:

代码语言:javascript
复制
#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 VisualC++ 2010编译会出现以下错误:

3>..\boost_test\testSystem.cpp(42):错误C2780:'bool C2780 const boost::unit_test::lazy_ostream &,boost::test_tools::const_string,size_t,boost::test_tools::tt_detail::tool_level,boost::test_tools::tt_detail::check_type,const Arg0 &,const char *,const Arg1 &,const char *,const Arg2 &,const char *,const Arg3 &,const char *,const Arg4 &,const char *):期望16个参数-10个提供了3> C:\Boost\include\boost-1_51\boost/test/test_tools.hpp(523):参见“boost::test_tools::tt_detail::check_frwd”3>..\boost_test\testSystem.cpp(42)的声明:错误C2780:'bool boost::test_tools::tt_detail::check_frwd(Pred,const boost::unit_test::lazy_ostream &,boost::test_tools::const_string,size_t,boost::test_tools::tt_detail::tool_level,boost::test_tools::tt_detail::check_type,const Arg0 &,const char *,const Arg1 &,const char *,const Arg2 &,const char *,const Arg3 &,const *):期望14个参数-10个提供了C:\Boost\include\boost-1_51\boost/test/test_tools.hpp(523):参见“boost::test_tools::tt_detail::check_frwd”3>..\boost_test\testSystem.cpp(42)的声明: error C2780:'bool boost::test_tools::tt_detail::check_frwd(Pred,const boost::unit_test::lazy_ostream &,boost::test_tools::const_string,size_t,boost::test_tools::tt_detail::tool_level,boost::test_tools::tt_detail::check_type,const Arg0 &,const char *,const Arg1 &,const char *,const Arg2 &,const *):期望12个参数-10个提供了C:\Boost\include\boost-1_51\boost/test/test_tools.hpp(523):参见“boost::test_tools::tt_detail::check_frwd”3>..\boost_test\testSystem.cpp(42)的声明: error C2896:'bool boost::test_tools::tt_detail::check_frwd(Pred,const boost::unit_test::lazy_ostream &,boost::test_tools::const_string,size_t,boost::test_tools::tt_detail::tool_level,boost::test_tools::tt_detail::check_type,const Arg0 &,const char *,const Arg1 &,const char *):无法使用函数模板'bool is_close_enough(const U &,作为函数参数3> ..\boost_test\testSystem.cpp(18):参见is_close_enough 3>..\boost_test\testSystem.cpp(42)的声明:错误C2784:'bool is_close_enough const boost::unit_test::lazy_ostream &,boost::test_tools::const_string,size_t,boost::test_tools::tt_detail::tool_level,boost::test_tools::tt_detail::check_type、const Arg0 &、const char *、const Arg1 &、const char *):无法从“重载函数类型”中推断“重载函数类型”的模板参数 C:\Boost\include\boost-1_51\boost/test/test_tools.hpp(523):参见“boost::test_tools::tt_detail::check_frwd”3>..\boost_test\testSystem.cpp(42)的声明:错误C2780:'bool boost::test_tools::tt_detail::check_frwd(Pred,const boost::unit_test::lazy_ostream &,boost::test_tools::const_string,size_t,boost::test_tools::tt_detail::tool_level,boost::test_tools::tt_detail::check_type,const Arg0 &,const char *):预期提供8个参数-10个

知道我在这里做错什么了吗?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2013-06-10 17:10:12

以下内容在Visual 2012和g++ 4.8.1上使用Boost 1.53.0很好。我认为,如果要使用模板函数,则需要显式地指定模板参数。出于这个原因,我更喜欢函子的解决方案。

代码语言:javascript
复制
#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()
票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/17027505

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档