有没有在使用标志时使用有符号变量和无符号变量的“最佳实践”或习惯?个人会使用无符号变量,但我可以看到一些代码中甚至使用有符号变量来表示标志。我的意思是特别是在库接口中很重要。
更新:我不能接受“使用枚举”的答案,因为它是实现相关的,不能在库接口中使用。
更新:我不能接受“使用枚举”的答案,因为它是实现相关的,不能在库接口中使用。
#include <iostream>
#include <bitset>
using namespace std;
int main() {
std::bitset<4> flags;
flags.set(1);
flags.set(3);
std::cout << flags.to_string() << std::endl;
std::cout << flags.to_ulong() << std::endl;
return 0;
}
众所周知,标志(flags)始终是非负整数,但为什么要使用 int
/ unsigned int
/ short
/ unsigned short
来表示标志呢?应该使用 #define
,或者更好的方法是使用 enum
类型。
enum flags
{
FLAG0 = 0,
FLAG1 = 1,
FLAG2 = 2,
...
FLAGN = n
};
#define
。 - eerorika#define GENERATE_ENUM_FLAG_OPERATORS(enumType) \
inline enumType operator| (enumType lhs, enumType rhs) \
{ \
return static_cast<enumType>(static_cast<int>(lhs) | static_cast<int>(rhs)); \
} \
inline enumType& operator|= (enumType& lhs, const enumType& rhs) \
{ \
lhs = static_cast<enumType>(static_cast<int>(lhs) | static_cast<int>(rhs)); \
return lhs; \
} \
inline enumType operator& (enumType lhs, enumType rhs) \
{ \
return static_cast<enumType>(static_cast<int>(lhs) & static_cast<int>(rhs)); \
} \
inline enumType& operator&= (enumType& lhs, const enumType& rhs) \
{ \
lhs = static_cast<enumType>(static_cast<int>(lhs) & static_cast<int>(rhs)); \
return lhs; \
} \
inline enumType operator~ (const enumType& rhs) \
{ \
return static_cast<enumType>(~static_cast<int>(rhs)); \
}
使用方法:
enum Test
{
TEST_1 = 0x1,
TEST_2 = 0x2,
TEST_3 = 0x4,
};
GENERATE_ENUM_FLAG_OPERATORS(Test);
Test one = TEST_1;
Test two = TEST_2;
Test three = one | two;
std::underlying_type<enumType>::type
而不是 int。 - lisyarusauto three = Test(TEST_1 | TEST_2)
与默认运算符也非常配合。 - Nimfunction(TEST_1 | TEST_2)
与 function(Test(TEST_1 | TEST_2))
的区别。而且所有这些运算符都是内联的,在运行时不会产生任何开销。 - rozina
|
、&
和~
)一起使用。 - tmp