Здравствуйте, Erop, Вы писали:
E>>>С другой стороны это дело довольно элементарно обходится, например так: class ZZZ {
EP>>можно намного проще:
E>Это ++11, но тут это не суть.
Кроме in-class initialization, что там C++11?
E>Суть в том, что access публикует потроха, "для всех", а через спец. структуру мы публикуем только для тех, кто эту структуру строит => легко найти весь тесно связанный с потрохами код
Спец структуру/функцию, которая будет давать доступ, можно сделать и в моём случае — я же сказал, "сахар по вкусу". А разница в том, что не надо пробрасывать каждое поле вручную.
Да и .access() — тоже легко найти.
Здравствуйте, Evgeny.Panasyuk, Вы писали:
EP>Кроме in-class initialization, что там C++11?
Оно самое.
EP>Спец структуру/функцию, которая будет давать доступ, можно сделать и в моём случае — я же сказал, "сахар по вкусу". А разница в том, что не надо пробрасывать каждое поле вручную.
EP>Да и .access() — тоже легко найти.
Да, это я тупанул. Не заметил, что ты приватные поля в структуру собрал. Так, конечно, тое можно, если мы только свои поля публикуем.
Все эмоциональные формулировки не соотвествуют действительному положению вещей и приведены мной исключительно "ради красного словца". За корректными формулировками и неискажённым изложением идей, следует обращаться к их автором или воспользоваться поиском
Здравствуйте, Erop, Вы писали:
E>Ну это же просто обход дырки в языке/компиляторе, а не систематический подход?
А вот ещё вариант когда реально нужен friend: intrusive_ptr.
Аналогично операторам вывода в поток используется ADL для выбора нужной ф-ции intrusive_ptr_add_ref/release. И если в случае с выводом в поток действительно можно обойтись public функцией типа print, то add_ref/release желательно закрыть.
class foo
{
private:
friend void intrusive_ptr_add_ref(foo* obj) {}
friend void intrusive_ptr_release(foo* obj) {}
};
Здравствуйте, Evgeny.Panasyuk, Вы писали:
EP>То есть теперь "доказательство" вредности исключений строится не на том что "goto = зло", exceptions похожи на goto, exceptions = зло, а на том что "non-local-control-flow = зло" ...? То же самое только в профиль
Здесь сложно что-то "доказать", речь о стиле и опыте. Человек проще воспринимает локальные конструкции. В своё время именно переход от GOTO к осмысленным IF, WHILE, etc сильно упростил промышленное программирование. Потом придумали threads и exceptions и стало всё как раньше =)
Предпочтение к локальным конструкциям улучшает структурность программы, её поддерживаемость и модифицируемость. Это также облегчает анализ и трансформации в бэкенде компилятора.
EP>Например, со-процедуры зло? А ведь они "мощнее" исключений, так как позволяют прыгать по стэку и вверх и вниз. И да — некоторые задачи отлично выражаются в терминах сопроцедур. Или другой пример — async/await из последнего C#, которые стали одной из любимых фишек шарпистов. Самый обыкновенный non-local-control-flow. Так что — тоже зло?
Я не люблю спорить на эти темы. Здесь я всё излагаю довольно ясно, кмк:
http://rsdn.ru/forum/philosophy/5109064.1Автор: Tilir
Дата: 22.03.13