Цель состоит в том, чтобы контролировать, каким типам пользователей разрешено выполнять какие операции на уровне пользовательского интерфейса.Этот код был на месте некоторое время;Я просто хочу немного улучшить это.Файл, который я пытаюсь улучшить, вероятно, должен быть сгенерирован автоматически, но это было бы слишком большим изменением, поэтому я ищу более простое решение.
Файл, который мы назовем PermissionBits.h
, имеет кучуиз них:
// Here names are mangled; for example XYZ_OP_A is:
// permission to operation A in category/context XYZ
// SCU64 = static const unsigned __int64
// Some namespaces utilize all 64 bits
// The actual values (as long as they are proper bit fields)
// do not matter - they are always used by name
namespace XYZPermissionBits
{
SCU64 XYZ_OP_A = 1UI64 << 0; // 1 = 0x0000000000000001
SCU64 XYZ_OP_B = 1UI64 << 1; // 2 = 0x0000000000000002
SCU64 XYZ_OP_C = 1UI64 << 2; // 4 = 0x0000000000000004
SCU64 XYZ_OP_C = 1UI64 << 3; // 8 = 0x0000000000000008
SCU64 XYZ_OP_D = 1UI64 << 4; // 16 = 0x0000000000000010
SCU64 XYZ_OP_E = 1UI64 << 5; // 32 = 0x0000000000000020
SCU64 XYZ_OP_F = 1UI64 << 6; // 64 = 0x0000000000000040
SCU64 XYZ_OP_G = 1UI64 << 7; // 128 = 0x0000000000000080
SCU64 XYZ_OP_H = 1UI64 << 8; // 256 = 0x0000000000000100
SCU64 XYZ_OP_I = 1UI64 << 9; // 512 = 0x0000000000000200
SCU64 XYZ_OP_J = 1UI64 << 10; // 1024 = 0x0000000000000400
SCU64 XYZ_OP_K = 1UI64 << 11; // 2048 = 0x0000000000000800
SCU64 XYZ_OP_L = 1UI64 << 12; // 4096 = 0x0000000000001000
}
Даже с помощью ярлыка 1UI64 << <numBits>;
все еще есть проблемы, так как кодеры создают флаги с дублирующимися значениями, делают опечатки и т. д.
В идеале я хотел бымакрос, который может быть красиво отформатирован и выглядеть следующим образом:
BITFIELDS_FOR_NAMESPACE(
//*************** <<== I want to make the namespace name more vivid
XYZPermissionBits,
//*************** <<== somehow if that is possible. It is not a must-have.
XYZ_OP_A, // Being able to add a comment here would be nice, but not critical
XYZ_OP_B,
XYZ_OP_C,
XYZ_OP_D,
XYZ_OP_E,
XYZ_OP_F,
XYZ_OP_G,
XYZ_OP_H,
XYZ_OP_I,
XYZ_OP_J,
XYZ_OP_K,
XYZ_OP_L
)
Я бы хотел, чтобы этот макрос был гибким и не позволял мне вводить менее 2 или более 65 аргументов - имя пространства имен + 64 флага.Можно ли делать то, что я хочу, или близко к этому, или я должен прибегнуть к сгенерированному коду?Какой еще совет ты имеешь?