我们在C ++ 17代码库中有一个宏,它说:
是否有可能在没有…的现代C ++中实现相同的功能
它不能完美替代。问题在于 alignas 属性只能在两个地方应用。对(成员)可变的声明,或对类型的声明。所以潜在的替代品可能是这样的:
alignas
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 本身可以使用,但它不是替代品。将有转换为a的实例(大多数涉及类型扣除) Type glvalue不会触发。
APOT_DEF(Type, Member)
ApotDef<Type> Member;
ApotDef<Type>
Type
因此,如果成员的确切类型对您很重要,我会坚持使用宏。然而,我会稍微改变它,使声明稍微更多“C ++”而不是包装C ++的DSL。我用这个宏:
#define APOT_ALIGNED(Type) alignas(NextPow2(sizeof(Type))) Type
所以变量声明至少会有声明的形式:
APOT_ALIGNED(Type) member;