Я пытаюсь создать функцию, которая берет базовый контейнер, и возвращает boost:: iterator_range на основе пользовательского итератора, который выполняет некоторую обработку элементов.
например.
// The range class, templated on the underlying iterator type
template<class Iter> using CustomRange = boost::iterator_range<CustomIterator<Iter>>;
using std::begin;
template <class Container>
auto make_custom_range(Container& c) -> CustomRange<decltype(begin(c))> {
using std::end;
return make_custom_range_from_iterators(begin(c),end(c));
}
Работает код (с учетом соответствующих определений для CustomIterator и make_custom_range_from_iterators).
Меня беспокоит объявление using std::begin
, которое, я думаю, приведет к тому, что std:: begin будет импортирован во все пространство имен, где объявлена моя функция. Я предпочитаю не использовать std:: begin явно в decltype, чтобы ADL мог работать (как в этом вопросе: Опираясь на ADL для std:: begin() и std:: end ( )?).
Я думаю, что в С++ 14 я мог бы использовать здесь тип автоматического возврата. Есть ли решение С++ 11? Есть ли способ, чтобы возвращаемый тип отображался в объявлении using, не подвергая его всему пространству имен?