#include <type_traits>
#include <list>
#include <string>
template <typename T, typename C>
class tl2;
template <typename D, typename T>
class tl1
{
private:
std::list<T> mTs;
tl1()
{
static_assert(std::is_base_of<tl2<T, D>, T>::value,
"T should inherit from tl2");
}
friend D;
public:
T& getTbyName() const;
};
template <typename T, typename C>
class tl2
{
public:
tl2()
{
static_assert(std::is_base_of<tl1<C, T>, C>::value,
"C should inherit from tl1");
}
std::string getName()
{
return mName;
}
private:
std::string mName;
};
class cl1;
class cl2 : public tl2<cl2, cl1>
{
cl2(){}
};
class cl1 : public tl1<cl1, cl2>
{
cl1(){}
};
int main()
{
}
I2luY2x1ZGUgPHR5cGVfdHJhaXRzPgojaW5jbHVkZSA8bGlzdD4KI2luY2x1ZGUgPHN0cmluZz4KCnRlbXBsYXRlIDx0eXBlbmFtZSBULCB0eXBlbmFtZSBDPgpjbGFzcyB0bDI7Cgp0ZW1wbGF0ZSA8dHlwZW5hbWUgRCwgdHlwZW5hbWUgVD4KY2xhc3MgdGwxCnsKcHJpdmF0ZToKICBzdGQ6Omxpc3Q8VD4gbVRzOwogIHRsMSgpCiAgewogICAgc3RhdGljX2Fzc2VydChzdGQ6OmlzX2Jhc2Vfb2Y8dGwyPFQsIEQ+LCBUPjo6dmFsdWUsCiAgICAgICAgICAgICAgICAgICJUIHNob3VsZCAgICAgaW5oZXJpdCBmcm9tIHRsMiIpOwogIH0KICBmcmllbmQgRDsKCnB1YmxpYzoKICBUJiBnZXRUYnlOYW1lKCkgY29uc3Q7Cn07Cgp0ZW1wbGF0ZSA8dHlwZW5hbWUgVCwgdHlwZW5hbWUgQz4KY2xhc3MgdGwyCnsKcHVibGljOgogIHRsMigpCiAgewogICAgc3RhdGljX2Fzc2VydChzdGQ6OmlzX2Jhc2Vfb2Y8dGwxPEMsIFQ+LCBDPjo6dmFsdWUsCiAgICAgICAgICAgICAgICAgICJDIHNob3VsZCBpbmhlcml0IGZyb20gdGwxIik7CiAgfQoKICBzdGQ6OnN0cmluZyBnZXROYW1lKCkKICB7CiAgICByZXR1cm4gbU5hbWU7CiAgfQoKcHJpdmF0ZToKICBzdGQ6OnN0cmluZyBtTmFtZTsKfTsKCmNsYXNzIGNsMTsKCmNsYXNzIGNsMiA6IHB1YmxpYyB0bDI8Y2wyLCBjbDE+CnsKICBjbDIoKXt9Cn07CmNsYXNzIGNsMSA6IHB1YmxpYyB0bDE8Y2wxLCBjbDI+CnsKICBjbDEoKXt9Cn07CgppbnQgbWFpbigpCnsKfQo=