#include <iostream>
// Declared but not defined, specializations will provide definitions
template<typename T>
struct GenericTypeTraits;
template<typename T>
class Generic
{
public:
using IdType = typename GenericTypeTraits<T>::IdType;
void setIdentifier(IdType id)
{
mType.mIdentifier = id;
}
IdType getIdentifier() const
{
return mType.mIdentifier;
}
private:
T mType;
};
class Type1
{
public:
int mIdentifier;
};
template<>
struct GenericTypeTraits<Type1>
{
using IdType = int;
};
class Type2
{
public:
std::string mIdentifier;
};
template<>
struct GenericTypeTraits<Type2>
{
using IdType = std::string;
};
int main()
{
Generic<Type1> t1[5];
t1[0].setIdentifier(3);
std::cout << t1[0].getIdentifier() << "\n";
Generic<Type2> t2[5];
t2[0].setIdentifier("3");
std::cout << t2[0].getIdentifier() << "\n";
return 0;
}
I2luY2x1ZGUgPGlvc3RyZWFtPgoKLy8gRGVjbGFyZWQgYnV0IG5vdCBkZWZpbmVkLCBzcGVjaWFsaXphdGlvbnMgd2lsbCBwcm92aWRlIGRlZmluaXRpb25zCnRlbXBsYXRlPHR5cGVuYW1lIFQ+CnN0cnVjdCBHZW5lcmljVHlwZVRyYWl0czsKCnRlbXBsYXRlPHR5cGVuYW1lIFQ+CmNsYXNzIEdlbmVyaWMKewpwdWJsaWM6Cgl1c2luZyBJZFR5cGUgPSB0eXBlbmFtZSBHZW5lcmljVHlwZVRyYWl0czxUPjo6SWRUeXBlOwoJCgl2b2lkIHNldElkZW50aWZpZXIoSWRUeXBlIGlkKQoJewoJCW1UeXBlLm1JZGVudGlmaWVyID0gaWQ7Cgl9CgkKCUlkVHlwZSBnZXRJZGVudGlmaWVyKCkgY29uc3QKCXsKCQlyZXR1cm4gbVR5cGUubUlkZW50aWZpZXI7Cgl9CgkKcHJpdmF0ZToKCVQgbVR5cGU7Cn07CgpjbGFzcyBUeXBlMQp7CnB1YmxpYzoKCWludCBtSWRlbnRpZmllcjsKfTsKCnRlbXBsYXRlPD4Kc3RydWN0IEdlbmVyaWNUeXBlVHJhaXRzPFR5cGUxPgp7Cgl1c2luZyBJZFR5cGUgPSBpbnQ7Cn07CgpjbGFzcyBUeXBlMgp7CnB1YmxpYzoKCXN0ZDo6c3RyaW5nIG1JZGVudGlmaWVyOwp9OwoKdGVtcGxhdGU8PgpzdHJ1Y3QgR2VuZXJpY1R5cGVUcmFpdHM8VHlwZTI+CnsKCXVzaW5nIElkVHlwZSA9IHN0ZDo6c3RyaW5nOwp9OwoKaW50IG1haW4oKQp7CglHZW5lcmljPFR5cGUxPiB0MVs1XTsKCXQxWzBdLnNldElkZW50aWZpZXIoMyk7CglzdGQ6OmNvdXQgPDwgdDFbMF0uZ2V0SWRlbnRpZmllcigpIDw8ICJcbiI7CgkKCUdlbmVyaWM8VHlwZTI+IHQyWzVdOwoJdDJbMF0uc2V0SWRlbnRpZmllcigiMyIpOwoJc3RkOjpjb3V0IDw8IHQyWzBdLmdldElkZW50aWZpZXIoKSA8PCAiXG4iOwoJCglyZXR1cm4gMDsKfQ==