我们的C ++ 17代码库中有一个宏,内容为:
#define APOT_DEF(Type, Member) alignas(NextPow2(sizeof(Type))) Type Member
是否可以在不使用宏的情况下在现代C ++中实现相同的功能?
函数或函数与类型的组合是否可以完成此任务?
答案 0 :(得分:1)
无法完美替换。问题是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;