Сейчас налетел на очепятку вот такого рода
// дано
class Contents;
struct Size;
class Image;
class Icon {
.....
Image AsImage() const;
.....
};
class Controller {
.....
Icon GetIcon(Contents, Size) const;
.....
};
// хотел
Image image = controller.GetIcon(contents, size).AsImage();
// написал
Image image = controller.GetIcon(contents, size.AsImage());
И подумалось: а БЫЛО БЫ КРУТО просовывать пожелания ("AsImage" — это пожелание) изнутри наружу.
На перегрузках и шаблонах это делается несложно, хотя и многословно, если нет соответствующего фреймворка или поддержки языка
class Controller {
.....
template<class Wish>
auto GetIcon(Contents contents, Size size, Wish wish) -> auto {
return apply_wish(GetIcon(contents, size), wish);
}
.....
};
Image image = controller.GetIcon(contents, size, AsImage);
Следующим шагом будет свёртка пожеланий с аргументами (что у меня и произошло в опечатке) — и дальнейший вывод пожелания из типа аргумента.
class Controller {
.....
template<class Size_Wish>
auto GetIcon(Contents contents, Size_Wish size) -> auto {
return apply_wish(GetIcon(contents, get_pure(size)), get_wish(size));
}
.....
};
Image image = controller.GetIcon(contents, make_wish(size, AsImage));
Ну и наконец, легитимизация синтаксиса: make_wish(x,y) == x.y
Дело запахло аппликативными функторами...