#include <iostream>
#include <set>
#include <string>
#include <type_traits>
using namespace std;
struct base
{
struct compare
{
template <typename T, std::enable_if_t<!std::is_base_of<base, T>::value, bool> = true>
bool operator()(const T& lhs, const base& rhs) const { return lhs < rhs.Name; }
template <typename T, std::enable_if_t<!std::is_base_of<base, T>::value, bool> = true>
bool operator()(const base& lhs, const T& rhs) const { return lhs.Name < rhs; }
bool operator()(const base& lhs, const base& rhs) const { return lhs.Name < rhs.Name; }
using is_transparent = int;
};
/*explicit base(const char * name) : Name(name) {} */
explicit base(std::string name) : Name(std::move(name)) {}
virtual ~base() {};
std::string Name;
};
/*
base::~base()
{
}
*/
struct derived : base
{
explicit derived(const std::string& name)
: base(name)
{
}
};
int main()
{
std::set<derived, base::compare> baseset;
baseset.emplace("Test");
auto x = baseset.find("Test");
std::cout << (x != baseset.end() ? x->Name : "not found!") << std::endl;
auto y = baseset.find(string("Test2"));
std::cout << (y != baseset.end() ? y->Name : "not found!") << std::endl;
}
I2luY2x1ZGUgPGlvc3RyZWFtPgojaW5jbHVkZSA8c2V0PgojaW5jbHVkZSA8c3RyaW5nPgojaW5jbHVkZSA8dHlwZV90cmFpdHM+CnVzaW5nIG5hbWVzcGFjZSBzdGQ7CgpzdHJ1Y3QgYmFzZSAKeyAKICAgIHN0cnVjdCBjb21wYXJlIAogICAgewogICAgICAgIHRlbXBsYXRlIDx0eXBlbmFtZSBULCBzdGQ6OmVuYWJsZV9pZl90PCFzdGQ6OmlzX2Jhc2Vfb2Y8YmFzZSwgVD46OnZhbHVlLCBib29sPiA9IHRydWU+CiAgICAgICAgYm9vbCBvcGVyYXRvcigpKGNvbnN0IFQmIGxocywgY29uc3QgYmFzZSYgcmhzKSBjb25zdCB7IHJldHVybiBsaHMgPCByaHMuTmFtZTsgfQogICAgICAgIAogICAgICAgIHRlbXBsYXRlIDx0eXBlbmFtZSBULCBzdGQ6OmVuYWJsZV9pZl90PCFzdGQ6OmlzX2Jhc2Vfb2Y8YmFzZSwgVD46OnZhbHVlLCBib29sPiA9IHRydWU+CiAgICAgICAgYm9vbCBvcGVyYXRvcigpKGNvbnN0IGJhc2UmIGxocywgY29uc3QgVCYgcmhzKSBjb25zdCB7IHJldHVybiBsaHMuTmFtZSA8IHJoczsgfQoKICAgICAgICBib29sIG9wZXJhdG9yKCkoY29uc3QgYmFzZSYgbGhzLCBjb25zdCBiYXNlJiByaHMpIGNvbnN0IHsgcmV0dXJuIGxocy5OYW1lIDwgcmhzLk5hbWU7IH0gCgogICAgICAgIHVzaW5nIGlzX3RyYW5zcGFyZW50ID0gaW50OyAKICAgIH07IAoKICAgIC8qZXhwbGljaXQgYmFzZShjb25zdCBjaGFyICogbmFtZSkgOiBOYW1lKG5hbWUpIHt9ICovCiAgICBleHBsaWNpdCBiYXNlKHN0ZDo6c3RyaW5nIG5hbWUpIDogTmFtZShzdGQ6Om1vdmUobmFtZSkpIHt9CiAgICAKICAgIHZpcnR1YWwgfmJhc2UoKSB7fTsKCiAgICBzdGQ6OnN0cmluZyBOYW1lOwp9OwovKgpiYXNlOjp+YmFzZSgpCnsKfQoqLwpzdHJ1Y3QgZGVyaXZlZCA6IGJhc2UKeyAKICAgICAgICBleHBsaWNpdCBkZXJpdmVkKGNvbnN0IHN0ZDo6c3RyaW5nJiBuYW1lKSAKICAgICAgICAgICAgICAgIDogYmFzZShuYW1lKSAKICAgICAgICB7IAogICAgICAgIH0gCn07CgppbnQgbWFpbigpIAp7IAogICAgc3RkOjpzZXQ8ZGVyaXZlZCwgYmFzZTo6Y29tcGFyZT4gYmFzZXNldDsgCgogICAgYmFzZXNldC5lbXBsYWNlKCJUZXN0Iik7IAoKICAgIGF1dG8geCA9IGJhc2VzZXQuZmluZCgiVGVzdCIpOyAKCiAgICBzdGQ6OmNvdXQgPDwgKHggIT0gYmFzZXNldC5lbmQoKSA/IHgtPk5hbWUgOiAibm90IGZvdW5kISIpIDw8IHN0ZDo6ZW5kbDsKICAgIAogICAgYXV0byB5ID0gYmFzZXNldC5maW5kKHN0cmluZygiVGVzdDIiKSk7CiAgICAKICAgIHN0ZDo6Y291dCA8PCAoeSAhPSBiYXNlc2V0LmVuZCgpID8geS0+TmFtZSA6ICJub3QgZm91bmQhIikgPDwgc3RkOjplbmRsOwp9Cg==