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

时间:2013-06-10 15:30:28

标签: c++ templates boost boost-unit-test-framework

我正在尝试为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&gt; .. \ boost_test \ testSystem.cpp(42):错误C2780:'bool   提高:: test_tools :: tt_detail :: check_frwd(强的松,常量   提高:: unit_test :: lazy_ostream   &安培;,提振:: test_tools :: const_string,为size_t,提振:: test_tools :: tt_detail :: tool_level,提振:: test_tools :: tt_detail :: check_type,常量   Arg0&amp;,const char *,const Arg1&amp;,const char *,const Arg2&amp;,const char   *,const Arg3&amp;,const char *,const Arg4&amp;,const char *)':需要16个参数--10个提供3&gt;

  C:\ Boost \ include \ boost-1_51 \ boost / test / test_tools.hpp(523):见   声明'boost :: test_tools :: tt_detail :: check_frwd'   3&gt; .. \ boost_test \ testSystem.cpp(42):错误C2780:'布尔   提高:: test_tools :: tt_detail :: check_frwd(强的松,常量   提高:: unit_test :: lazy_ostream   &安培;,提振:: test_tools :: const_string,为size_t,提振:: test_tools :: tt_detail :: tool_level,提振:: test_tools :: tt_detail :: check_type,常量   Arg0&amp;,const char *,const Arg1&amp;,const char *,const Arg2&amp;,const char   *,const Arg3&amp;,const char *)':需要14个参数 - 10个提供3&gt; C:\ Boost \ include \ boost-1_51 \ boost / test / test_tools.hpp(523):见   声明'boost :: test_tools :: tt_detail :: check_frwd'   3&gt; .. \ boost_test \ testSystem.cpp(42):错误C2780:'布尔   提高:: test_tools :: tt_detail :: check_frwd(强的松,常量   提高:: unit_test :: lazy_ostream   &安培;,提振:: test_tools :: const_string,为size_t,提振:: test_tools :: tt_detail :: tool_level,提振:: test_tools :: tt_detail :: check_type,常量   Arg0&amp;,const char *,const Arg1&amp;,const char *,const Arg2&amp;,const char   *)':期望12个参数 - 10个提供3&gt; C:\ Boost \ include \ boost-1_51 \ boost / test / test_tools.hpp(523):见   声明'boost :: test_tools :: tt_detail :: check_frwd'   3&gt; .. \ boost_test \ testSystem.cpp(42):错误C2896:'布尔   提高:: test_tools :: tt_detail :: check_frwd(强的松,常量   提高:: unit_test :: lazy_ostream   &安培;,提振:: test_tools :: const_string,为size_t,提振:: test_tools :: tt_detail :: tool_level,提振:: test_tools :: tt_detail :: check_type,常量   Arg0&amp;,const char *,const Arg1&amp;,const char *)':不能使用函数   模板'bool is_close_enough(const U&amp; const V&amp;)'作为函数   参数3&gt; .. \ boost_test \ testSystem.cpp(18):看   声明'is_close_enough'3&gt; .. \ boost_test \ testSystem.cpp(42):   错误C2784:'bool boost :: test_tools :: tt_detail :: check_frwd(Pred,const   提高:: unit_test :: lazy_ostream   &安培;,提振:: test_tools :: const_string,为size_t,提振:: test_tools :: tt_detail :: tool_level,提振:: test_tools :: tt_detail :: check_type,常量   Arg0&amp;,const char *,const Arg1&amp;,const char *)':无法演绎   '重载函数类型'的模板参数来自'重载   功能类型'3&gt;
  C:\ Boost \ include \ boost-1_51 \ boost / test / test_tools.hpp(523):见   声明'boost :: test_tools :: tt_detail :: check_frwd'   3&gt; .. \ boost_test \ testSystem.cpp(42):错误C2780:'布尔   提高:: test_tools :: tt_detail :: check_frwd(强的松,常量   提高:: unit_test :: lazy_ostream   &安培;,提振:: test_tools :: const_string,为size_t,提振:: test_tools :: tt_detail :: tool_level,提振:: test_tools :: tt_detail :: check_type,常量   Arg0&amp;,const char *)':需要8个参数--10个提供

我在这里做错了什么想法?

1 个答案:

答案 0 :(得分:3)

以下版本适用于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()