假设我有3个bool类型的值
bool canwalk=true;
bool cantalk=false;
bool caneat=false;
我想设置一个表示三者的位集
std::bitset<3> foo;
如何使用布尔值构造bitset?
我想做这样的事情
std::bitset<3> foo(canWalk,cantalk,caneat); //giving me 100
解决方法:
按照Shivendra Agarwal的例子,但是使用接收unsigned long long的构造函数,我提出了以下可变参数模板函数(更通用)
template <typename ... Args>
unsigned long long getULL (Args ... as)
{
using unused = int[];
unsigned long long ret { 0ULL };
(void) unused { 0, (ret <<= 1, ret |= (as ? 1ULL : 0ULL), 0)... };
return ret;
}
允许foo初始化如下
std::bitset<3> foo{ getULL(canwalk, cantalk, caneat) };
这仅适用于std :: bitset的维度不是无符号长long中的位数(使用3 whe肯定是安全的)的大小.
以下是一个完整的工作示例
#include <bitset>
#include <iostream>
template <typename ... Args>
unsigned long long getULL (Args ... as)
{
using unused = int[];
unsigned long long ret { 0ULL };
(void) unused { 0, (ret <<= 1, ret |= (as ? 1ULL : 0ULL), 0)... };
return ret;
}
int main()
{
bool canwalk=true;
bool cantalk=false;
bool caneat=false;
std::bitset<3> foo{ getULL(canwalk, cantalk, caneat) };
std::cout << foo << std::endl;
}