Создание класса эмулирующего пространственную точку

Задача проста. Создать класс Point который будет эмулировать пространственную точку, храня соответствующее количество double переменных.
Изначально рассматривал подход с множественным наследованием типа Point <- Point1D <- Point2D <- Point3D, но он мне показался неряшливым.
Потом подумал создать универсальный класс Point, который будет хранить в себе вектор со значениями по разным измерениям. Однако и это вариант я отсёк, так как не возможно будет сразу визуально определить скольки-мерная это точка.
И сейчас я пытаюсь сделать этот класс на вариативном шаблоне.
Мой код:

template<size_t size>
class Point {
protected:
    double Data[size];
public:
    template<double... args>
    Point(args) {
        /* что нужно написать тут */
    }
};
typedef Point<1> Point1D;
typedef Point<2> Point2D;
typedef Point<3> Point3D;

Как видно из примера - я пытался создать класс и потом уже переопределять его в соответствии с параметрами шаблона. Минуса я выделил только 1 - невозможность контролировать кол-во передаваемых параметров, однако он не критичен для меня.
Вызов конструктора должен выглядеть примерно так.

Point2D MyPoint(1. , 2.);

А теперь сам вопрос: Как правильно описать данный класс, что бы это работало хотя бы приблизительно так, как это предполагалось. Возможно вы подскажете как написать правильнее с точки зрения структуры или красоты кода. p.s. Варианты с cstdarg и std::initializer_list использовать очень не хочется :)

/---------- U.D.P ----------/
Ещё пытался описать вот так:

template<size_t size, typename... args>
class Point {
protected:
    double Data[size];
public:
    Point(args ... Args) {
        // ????
    }
};
typedef Point<1, double> Point1D;
typedef Point<2, double, double> Point2D;
typedef Point<3, double, double, double> Point3D;

Ответы (1 шт):

Автор решения: user7860670

По сути у это сейчас - обертка над С массивом, аналог ::std::array. Соответственно и конструктор писать не обязательно, можно обойтись агрегатной инициализацией. Если уж хочется конструктор, то можно сделать так:

#include <utility>
#include <cstddef>

template< ::std::size_t x_size >
class Point
{
    private: double m_items[x_size];

    public: template< typename... x_Args > explicit
    Point(x_Args &&... args)
    :   m_items{::std::forward<x_Args>(args)...}
    {
        /* тут ничего писать не нужно */
    }
};
→ Ссылка