Создание класса эмулирующего пространственную точку
Задача проста. Создать класс 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 шт):
По сути у это сейчас - обертка над С массивом, аналог ::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)...}
{
/* тут ничего писать не нужно */
}
};