我们在C ++ 17代码库中有一个宏,它说:
#define APOT_DEF(Type, Member) alignas(NextPow2(sizeof(Type))) Type Member
是否可以在不使用宏的情况下在现代C ++中实现相同的功能?
功能或功能和类型的组合能够实现这一目标吗?
它不能完美替代。问题是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
本身可以使用,但它不是一个替代品。将有实例(大多数涉及类型推导),其中转换为Type
glvalue不会触发。
因此,如果成员的确切类型对您很重要,我会坚持使用宏。然而,我会稍微改变它,使声明稍微更多“C ++”而不是包装C ++的DSL。我用这个宏:
#define APOT_ALIGNED(Type) alignas(NextPow2(sizeof(Type))) Type
所以变量声明至少会有声明的形式:
APOT_ALIGNED(Type) member;