如何在现代C ++中重写这个宏?

问题描述 投票:1回答:1

我们在C ++ 17代码库中有一个宏,它说:

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

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

功能或功能和类型的组合能够实现这一目标吗?

c++ macros refactoring porting
1个回答
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;
© www.soinside.com 2019 - 2024. All rights reserved.