fork download
  1. #include <iostream>
  2. #include <memory>
  3.  
  4. using namespace std;
  5.  
  6. class Genre
  7. {
  8. public:
  9. Genre() = default;
  10. std::string name;
  11. };
  12.  
  13. struct Provider
  14. {
  15. public:
  16. Provider() = default;
  17. std::string name;
  18. std::string logo;
  19. };
  20.  
  21.  
  22. template <typename T, typename R>
  23. void foo(std::shared_ptr<T>* ptr, R T::* member)
  24. {
  25. std::cout << ptr->get()->*member << std::endl;
  26. ptr->get()->*member = "...";
  27. }
  28.  
  29. template <typename T, typename R>
  30. void foo2(std::shared_ptr<T>* ptr, R T::* member)
  31. {
  32. std::cout << (&*ptr)->*member << std::endl;
  33. (&*ptr)->*member = "...";
  34. }
  35.  
  36. int main() {
  37. auto genre = std::make_shared<Genre>();
  38. auto provider = std::make_shared<Provider>();
  39.  
  40. genre->name = "123";
  41. provider->logo = "http://";
  42.  
  43. foo<Genre, std::string>(&genre, &Genre::name);
  44. foo<Genre, std::string>(&genre, &Genre::name);
  45.  
  46. foo<Provider, std::string>(&provider, &Provider::logo);
  47. foo<Provider, std::string>(&provider, &Provider::logo);
  48.  
  49.  
  50. return 0;
  51. }
Success #stdin #stdout 0s 3232KB
stdin
Standard input is empty
stdout
123
...
http://
...