Хороший вопрос, +1. Как жаль, ему два года ... В любом случае, я отправляю ответ: вы застряли на "C ++ way", если хотите только открыть интерфейс своей библиотеки. Мой способ сделать это так:
template<class TValue>
class IEnumerator {
public:
virtual bool MoveNext() = 0;
vírtual TValue Current() = 0;
virtual void Reset() = 0;
};
template<class TValue>
class IEnumerable {
public:
virtual std::unique_ptr< IEnumerator<TValue> > GetEnumerator() const = 0;
};
Таким образом, вы можете написать API следующего вида:
void MyAPI(const IEnumerable<IMyLibAPIObject>& pSequence);
Конечно, я предоставляю различные реализации, такие как StlEnumerator
или StlEnumerable
, или EnumeratorAdaptor<T, U>
, чтобы получить ковариацию, как в C # ...
Приветствия
Пол
Редактировать: До сих пор у меня был тип, удаляющий AnyEnumerator и AnyEnumerable. Также мне известно о различных реализациях any_iterator ...