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.