fork download
  1. #include <algorithm>
  2. #include <iostream>
  3. #include <list>
  4.  
  5. template <typename T, typename MPtr>
  6. auto arrow(T* obj, MPtr mptr)
  7. {
  8. return obj->*mptr;
  9. }
  10.  
  11. template <typename T, typename MPtr, typename ... MPtrs>
  12. auto arrow(T* obj, MPtr mptr, MPtrs... mptrs)
  13. {
  14. return arrow(obj->*mptr, mptrs...);
  15. }
  16.  
  17. template <typename Container, typename T, typename... DataPtrs>
  18. auto searchByDataMember (const Container& container, const T& t, DataPtrs... ptrs)
  19. {
  20. return std::find_if(std::begin(container), std::end(container),
  21. [&](const auto&e) {
  22. return arrow(e, ptrs...) == t;
  23. });
  24. }
  25.  
  26. struct Thing {
  27. int ID, value;
  28. std::string name;
  29. Thing (int i, int v, const std::string& n) : ID(i), value(v), name(n) {}
  30. };
  31.  
  32. struct Object {
  33. int rank;
  34. Thing* thing;
  35. Object (int r, Thing* t) : rank(r), thing(t) {}
  36. };
  37.  
  38.  
  39. int main() {
  40. Thing thing1(5, 6, "Sam");
  41. Object o1(8, &thing1);
  42. Thing thing2(11, 7, "Mark");
  43. Object o2(8, &thing2);
  44. Thing thing3(9, 12, "Rob");
  45. Object o3(8, &thing3);
  46. Thing thing4(2, 11, "Tom");
  47. Object o4(8, &thing4);
  48. std::list<Object*> objects{&o1, &o2, &o3, &o4};
  49.  
  50. const auto it = searchByDataMember (objects, 11, &Object::thing, &Thing::value);
  51. std::cout << (*it)->thing->name << '\n'; // Tom (the desired output)
  52. }
Success #stdin #stdout 0s 3416KB
stdin
Standard input is empty
stdout
Tom