gpt4 book ai didi

C++11 检查标志的方法

转载 作者:太空宇宙 更新时间:2023-11-03 10:28:04 24 4
gpt4 key购买 nike

典型的 C 风格方法:

#define LOG_ERRORS            1  // 2^0, bit 0
#define LOG_WARNINGS 2 // 2^1, bit 1
#define LOG_NOTICES 4 // 2^2, bit 2
#define LOG_INCOMING 8 // 2^3, bit 3
#define LOG_OUTGOING 16 // 2^4, bit 4
#define LOG_LOOPBACK 32 // and so on...

// Only 6 flags/bits used, so a char is fine
unsigned char flags;

// initialising the flags
flags = LOG_ERRORS;

//initialising to multiple values with OR (|)
flags = LOG_ERRORS | LOG_WARNINGS | LOG_INCOMING;
// sets to 1 + 2 + 8 i.e. bits 0, 1 and 3

// testing for a flag
// AND with the bitmask before testing with ==
if ((flags & LOG_WARNINGS) == LOG_WARNINGS)
...

// testing for multiple flags
// as above, OR the bitmasks
if ((flags & (LOG_INCOMING | LOG_OUTGOING))
== (LOG_INCOMING | LOG_OUTGOING))
...

在 C++11 中是否有更好的方法来保留旧的 C 风格接口(interface)(LOG_INCOMING | LOG_OUTGOING)?即我怎样才能摆脱检查设置了哪些位的“丑陋”方式?

我一直在查看 std::bitset 但后者仅测试位置查询(即例如它可以测试是否设置了第 3 位)并且不能测试这样的东西:

  LOG_INCOMING | LOG_OUTGOING

最佳答案

我会用 static const int 替换您的宏(好吧,或者一个带有显式值的 enum),但除此之外您的实现就很好。

你不应该仅仅因为你可以用一些新的模板怪物来替换好的、可靠的、健壮的、清晰的、自文档化的、简洁的、可靠的代码。

您的代码足够现代,而且这种模式仍在广泛使用。

关于C++11 检查标志的方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26665542/

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