假设我有两个 mpl 列表,例如
typedef boost::mpl::list<int, double> inner_types;
typedef boost::mpl::list<std::vector, std::set> outer_types;
我希望能够在 boost 单元测试中迭代这些列表的笛卡尔积并从每个组合构造一个对象......如下所示:
BOOST_TEST_CASE_TEMPLATE(mytest, InnerType, inner_types, OuterType, outer_types) {
OuterType<InnerType> obj;
BOOST_CHECK(ns::foo(obj));
}
但在使用 _TEMPLATE 作为 boost 测试用例时,您似乎只能有一个 mpl 列表。有办法实现我的目的吗?
最佳答案
您可以使用类似于this的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;
}
如果由于某种原因您无法使用 Boost MP11,您可以使用可变参数模板自行编写一个手动解决方案来创建类似于 the one I have written here 的别名 TypeList
.
关于c++ - boost 单元测试 mpl 列表的笛卡尔积,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/67894815/