Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/132.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 类的成员函数的基于范围的for循环?_C++ - Fatal编程技术网

C++ 类的成员函数的基于范围的for循环?

C++ 类的成员函数的基于范围的for循环?,c++,C++,我将实现一个list类,并希望遍历整个list < P>这是一个适当的C++来做如下的事情:< /P> for (auto i : *this) 如果不是,基于范围的for循环的正确语法是什么?您的列表类需要有合适的begin()和end()成员函数,否则必须有具有这些名称的合适自由函数。例如,见 这个没有什么特别之处。如果列表类是L,并且L具有类型L,则可以执行以下操作: for (auto i : l) 范例 list<T> l{....}; 列表l{….}; 后C++1

我将实现一个list类,并希望遍历整个list

< P>这是一个适当的C++来做如下的事情:< /P>
for (auto i : *this)

如果不是,基于范围的for循环的正确语法是什么?

您的列表类需要有合适的
begin()
end()
成员函数,否则必须有具有这些名称的合适自由函数。例如,见

这个
没有什么特别之处。如果列表类是
L
,并且
L
具有类型
L
,则可以执行以下操作:

for (auto i : l)
范例

list<T> l{....};
列表l{….};
后C++11

for(auto & elem : l)
    cout<<elem;
用于(自动和电气:l)

cout根据文档,循环的范围定义如下(直到C++17):

因此,您只需定义两个函数,即
begin
end
。它们可以是成员功能,也可以通过ADL访问。
这样,您就可以在循环的范围内使用您的类型,可以从类本身(使用
*This
)或任何其他地方(使用命名变量)


下面是一个简单的工作示例:

#include<list>
#include<iostream>

struct my_list {
    using iterator = std::list<int>::iterator;

    friend iterator begin(my_list &);
    friend iterator end(my_list &);

    void f() {
        for(auto v: *this) {
            std::cout << v << std::endl;
        }
    }

private:
    std::list<int> data{ 0, 1, 2 };
};

my_list::iterator begin(my_list &l) {
    return l.data.begin();
}

my_list::iterator end(my_list &l) {
    return l.data.end();
}

int main() {
    my_list l{};
    l.f();

    for(auto v: l) {
        std::cout << v << std::endl;
    }
}
#包括
#包括
构造我的列表{
使用iterator=std::list::iterator;
朋友迭代器开始(我的列表&);
朋友迭代器结束(我的列表&);
void f(){
对于(自动v:*此){

std::如果这是你要问的话,它是否可以工作……这很奇怪。你为什么要这样做。@IgorTandetnik是的,这基本上就是我要问的。这种语法有效吗?As range for只是一种语法糖,在内部作为一个普通的基于迭代器的循环进行计算。因此,你需要为你创建的元素集实现一个迭代器如果需要迭代对象实例的成员,则需要查看C++中的各种自检/反射技术。
{
    auto && __range = range_expression ; 
    for (auto __begin = begin_expr, __end = end_expr; __begin != __end; ++__begin) { 
        range_declaration = *__begin; 
        loop_statement 
    }
}
#include<list>
#include<iostream>

struct my_list {
    using iterator = std::list<int>::iterator;

    friend iterator begin(my_list &);
    friend iterator end(my_list &);

    void f() {
        for(auto v: *this) {
            std::cout << v << std::endl;
        }
    }

private:
    std::list<int> data{ 0, 1, 2 };
};

my_list::iterator begin(my_list &l) {
    return l.data.begin();
}

my_list::iterator end(my_list &l) {
    return l.data.end();
}

int main() {
    my_list l{};
    l.f();

    for(auto v: l) {
        std::cout << v << std::endl;
    }
}