爲了使用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());
}
是否有任何(升壓)庫那可以做到這個開箱即用?如何爲此寫入可變參數模板?
@zch很棒,我甚至瀏覽過那個,但不知怎的,它看起來並不像完整的通用解決方案,而是「僅」一個用於2個參數的情況。對不起,錯過了(這看起來很簡單!)。 – TemplateRex
這是一般性的,我會增加第三維作爲例子,使其更清晰(即使它在評論中提到)。 – zch
@zch我測試了它,它完全符合我的要求。真的很酷的把戲。 – TemplateRex