Не может быть полностью заменено.Проблема в том, что атрибут alignas
можно применять только в двух местах.Для объявления (члена) varaible или для объявления типа класса.Таким образом, потенциальная замена может быть чем-то вроде этого:
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 ++" и меньше DSL, который оборачивает C ++.Я бы использовал этот макрос:
#define APOT_ALIGNED(Type) alignas(NextPow2(sizeof(Type))) Type
Таким образом, объявление переменной будет, по крайней мере, иметь форму объявления:
APOT_ALIGNED(Type) member;