Как можно переписать этот макрос в современном C ++? - PullRequest
1 голос
/ 14 марта 2019

В нашей кодовой базе C ++ 17 есть макрос, который говорит:

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

Можно ли добиться такой же функциональности в современном C ++ без использования макроса?

Может ли функция или комбинация функции и типа выполнить это?

1 Ответ

1 голос
/ 14 марта 2019

Не может быть полностью заменено.Проблема в том, что атрибут 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;
...