gpt4 book ai didi

c++ - 使用带有 bitset 的 initializer_list

转载 作者:行者123 更新时间:2023-11-30 01:43:23 25 4
gpt4 key购买 nike

有没有办法使用 initializer_list 构建一个 bitset

例如我想做的:

const auto msb = false;
const auto b = true;
const auto lsb = false;
const bitset<3> foo = {msb, b, lsb};

但是当我尝试这个时,我得到:

error: could not convert {msb, b, lsb} from '<brace-enclosed initializer list>' to const std::bitset<3u>

我是否必须使用类次来构建 unsigned long初始化 foo ,或者有什么我不知道的方法可以做到这一点?

最佳答案

没有构造函数可以直接从初始化列表构造位集。你需要一个函数:

#include <bitset>
#include <initializer_list>
#include <iostream>

auto to_bitset(std::initializer_list<bool> il)
{
using ul = unsigned long;
auto bits = ul(0);
if (il.size())
{
auto mask = ul(1) << (il.size() - 1);

for (auto b : il) {
if (b) {
bits |= mask;
}
mask >>= 1;
}
}
return std::bitset<3> { bits };

}

int main()
{
auto bs = to_bitset({true, false, true});

std::cout << bs << std::endl;
}

预期结果:

101

如评论中所述,可变版本也是可能的。

#include <bitset>
#include <iostream>
#include <utility>

namespace detail {
template<std::size_t...Is, class Tuple>
auto to_bitset(std::index_sequence<Is...>, Tuple&& tuple)
{
static constexpr auto size = sizeof...(Is);
using expand = int[];
unsigned long bits = 0;
void(expand {
0,
((bits |= std::get<Is>(tuple) ? 1ul << (size - Is - 1) : 0),0)...
});
return std::bitset<size>(bits);
}
}

template<class...Bools>
auto to_bitset(Bools&&...bools)
{
return detail::to_bitset(std::make_index_sequence<sizeof...(Bools)>(),
std::make_tuple(bool(bools)...));
}

int main()
{
auto bs = to_bitset(true, false, true);

std::cout << bs << std::endl;
}

关于c++ - 使用带有 bitset 的 initializer_list,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37945207/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com