2012-02-16 2 views
19

Мне бы очень хотелось задать преднамеренно субъективный вопрос здесь, но у меня нет никого, кто мог бы задать это прямо ...C++: использовать auto или typedef?

Я пытаюсь «привести пример» в своей команде, приняв более современные концепции C++ в новом коде я пишу. Мои коллеги немного застенчивы от шаблонов и заставляют писать unique_ptr<Foobar> или shared_ptr<Foobar> вместо Foobar* при использовании некоторых классов, которые я недавно создал (фабричные методы возвращают unique_ptr и хранят списки этих объектов в векторах, используя shared_ptr).

Они скрутили мою руку и убедили меня напечатать их во что-то более легкое для ввода, например FoobarUniquePtr.

Но теперь я в беспорядке const-correctness с этими typedefs. Я должен был бы определить дополнительные typedefs для каждого типа const и non const, а const const_FoobarUniquePtr, похоже, не корректно выражает семантику const.

Итак, на мой вопрос, имеет ли смысл прекратить использование этих typedefs и вместо этого загружать auto у моих товарищей по команде, когда они жалуются на необходимость ввода шаблонных умных указателей? Я также открыт для других альтернатив.

+8

+1 за попытку заставить ваших сотрудников использовать более современные методы! – Nick

+0

Так же проблема с 'unique_ptr ' или 'const unique_ptr '? – Useless

+0

звучит как авто, созданный только для этого типа вещей. его хороший ярлык, позволяющий вам просто поставить auto вместо того, чтобы выяснить, какой тип вам нужно использовать для переменной. когда вы спрашиваете, имеет ли это смысл, ну, его часть языкового стандарта и использование его таким образом звучит «правильно» для меня. Но, конечно, некоторые личные предпочтения могут возникнуть в нем, так как я могу предположить, что некоторые могут утверждать, что они предпочитают видеть явный тип в любом месте, где он используется, и не полагаться на авто. Но помимо личных предпочтений, это похоже на правильное использование. – Nerdtron

ответ

15

В общем, auto делает вашу жизнь намного проще.

Если вы не отправляете какие-либо эзотерические архитектуры (и не планируете делать это в ближайшее время), ответ должен быть «использовать авто, когда только сможете».

+0

Это не всегда хороший совет (хотя это относится и к этому комментарию). Иногда намерение программиста может быть скрыто, или в редких случаях может произойти что-то неожиданное, и его трудно отследить, если вы используете компилятор-компилятор с ошибкой-компилятором, такой как GCC или MSVC. – rubenvb

+0

@rubenvb Согласен. Херб Саттер недавно заявил в своем лейбле GoingNative 2012, что мы всегда должны использовать 'auto', за исключением случаев, когда мы хотим делать преобразования типов. Я надеюсь, что он намеренно сенсационен. Пока я использую только авто для таких вещей, как итераторы STL, где никто не заботится о том, что такое тип, и все уже знают, что это будет в любом случае. Если само имя метода передает поведение/намерение типа (особенно если тип возвращаемого значения является частью параметра шаблона), я мог бы жить с кем-то, использующим 'auto', но я бы не стал его по умолчанию. –

8

Я думаю, вам нужно определить все варианты, которые могут вам понадобиться.

Получите, чтобы ваши ребята увидели презентацию от Bjarne Stoustrup и прочитали некоторые блоги в C++ 11. Что касается шаблонов, купите некоторые из книг в списке книг и «сокрушительно» отбросьте некоторые из них на свой стол, чтобы начать обсуждение.

Вы даже можете написать несколько презентаций powerpoint и представить их членам вашей команды и создать культуру исследований.

Bjarne Stroustrup: C++11 Style

Список книг: https://stackoverflow.com/tags/c%2b%2b/info

+1

Спасибо за совет. Кстати, я уже все это делаю. Я только что закончил смотреть все ключевые слова GoingNative 2012, а также «C++ и Beyond», а также несколько других, которые я мог найти в Интернете. Недавно я купил «Modern C++ Design», но этот код шаблона, вероятно, не собирается побеждать моих коллег, по крайней мере, до тех пор, пока я не напишу некоторые из них, а мои коллеги поймут на себе гибкость. Я также делал свои собственные презентации по const-правильности, семантике владения (и семантике перемещения), Lambdas, а затем презентацию Cork 11 для попурри. –

4

я должен определить дополнительные определений типов для каждого сопзЬ и не сопзЬ типа

... что приведет к комбинаторной раздутие как число мест, где const подходит к типу, увеличивается. Объясните своим коллегам, что объем работы, которую вы делаете, увеличивается экспоненциально, потому что они борются с языком, а не используют его. И да, используйте auto, если это необходимо.

1

Когда я создаю новый класс один из первых вещей, которые я делаю это:

class MyClass 
{ 
public: // Typedefs 
    typedef std::shared_ptr<MyClass> Ptr; 
    typedef std::shared_ptr<const MyClass> ConstPtr; 
}; 

Затем пользователя моего класса может использовать его как:

MyClass::Ptr pMyClass = std::make_shared<MyClass>(); 

Причина, я добавить их к class as public typedefs - я ненавижу загрязнять глобальное пространство имен.

+2

Я рассматривал этот подход.Моя единственная проблема с вашим 'MyClass :: ConstPtr' заключается в том, что я бы прочитал ее так, как будто' ptr' был 'const', а не объектом MyClass. Я не могу придумать соглашение об именах, которое правильно передает то, что легко предоставляет язык, поэтому я склоняюсь к тому, чтобы избегать typedefs и просто использовать язык. –