增强单元测试 mpl 列表的笛卡尔积

boost unit test cartesian product of mpl list

假设我有两个 mpl 列表,比方说

typedef boost::mpl::list<int, double> inner_types;
typedef boost::mpl::list<std::vector, std::set> outer_types;

我希望能够在提升单元测试中迭代这些列表的笛卡尔积并从每个组合构造一个对象..类似于以下内容:

BOOST_TEST_CASE_TEMPLATE(mytest, InnerType, inner_types, OuterType, outer_types) {
    OuterType<InnerType> obj;

    BOOST_CHECK(ns::foo(obj));
}

但在使用 _TEMPLATE 进行提升测试用例时,您似乎只能有一个 mpl 列表。有什么办法可以达到我的目的吗?

您可以使用类似于 Boost MP11 来合并 将两个列表 合并为一个笛卡尔积,如下所示

#include <boost/mp11.hpp>

template <template <typename...> typename... F>
using mp_list_q = boost::mp11::mp_list<boost::mp11::mp_quote<F>...>;

using outer_types = mp_list_q<std::vector, std::set>;
using inner_types = boost::mp11::mp_list<int, double>;

using TypeList = boost::mp11::mp_product<boost::mp11::mp_invoke_q,  
                                         outer_types, 
                                         inner_types>;

本例中TypeList corresponds to:

boost::mp11::mp_list<std::vector<int>, std::vector<double>, std::set<int>, std::set<double>>

这可以在类型化单元测试中使用,如下所示:

BOOST_TEST_CASE_TEMPLATE_FUNCTION(foo_test, T) {
  BOOST_TEST(ns::foo(T{}) == true);
}

boost::unit_test::test_suite* init_unit_test_suite(int, char* []) {
  boost::unit_test::framework::master_test_suite().add(BOOST_TEST_CASE_TEMPLATE(foo_test, TypeList));
  return EXIT_SUCCESS;
}

Try it here!


如果由于某种原因您不能使用 Boost MP11,您可以自己编写一个带有可变参数模板的手动解决方案来创建类似于 的别名 TypeList