Ответ 1
У вас есть механизм компоновки, который должен работать с 90-градусным вращением (перестановка по высоте и ширине).
Используя интеллектуальные указатели элементов, вы можете сделать (foo->*x)
и (foo->*y)
значение подкачки. Те же умные x
и y
могут работать с различными несвязанными типами данных (прямоугольники, точки, векторы), даже по типам, которых вы не являетесь.
template<class F>
struct smart_pm_t {
F f;
template<class T>
friend decltype(auto) operator->*(T* t, smart_pm_t const& self ) {
return self.f(t);
}
};
template<class F>
smart_pm_t<F> smart_pm( F f ) { return {std::move(f)}; }
auto x = smart_pm( [](auto* t)->decltype(auto) noexcept { return t->x; } );
auto y = smart_pm( [](auto* t)->decltype(auto) noexcept { return t->y; } );
и мы можем с ними полюбоваться.
do_layout( data, x, y );
против
do_layout( data, y, x );
решает проблему горизонтально или вертикально.
Это фактический (упрощенный) вариант использования в фактическом производственном коде, который уменьшил дублирование кода и вычистил целую кучу ошибок, потому что нам нужно было только один раз исправить код.
Правильный указатель элемента правой руки имел проблему, что нам пришлось бы передать целый набор указателей элементов, по одному на тип, который работает с левой стороны.
Фактически мы написали указатель на полиморфный член времени компиляции.