#include <iostream>
#include <memory>
using namespace std;
class Genre
{
public:
Genre() = default;
std::string name;
};
struct Provider
{
public:
Provider() = default;
std::string name;
std::string logo;
};
template <typename T, typename R>
void foo(std::shared_ptr<T>* ptr, R T::* member)
{
std::cout << ptr->get()->*member << std::endl;
ptr->get()->*member = "...";
}
template <typename T, typename R>
void foo2(std::shared_ptr<T>* ptr, R T::* member)
{
std::cout << (&*ptr)->*member << std::endl;
(&*ptr)->*member = "...";
}
int main() {
auto genre = std::make_shared<Genre>();
auto provider = std::make_shared<Provider>();
genre->name = "123";
provider->logo = "http://";
foo<Genre, std::string>(&genre, &Genre::name);
foo<Genre, std::string>(&genre, &Genre::name);
foo<Provider, std::string>(&provider, &Provider::logo);
foo<Provider, std::string>(&provider, &Provider::logo);
return 0;
}
I2luY2x1ZGUgPGlvc3RyZWFtPgojaW5jbHVkZSA8bWVtb3J5PgoKdXNpbmcgbmFtZXNwYWNlIHN0ZDsKCmNsYXNzIEdlbnJlCnsKCXB1YmxpYzoKCQlHZW5yZSgpID0gZGVmYXVsdDsKCXN0ZDo6c3RyaW5nIG5hbWU7CQp9OwoKc3RydWN0IFByb3ZpZGVyCnsKCXB1YmxpYzoKCQlQcm92aWRlcigpID0gZGVmYXVsdDsKCXN0ZDo6c3RyaW5nIG5hbWU7CQoJc3RkOjpzdHJpbmcgbG9nbzsKfTsKCgp0ZW1wbGF0ZSA8dHlwZW5hbWUgVCwgdHlwZW5hbWUgUj4Kdm9pZCBmb28oc3RkOjpzaGFyZWRfcHRyPFQ+KiBwdHIsIFIgVDo6KiBtZW1iZXIpIAp7CglzdGQ6OmNvdXQgPDwgcHRyLT5nZXQoKS0+Km1lbWJlciA8PCBzdGQ6OmVuZGw7CglwdHItPmdldCgpLT4qbWVtYmVyID0gIi4uLiI7Cn0KCnRlbXBsYXRlIDx0eXBlbmFtZSBULCB0eXBlbmFtZSBSPgp2b2lkIGZvbzIoc3RkOjpzaGFyZWRfcHRyPFQ+KiBwdHIsIFIgVDo6KiBtZW1iZXIpIAp7CglzdGQ6OmNvdXQgPDwgKCYqcHRyKS0+Km1lbWJlciA8PCBzdGQ6OmVuZGw7CgkoJipwdHIpLT4qbWVtYmVyID0gIi4uLiI7Cn0KCmludCBtYWluKCkgewoJYXV0byBnZW5yZSA9IHN0ZDo6bWFrZV9zaGFyZWQ8R2VucmU+KCk7CglhdXRvIHByb3ZpZGVyID0gc3RkOjptYWtlX3NoYXJlZDxQcm92aWRlcj4oKTsKCQoJZ2VucmUtPm5hbWUgPSAiMTIzIjsKCXByb3ZpZGVyLT5sb2dvID0gImh0dHA6Ly8iOwoKCWZvbzxHZW5yZSwgc3RkOjpzdHJpbmc+KCZnZW5yZSwgJkdlbnJlOjpuYW1lKTsKCWZvbzxHZW5yZSwgc3RkOjpzdHJpbmc+KCZnZW5yZSwgJkdlbnJlOjpuYW1lKTsKCQoJZm9vPFByb3ZpZGVyLCBzdGQ6OnN0cmluZz4oJnByb3ZpZGVyLCAmUHJvdmlkZXI6OmxvZ28pOwoJZm9vPFByb3ZpZGVyLCBzdGQ6OnN0cmluZz4oJnByb3ZpZGVyLCAmUHJvdmlkZXI6OmxvZ28pOwoJCgkKCXJldHVybiAwOwp9