【问题标题】:Implementing const range with template使用模板实现 const range
【发布时间】:2016-11-10 16:27:40
【问题描述】:

我尝试使用模板来避免在 std::vector 上实现 const 和非 const 范围时出现代码重复。

非 const 版本有效,但 const 版本无效。我不知道为什么。

测试.cpp。用g++ test.cpp编译:

#include <vector>
#include <iostream>
enum Cv {
    constant,
    non_constant
};

template <typename T, typename Index, Cv Cv_enum>
class Vector_range_facade {
    typedef typename std::conditional <
            Cv_enum == Cv::constant,
                    const std::vector<T>, std::vector<T>
    >::type Vec;
public:
    typedef typename Vec::iterator Iterator;
    Vector_range_facade(Vec& vec, const Index start_id, const Index size)
            : vec_{vec},
              it_begin_{vec_.begin() + start_id},
              it_end_  {vec_.begin() + start_id + size}
    {}  
    Iterator& begin() {return it_begin_;}
    Iterator& end()   {return it_end_;}
private:
    Vec& vec_;
    Iterator it_begin_;
    Iterator it_end_;
};

int main()
{
    std::vector<int> a;
    a.resize(100);
    Vector_range_facade<int, int, Cv::constant> range(a,0,10);
    for (auto x : range) {
        std::cout << x <<"\n";
    }   
}

【问题讨论】:

    标签: c++ templates iterator


    【解决方案1】:

    std::vector::iterator 总是计算为非const 迭代器的类型,因为它是在std::vector 中定义的typedef,它无法知道它是在const 上调用还是在非const 上调用实例。

    您需要在std::vector::iteratorstd::vector::const_iterator 之间有条件地选择您的迭代器类型。示例:

    typedef typename std::conditional <
            Cv_enum == Cv::constant,
            typename std::vector<T>::const_iterator, 
            typename std::vector<T>::iterator
    >::type Iterator;
    

    on wandbox

    【讨论】:

      猜你喜欢
      • 2018-10-08
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-03-06
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多