У меня полиморфного интерфейсуИспользование Boost.Range в интерфейсах C++
struct Interface {
Interface(SomeType& other)
: range([=](){ return other.my_range(); }), /*...*/ {}
Interface(SomeOtherType& other)
: range([=](){ return other.some_range(); }), /*...*/ {}
const std::function<Range(void)> range;
/// ...
};
элементов в обоих диапазонах имеют одинаковый тип (например, int
), но типы возвращаемых my_range()
и some_range()
различны, например, может быть filtered counting range
, а другой transformed filtered counting range
. Для интерфейса мне нужен один тип Range
.
Я пробовал использовать boost::any_range
, но производительность значительно хуже. Я хотел бы избежать необходимости копировать элементы диапазона в vector
и вместо этого возвращать вектор.
Есть ли альтернативы any_range
и копированию?
Спасибо за ответ, что алгоритмы обертывания в интерфейсе - это возможность, которую я не рассматривал. Кон является то, что после того, как алгоритм «for_each» приходит sort, binary_search, а затем ... взрыв функций-членов в интерфейсе. Возможно, этого не произойдет в моем приложении, поэтому то, что вы предлагаете, может быть лучшим решением (по крайней мере, в сочетании с any_range). Я буду спать на нем, спасибо за эту мысль! – gnzlbg