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
。
最后,您使用模板类作为模板名称空间的风格是笨拙的,可能不会产生多少好处。
相关文章:
- 没有找到相关文章