#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) {}
};
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::get), &Item::get>;
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+KGlucHV0KSkge30qLwogcHJvamVjdGlvbiAoRGF0YSBkKSA6IGRhdGEgKGQpIHt9Cn07CgoKc3RydWN0IEl0ZW0gewogaW50IHg7CiBpbnQgZ2V0ICgpIGNvbnN0IHsgcmV0dXJuIHg7IH0KfTsKCgppbnQgbWFpbiAoKSB7CiBJdGVtIGl0ZW1zIFtdID0gezEsMiwzLDQsNSw5OX07CiB1c2luZyBQID0gcHJvamVjdGlvbjxpbnQsIGRlY2x0eXBlKCZJdGVtOjpnZXQpLCAmSXRlbTo6Z2V0PjsKIGF1dG8gY29tcGFyZSA9IFtdKFAgY29uc3QgJiBsZWZ0LCBQIGNvbnN0ICYgcmlnaHQpIHsKICAgICAgICAgICAgICAgcmV0dXJuIGxlZnQuZGF0YSA8IHJpZ2h0LmRhdGE7IH07CiBzdGQ6OmNvdXQgPDwgc3RkOjpiaW5hcnlfc2VhcmNoKAogICAgICBzdGQ6OiBiZWdpbiAoaXRlbXMpLCBzdGQ6OmVuZChpdGVtcyksCiAgICAgIDQsIGNvbXBhcmUpCiAgICA8PCBzdGQ6OmVuZGw7CiBzdGQ6OmNvdXQgPDwgc3RkOjpiaW5hcnlfc2VhcmNoKAogICAgICBzdGQ6OiBiZWdpbiAoaXRlbXMpLCBzdGQ6OmVuZChpdGVtcyksCiAgICAgIDQ0LCBjb21wYXJlKQogICAgPDwgc3RkOjplbmRsOwp9