c++模板类混淆

C++ template class confusion

本文关键字:c++      更新时间:2023-10-16

所以我是一个相当有经验的C程序员,最近为了我正在编写的一个玩具编译器潜入了c++。我目前正在"现代化"我的c++代码,因为我现在的代码看起来更像ANSI-C,它唯一利用的c++东西是std::vector。

所以我决定使用迭代器,而不是通过带有count变量的for循环手动迭代容器和数组。我注意到我需要经常到达几个迭代器的中间,所以我写了一个静态类,用一个函数来完成这个任务。

现在扩展这个函数,不仅返回指向中间元素的迭代器,而且返回指向容器若干部分的迭代器向量。我正在使用模板,使代码更通用,但我有点坚持与我当前的功能的实现。

下面是类的定义:

namespace dbc {
  template<typename generic_iterator_t>
  class itertools {
  public:
    /* returns an iterator which points to the middle element,
     * the same as calling get_fraction_iterator with fraction = 2 */
    static generic_iterator_t get_middle_iterator(
      generic_iterator_t begin, generic_iterator_t end
    );
    /* splits a container into several chunks and returns
     * the iterators in a vector */
    template<typename generic_iterator_t, size_t chunks>
    static std::vector<generic_iterator_t> get_chunk_iterator(
      generic_iterator_t begin, generic_iterator_t end
    );
    /* calculates the optimal chunk size, particulary useful
     * for get_chunk_iterator */
    template<typename generic_number_t>
    static constexpr generic_number_t
    get_optimal_chunk_size(generic_number_t val);
  };
}

如何实现这个函数?据我所知,这应该是正确的,但事实并非如此。

template<typename generic_iterator_t, size_t chunks>
static std::vector<generic_iterator_t>
dbc::itertools<generic_iterator_t>::get_chunk_iterator<
  generic_iterator_t, size_t
>(generic_iterator_t begin, generic_iterator_t end)

变化

template<typename generic_iterator_t, size_t chunks>
static std::vector<generic_iterator_t> get_chunk_iterator(

template<size_t chunks>
static std::vector<generic_iterator_t> get_chunk_iterator(

template<typename generic_iterator_t, size_t chunks>
static std::vector<generic_iterator_t>
dbc::itertools<generic_iterator_t>::get_chunk_iterator<
  generic_iterator_t, size_t
>(generic_iterator_t begin, generic_iterator_t end)

template<typename generic_iterator_t>
template<size_t chunks> 
std::vector<generic_iterator_t> 
dbc::itertools<generic_iterator_t>::get_chunk_iterator(
  generic_iterator_t begin, generic_iterator_t end
){
  return {};
}

不需要在类和类的静态方法中重复类型generic_iterator_t

最后,您使用模板类作为模板名称空间的风格是笨拙的,可能不会产生多少好处。

相关文章:
  • 没有找到相关文章