返回迭代器到C数组的方法的正确类型声明
Correct type declaration for method returning iterator to C array
我可以这样遍历一个c风格的数组:
char foo[3] = { 'a', 'b', 'c' };
for (auto it = std::begin(foo); it != std::end(foo); ++it)
{
*it = 'k'; //values of foo are correctly modified
}
现在假设我想将数组包装在一个类中,并公开返回相对迭代器的begin()
和end()
方法。我尝试了以下操作:
template<size_t size>
class StackMemPolicy
{
private:
char mem[size];
public:
typedef typename std::iterator<std::input_iterator_tag, char> iter;
iter begin()
{
return std::begin(mem);
}
iter end()
{
return std::end(mem);
}
}
返回的类型声明似乎是错误的,下面的调用代码无法编译:
StackMemPolicy<4> bar;
for (auto it = bar.begin(); it != bar.end(); ++it)
{
*it = 'k';
}
错误如下:
谁能告诉我我的错误在哪里?Error 1 Error C2678: binary '!=':没有找到带a的操作符类型'StackMemPolicy<4>::iter'的左操作数(或者没有)可接受的转换)
std::iterator
意味着被用作基类。从24.4.2/1:
namespace std {
template<class Category, class T, class Distance = ptrdiff_t,
class Pointer = T*, class Reference = T&>
struct iterator {
typedef T value_type;
typedef Distance difference_type;
typedef Pointer pointer;
typedef Reference reference;
typedef Category iterator_category;
};
}
它只给你一些类型定义,不会神奇地实现所有必需的操作符。在您的情况下,begin()
和end()
应该只返回char*
,它已经有std::iterator_traits
的专门化。
std::iterator_traits
),您需要预定义的类型,如value_type
、iterator_category
等。
由于正确使用这些参数有时会很棘手,因此std::iterator
将根据给定的模板参数为您定义这些参数。下面是一个在迭代器中使用std::iterator_traits
的例子。
请注意,从c++ 17开始,由于各种原因,std::iterator
已被弃用。
如果我更改:
typedef typename std::iterator<std::input_iterator_tag, char> iter;
:
typedef char * iter;
除非您不想修改行为,否则您应该只返回std::begin(mem)
,这只不过是char *
。
参见参见2' and overload
使用函数的尾随返回类型语法可以实现如下:
template<size_t size>
class StackMemPolicy
{
private:
char mem[size];
public:
//typedef typename std::iterator<std::input_iterator_tag, char> iter;
auto begin() -> decltype(std::begin(mem))
{
return std::begin(mem);
}
auto end() -> decltype(std::end(mem))
{
return std::end(mem);
}
};
int main()
{
StackMemPolicy<3> bar;
for (auto it = bar.begin(); it != bar.end(); ++it)
{
*it = 'k';
}
for (auto it = bar.begin(); it != bar.end(); ++it)
{
std::cout<<*it;
}
}
相关文章:
- 将类型声明为类型模板参数的模板参数的一部分是否合法?
- 当返回类型声明为 ListNode 时,我们是否可以返回 false<T>*
- 如何使用自定义类型声明Arduino数组?
- 将函数参数类型声明为 auto
- 使用typedef'ed返回类型声明友元函数时出现编译器错误
- 在没有标识符的情况下如何读取复杂的C++类型声明?
- 模板函数参数显式类型声明
- 使用指针遍历一系列基元类型声明?
- 字符类型声明和验证
- 使用本地类型声明的G lambda被使用但从未定义 - 确实是一个错误
- 为什么 c++ lambda 捕获不需要类型声明?
- 为什么没有"int"类型声明时输出不同?
- C++如何使用虚拟基类型声明全局静态分配的变量
- 我可以使用预处理器将一个类型声明替换为另一个类型声明吗?
- 如何将数据类型声明从.cpp文件传输到 .cu 文件
- C++17 枚举类型声明
- 条件类型声明
- 具有特定参数的特定构造函数的类型声明
- 我可以使用相同的名称为周围作用域中的类型声明成员类型别名吗
- 函数调用之前,C 类型声明