Стандартизовать properties

mezastel
mezastel

Сейчас уже почти на всех компиляторах можно использовать properties, например

struct foo
{
  int n;
  int get_n() const { return n; }
  void set_n(int value) { n = value; }
  __declspec(property(get=get_n,put=set_n)) int n;
}

// usage
foo f{};
f.n = 123; // calls f.set_n(123);

Предлагаю это как-то оформить в языковую фичу, например чтобы можно было просто писать property int n; а member functions искать подходом convention over configuration (т.е. дефолтные имена).

-9
рейтинг
9 комментариев
yndx-antoshkka
Лично мне жутко не нравятся свойства, так как они скрывают вызов функции и в лучшем случае заставляют печатать на 1 символ больше:

class foo {
int n_;
public:
int n() const { return n_; }
void n(int value) { n_ = value; }
};

// usage
foo f{};
f.n(123); // на 1 символ короче
yndx-antoshkka
Anatoly Scheglov
yndx-antoshkka, свойства полезны как ad-hoc средство отладки. Обычное поле можно заменить на свойство и логировать/делать ассёрты на его чтение/запись.
Anatoly Scheglov
Andrey Davydov
Anatoly Scheglov, для отладки можно воспользоваться таким трюком stackoverflow.com/a/5924594
Andrey Davydov
mezastel
Andrey Davydov, пример, приведенный на StackOverflow это, извините, трэш тотальный. Должны работать простые присваивания, например `foo.x = bar`, а доступ должен быть через `foo.x` а не `foo.x()` что собственно уже можно получить в обычном С++
mezastel
Andrey Davydov
mezastel, для пользователя класса Foo работают простое присваивание foo.x = bar и доступ foo.x
Andrey Davydov
dix75
Весьма полезная вещь, особенно если ты пишешь не только на с++ и портируешь из других языков в с++
dix75
yndx-antoshkka
dix75, под этим предлогом можно в C++ притащить очень много сомнительных вещей: монады, сборщик мусора, интерпритируемость языка, нестрогую типизацию, synchronized(this)...

А для тех, кто переписывает с Перла, можно ещё добавить \\, ~~, =>{}, @_, $@, $_, qw//
yndx-antoshkka
mrgordonfreman
dix75, а как подход convention over configuration будет совместим со старым кодом? Если случайно у меня имя поля и функция-сеттер были названы в соответствии с правилами новой фичи, то при обращении к такому полю в деталях реализации внезапно начнет вызываться сеттер?
mrgordonfreman
maxf1312
Поставил минус, несмотря на то, что нередко пользуюсь обертками COM, которые генерирует MS Visual Studio через директиву import.

Сам предпочитаю пару методов в стиле:
int n() const;
void n(int n);
Если бы это было в языке - нужно было бы обязательно прописывать селекторы и модификаторы, т.к. соглашение по умолчанию не подойдет - очень много старого кода существует, обязательно будут коллизии имен.
maxf1312
Другие идеи
Группа создана, чтобы собирать предложения к стандарту C++, организовывать их внутренние обсуждения, помогать готовить их для отправки в комитет и защищать на общих собраниях в рабочей группе по С++ Международной организации по стандартизации (ISO).