Какие идиомы С++ должны использовать программисты на С++?

Какие идиомы С++ должны знать программисты на С++?

Под идиомами C++ я подразумеваю шаблоны проектирования или способ выполнения определенных действий, которые применимы только для C++ или более применимы для C++, чем для большинства других языков.

Почему следует использовать идиомы и что они делают?


person Partial    schedule 18.11.2009    source источник
comment
Все, что применимо к C++, обычно применимо и к другим языкам (поскольку C++ охватывает множество различных стилей программирования).   -  person Martin York    schedule 19.11.2009
comment
Можете ли вы сделать RAII и PIMPL на стольких других языках?   -  person Partial    schedule 19.11.2009
comment
@Partial: RAII да, просто в C++ это более естественно, чем в большинстве языков.   -  person Georg Fritzsche    schedule 19.11.2009
comment
В голову не пришло, да. Perl (старый злой язык поддерживает и то, и другое, если вы умеете делать объектно-ориентированные программы в Perl). Я был бы удивлен, если бы почти каждый язык OO поддерживал оба из них (хотя для RAII требуется язык OO без GC (предположительно, Smalltalk поддержал бы его (хотя я точно не знаю об этом)).   -  person Martin York    schedule 19.11.2009
comment
Для этого вам не нужны языки, отличные от GC, см., например. C# и общий using(A a = new A()) { ... } с использованием IDisposable.   -  person Georg Fritzsche    schedule 19.11.2009
comment
Например, вы можете использовать RAII в Python с операторами with. Просто RAII не применяется автоматически к каждой переменной.   -  person    schedule 19.11.2009
comment
@гф. Истинный. Но это только лучше, чем использование try {} catch {} finally {} для реализации RAII. RAII не должен требовать никаких действий со стороны пользователя объекта. Что C++ удалось сделать с RAII, так это возложить ответственность за правильное использование на разработчика класса, а не на пользователя класса.   -  person Martin York    schedule 19.11.2009
comment
@Martin: Хороший вопрос, почему-то я не думал о принудительном исполнении на стороне дизайна как об атрибуте RAII.   -  person Georg Fritzsche    schedule 19.11.2009
comment
Я бы не считал операторы использования С# примером RAII. Проблема в том, что вы по-прежнему не можете позволить объекту управлять ресурсом, что и является целью RAII, вам все равно придется делать это вручную, когда вы создаете объект, вы просто получаете некоторый синтаксический сахар для сделать так, чтобы это выглядело красивее.   -  person jalf    schedule 01.12.2009
comment
Объект по-прежнему управляет ресурсами, которыми он владеет, а using управляет объектом.   -  person Pavel Minaev    schedule 01.12.2009


Ответы (7)


Вот один из списка. Если бы мне нужно было выбрать пару, я бы выбрал любопытно повторяющийся шаблон шаблона или виртуальные конструкторы.

person Duck    schedule 18.11.2009
comment
Отличный список, с которым я часто консультируюсь; однако Curiously recurring Template был бы очень низким в моем списке, поскольку это то, что должен знать каждый программист C++. - person Elemental; 19.11.2009
comment
@Элементаль - Согласен. Возможно, я неправильно понял вопрос, но я думал, что в нем упоминается однозначно С++, и CRTP, похоже, подходит в этом отношении. - person Duck; 19.11.2009

На сегодняшний день наиболее важным «шаблоном», который необходимо изучить и узнать и который (почти) уникален для C++, является RAII (Приобретение ресурсов является инициализацией).

Изменить: (Чтобы ответить на дополнительный вопрос, отредактированный в вопросе). Вы используете RAII в первую очередь для (полу-) автоматизации управления ресурсами. Наиболее очевидным применением является освобождение ресурсов, принадлежащих объектам, когда объекты-владельцы выходят за рамки, например освобождение памяти или закрытие файлов.

person Jerry Coffin    schedule 18.11.2009
comment
+1. К сожалению, также идиома с худшим названием. - person the_mandrill; 19.11.2009
comment
Не поймите меня неправильно, это одна из самых важных функций в C++, но она даже близко не уникальна для C++. Хотя C++ сделал его известным. - person Martin York; 19.11.2009
comment
Я думаю, дело не в вещах, которые уникальны для C++; скорее, речь идет о вещах, которые однозначно вездесущи в C++; что-то, без знания чего вы не можете обойтись, что, возможно, вы могли бы сделать в некоторых других языках. RAII определенно был бы такой вещью. - person Pavel Minaev; 19.11.2009
comment
Согласитесь, RAII очень важен в C++, так как интеллектуальные указатели являются его неотъемлемой частью. - person Daniel Rodriguez; 19.11.2009
comment
В вопросе четко указано: вещи, которые применимы только для C++ - person Martin York; 19.11.2009
comment
@Martin: применимо только для C++ или более применимо для C++, чем для большинства других языков. - person Jerry Coffin; 19.11.2009
comment
RAII — это способ C++ реализации шаблона /релиза/. - person Luc Hermitte; 19.11.2009
comment
C++ сделал его известным, потому что утечки памяти не появляются в GC-языке, а память, безусловно, является наиболее очевидным ресурсом. К сожалению, это означает, что люди, которые не знают об этой идиоме, имеют проблемы с управлением подключениями к БД или сокетами и т. д. ... конструкция «использование», на мой взгляд, отстает, поскольку она возлагает бремя на КАЖДОГО пользователя, а не на единственного автора класса:/ - person Matthieu M.; 19.11.2009

PIMPL, также известный как P указатель на IMPL ementation?

person Dmitry    schedule 18.11.2009
comment
Я лично ненавижу это. :/ - person GManNickG; 19.11.2009
comment
Ну не надо его везде использовать :) - person Dmitry; 19.11.2009
comment
Технически вам необходимо использовать его где-либо. :-) - person James McNellis; 19.11.2009
comment
К сожалению, бинарная совместимость иногда важна, и это единственный практичный способ ее обеспечить. - person Pavel Minaev; 19.11.2009
comment
Это также значительно сокращает время компиляции (за счет уменьшения явных зависимостей), и бог знает, как от этого страдают программисты на C++! - person Matthieu M.; 19.11.2009
comment
С другой стороны, без длительного времени компиляции многие из нас не смогли бы проводить почти столько времени здесь, в StackOverflow. - person James McNellis; 19.11.2009
comment
@JamesMcNellis... Согласен: D - person Adri C.S.; 05.02.2013

Метапрограммирование шаблонов. Это здорово, потому что это в основном утиная типизация во время компиляции, поэтому вы получаете большую часть гибкости утиной печати со скоростью статической типизации.

person dsimcha    schedule 18.11.2009
comment
Утки нельзя записывать. - person greyfade; 19.11.2009
comment
+1 За утиную печать. Я всегда думал, что утиная печать — это версия SFINAE во время выполнения. - person Manu343726; 12.08.2013

Если вы хотите получить максимальную отдачу от STL, итераторы и функторы/объекты функций являются важными идиомами. Использование итераторов также неявно полагается на идиому «полуоткрытый диапазон».

person the_mandrill    schedule 18.11.2009
comment
Очень верно! Слышали ли вы о конструкторах последовательности и конструкторах преобразования? - person Partial; 19.11.2009
comment
Вы имеете в виду как iota()? Еще одно упущение в списке — это объекты-генераторы. - person the_mandrill; 19.11.2009
comment
Честно говоря, я не знаком с iota(), но я разместил ответ с примером. - person Partial; 20.11.2009

Использование строгой типизации и const правильности также чрезвычайно полезно.

Я также запрещаю конструкторы копирования по умолчанию и операторы присваивания. На самом деле я выхожу за рамки этого, но это самые распространенные. Думаю, жизнь была бы проще, если бы они не были неявными.

person justin    schedule 30.11.2009

RAII, COW, pimpl, закон Деметры (не уверен, что его можно отнести к идиомам), типичные черты и политика. (Однако COW и закон Деметры не ограничиваются C++)

person BostonLogan    schedule 19.11.2009
comment
Черты - это то, чего я больше нигде не видел (но опять же, я не искал так сильно). - person Martin York; 19.11.2009