#include <string>
#include <iostream>
struct Foo {
char c;
void set(std::string s) {c = s[0];}; // We don't really care here
};
struct Bar {
int n;
void set(std::string s) {n = s.size();}; // We don't really care here
};
template<typename T>
struct Identified {
T model;
std::string id;
};
template<typename T>
Identified<T> GetIdentifiedModel(std::string id) {
Identified<T> result;
result.id = id;
// Obviously shouldn't be ID but for the example
result.model.set(id); // Common method for T
return result;
}
void assert(bool b) {
if (b) std::cout << "OK" << std::endl;
else std::cout << "There is a problem !" << std::endl;
};
int main() {
auto fooWithID = GetIdentifiedModel<Foo>("foo id");
auto barWithID = GetIdentifiedModel<Bar>("bar");
assert (fooWithID.model.c == 'f');
assert (barWithID.model.n == 3);
return (0);
}
I2luY2x1ZGUgPHN0cmluZz4KI2luY2x1ZGUgPGlvc3RyZWFtPgoKc3RydWN0IEZvbyB7CgljaGFyIGM7Cgl2b2lkIHNldChzdGQ6OnN0cmluZyBzKSB7YyA9IHNbMF07fTsgLy8gV2UgZG9uJ3QgcmVhbGx5IGNhcmUgaGVyZQp9OwpzdHJ1Y3QgQmFyIHsKCWludCBuOwoJdm9pZCBzZXQoc3RkOjpzdHJpbmcgcykge24gPSBzLnNpemUoKTt9OyAvLyBXZSBkb24ndCByZWFsbHkgY2FyZSBoZXJlCn07Cgp0ZW1wbGF0ZTx0eXBlbmFtZSBUPgpzdHJ1Y3QgSWRlbnRpZmllZCB7CiAgICBUIG1vZGVsOwogICAgc3RkOjpzdHJpbmcgaWQ7Cn07Cgp0ZW1wbGF0ZTx0eXBlbmFtZSBUPgpJZGVudGlmaWVkPFQ+IEdldElkZW50aWZpZWRNb2RlbChzdGQ6OnN0cmluZyBpZCkgewogICAgSWRlbnRpZmllZDxUPiByZXN1bHQ7CiAgICByZXN1bHQuaWQgPSBpZDsKICAgIC8vIE9idmlvdXNseSBzaG91bGRuJ3QgYmUgSUQgYnV0IGZvciB0aGUgZXhhbXBsZQogICAgcmVzdWx0Lm1vZGVsLnNldChpZCk7ICAvLyBDb21tb24gbWV0aG9kIGZvciBUCiAgICByZXR1cm4gcmVzdWx0Owp9Cgp2b2lkIGFzc2VydChib29sIGIpIHsKCWlmIChiKSBzdGQ6OmNvdXQgPDwgIk9LIiA8PCBzdGQ6OmVuZGw7CgllbHNlIHN0ZDo6Y291dCA8PCAiVGhlcmUgaXMgYSBwcm9ibGVtICEiIDw8IHN0ZDo6ZW5kbDsKfTsKCmludCBtYWluKCkgewoJYXV0byBmb29XaXRoSUQgPSBHZXRJZGVudGlmaWVkTW9kZWw8Rm9vPigiZm9vIGlkIik7CglhdXRvIGJhcldpdGhJRCA9IEdldElkZW50aWZpZWRNb2RlbDxCYXI+KCJiYXIiKTsKCWFzc2VydCAoZm9vV2l0aElELm1vZGVsLmMgPT0gJ2YnKTsKCWFzc2VydCAoYmFyV2l0aElELm1vZGVsLm4gPT0gMyk7CglyZXR1cm4gKDApOwp9