fork download
  1. #include <utility>
  2. #include <algorithm>
  3. #include <iostream>
  4.  
  5. template<typename D, typename P, P> struct projection;
  6.  
  7. template<typename Data, typename Class, typename Return, Return (Class::*member_function) () const>
  8. struct projection<Data, Return (Class::*) () const, member_function> {
  9. Data data;
  10. projection (Class const & object)
  11. : data ((object.*member_function)()) {}
  12. /* template<typename X>
  13.  projection (X&& input)
  14.   : data (std::forward<X>(input)) {}*/
  15. projection (Data d) : data (d) {}
  16. };
  17.  
  18. template<typename Data, typename Class, typename Member, Member (Class::*member_pointer)>
  19. struct projection<Data, Member (Class::*), member_pointer> {
  20. Data data;
  21. projection (Class const & object)
  22. : data (object.*member_pointer) {}
  23. /* template<typename X>
  24.  projection (X&& input)
  25.   : data (std::forward<X>(input)) {}*/
  26. projection (Data d) : data (d) {}
  27. };
  28.  
  29.  
  30. struct Item {
  31. int x;
  32. int get () const { return x; }
  33. };
  34.  
  35.  
  36. int main () {
  37. Item items [] = {1,2,3,4,5,99};
  38. using P = projection<int, decltype(&Item::x), &Item::x>;
  39. auto compare = [](P const & left, P const & right) {
  40. return left.data < right.data; };
  41. std::cout << std::binary_search(
  42. std:: begin (items), std::end(items),
  43. 4, compare)
  44. << std::endl;
  45. std::cout << std::binary_search(
  46. std:: begin (items), std::end(items),
  47. 44, compare)
  48. << std::endl;
  49. }
Success #stdin #stdout 0s 15240KB
stdin
Standard input is empty
stdout
1
0