Use CRTP for Polymorphic Chaining
by Marco Arena
This suggested video reminded me another use of CRTP I described some months ago. It was about how to support method chaining when inheritance is involved.
Consider this simple scenario:
struct Printer
{
Printer(ostream& stream) : m_stream(stream) {}
template<typename T>
Printer& println(T&& message)
{
cout << message << endl;
return *this;
}
protected:
ostream& m_stream;
};
struct CoutPrinter : public Printer
{
CoutPrinter() : Printer(cout) {}
CoutPrinter& color(Color c)
{
// change console color
return *this;
}
}
//...
CoutPrinter printer;
printer.color(red).println("Hello").color( // OOPS
println("Hello") returns a Printer& and not a CoutPrinter&, so color is no longer available.
In this post I wrote a very simple approach based on CRTP to maintain the chaining relationship when inheritance is involved. I also propose a complicated-at-first-sight way to avoid duplication employing a bit of metaprogramming.

Add a Comment
Comments are closed.