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

Игорь Шаповал
Игорь Шаповал

Каждый компилятор имеет набор специфичных для него набор атрибутов. В С++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,
   ...
}

 

 

6
рейтинг
8 комментариев
Andrey

В C++17 Ваш пример класcа `student` совершенно валидный, так что все что Вы хотите разрешено уже сейчас.

Andrey
Игорь Шаповал

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

Игорь Шаповал
Обновлено 
dreverser

Игорь Шаповал, зачем геттеры и сеттеры ?  сделайте поля паблик

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

dreverser
yndx-antoshkka

Начиная с C++17 можно писать любые свои атрибуты, но вот навесить на них функционал просто так не получится.

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

yndx-antoshkka
Саша Зайцев

yndx-antoshkka, как вариант для своего функционала советую написать свои плагины для Clang-Tidy, который будет опираться на кастомные атрибуты.

Саша Зайцев
Fihtangolz

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

Fihtangolz
yndx-antoshkka

Всё будет, но не в C++20. Я немного обмолвился об этом вот тут

yndx-antoshkka
asschool

Нужны метаклассы а не вот это вот

 

asschool
Другие идеи
Группа создана, чтобы собирать предложения к стандарту C++, организовывать их внутренние обсуждения, помогать готовить их для отправки в комитет и защищать на общих собраниях в рабочей группе по С++ Международной организации по стандартизации (ISO).
Все предложения