c++ - 在不使用 auto 的情况下从模板中的迭代器推断出变量的类型

标签 c++ templates auto

在下面的代码中,我使用 auto 定义了一个与所使用的迭代器兼容的新变量“temp”。我只是好奇我是否可以在不使用 auto 关键字的情况下做同样的事情??

换句话说,我不知道容器是什么。那么如何在不破坏代码通用性的情况下定义临时变量。

作为 C++ 的新手,我一直使用 SO 作为解决任何问题的网站。我一直在寻找类似的问题,但没有找到任何问题。任何帮助将不胜感激!!

/* InsertionSort.c */
#include<iostream>
#include <typeinfo>


namespace sort {

template <class RandomAccessIterator, class Compare >
void InsertionSort(RandomAccessIterator begin, RandomAccessIterator end, Compare comp) {
    RandomAccessIterator itrOuter,itrInner,itrShift;

    for(itrOuter = begin+1; itrOuter!=(end); itrOuter++) {
     // ***************HERE***********************************************   
             auto temp= *itrOuter;

        for(itrInner=begin;itrInner<itrOuter;itrInner++) {
            if(!comp(*itrInner,*itrOuter)) {
                for(itrShift=itrOuter;itrShift> itrInner;itrShift--)
                    *itrShift=*(itrShift -1);
            *itrInner=temp;
            break;
            }       
        }
    }       
}
}

bool Compa(int& x, int& y) {return (x<y);}

int main(void) {
    using namespace sort;
    int arr[] = {3,5,1,7,2,6,9,12};
    InsertionSort(arr, arr+8, Compa );

    for(int i=0;i < 8;i++) 
        std::cout<<arr[i]<<" ";

    return 0;
}

最佳答案

使用 auto是使用 C++11 的最简单方法。您也可以使用 decltype() ,当然:

decltype(*itrOuter) tmp = *iterOuter;

这将作为您使用 auto 的方法, 复制值。如果你真的想获得你会使用的引用

decltype((*itrOuter)) tmp = *iterOuter;

大致相当于:

auto& tmp = *iterOuter;

假设你需要使用C++03,没有办法推导出这个位置的变量类型。推断变量类型的唯一方法是委托(delegate)给函数模板。正常的 C++03 方法是获取 value_type来自 std::iterator_traits<...> :

typename std::iterator_traits<RandomAccessIterator>::value_type tmp = *iterOuter;

...或者,对引用做同样的事情:

typename std::iterator_traits<RandomAccessIterator>::reference tmp = *iterOuter;

关于c++ - 在不使用 auto 的情况下从模板中的迭代器推断出变量的类型,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20452979/

相关文章:

C++11 - 将非静态数据成员声明为 'auto'

c++ - 需要某种运算符.. c++

c++ - 如何获得用另一种类型调用仿函数的返回类型?

c++ - 指针 vector 的迭代器

c++ - 在构造函数中使用可变参数初始化 std::tuple

c++ - 为什么我的模板特化需要匹配原始约束?

c++ - C++11 auto 关键字是否针对所有情况进行了准确定义?或者 : how does auto know what I intend?

c++ - 在 lambda 中访问自动参数的类型

c++ - 如何将任意大小的位集传递给函数?

c++ - std::bind 与指向函数对象的指针