Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/153.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/templates/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ c++;迭代模板函数接收的对象_C++_Templates_C++11 - Fatal编程技术网

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

C++ c++;迭代模板函数接收的对象,c++,templates,c++11,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 : myUn

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

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
    }
}
if(!myVector.empty()){
用于(自动&i:myVector)
{

std::无法编写两个以迭代器为输入的模板函数。标准库中已经有函数模板(std::copy和std::transform with a)但是它们比您已经编写的循环更长,而且可以说更重复。请编写两个以迭代器作为输入的模板函数。标准库中已经有函数模板(std::copy和std::transform with a)但是它们比您已经编写的循环更长,而且可以说更重复。它应该是
const auto&i
@RSahu在大多数情况下使用
auto&
。尝试将
向量传递给
foo()
@Praetorian,我没有想到。谢谢。修复了答案。@Mozbi:我想他们指的是vector返回一个名为
reference\u wrapper
的代理类(我忘了)但这是一个巨大的痛苦,每个人都同意,在标准中首先发明这个例外是一个错误。但由于向后兼容的原因,它今天仍然存在,我们需要关心(和担心)关于这种情况。@Mozbi
vector
vector
的特化,对
vector::iterator
的解引用返回一个代表单个布尔值的代理对象。由于该代理对象是按值返回的,因此不能绑定到非常量左值引用。这就是为什么在这种情况下使用
auto&
失败的原因。T对于基于范围的
for
我遵循的经验法则是,如果我想修改正在迭代的对象,我使用
auto&&
,否则我使用
auto const&
它应该是
const auto&I
@RSahu在大多数情况下使用
auto&
。尝试将
向量传递给
foo()
@Praetorian,我没有想到。谢谢。修复了答案。@Mozbi:我想他们指的是vector返回一个名为
reference\u wrapper
的代理类(我忘了)但这是一个巨大的痛苦,每个人都同意,在标准中首先发明这个例外是一个错误。但由于向后兼容的原因,它今天仍然存在,我们需要关心(和担心)关于这种情况。@Mozbi
vector
vector
的特化,对
vector::iterator
的解引用返回一个代表单个布尔值的代理对象。由于该代理对象是按值返回的,因此不能绑定到非常量左值引用。这就是为什么在这种情况下使用
auto&
失败的原因。T对于基于范围的
for
我遵循的经验法则是,如果我想修改正在迭代的对象,我使用
auto&
,否则我使用
auto const&
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;
      }
   }
}
template <typename Container>
void foo(Container const& container)
{
   for(const auto& i : container)
   {
     std::cout << getValue(i) << std::endl;
   }
}