#include <iostream>
#include <iterator>
template<class T>
class Base
{
protected:
std::string mFoo;
public:
// note: *something* virtual required for dynamic_cast
virtual ~Base() {};
T& withFoo(const std::string& foo)
{
mFoo = foo;
return dynamic_cast<T&>(*this);
}
};
class Derived : public Base<Derived>
{
protected:
std::string mBar;
public:
Derived& withBar(std::string bar)
{
mBar = bar;
return *this;
}
void doOutput()
{
std::cout << "Foo is " << mFoo
<< ". Bar is " << mBar << "."
<< std::endl;
}
};
int main()
{
Derived d;
d.withFoo("foo").withBar("bar");
d.doOutput();
return 0;
}
I2luY2x1ZGUgPGlvc3RyZWFtPgojaW5jbHVkZSA8aXRlcmF0b3I+Cgp0ZW1wbGF0ZTxjbGFzcyBUPgpjbGFzcyBCYXNlCnsKcHJvdGVjdGVkOgogICAgc3RkOjpzdHJpbmcgbUZvbzsKICAgIApwdWJsaWM6CiAgICAvLyBub3RlOiAqc29tZXRoaW5nKiB2aXJ0dWFsIHJlcXVpcmVkIGZvciBkeW5hbWljX2Nhc3QKICAgIHZpcnR1YWwgfkJhc2UoKSB7fTsKICAgIAogICAgVCYgd2l0aEZvbyhjb25zdCBzdGQ6OnN0cmluZyYgZm9vKQogICAgewogICAgICAgIG1Gb28gPSBmb287CiAgICAgICAgcmV0dXJuIGR5bmFtaWNfY2FzdDxUJj4oKnRoaXMpOwogICAgfQp9OwoKY2xhc3MgRGVyaXZlZCA6IHB1YmxpYyBCYXNlPERlcml2ZWQ+CnsKcHJvdGVjdGVkOgogICAgc3RkOjpzdHJpbmcgbUJhcjsKICAgIApwdWJsaWM6CiAgICBEZXJpdmVkJiB3aXRoQmFyKHN0ZDo6c3RyaW5nIGJhcikKICAgIHsKICAgICAgICBtQmFyID0gYmFyOwogICAgICAgIHJldHVybiAqdGhpczsKICAgIH0KICAgIAogICAgdm9pZCBkb091dHB1dCgpCiAgICB7CiAgICAgICAgc3RkOjpjb3V0IDw8ICJGb28gaXMgIiA8PCBtRm9vCiAgICAgICAgICAgICAgICAgIDw8ICIuICBCYXIgaXMgIiA8PCBtQmFyIDw8ICIuIgogICAgICAgICAgICAgICAgICA8PCBzdGQ6OmVuZGw7CiAgICB9Cn07CgoKaW50IG1haW4oKQp7CiAgICBEZXJpdmVkIGQ7CiAgICBkLndpdGhGb28oImZvbyIpLndpdGhCYXIoImJhciIpOwogICAgZC5kb091dHB1dCgpOwogICAgCiAgICByZXR1cm4gMDsKfQ==