2015-09-28 2 views
2

У меня есть класс временных рядов TimeSeries, и мне нужно уметь его строить из некоторых дат и значений. Date - класс даты. Сейчас у меня это как конструктор:Общий конструктор с использованием итераторов

TimeSeries(std::vector<Date>::const_iterator dates, std::vector<double>::const_iterator values, std::size_t s)

и я называю это с помощью TimeSeries(dates.begin(), fixings.begin(), size) где dates является std::vector<Date> и fixings является std::vector<double>.

Но я хотел бы, чтобы настроить конструктор, так что я могу использовать стандартную библиотеку C++ способа просто вызывая итератор без ссылки на базовый тип данных: dates и values не должен быть итераторы на std::vector.

К сожалению, я не могу обработать аргументы конструктора. Является ли это возможным?

+0

Дубликат http://stackoverflow.com/questions/1104035/generic-iterator-in-c – ypnos

ответ

2

Да, это возможно. Почему бы не реализовать его «стандартный путь библиотеки C++»?

template<class DateIt, class ValueIt> 
TimeSeries(DateIt dates, ValueIt values, std::size_t s) 
{ 
    /*ToDo - your construction here*/ 
} 

Тогда вы можете позвонить ему, используя TimeSeries(dates.begin(), fixings.begin(), size).

Мое «вдохновение» взято из пути std::max_element работы: http://en.cppreference.com/w/cpp/algorithm/max_element

1

Вы можете использовать шаблоны, чтобы принять любого итератор-подобный объект. Чтобы исправить интерфейс, обычно рекомендуется искать аналогичное поведение в стандартной библиотеке.

В этом случае вы хотите выполнить итерацию по двум последовательностям, имеющим одинаковое количество элементов, и сделать что-то с каждым (а именно, вставить их в свой временной ряд). Это звучит очень похоже на std::transform в своей форме две последовательности:

template< class InputIt1, class InputIt2, class OutputIt, 
      class BinaryOperation > 
OutputIt transform(InputIt1 first1, InputIt1 last1, InputIt2 first2, 
        OutputIt d_first, BinaryOperation binary_op); 

Вам не нужно, чтобы пользователи могли задать бинарную операцию; ваш конструктор уже знает, что делать. Вы также не хотите итератора вывода, который только оставляет begin,end пару для первой последовательности, и begin итератор для второй последовательности:

template <typename DateIterator, typename ValueIterator> 
TimeSeries(DateIterator first, DateIterator last, ValueIterator first2); 

Эта форма требует только, что последовательность имеет значение по крайней мере, многие как диапазон, указанный в последовательности даты. В частности, размер явно не указан, поэтому эту форму можно использовать с более общей концепцией итератора ввода, а не ограничиваться переадресацией итераторов (см. http://en.cppreference.com/w/cpp/iterator для категорий итераторов).

Смежные вопросы