提问人:ajl123 提问时间:7/18/2023 最后编辑:ajl123 更新时间:7/18/2023 访问量:108
使用模板元编程在 C++ 中生成组合列表的最简单方法是什么?
What's the easiest way to generate a list of combinations in C++ using template meta-programming?
问:
我找到了SO帖子:在C++中生成组合列表的最简单方法是什么?,它告诉我们如何在运行时生成大小为真/假元组的所有可能组合的列表。N
但是,如果我们知道,我在编译时也有同样的问题。我们将如何使用模板递归进行模板元编程?假设在编译时已知,并且唯一的值是 或 。N
N
true
false
重述主要问题:“通常,您会遇到一个问题,其中属性 A 可以是真或假,属性 B 也可以是真或假,依此类推。我们想测试A为真而B为假的每个组合,依此类推。
// Say N is 3, then the following tuple of booleans would be generated
[true,true,true]
[true,true,false]
[true,false,true]
[true,false,false]
[false,true,true]
[false,true,false]
[false,false,true]
[false,false,false]
可能的函数签名可能如下所示:
template <std::size_t N>
constexpr auto boolean_combinations()
如果可能,我想使用 C++ 17 或更高版本来执行此操作。
答:
4赞
Nelfeal
7/18/2023
#1
在 C++ 17 中,您不需要模板元编程。一个函数可以做到这一点:constexpr
#include <array>
auto constexpr pow2(std::size_t exponent) -> std::size_t {
return exponent == 0 ? 1 : 2 * pow2(exponent - 1);
}
template<std::size_t N>
constexpr auto boolean_combinations() {
static_assert(N < sizeof(std::size_t));
std::array<std::array<bool, N>, pow2(N)> list{}; // initialization needed in C++17
for (auto i = 0; i < list.size(); ++i) {
for (auto j = 0; j < N; ++j) {
list[i][j] = static_cast<bool>(i & (1 << j));
}
}
return list;
}
评论
0赞
ajl123
7/18/2023
哦,生病了!但是,是否可以使用 C++17 做到这一点?
0赞
Nelfeal
7/18/2023
@ajl123 查看编辑。在 C++14 中,它会有点复杂。
评论
views::cartesian_product
std::integer_sequence
integer_sequence
bool