cpp-ru / ideas

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

Написание пользовательских атрибутов #331

Open apolukhin opened 3 years ago

apolukhin commented 3 years ago

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

Каждый компилятор имеет набор специфичных для него набор атрибутов. В С++11 ввели синтаксис для атрибутов в стандарт и начали добавлять стандартные атрибуты.

Атрибуты в С++ подобны по механизма анотаций в языке Java. Следующие строки в языках одинаковые

@Deprecated
void test() {}

[[deprecated]]
void test() {}

Но в отличие от Java, нельзя реализовывать пользовательские атрибуты. Например, было бы не плохо добавить атрибуты setter/getter

class student{
private:
   [[using usr: setter, getter]]
   int id;

   [[using usr: setter, getter]]
   string name;

   [[using usr: setter, getter]]
   int age;
};

Для реализации пользовательских атрибутов, как вариант, добавить ключевое слово attribute

[[target(target_type::field)]]
attribute usr::setter(/*params*/) {
   /* logic */
}

Пользовательские атрибуты лучше объявлять в пользовательском namespace. И добавить мета-атрибут, который будет определять для кого этот атрибут

enum class target_type{
   local_variable,
   function,
   field,
   method,
   ...
}
apolukhin commented 3 years ago

Andrey, 23 июля 2018, 13:55 В C++17 Ваш пример класcа student совершенно валидный, так что все что Вы хотите разрешено уже сейчас.

Игорь Шаповал, 23 июля 2018, 14:31 При добавлении к полям класса атрибутов setter/getter компилятор сгенерирует методы установки и считывания. Нам не надо писать самому.

dreverser, 24 июля 2018, 13:05 Игорь Шаповал, зачем геттеры и сеттеры ? сделайте поля паблик

в гугле можно найти много споров на эту тему, но я так же согласен с тем что пустые геттеры и сеттеры не нужны

yndx-antoshkka, 23 июля 2018, 15:46 Начиная с C++17 можно писать любые свои атрибуты, но вот навесить на них функционал просто так не получится.

Сейчас идёт активная работа над рефлексией и кодогенерацией в C++. Как только работа завершится и попадёт в стандарт - можно будет наделять атрибуты каким-то занчением и действительно делать getter/setter. А до тех пор - придётся ждать :(

Саша Зайцев, 23 июля 2018, 17:16 yndx-antoshkka, как вариант для своего функционала советую написать свои плагины для Clang-Tidy, который будет опираться на кастомные атрибуты.

Fihtangolz, 3 августа 2018, 3:44 yndx-antoshkka, а шо слышно, есть инфа по метаклассам?, прупозал по текушей рефлексии отклонили?, добавят ли cod injection в constexpr блоки и будут ли они.

yndx-antoshkka, 6 августа 2018, 11:46 Всё будет, но не в C++20. Я немного обмолвился об этом вот тут

Айдар Фаттахов, 30 июля 2018, 18:17 Нужны метаклассы а не вот это вот