模板模板功能定义

时间:2018-06-27 02:05:58

标签: c++ templates template-deduction template-templates

我有一个名为Array的模板类

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

    //definition of the class

}

我想编写一个非成员函数强制转换,以便可以将Array强制转换为其他类型。例如

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 :(得分:3)

这里完全不需要模板模板参数。简单的typenameint参数即可:

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能够接受Arraystd::array,则可以使用模板template参数:

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使用{{ 1}}。

答案 1 :(得分:2)

  

我应该如何编写此函数?我对如何定义它而不是如何进行详细的转换更感兴趣。

我想类似

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

ToT(待键入)放在第一位置很有用,因此您可以显式显示它,并让FromT值推导DiminA

---编辑---

OP询问

  

有什么见解,为什么我必须把它[[ToT]放在第一位?

您不一定必须将ToT放在第一位。但这简化了您的生活。

要点是,FromTDim可从inA参数推导出; ToT不能从参数中推论出来,因此您必须将其明确。

但是,如果要显式指定模板参数,则必须显式前面的参数。因此,如果将ToT放在最后一个位置,则必须调用cast()来说明所有模板参数

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

如果将ToT放在第一位,则只需将其显式显示,并让编译器从参数中推断出FromTDim

cast<float>(a);