Java позволяет классов выявить Iterable
типы, так что клиенты могут пройти сбор некоторых экземпляра данных, например, так:Является ли Iterable-подобное поведение в C++ достижимым?
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
сек до LinkedList
с, если бы я хотел и все еще удобен для клиента в таких конструкциях, как for(String s : myClassInstance.allStrings()) //...
.
В C++, однако, если я хочу разрешить клиенту использовать мой for-loop
, в отсутствие Iterable
мне нужно вернуть const vector<T>&
или что-то еще, что явно не слишком велико.
Определение template<> begin<my_class> {/*...*/}
и друзей приятно, но только если my_class
имеет одну коллекцию для повторения. Что еще я могу сделать?
C++ имеет итераторы, хотя они работают несколько иначе, чем в Java. На самом деле интерфейс 'Iterable' - это просто слой, который позволяет компилятору Java использовать синтаксический сахар для автоматизации фактической итерации. –
@JohnGaughan Я никогда не говорил, что у C++ не было итераторов - см. Мое решение. – VF1
Если 'allTs()' возвращает 'const vector &', вы можете использовать его для инициализации переменной 'const auto &' и быть изолированной от ее типа. –
Oktalist