c ++迭代由模板函数接收的对象

Moz*_*zbi 1 c++ templates c++11

我有两段看似相似的代码,我想利用模板来防止复制的代码.

if(!myVector.empty()) {
    for(auto& i : myVector)
    {
        std::cout << i << std::endl;
        //some other code that is similar to below
   }
}

if(!myUnorederedMap.empty()) {
    for(auto i : myUnorderedMap)
    {
        std::cout << i.second << std::endl;
        //some other code that is similar to top
    }
}
Run Code Online (Sandbox Code Playgroud)

当我必须在地图上调用.second而不是我的向量时,如何为迭代器编写函数模板?

R S*_*ahu 6

template <typename T>
T const& getValue(T const& t)
{
   return t;
}

template <typename T, typename U>
U const& getValue(std::pair<T, U> const& p)
{
   return p.second;
}


template <typename Container>
void foo(Container const& container)
{
   if(!container.empty()) {
      for(const auto& i : container)
      {
        std::cout << getValue(i) << std::endl;
      }
   }
}
Run Code Online (Sandbox Code Playgroud)

虽然,这条线if(!container.empty())似乎没有任何用途.你也可以写:

template <typename Container>
void foo(Container const& container)
{
   for(const auto& i : container)
   {
     std::cout << getValue(i) << std::endl;
   }
}
Run Code Online (Sandbox Code Playgroud)

  • 它应该是`const auto&i` (2认同)
  • @RSahu大部分时间都在使用`auto&`**.尝试将`vector <bool>`传递给`foo()`. (2认同)
  • @Mozbi`vector <bool>`是`vector`的特化,取消引用`vector <bool> :: iterator`返回一个代表单个布尔值的代理对象.由于此代理对象是按值返回的,因此不能绑定到非const左值引用.这就是在这种情况下使用`auto &`失败的原因.我遵循的基于`for`的范围的经验法则是,如果我想修改迭代的对象,我使用`auto &&`,否则我使用`auto const&` (2认同)