Я пытаюсь реализовать свой собственный bind_range
, который может связываться с диапазоном. Это должно разрешить клиентский код следующим образом:
void f(int x, int y)
{
std::cout << x + y << ',';
}
std::vector<int> v1; // contains 1,2,3
void go()
{
boost::function<void(int y)> f_bound = bind_range(f, v1, _1);
f_bound(10); // prints 11,12,13,
}
В приведенном выше коде мой шаблон bind_range
обнаруживает, что v1
соответствует ForwardRangeConcept<>
и что его тип значения совместим с первым параметром f()
. Затем он генерирует функциональный объект, который будет перебирать v1
, вызывая f()
для каждого значения.
Я знаю, что вышеупомянутое может быть достигнуто с помощью некоторой формы конструкции for-each в вызывающем коде, но я хочу взять связанную функцию и использовать ее позже.
Вышесказанное - это суть того, чего я хочу достичь. Я прочитал свою копию C ++ Template Metaprogramming и посмотрел на реализацию boost::bind
, но не могу начать с решения. У меня также есть ноющее чувство, что нечто подобное уже существует где-то в библиотеках Boost.
Расширения:
Связывание нескольких диапазонов. Например:
std::vector<int> v10; // contains 10,20,30
void go_multiple()
{
boost::function<void()> f_bound = bind_range(f, v10, v1);
f_bound(); // prints 11,12,13,21,22,23,31,32,33,
}
Работа с типом возврата. Мне не нужен тип возврата из моих повторных вызовов, но вполне возможно, что кто-то захочет сохранить или обработать каждое возвращаемое значение. Я уверен, что это можно сделать аккуратно с помощью какой-то конструкции типа Lamda.