PWIZ_API_DECL void diff(const ContactPtr a, const ContactPtr b, ContactPtr& a_b, ContactPtr& b_a, const DiffConfig& config) { Person* a_person = dynamic_cast<Person*>(a.get()); Person* b_person = dynamic_cast<Person*>(b.get()); Organization* a_organization = dynamic_cast<Organization*>(a.get()); Organization* b_organization = dynamic_cast<Organization*>(b.get()); if (a_person && b_person) { a_b = ContactPtr(new Person()); b_a = ContactPtr(new Person()); diff(*a_person, *b_person, (Person&)*a_b, (Person&)*b_a, config); } else if (a_organization && b_organization) { a_b = ContactPtr(new Organization()); b_a = ContactPtr(new Organization()); diff(*a_organization, *b_organization, (Organization&)*a_b, (Organization&)*b_a, config); } else { ptr_diff(a, b, a_b, b_a, config); string a_type = (a_person ? "Person" : (a_organization ? "Organization" : "Contact")); string b_type = (b_person ? "Person" : (b_organization ? "Organization" : "Contact")); } }