определение шаблона функции шаблона - PullRequest
0 голосов
/ 27 июня 2018

У меня есть шаблон класса Array

template<typename T, int dimension>
class Array<typename T, int dimension>{

    //definition of the class

}

Я хочу написать функцию, не являющуюся членом, чтобы я мог приводить массив к другому типу. Например

Array<int, 2> a;
Array<float, 2> b = cast<float>(a);

Как мне написать эту функцию? Меня больше интересует, как это объявить, а не как реализовать детальный кастинг. Я пробовал

template<template<typename T, int dimension> class Array, typename New_T, int dimension>
Array<typename New_T, int dimension> cast(Array<typename T, int dimension> a){

// detailed implementation of casting, which I do not care for this question.

}

но не может пройти компиляцию.

Ответы [ 2 ]

0 голосов
/ 27 июня 2018

Здесь вам не нужны параметры шаблона шаблона. Простые параметры typename и int подойдут:

template <typename T, int dimension>
class Array
{
    // ...
};

template <typename NewT, typename T, int dimension>
Array<NewT, dimension> cast(const Array<T, dimension>& a)
{
    // ...
}

Live Demo

Вам нужны только параметры шаблона шаблона, если вы хотите принимать различные типы шаблонов. Например, если вы хотите, чтобы cast мог принимать Array или std::array, вы можете использовать параметр шаблона шаблона:

template<typename NewT, typename T, auto dimension, template<typename, auto> typename ArrayT>
ArrayT<NewT, dimension> cast(const ArrayT<T, dimension>& a)
{
    // ...
}

Live Demo

Обратите внимание, что в этом случае я также изменил тип dimension на auto, поскольку std::array использует size_t для своего измерения, в то время как ваш Array использует int.

0 голосов
/ 27 июня 2018

Как мне написать эту функцию? Меня больше интересует, как его определить, а не как реализовать детальное приведение.

Полагаю, что-то вроде

template <typename ToT, typename FromT, int Dim>
Array<ToT, Dim> cast (Array<FromT, Dim> const & inA)
 {
   // ...
 }

Это полезное место ToT (для ввода) на первой позиции, так что вы можете указать его и позволить FromT и Dim, выведенные из значения inA.

--- РЕДАКТИРОВАТЬ ---

ОП спрашивает

Любое понимание, почему я должен поставить его [ToT] на первую позицию?

Вам не обязательно ставить ToT на первую позицию. Но это упростит вашу жизнь.

Дело в том, что FromT и Dim выводятся из аргумента inA; ToT не выводится из аргументов, поэтому вы должны явно это указать.

Но если вы хотите явно указать параметр шаблона, вам обязательно нужно указать предыдущие параметры. Поэтому, если вы поставите ToT в последнюю позицию, вам придется вызвать cast(), объясняя все параметры шаблона

cast<int, 2, float>(a);

Если вы поставите ToT на первую позицию, вы должны указать только его и оставить компилятору вывод FromT и Dim из аргумента

cast<float>(a);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...