代码之家  ›  专栏  ›  技术社区  ›  Frank

我真的需要返回类型::大小\u类型吗?

  •  4
  • Frank  · 技术社区  · 15 年前

    我经常有一些类,它们大多只是一些STL容器的包装器,比如:

    class Foo {
    public:
      typedef std::vector<whatever> Vec;
      typedef Vec::size_type size_type;
      const Vec& GetVec() { return vec_; }
      size_type size() { return vec_.size() }
    private:
      Vec vec_;
    };
    

    我不太确定会不会回来 size_type . 通常,某些函数会调用 size() 然后把这个值传递给另一个函数,这个函数会用到它,也许会传递给它。现在每个人都必须包括foo头,尽管我只是传递一些大小值,应该只是 unsigned int 总之……?在这里做什么是正确的?真正使用是最佳实践吗 SiZe型 到处都是?

    5 回复  |  直到 15 年前
        1
  •  7
  •   peterchen    15 年前

    STL将这些类型定义为容器的抽象接口。它旨在支持任何类型的备份存储。可能是NUMA或磁盘备份存储,其中 size_type ptr-type 与系统内存不同。或者——在NUMA体系结构中——它可能是一个特定的内存节点,速度很快,并且可以与非常小的 SiZe型 ptr_type -这是许多体系结构的相关优化。

    至少,这是设计目标,也是由预期驱动的 能够 是支持C++的平台。一些早期的让步还允许STL实现者使用快捷方式,这些方式基本上禁用了这种灵活性,而且我从未使用过利用这种灵活性的STL实现。我想说这是因为线性内存访问已经不再是一个问题了,而在这一级别上的STL开发实际上并不容易。

    但是,它对你有多大伤害?这是正确的做法。

        2
  •  6
  •   GManNickG    15 年前

    应该 vector<>::size_type 像你一样,这是最正确的方法。

    也就是说,我知道很多人,包括我自己,只会使用 size_t 相反。虽然不是强制要求相同, 矢量<>::大小_类型 西泽特 对于我知道的每一个实现。你应该接受的。

        3
  •  5
  •   Alex F    15 年前

    实际上,为了64位的兼容性,它应该是大小而不是无符号int。作为包装类编写器,我将返回size_类型。作为类客户机,如果更方便的话,我会将其强制转换为适当的类型(大小)。

        4
  •  1
  •   UncleBens    15 年前

    我不太确定会不会回来 SIZE型。通常,某些功能会 调用size()并将该值传递给 另一个函数,它将使用 它可能会传下去。现在每个人 必须包含foo标题…

    可以退回 size_type 但这并不意味着另一个函数必须取相同的值。 SiZe型 在您的类中被类型化。整数类型之间存在转换。勇敢地使用 size_t .

    无论如何,您都不能重载函数,这样就会有一个函数与 size 矢量的,另一个用于 deque 等等,以防万一他们都使用了不同的 SiZe型 (标准可能允许)。-但如果可能的话,您也可以使用模板来推导正确的 SiZe型 从参数中使用。

        5
  •  -1
  •   Joey Adams    15 年前

    您可以考虑的一个选项是继承自 std::vector :

    typedef std::vector<whatever> Foo_Vec;
    
    class Foo : public Foo_Vec
    {
    public:
        const Foo_Vec &GetVec() { return (Foo_Vec&)*this; }
    };
    

    我决不是说这是最好的方法,因为它可以引入一些问题,而这些问题不会通过拥有一个私有成员或继承而发生。 private Foo_Vec 作为 public Foo_Vec 显示上的所有方法 STD::载体 Foo . 此外, STD::载体 没有虚拟析构函数,因此如果尝试清理 STD::载体 里面塞着一个食物,它不会被完全清理干净。我只是把它扔出去。

    如其他答案所示,您应该使用 size_t size_type 而不是 unsigned int 为了64位兼容性。否则,在未来的64位构建中, STD::载体 可能有2个以上 三十二 但大小值将被截断,从而导致错误。