Приведение класса шаблона в конструктор - PullRequest
0 голосов
/ 01 мая 2018

Допустим, у меня есть такой класс:

template< typename T, int nDimensions = 2 >
class Vec
{
private:
    std::array< T, nDimensions > elements_;
}

Затем я печатаю несколько разных типов.

typedef Vec< int, 2 > Vec2i;
typedef Vec< int, 3 > Vec3i;
typedef Vec< float, 2 > Vec2f;
typedef Vec< float, 3 > Vec3f;

Каким был бы конструктор, если бы я хотел преобразовать один тип в другой?

Vec2i something(10,20); //10,20
Vec2f somethingElse(something); //10.0f,20.0f

То же самое касается разных размеров:

Vec3f somethingmore(something); //10.0f,20.0f,0.0f

Пока у меня есть:

template<typename F>
    Vec(const F& other)
    {
        for (int i = 0; i < nDimensions; i++)
        {
            this->elements_[i] = static_cast<F>(other[i]); //I know this is wrong.
        }
    }

Я не могу найти хороший способ заставить базовый тип другого класса выполнять статическое приведение к каждому элементу, ни хороший способ получить размер других nDimension, чтобы я мог выполнить правильную проверку границ.

1 Ответ

0 голосов
/ 01 мая 2018

Каким был бы конструктор, если бы я хотел преобразовать один тип в другой?

Самый общий конструктор будет:

template <typename T2, int nDimension2>
Vec(Vec<T2, nDimension2> const& copy) { ... }

Для этого потребуется соответствующая логика, чтобы убедиться, что вы не обращаетесь к памяти, используя индексы за пределами.

Менее универсальный конструктор будет:

template <typename T2>
Vec(Vec<T2, nDimension> const& copy) { ... }

Здесь вы можете использовать std::copy для копирования элементов.

template <typename T2>
Vec(Vec<T2, nDimension> const& copy) { std::copy(copy.elements_.begin(),
                                                 copy.elements_.ennd(),
                                                 this->elements_.begin()); }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...