#include <type_traits>
#include <string>
template <typename Heir>
class SToString {
public:
std::string toString() {
static_assert(std::is_member_function_pointer<decltype(&Heir::toStringImpl)>::value, "class derived from SToString should implement toStringImpl()");
return static_cast<Heir*>(this)->toStringImpl();
}
};
class Foo : public SToString<Foo> {
public:
std::string toStringImplRRRRRRRRRRRRR() {
return "Foo";
}
};
int main() {
Foo f;
return 0;
}
I2luY2x1ZGUgPHR5cGVfdHJhaXRzPgojaW5jbHVkZSA8c3RyaW5nPgoKdGVtcGxhdGUgPHR5cGVuYW1lIEhlaXI+CmNsYXNzIFNUb1N0cmluZyB7CnB1YmxpYzoKICAgIHN0ZDo6c3RyaW5nIHRvU3RyaW5nKCkgewogICAgICAgIHN0YXRpY19hc3NlcnQoc3RkOjppc19tZW1iZXJfZnVuY3Rpb25fcG9pbnRlcjxkZWNsdHlwZSgmSGVpcjo6dG9TdHJpbmdJbXBsKT46OnZhbHVlLCAiY2xhc3MgZGVyaXZlZCBmcm9tIFNUb1N0cmluZyBzaG91bGQgaW1wbGVtZW50IHRvU3RyaW5nSW1wbCgpIik7CiAgICAgICAgcmV0dXJuIHN0YXRpY19jYXN0PEhlaXIqPih0aGlzKS0+dG9TdHJpbmdJbXBsKCk7CiAgICB9Cn07CgpjbGFzcyBGb28gOiBwdWJsaWMgU1RvU3RyaW5nPEZvbz4gewpwdWJsaWM6CiAgICBzdGQ6OnN0cmluZyB0b1N0cmluZ0ltcGxSUlJSUlJSUlJSUlJSKCkgewogICAgICAgIHJldHVybiAiRm9vIjsKICAgIH0KfTsKCmludCBtYWluKCkgewoJRm9vIGY7CgkKCXJldHVybiAwOwp9