#include <utility>
#include <algorithm>
#include <iostream>
template<typename D, typename P, P> struct projection;
template<typename Data, typename Class, typename Return, Return (Class::*member_function) () const>
struct projection<Data, Return (Class::*) () const, member_function> {
Data data;
projection (Class const & object)
: data ((object.*member_function)()) {}
/* template<typename X>
projection (X&& input)
: data (std::forward<X>(input)) {}*/
projection (Data d) : data (d) {}
};
template<typename Data, typename Class, typename Member, Member (Class::*member_pointer)>
struct projection<Data, Member (Class::*), member_pointer> {
Data data;
projection (Class const & object)
: data (object.*member_pointer) {}
/* template<typename X>
projection (X&& input)
: data (std::forward<X>(input)) {}*/
projection (Data d) : data (d) {}
};
struct Item {
int x;
int get () const { return x; }
};
int main () {
Item items [] = {1,2,3,4,5,99};
using P = projection<int, decltype(&Item::x), &Item::x>;
auto compare = [](P const & left, P const & right) {
return left.data < right.data; };
std::cout << std::binary_search(
std:: begin (items), std::end(items),
4, compare)
<< std::endl;
std::cout << std::binary_search(
std:: begin (items), std::end(items),
44, compare)
<< std::endl;
}
I2luY2x1ZGUgPHV0aWxpdHk+CiNpbmNsdWRlIDxhbGdvcml0aG0+CiNpbmNsdWRlIDxpb3N0cmVhbT4KCnRlbXBsYXRlPHR5cGVuYW1lIEQsIHR5cGVuYW1lIFAsIFA+IHN0cnVjdCBwcm9qZWN0aW9uOwoKdGVtcGxhdGU8dHlwZW5hbWUgRGF0YSwgdHlwZW5hbWUgQ2xhc3MsIHR5cGVuYW1lIFJldHVybiwgUmV0dXJuIChDbGFzczo6Km1lbWJlcl9mdW5jdGlvbikgKCkgY29uc3Q+CnN0cnVjdCBwcm9qZWN0aW9uPERhdGEsIFJldHVybiAoQ2xhc3M6OiopICgpIGNvbnN0LCBtZW1iZXJfZnVuY3Rpb24+IHsKIERhdGEgZGF0YTsKIHByb2plY3Rpb24gKENsYXNzIGNvbnN0ICYgb2JqZWN0KQogIDogZGF0YSAoKG9iamVjdC4qbWVtYmVyX2Z1bmN0aW9uKSgpKSB7fQovKiB0ZW1wbGF0ZTx0eXBlbmFtZSBYPgogcHJvamVjdGlvbiAoWCYmIGlucHV0KQogIDogZGF0YSAoc3RkOjpmb3J3YXJkPFg+KGlucHV0KSkge30qLwogcHJvamVjdGlvbiAoRGF0YSBkKSA6IGRhdGEgKGQpIHt9Cn07Cgp0ZW1wbGF0ZTx0eXBlbmFtZSBEYXRhLCB0eXBlbmFtZSBDbGFzcywgdHlwZW5hbWUgTWVtYmVyLCBNZW1iZXIgKENsYXNzOjoqbWVtYmVyX3BvaW50ZXIpPgpzdHJ1Y3QgcHJvamVjdGlvbjxEYXRhLCBNZW1iZXIgKENsYXNzOjoqKSwgbWVtYmVyX3BvaW50ZXI+IHsKIERhdGEgZGF0YTsKIHByb2plY3Rpb24gKENsYXNzIGNvbnN0ICYgb2JqZWN0KQogIDogZGF0YSAob2JqZWN0LiptZW1iZXJfcG9pbnRlcikge30KLyogdGVtcGxhdGU8dHlwZW5hbWUgWD4KIHByb2plY3Rpb24gKFgmJiBpbnB1dCkKICA6IGRhdGEgKHN0ZDo6Zm9yd2FyZDxYPihpbnB1dCkpIHt9Ki8KIHByb2plY3Rpb24gKERhdGEgZCkgOiBkYXRhIChkKSB7fQp9OwoKCnN0cnVjdCBJdGVtIHsKIGludCB4OwogaW50IGdldCAoKSBjb25zdCB7IHJldHVybiB4OyB9Cn07CgoKaW50IG1haW4gKCkgewogSXRlbSBpdGVtcyBbXSA9IHsxLDIsMyw0LDUsOTl9OwogdXNpbmcgUCA9IHByb2plY3Rpb248aW50LCBkZWNsdHlwZSgmSXRlbTo6eCksICZJdGVtOjp4PjsKIGF1dG8gY29tcGFyZSA9IFtdKFAgY29uc3QgJiBsZWZ0LCBQIGNvbnN0ICYgcmlnaHQpIHsKICAgICAgICAgICAgICAgcmV0dXJuIGxlZnQuZGF0YSA8IHJpZ2h0LmRhdGE7IH07CiBzdGQ6OmNvdXQgPDwgc3RkOjpiaW5hcnlfc2VhcmNoKAogICAgICBzdGQ6OiBiZWdpbiAoaXRlbXMpLCBzdGQ6OmVuZChpdGVtcyksCiAgICAgIDQsIGNvbXBhcmUpCiAgICA8PCBzdGQ6OmVuZGw7CiBzdGQ6OmNvdXQgPDwgc3RkOjpiaW5hcnlfc2VhcmNoKAogICAgICBzdGQ6OiBiZWdpbiAoaXRlbXMpLCBzdGQ6OmVuZChpdGVtcyksCiAgICAgIDQ0LCBjb21wYXJlKQogICAgPDwgc3RkOjplbmRsOwp9