r/cpp 13d ago

C++26: std::polymorphic

https://www.sandordargo.com/blog/2026/08/19/cpp26-polymorphic
97 Upvotes

44 comments sorted by

View all comments

Show parent comments

3

u/robin-m 12d ago

With c++23 deducing this you can simplify your code to just:

c++23    class Shape {     public:         template <class Self>         std::unique_ptr<Shape> clone(this Self& self) {             return std::make_unique<Self>(self);         }     };          class Rectangle: public Shape {     };          class Triangle: public Shape {     };

7

u/Big_Target_1405 12d ago

You still need a virtual clone if you actually want runtime polymorphism

2

u/robin-m 12d ago

What do you mean? Rectangle::clone() does allocate a unique pointer of Rectangle.

godbolt

8

u/Big_Target_1405 12d ago

See line 28:

https://godbolt.org/z/55Y3Gqqqd

Template 'this' deduces Self to Animal, which is useless.

What's the point in a non-virtual clone?

Template this helps with boilerplate, not with defining runtime polymorphic interfaces.

2

u/robin-m 12d ago

You are absolutely right. Thanks a lot I didn’t now, nor realized it was indeed half useless right now. I even found a paper that aim at fixing this exact issue: open-std.org