【问题标题】:deduce the type of variable from iterator in a template, with out using auto从模板中的迭代器推断变量的类型,而不使用 auto
【发布时间】:2013-12-08 11:38:54
【问题描述】:

在下面的代码中,我使用 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;
}

【问题讨论】:

    标签: c++ templates auto


    【解决方案1】:

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

    decltype(*itrOuter) tmp = *iterOuter;
    

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

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

    大致相当于:

    auto& tmp = *iterOuter;
    

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

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

    ...或者,对参考做同样的事情:

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

    【讨论】:

    • 我有一个疑问。请看这个问题stackoverflow.com/questions/17241614/…。当我使用 decltype(* itrOuter) tmp 时,iterOuter 是 int*,然后 tmp 被声明为 int&,因为 *itrOuter 返回一个左值。当我用 decltype 替换 auto 时,即使插入排序也不起作用。那么无论如何我可以通过使用decltype获得实际类型(int)而不是(int&)。或者 auto 的唯一替代方法是 iterator_traits。感谢您的帮助!!!
    • @vivek:嗯。似乎我需要更正abswer 的某些部分 - 对不起(我会在今天晚些时候做)。您可能已经能够使用typename decay(decltype(*it))::type 来获取值类型。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-01-16
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多