如何用现代C ++重写此宏?

时间:2019-03-14 05:49:24

标签: c++ macros refactoring porting

我们的C ++ 17代码库中有一个宏,内容为:

#define APOT_DEF(Type, Member) alignas(NextPow2(sizeof(Type))) Type Member

是否可以在不使用宏的情况下在现代C ++中实现相同的功能?

函数或函数与类型的组合是否可以完成此任务?

1 个答案:

答案 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;