Я пытаюсь создать функцию, которая берет базовый контейнер, и возвращает boost :: iterator_range на основе пользовательского итератора, который выполняет некоторую обработку на элементы.Применить с помощью оператора к типу возврата функции без применения ко всему пространству имен
E.g.
// 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 мог работать (как в этом вопросе: Relying on ADL for std::begin() and std::end()?).
Я думаю, что в C++ 14 я мог бы использовать здесь тип автоматического возврата. Есть ли решение C++ 11? Есть ли способ, чтобы возвращаемый тип отображался в объявлении using, не подвергая его всему пространству имен?
ADL должен сделать это, что usings не требуется – Creris
'using' связан области. –
@Creris Это необходимо, если вы хотите, чтобы также работали массивы C-стиля. – Shoe