#include <memory>
#include <iostream>
template<typename T>
using SP = std::shared_ptr<T>;
class CVPatModel;
typedef SP<CVPatModel> VModel;
class CTest
{
public:
void SaveModelToFile( VModel ModelPtr, const char* szFileName );
};
class CVPatModel
{
public :
friend void CTest::SaveModelToFile( VModel, const char*);
protected :
virtual void Save( const char* szFileName ) { std::cout << "saving to file \"" << szFileName << "\" succeeded!\n"; };
};
void CTest::SaveModelToFile( VModel ModelPtr, const char* szFileName )
{
ModelPtr->Save(szFileName);
}
int main()
{
VModel vm = std::make_shared<CVPatModel>();
CTest ct;
ct.SaveModelToFile(vm, "bla");
}
I2luY2x1ZGUgPG1lbW9yeT4KI2luY2x1ZGUgPGlvc3RyZWFtPgogCnRlbXBsYXRlPHR5cGVuYW1lIFQ+CnVzaW5nIFNQID0gc3RkOjpzaGFyZWRfcHRyPFQ+OwogCmNsYXNzIENWUGF0TW9kZWw7CnR5cGVkZWYgU1A8Q1ZQYXRNb2RlbD4gVk1vZGVsOwogIApjbGFzcyBDVGVzdAp7CnB1YmxpYzoKICAgIHZvaWQgU2F2ZU1vZGVsVG9GaWxlKCBWTW9kZWwgTW9kZWxQdHIsIGNvbnN0IGNoYXIqIHN6RmlsZU5hbWUgKTsgICAgCn07ICAKICAKY2xhc3MgQ1ZQYXRNb2RlbAp7CnB1YmxpYyA6IAogICAgZnJpZW5kIHZvaWQgQ1Rlc3Q6OlNhdmVNb2RlbFRvRmlsZSggVk1vZGVsLCBjb25zdCBjaGFyKik7CiAKcHJvdGVjdGVkIDogCiAgICB2aXJ0dWFsIHZvaWQgU2F2ZSggY29uc3QgY2hhciogc3pGaWxlTmFtZSApIHsgc3RkOjpjb3V0IDw8ICJzYXZpbmcgdG8gZmlsZSBcIiIgPDwgc3pGaWxlTmFtZSA8PCAiXCIgc3VjY2VlZGVkIVxuIjsgfTsKfTsKIAp2b2lkIENUZXN0OjpTYXZlTW9kZWxUb0ZpbGUoIFZNb2RlbCBNb2RlbFB0ciwgY29uc3QgY2hhciogc3pGaWxlTmFtZSApCnsgCiAgICBNb2RlbFB0ci0+U2F2ZShzekZpbGVOYW1lKTsKfQogICAgCmludCBtYWluKCkKewogICAgVk1vZGVsIHZtID0gc3RkOjptYWtlX3NoYXJlZDxDVlBhdE1vZGVsPigpOwogICAgQ1Rlc3QgY3Q7CiAgICBjdC5TYXZlTW9kZWxUb0ZpbGUodm0sICJibGEiKTsKfQ==