cpp-ru / ideas

Идеи по улучшению языка C++ для обсуждения
https://cpp-ru.github.io/proposals
Creative Commons Zero v1.0 Universal
89 stars 0 forks source link

Дизайн предложения метаклассы #363

Open apolukhin opened 3 years ago

apolukhin commented 3 years ago

Перенос предложения: голоса +7, -1 Автор идеи: Игорь Шаповал

Сделать более красивее синтаксис метаклассов

В текущем предложении по метаклассам одобрен синтаксис

constexpr void interface(meta::type target, meta::type source) {
   ...
}

Сдесь не понятно. Это функция или метакласс? Подобная ситуация с terse syntax для концептов: это тип или концепт? Поскольку метакласс - это сущность времени компиляции, то следующий синтаксис более выразителен

constexpr class interface {
   ...
}

Не нужно добавлять новые слова. Насчет source и target, то лучше ввести два ключевые слова in, out на подобие this. Или сделать встроенные объекты: target, source, compiler.

for (auto f : in.functions()) {
   if (f.is_copy() || f.is_move()) {
        compiler.error("this type may not have a copy or move function" , f);
   }
} 

И определение сделать проще и естествение. Вместо

class(interface) Shape { ... };

Сделать вот так

interface Shape { ... };

Этот синтаксис на много лучше. Но пока, рефлексия и кодогенерация не будет принята, окончательный синтаксис метаклассов будет менятся.

apolukhin commented 3 years ago

Александр Коновалов, 9 октября 2018, 0:42 В данном подходе мне только не нравится наличие "магических" in, out и compiler. В их получении думаю логичне было бы опереться на синтаксис рефлексий. Или пойти по пути type_info, т.е. что-нибудь вроде:

for (auto f : metainfo(interface).in.functions()) {
   if (f.is_copy() || f.is_move()) {
        metainfo(interface).compiler.error("this type may not have a copy or move function" , f);
   }
} 

Таким образом, будет консистентно с typeid, sizeof и другими ключевыми словами с подобным синтаксисом.

Alexander, 9 октября 2018, 8:31 Саттер на презентации говорил, что предложение ещё будет меняться. В том числе и синтаксис обьявления метаклассов. Так что вариант, который есть сейчас, далеко не финальный