Но для плоскости одно число и тип параметров, для прямой другое, а для точки третье. Это то, что в функциональных языках называется dependent sum type. Можно ли это сделать в C++?
Эта задача стала одной из тех из которых вырос классический ООП.
Например вот тут Алан Кэй (создатель Smalltalk и пионер в области ООП в целом) пишет:
http://userpage.fu-berlin.de/~ram/pub/p ... kay_oop_enЦитата:
"...the early work of Doug Ross at MIT (AED and earlier) in
which he advocated embedding procedure pointers in data structures,
Sketchpad (which had full polymorphism — where e.g. the same offset
in its data structure meant "display" and there would be a pointer to
the appropriate routine for the type of object that structure
represented, etc...."
То есть да, он относит к зарождению ООП в том числе момент когда некто Doug Ross из MIT вложил указатели на код в данные визуального редактора Sketchpad со смыслом "нарисовать себя", а это полиморфизм и предыстория ООП.
В общем в рамках C++ никаких variant тут не надо - нужны классы с объектами как уже в общем то показали.
Полиморфные (ООП) объекты надо хранить по указателям - например в контейнере std::vector< Figure * > и внешний код в идеале не должен обращаться к полям этих объектов - только давать им методы по смыслу типа "нарисуй себя" или "находишься ли ты по координатам (x,y)?", хотя если речь про OpenGL может быть будет уместно что-то вроде "сложи мне свои трианглы в вершинный буфер сюда то" - тут по объёму задачи и сложности рендера надо смотреть.
Для очень большого числа объектов и массивной отрисовки бывает смысл отказываться от ООП и переходить на какой нибудь data-driven где каждый тип описан компактно в массивах однородных данных, рисуется через инстансинг и т.п.