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

保证std::container::size\u类型是std::size\u t

  •  5
  • Caduchon  · 技术社区  · 7 年前

    this question ,我决定使用 std::size_t size_type std::container<T>::size_type ,但我认为我当前和未来的配置并非如此。

    然而,为了避免恶意bug,我在使用它们时会检查它们的类型是否相同。例如:

    BOOST_STATIC_ASSERT(boost::is_same< std::vector<double>::size_type , std::size_t >::value);
    std::vector<double> x;
    /* fill x */
    for(std::size_t i = 0; i < x.size(); ++i) { /* do something */ }
    

    代码中的另一个地方,我使用 std::vector<long int> ,然后我还检查:

    BOOST_STATIC_ASSERT(boost::is_same< std::vector<long int>::size_type , std::size_t >::value);
    

    std::vector<std::list<std::string>*> std::vector<std::list<double*>*> ,然后我检查:

    BOOST_STATIC_ASSERT(boost::is_same< std::vector<std::list<std::string>*>::size_type , std::size_t >::value);
    BOOST_STATIC_ASSERT(boost::is_same< std::vector<std::list<double*>*>::size_type , std::size_t >::value);
    

    那么,我的问题是: std::vector<any_common_type>::size_type 是一个 ,有没有可能 std::vector<another_type>::size_type 不是 std::container::size_type 总是 在我的编译器上?

    1 回复  |  直到 7 年前
        1
  •  4
  •   gsamaras    7 年前

    如果你真的需要这样做的话,你在问题中遵循的方法似乎是一条路。

    不过,我觉得你担心得太多了,因为 size_t size_type .

    如果您发现自己处于平台实现的不太可能的情况下 size\u类型 ,那么我很确定您将在尝试执行任何比较时收到编译器警告。

    'size_t' vs 'container::size_type' 提及:

    分配器::size\u type(分配器是一个模板参数),用于 分配器通常定义为size\u t(或兼容的


    因此,如果我是你,我相信我的编译器会在典型情况下运行。然而,如果我确实使用了非标准容器,那么我会不厌其烦地遵循你的方法,就像你说的那样,把它放在一个文件中,让它在一个隐藏的黑暗角落里完成它的工作。