2012-02-16 9 views
19

私はここで意図的に主観的な質問をしたくないですが、私は直接この質問をする他に誰も持っていません...C++:auto、またはtypedefを使用しますか?

私はもっとチーム私が書いた新しいコードの最新のC++概念。私の同僚はテンプレートに少し恥ずかしがり、最近作成したクラス(ファクトリメソッドはunique_ptrが返され、これらのオブジェクトのリストはshared_ptrを使用してリストアされます)を利用するときはFoobar*の代わりにunique_ptr<Foobar>またはshared_ptr<Foobar>を入力する必要があります。

彼らは私の腕をねじって、入力しやすいものにtypedefを入力するように頼んだ。例えばFoobarUniquePtr

しかし、私はこれらのtypedefでconst-correctnessの混乱に陥っています。私はconstとnon constの型ごとに余分なtypedefを定義しなければならず、const const_FoobarUniquePtrはconstの意味を適切に表現していないようです。

私の質問によれば、これらのtypedefの使用をやめ、代わりにautoを私のチームメイトに押しつけるのは理にかなっていますか?私は他の選択肢にもオープンしています。

+8

+1あなたの同僚に近代的なプラクティスを使用しようとすると+1! – Nick

+0

'unique_ptr 'または 'const unique_ptr 'にも問題がありますか? – Useless

+0

オートのようなサウンドは、このタイプのもののためだけに作成されました。その素晴らしいショートカットを使用すると、変数に使用する必要があるタイプを正確に把握するのではなく、autoを置くことができます。それが意味をなさないかどうか聞いてみると、よく言えば、言語標準のその部分を使ってこのようにして、私に「正しい」と言います。しかし、もちろん、個人的な好みがあるかもしれませんが、私は一部の人が明示的なタイプをどこで使用し、自動車に依存していないと思うかもしれないと主張するかもしれないと考えています。しかし、個人的な好みを超えて、それは有効な使用のように思えます。 – Nerdtron

答えて

15

通常、の自動は、あなたの人生を楽にします。

いずれの難解なアーキテクチャでも出荷していない場合は(すぐにはこれを行う予定はありません)、回答は「可能な限り、いつでもautoを使用する」必要があります。

+0

これは必ずしも良いアドバイスではありません(このコメントにも当てはまりますが)。 GCCやMSVCのような悪意のあるコンパイラエラーメッセージコンパイラを使用している場合、プログラマの意図が隠されていることがあります。まれに予期しないことが起こることがあります。 – rubenvb

+0

@rubenvb私は同意します。 Herb Sutter氏は、GoingNative 2012の基調講演で、タイプ変換を行う場合を除いて、常に 'auto'を使用するべきだと宣言しました。私は彼が意図的にセンセーショナルなことを望んでいる。今のところ、STLイテレータのようなものにはautoだけを使用しています。誰も本当にそのタイプが何であるか心配していません。メソッド名自体が型の動作/意図を伝える場合(特に戻り値の型がテンプレートパラメータの一部である場合)、 'auto'を使って誰かと一緒に暮らすことができますが、デフォルトにはなりません。 –

8

私はあなたが必要と思われるすべてのバリエーションを定義する必要があると思います。

Bjarne Stoustrupからのプレゼンテーションを見て、C++ 11のブログを読んでください。テンプレートに関しては、本のリストのいくつかの本を購入し、議論を始めるためにあなたの机の上にそれらのいくつかを落としてください。

パワーポイントのプレゼンテーションをいくつか書き、チームメンバーに提示して研究の文化を構築することもできます。

Bjarne Stroustrup: C++11 Style

ブックリスト:https://stackoverflow.com/tags/c%2b%2b/info

+1

アドバイスをいただきありがとうございます。偶然、私はすでにこのすべてをやっています。私はちょうどGoingNative 2012からの基調講演と、「C++ and Beyond」と、オンラインで見つけられるその他のものを見終わったところです。私は最近 "Modern C++ Design"を購入しましたが、テンプレートコードはおそらく私の同僚に勝つつもりはありません。 私はまた、const-correctness、所有権セマンティクス(そしてセマ​​ンティクスの移動)、Lambdas、そしてC++ 11の機能のポプリに関するプレゼンテーションを行ってきました。 –

4

が、私はのように、組み合わせ爆発の原因となる...それぞれのconstと非const型

のための余分のtypedefを定義する必要があると思いますタイプに適合する場所の数が増えます。あなたの仕事の量は、使用する代わりに言語と戦っているため、指数関数的に増加することを同僚に説明してください。はい、適切な場合は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>(); 

私はそれらを追加した理由私はグローバルな名前空間を汚染することを嫌いです。

+2

私はそのアプローチを考えていました。あなたの 'MyClass :: ConstPtr'の私の唯一の問題は' ptr'が 'MyClass'オブジェクトではなく' const'だったかのように読んでしまうことです。私は、言語が容易に提供できるものを適切に伝える命名規則を思いつくことができないので、typedefを避けて言語を使うことに傾いています。 –

関連する問題