5

コードをより簡単に変更できるようにするために、多くの型エイリアス (typedef) を書いていることに気付きますが、同時に、自分で作業しようとしている人々に多くの混乱を引き起こす可能性があるため、それを避けるように何かが教えてくれます。コード。

おそらく最良の例ではありませんが、こちらをご覧ください。また、より最近の例を挙げます。これらは、XML パーサーを作成するときにいじったいくつかのクラスです。

namespace XML
{
    struct Attribute
    {
        typedef std::string name_t;
        typedef std::string value_t;

        Attribute(const name_t &name, const value_t &value = "");

        name_t name;
        value_t value;
    };
}

namespace XML
{
    class Element
    {
        private:
            typedef std::list<Attribute> attribute_container;
            typedef std::list<Element> element_container;

        public:
            typedef attribute_container::iterator attribute_iterator;
            typedef attribute_container::const_iterator const_attribute_iterator;

            typedef element_container::iterator element_iterator;
            typedef element_container::const_iterator const_element_iterator;

            typedef std::string name_t;
            typedef std::string data_t;
...
        private:
            name_t _name;
            data_t _data;

            attribute_container _attributes;
            element_container _child_elements;

このようにすることで、コードの記述が容易になり、おそらく直感的にも理解できるようになりますが、このような方法の欠点は何でしょうか?

4

4 に答える 4

5

これが私の5セントです。特定の状況でこれらの typedef を作成する必要があります。たとえば、独自の反復子クラスを作成している場合は、それを機能させiterator_traitsて、ネストされた typedef などを提供する必要がありdifference_typeます。場合によっては、コンテナにも同じことが当てはまります。たとえば、一般的な関数が次のように記述されているとします。

template <typename T>
void foo(T::iterator it);

テンプレート引数として指定されているものは何でもT、ネストされたiterator型を宣言する必要があります。独自の追加のテンプレート インターフェイス規則を挿入して、コード全体でそれらに従うことができます。

ネストされた型が役立つもう 1 つのケースは、テンプレート引数をエイリアスして、コードの他の部分が参照できるようにすることです。例えば:

template <typename T>
class Foo {
  public:
    typedef T now_you_can_access_this_from_the_outside;
};

しかし、それ以外は — 型定義は必要ありません。それなら好みの問題ですが、私の家はそれに賭けます —誰もが何であるかを知っていて、それ自体について何も言わないという理由だけでなく、std::stringより読みやすいです。value_tstd::stringvalue_t

于 2012-07-30T19:22:25.307 に答える
4

効果的なプログラミングとは、自分の頭に何が収まるかがすべてです。型を定義することで頭に収まりやすくなる場合は、それを選択してください。しかし、やりすぎると、あまりにも多くのタイプを追跡するという認知的負荷が全体的に害になります.

たとえば、これには次のようなものを使用できます。

typedef std::map<std::string, std::vector<std::string> > SynonymMap;

結論から言うと、プログラム内の変数ごとに新しい型を発明することになります。それはどれほど読みやすいでしょうか?

于 2012-07-30T19:53:55.797 に答える
3

私の経験則では、typedef が 2 ~ 3 回以上使用されている場合は、存在する価値があります。さもなければ、これは環境に悪いインクの無駄です。

于 2012-07-30T19:14:56.213 に答える
2

主観的には、これが正しく行われると、実際にはコードが読みやすく理解しやすくなります。また、stdこれboostは広く使用されているため、一貫性を維持するためだけに使用することをお勧めします。

于 2012-07-30T19:13:53.593 に答える