【发布时间】:2013-05-10 10:24:20
【问题描述】:
为了对带有std::tuple 构造函数的类进行单元测试,我想生成一个特殊情况的样本以及构造函数参数的随机值。假设我有一个std::tuple 的std::vector<T1> 到std::vector<Tn>,(其中每个Ti 都不同)如何将其转换为所有std::tuple<T1, ..., Tn> 组合的完整笛卡尔积的std::vector?
具体来说,我想要一个看起来像这样的可变参数函数模板:
template<typename... Args>
std::vector<std::tuple<Args...> cartesian_product(std::vector<Args>...)
{
// template magic or fat mulitple loops?
}
并且可以这样使用:
// some type to be tested
class MyType
{
MyType(std::tuple<int, bool, std::string>);
// bla
};
// test values for each constructor argument
std::tuple< std::vector<int>, std::vector<bool>, std::vector<std::string> > input {
{ 1, 2, 3}, { false, true}, { "Hello", "World"}
};
// should become 3 x 2 x 2 = 12 cases { {1, false, "Hello"}, ... , {3, true, "World"} }
std::vector< std::tuple<int, bool, std::string> > test_cases = cartesian_product( input );
// can write flat single loop over all cases
for (auto t: test_cases) {
BOOST_CHECK(MyType(t).my_test());
}
是否有任何 (Boost) 库可以开箱即用地执行此操作?为此编写可变参数模板的参与程度如何?
【问题讨论】:
-
@zch 太好了,我什至浏览了那个,但不知何故,它看起来不像完整的通用解决方案,而是“仅”一个用于 2 参数情况。很抱歉错过了这一点(看起来很简单!)。
-
很笼统,我会在示例中添加三维以使其更清晰(即使在那里的评论中提到过)。
-
@zch 我测试了它,它完全符合我的要求。真的很酷的把戏。
标签: c++ c++11 vector tuples cartesian-product