Я использую ЬурейиЙ определить тип контейнера в моей программе, так что я могу легко переключаться между использованием обычных контейнеров STL и STXXL контейнеров, вдоль линий:Перегрузки for_each для конкретных типов итераторов
typedef stxxl:vector<Data> MyContainer;
или
typedef std:vector<Data> MyContainer;
Одна трудность заключается в том, что STXXL предоставляет специальную версию std::for_each
, stxxl::for_each
, который оптимизирован для использования с контейнерами STXXL. Я бы предпочел использовать эту функцию, когда MyContainer вводится как stxxl::vector
.
Одним из решений было бы определить мою собственную функцию for_each
, которая вызывает функцию for_each
и использовать ее, когда я хочу позвонить for_each
.
Другое решение, которое я сейчас изучаю, заключается в том, чтобы перегружать/специализировать std::foreach
так, чтобы он вызывал stxxl::for_each
всякий раз, когда он вызывается с stxxl::vector<Data>::(const_)iterator
в качестве первого и второго аргументов.
Я не могу заставить вторую идею работать. Я пробовал следующее:
namespace std
{
template <class UnaryFunction>
UnaryFunction for_each(stxxl:vector<Data>::const_iterator first,
stxxl:vector<Data>::const_iterator last, UnaryFunction f)
{
stxxl::for_each(first, last, f, 4);
}
}
Наряду с аналогичной функцией для итераторов, не являющихся константами. Хотя их не называют.
Что было бы предпочтительным решением этой проблемы? Как я могу получить свою версию std::for_each
для stxxl::vector
итераторов для вызова?
Обновление: У меня есть вторая идея работать сейчас, как опубликовано. Проблема заключалась в том, что я включал неправильный файл (ouch ...). Первый вопрос остается, хотя: Какое предпочтительное решение этой проблемы? Можно ли перегрузить std :: for_each, поскольку пространство имен std не предназначено для простых смертных?
Я никогда не запомню правила того, что вам разрешено вводить в std namespacem, и я уверен, что большинство других людей тоже не могут. Поэтому я предпочел бы неинвазивное решение. – 2010-01-01 16:50:41