"std::vector:<T>:iterator"模板化函数的C ++正确语法
c++ proper syntax for templated function of `std::vector<T>::iterator`
我正在尝试编写一个模板,该模板将任何类型的向量的迭代器作为其参数。当我尝试编译以下内容时,它会给我一个no matching function call
错误。
#include <vector>
struct A { int x; };
template <class T>
void process (typename std::vector<T>::iterator begin,
typename std::vector<T>::iterator end)
{ for(; begin != end; begin++) { /*do_something*/ } }
int main()
{
std::vector <A> obj;
process(obj.begin(), obj.end());
}
1类型T
不能从参数类型中推导出来。
2为什么要将函数限制为只接受std::vector
元素的迭代器?如果您真的只想要向量元素,最好将std::vector<T> const&
作为参数。但最好只接受任何迭代器参数(或任何容器参数)。
edit好的,这里有一个例子。当static_assert
与std::for_each(begin,end,do_something);
相同(除了返回类型)时,您可以省略它
template <class It>
void process(It begin, const It end)
{
static_assert(std::is_same<typename std::iterator_traits<It>::iterator_category,
std::random_access_iterator_tag>::value,
"arguments not random access iterators");
for (; begin != end; ++begin)
do_something(*begin);
}
根据OP的请求,请参阅下文。您可以使用任何有效的容器前向迭代器,它支持来自operator *()
的值引用,例如向量、deque、列表等。这不使用chris提到的静态断言逻辑,我让您自己决定。
#include <iostream>
#include <iterator>
template<typename Iterator>
void process(Iterator start, Iterator stop)
{
typedef typename std::iterator_traits<Iterator>::value_type value_type;
for (Iterator it=start; it != stop; ++it)
{
const value_type& val = (*it);
// do something with val
std::cout << val << std::endl;
}
}
int main()
{
int ar[] = { 1,2,3,4,5 };
process(std::begin(ar), std::end(ar));
return 0;
}
相关文章:
- C++使用 rand 定义函数语法
- QObject::连接不起作用 - 使用函数语法找不到信号
- C++ std::函数语法问题
- 如何在不更改现有函数语法的情况下将普通指针替换为共享指针
- 模板化函数语法错误中使用的模板化类中的嵌套类
- C 变化函数语法
- 返回语句中的构造函数语法
- 复制构造函数语法错误:myclass 没有成员 mymember
- C++.传递给函数.语法问题
- C++可视化工作室函数语法突出显示
- 在 c++ 中移动 2d 数组的构造函数(语法逻辑不清楚):
- c 通过值或指针函数语法
- 正确的朋友模板函数语法
- C++类构造函数语法的解释
- C++ 使用指针移动构造函数(*&&&语法)
- 复制构造函数语法并显示构造函数的值
- 回调函数语法
- 类模板专用化中的成员函数语法
- C++学习函数语法
- 使用模板 C++ 的友元函数语法错误