如何用现代 C++ 重写这个宏?
How could this macro be rewritten in modern C++?
我们的 C++17 代码库中有一个宏,上面写着:
#define APOT_DEF(Type, Member) alignas(NextPow2(sizeof(Type))) Type Member
是否可以在不使用宏的情况下在现代 C++ 中实现相同的功能?
函数或函数与类型的组合是否能够完成此任务?
无法完美替代。问题是 alignas
属性只能应用于两个地方。到(成员)变量的声明,或到 class 类型的声明。所以潜在的替代品可能是这样的:
template<typename Type>
struct alignas (NextPow2(sizeof(Type))) ApotDef {
Type mem;
operator Type& () & { return mem; }
operator Type const& () const& { return mem; }
operator Type&& () && { return std::move(mem); }
// Maybe for volatile?
};
所以每次出现的 APOT_DEF(Type, Member)
都可以替换为 ApotDef<Type> Member;
。这将允许 ApotDef<Type>
在许多相同的地方使用 Type
本身可以使用,但它不是替代品的下降。在某些情况下(大多数涉及类型推导)不会触发到 Type
泛左值的转换。
因此,如果成员的确切类型对您很重要,我会坚持使用宏。然而,我会稍微改变它,使声明稍微多一点 "C++" 而少一个包装 C++ 的 DSL。我会使用这个宏:
#define APOT_ALIGNED(Type) alignas(NextPow2(sizeof(Type))) Type
所以变量声明至少要有声明的形式:
APOT_ALIGNED(Type) member;
我们的 C++17 代码库中有一个宏,上面写着:
#define APOT_DEF(Type, Member) alignas(NextPow2(sizeof(Type))) Type Member
是否可以在不使用宏的情况下在现代 C++ 中实现相同的功能?
函数或函数与类型的组合是否能够完成此任务?
无法完美替代。问题是 alignas
属性只能应用于两个地方。到(成员)变量的声明,或到 class 类型的声明。所以潜在的替代品可能是这样的:
template<typename Type>
struct alignas (NextPow2(sizeof(Type))) ApotDef {
Type mem;
operator Type& () & { return mem; }
operator Type const& () const& { return mem; }
operator Type&& () && { return std::move(mem); }
// Maybe for volatile?
};
所以每次出现的 APOT_DEF(Type, Member)
都可以替换为 ApotDef<Type> Member;
。这将允许 ApotDef<Type>
在许多相同的地方使用 Type
本身可以使用,但它不是替代品的下降。在某些情况下(大多数涉及类型推导)不会触发到 Type
泛左值的转换。
因此,如果成员的确切类型对您很重要,我会坚持使用宏。然而,我会稍微改变它,使声明稍微多一点 "C++" 而少一个包装 C++ 的 DSL。我会使用这个宏:
#define APOT_ALIGNED(Type) alignas(NextPow2(sizeof(Type))) Type
所以变量声明至少要有声明的形式:
APOT_ALIGNED(Type) member;