Достало писать кучу boilerplate'а
От: Cyberax Марс  
Дата: 13.12.11 21:57
Оценка:
Достало писать кучу boilerplate'а.

В старом недобром С++03 нужно для классов было определять: копирующий констркутор, конструктор по умолчанию, оператор присваивания. Ещё терпимо. В С++11 сюда ещё добавился конструктор перемещения и оператор присваивания с перемещением. Уже достаёт — в классе из четырёх строчек получается строк 20 стандартного кода.

А ещё есть операторы сравнения и присваивания. Что есть хорошего, разумного, вечного для одоления этого недуга?

Заодно вечная проблема с дублирующимися методами:
  const std::string& get_str() const { return str_; }
  std::string& get_str() { return str_; }

тоже уже достала.
Sapienti sat!
Re: Достало писать кучу boilerplate'а
От: Хвост  
Дата: 13.12.11 22:07
Оценка: +1
Здравствуйте, Cyberax, Вы писали:

C>В старом недобром С++03 нужно для классов было определять

Не нужно, а можно. И если поведение должно отличаться от дефолтового, то что иначе как не писать код? Компиляторы других языков читают мысли программиста?
People write code, programming languages don't.
Re: Достало писать кучу boilerplate'а
От: DorfDepp  
Дата: 13.12.11 22:09
Оценка: :))) :)
Здравствуйте, Cyberax, Вы писали:

C>Достало писать кучу boilerplate'а.

C>Что есть хорошего, разумного, вечного для одоления этого недуга?

Есть Java, C# и другие удобные языки.

Через 3 недели как-никак 2012 год наступит. Кто еще пишет low-level в век, когда космические корабли бороздят просторы Большого Театра?
Re: Достало писать кучу boilerplate'а
От: dilmah США  
Дата: 13.12.11 22:11
Оценка:
в гугл-стайл большинство классов включают макрос DISALLOW_COPY_AND_ASSIGN или DISALLOW_EVIL_CONSTRUCTORS
Re[2]: Достало писать кучу boilerplate'а
От: Cyberax Марс  
Дата: 13.12.11 22:35
Оценка:
Здравствуйте, Хвост, Вы писали:

C>>В старом недобром С++03 нужно для классов было определять

Х>Не нужно, а можно. И если поведение должно отличаться от дефолтового, то что иначе как не писать код? Компиляторы других языков читают мысли программиста?
Да, я подразумеваю value-классы, понятное дело.
Sapienti sat!
Re[2]: Достало писать кучу boilerplate'а
От: Cyberax Марс  
Дата: 13.12.11 22:35
Оценка: +2 :)
Здравствуйте, dilmah, Вы писали:

D>в гугл-стайл большинство классов включают макрос DISALLOW_COPY_AND_ASSIGN или DISALLOW_EVIL_CONSTRUCTORS

Плевать на гугл-стайл.
Sapienti sat!
Re: Достало писать кучу boilerplate'а
От: Abyx Россия  
Дата: 13.12.11 22:41
Оценка: 47 (2)
Здравствуйте, Cyberax, Вы писали:

C>Достало писать кучу boilerplate'а.


C>В старом недобром С++03 нужно для классов было определять: копирующий констркутор, конструктор по умолчанию, оператор присваивания. Ещё терпимо. В С++11 сюда ещё добавился конструктор перемещения и оператор присваивания с перемещением. Уже достаёт — в классе из четырёх строчек получается строк 20 стандартного кода.


в С++11 добавили "=default;"

Что качается остального, единственный вариант — это переходить на другой язык. Или принять реальность такой какая она есть, и не писать сюда того что и без вас все знают. Да, все ненавидят С++, но юзают его потому что других вариантов-то сейчас нету.
In Zen We Trust
Re[2]: Достало писать кучу boilerplate'а
От: Cyberax Марс  
Дата: 13.12.11 23:08
Оценка:
Здравствуйте, Abyx, Вы писали:

C>>В старом недобром С++03 нужно для классов было определять: копирующий констркутор, конструктор по умолчанию, оператор присваивания. Ещё терпимо. В С++11 сюда ещё добавился конструктор перемещения и оператор присваивания с перемещением. Уже достаёт — в классе из четырёх строчек получается строк 20 стандартного кода.

A>в С++11 добавили "=default;"
Вот как раз то что нужно. Жаль, что в MSVC не поддерживается.
Sapienti sat!
Re: Достало писать кучу boilerplate'а
От: landerhigh Пират  
Дата: 13.12.11 23:14
Оценка:
Здравствуйте, Cyberax, Вы писали:

C>В старом недобром С++03 нужно для классов было определять: копирующий констркутор, конструктор по умолчанию, оператор присваивания. Ещё терпимо. В С++11 сюда ещё добавился конструктор перемещения и оператор присваивания с перемещением. Уже достаёт — в классе из четырёх строчек получается строк 20 стандартного кода.


А шо делать?

C>А ещё есть операторы сравнения и присваивания. Что есть хорошего, разумного, вечного для одоления этого недуга?


Visual Assist для генерации объявлений в хедере и заглушек реализации в *.cpp
Особенно удобно при подходе, кода одна пара *.h/*.cpp определяет один класс и имя класса совпадает с именем файла.
www.blinnov.com
Re[2]: Достало писать кучу boilerplate'а
От: Cyberax Марс  
Дата: 13.12.11 23:20
Оценка:
Здравствуйте, landerhigh, Вы писали:

C>>В старом недобром С++03 нужно для классов было определять: копирующий констркутор, конструктор по умолчанию, оператор присваивания. Ещё терпимо. В С++11 сюда ещё добавился конструктор перемещения и оператор присваивания с перемещением. Уже достаёт — в классе из четырёх строчек получается строк 20 стандартного кода.

L>А шо делать?
Набросал макросы пока что. Что-то типа такого получается:
struct point {
  int x, y;

  DEF_VALUE_OBJECT(point, (x)(y));
};
Sapienti sat!
Re[3]: Достало писать кучу boilerplate'а
От: landerhigh Пират  
Дата: 13.12.11 23:34
Оценка: +3
Здравствуйте, Cyberax, Вы писали:

L>>А шо делать?

C>Набросал макросы пока что. Что-то типа такого получается:
C>
C>struct point {
C>  int x, y;

C>  DEF_VALUE_OBJECT(point, (x)(y));
C>};
C>




Честно говоря, я лучше руками буду писать конструкторы.
www.blinnov.com
Re: Достало писать кучу boilerplate'а
От: Banned by IT  
Дата: 13.12.11 23:44
Оценка:
Здравствуйте, Cyberax, Вы писали:

C>В старом недобром С++03 нужно для классов было определять: копирующий констркутор, конструктор по умолчанию, оператор присваивания. Ещё терпимо. В С++11 сюда ещё добавился конструктор перемещения и оператор присваивания с перемещением.

А также добавился
= default;


C> Уже достаёт — в классе из четырёх строчек получается строк 20 стандартного кода.



C>А ещё есть операторы сравнения и присваивания. Что есть хорошего, разумного, вечного для одоления этого недуга?

= default


C>Заодно вечная проблема с дублирующимися методами:

C>
C>  const std::string& get_str() const { return str_; }
C>  std::string& get_str() { return str_; }
C>

C>тоже уже достала.

Ну тут извините, совершенно разное использование подразумевается. Неконстантный get_str это уже не геттер вовсе, он подразумевает что строку будут таким образом менять.
... << RSDN@Home 1.1.4 stable SR1 rev. 568>>
Re: Достало писать кучу boilerplate'а
От: night beast СССР  
Дата: 14.12.11 03:45
Оценка: +1
Здравствуйте, Cyberax, Вы писали:

C>А ещё есть операторы сравнения и присваивания. Что есть хорошего, разумного, вечного для одоления этого недуга?


дык известно что -- макросы.
ну, про =default уже писали.

C>Заодно вечная проблема с дублирующимися методами:

C>тоже уже достала.

макрос на объявление свойства.
Re: Достало писать кучу boilerplate'а
От: MasterZiv СССР  
Дата: 14.12.11 05:41
Оценка:
On 12/14/2011 01:57 AM, Cyberax wrote:

> В старом недобром С++03 нужно для классов было определять: копирующий

> констркутор, конструктор по умолчанию, оператор присваивания. Ещё терпимо. В
> С++11 сюда ещё добавился конструктор перемещения и оператор присваивания с
> перемещением. Уже достаёт — в классе из четырёх строчек получается строк 20
> стандартного кода.

Так это ж не в каждом классе нужно писать. И конструкторы, и операторы
присваивания нужно писать только там, где это реально нужно.
Posted via RSDN NNTP Server 2.1 beta
Re[3]: Достало писать кучу boilerplate'а
От: alsemm Россия  
Дата: 14.12.11 06:28
Оценка:
Здравствуйте, Cyberax, Вы писали:

C>
C>struct point {
C>  int x, y;

C>  DEF_VALUE_OBJECT(point, (x)(y));
C>};
C>

Я так понимаю, что DEF_VALUE_OBJECT разворачивается в частности в get_point/set_point. А зачем, если поля и так открыты для прямого доступа?
Re: Достало писать кучу boilerplate'а
От: alsemm Россия  
Дата: 14.12.11 06:30
Оценка:
Здравствуйте, Cyberax, Вы писали:

C>Заодно вечная проблема с дублирующимися методами:

C>
C>  const std::string& get_str() const { return str_; }
C>  std::string& get_str() { return str_; }
C>

Перегружать разные по логике методы — это диверсия.
Re[2]: Достало писать кучу boilerplate'а
От: Кодт Россия  
Дата: 14.12.11 09:51
Оценка:
Здравствуйте, alsemm, Вы писали:

A>Перегружать разные по логике методы — это диверсия.

Это не диверсия, а не более чем перверсия, родом из STL (см. begin(), end(), front(), back())

Её смысл — только в углублении константности.
У прямых членов-данных константность глубокая (константность хозяина влечёт константность элементов), у косвенных (включая вычисляемые) — поверхностная. Если хочется эмулировать глубокую константность для косвенных членов, приходится делать вот так.

Заметим, что в примере с get_str мы не снимаем константность, а накладываем, т.е. делаем более строгий контракт.
Предположительно, str_ объявлен как string& либо mutable string.
Перекуём баги на фичи!
Re: Достало писать кучу boilerplate'а
От: Masterkent  
Дата: 14.12.11 10:32
Оценка:
Cyberax:

C>Заодно вечная проблема с дублирующимися методами:

C>
C>  const std::string& get_str() const { return str_; }
C>  std::string& get_str() { return str_; }
C>

C>тоже уже достала.

Я собирался предложить комитету ввести параметризуемые cv-квалификаторы и соответствующий вывод аргументов в шаблонах

namespace std {

    enum const_qualification { non_const_q, const_q };
    enum volatile_qualification { non_volatile_q, volatile_q };

    template <class Container>
        using iterator_of =
            typename conditional<is_const<Container>{}, typename Container::const_iterator, typename Container::iterator>::type;

}


template <class T>
    class Vector
{
    using iterator = T *;
    using const_iterator = T const *;

    template <std::const_qualification cq>
        using iterator_type = std::iterator_of<Vector const<cq>>;

    template <std::const_qualification cq>
        iterator_type<cq> begin() const<cq>;

    const_iterator cbegin() const
    {
        return begin<std::const_q>();
    }

    template <std::const_qualification cq>
        T const<cq> &front() const<cq>;

    // ...
};

но пока не знаю, стоит ли.
Re[2]: Достало писать кучу boilerplate'а
От: night beast СССР  
Дата: 14.12.11 12:58
Оценка:
Здравствуйте, Masterkent, Вы писали:

M>Cyberax:


C>>Заодно вечная проблема с дублирующимися методами:

C>>
C>>  const std::string& get_str() const { return str_; }
C>>  std::string& get_str() { return str_; }
C>>

C>>тоже уже достала.

M>Я собирался предложить комитету ввести параметризуемые cv-квалификаторы и соответствующий вывод аргументов в шаблонах


M>    template <std::const_qualification cq>
M>        iterator_type<cq> begin() const<cq>;

M>но пока не знаю, стоит ли.

как то хрево выглядит. нам точно нужен именованный параметр?
что-нибудь вроде:
     iterator_type< Vector auto > begin() auto;
     T auto & front() auto;

не подойдет?
Re: Достало писать кучу boilerplate'а
От: о_О
Дата: 14.12.11 13:15
Оценка: 1 (1) +1 :)
Здравствуйте, Cyberax, Вы писали:

C>Достало писать кучу boilerplate'а.


C>Уже достаёт


C>тоже уже достала.


зачем?! зачем так мучать себя, когда есть Nemerle?!
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.