5

我发现自己编写了很多类型别名(typedefs)以使代码更容易更改,但同时有些东西告诉我要避免这样做,因为它会给将要与我一起工作的人造成很多混乱。代码。

也许不是最好的例子,但看看这里。我还会举一个最近的例子;这些是我在构建 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并提供嵌套类型定义等difference_type。在某些情况下,这同样适用于容器。例如,如果一些常用的函数是这样写的:

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

那么无论T指定为模板参数,它都必须iterator声明一个嵌套类型。您可以添加自己的额外模板接口约定,并在整个代码中遵循它们。

嵌套类型有用的另一种情况是为模板参数设置别名,以让代码的其他部分引用它。例如:

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

但除此之外——不需要类型定义。然后这是一个偏好问题,但我打赌我的房子 -std::stringvalue_t仅仅因为每个人都知道是什么而更具可读性std::string,并且value_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 回答