gpt4 book ai didi

c++ - C++ 中类似 Iterable 的行为是否可以实现?

转载 作者:塔克拉玛干 更新时间:2023-11-02 23:49:08 24 4
gpt4 key购买 nike

Java 允许类显示 Iterable类型,以便客户端可以遍历某些实例的数据集合,如下所示:

public class MyClass
{
private ArrayList<String> strings;
private ArrayList<Integers> ints;
public MyClass() { /* generate data ... */ }
public Iterable<String> allStrings() {return strings;}
public Iterable<Integer> allInts() {return ints;}
}

这一直让我觉得“干净”,因为它保持封装,允许我更改 ArrayList s 至 LinkedList如果我愿意并且在 for(String s : myClassInstance.allStrings()) //... 等结构中对客户来说仍然很方便.

然而,在 C++ 中,如果我想让客户端使用我的 for-loop , 在没有 Iterable 的情况下,我需要返回一个 const vector<T>&或其他,这显然不太好。

定义 template<> begin<my_class> {/*...*/}和 friend 很好,但前提是 my_class有一个集合要迭代。我还能做什么?

最佳答案

只需在 C++ 中制作 Iterable

template<class T, class U>
struct Iterable
{
T _begin;
U _end;

Iterable(T begin, U end)
: _begin(begin), _end(end)
{}

T begin()
{
return _begin;
}

U end()
{
return _end;
}
};

template<class T, class U>
Iterable<T,U> make_iterable(T t, U u)
{
return Iterable<T,U>(t, u);
}

struct MyClass
{
std::vector<int> _ints;
std::vector<std::string> _strings;

auto allInts() -> decltype(make_iterable(_ints.begin(), _ints.end()))
{
return make_iterable(_ints.begin(), _ints.end());
}

auto allStrings() -> decltype(make_iterable(_strings.begin(), _strings.end()))
{
return make_iterable(_strings.begin(), _strings.end());
}
};

然后像这样使用它

for (auto i : foo.allInts())
{
cout << i << endl;
}

for (auto i : foo.allStrings())
{
cout << i << endl;
}

live example

关于c++ - C++ 中类似 Iterable 的行为是否可以实现?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23400693/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com