如何用现代 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;