模板模板函数定义

template template function definition

本文关键字:定义 函数      更新时间:2023-10-16

我有一个名为 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.
}

但它无法通过编译。

这里根本不需要模板模板参数。 简单的typenameint参数就可以:

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

现场演示

仅当您想要接受不同类型的模板时,才需要模板模板参数。 例如,如果您希望cast能够接受Arraystd::array,则可以使用模板模板参数:

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

现场演示

请注意,在这种情况下,我还将dimension的类型更改为auto,因为std::array使用size_t作为其维度,而您的Array使用int

我应该如何编写此函数?我更感兴趣的是如何定义它,而不是如何实现详细的强制转换。

我想像

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

ToT(to-type(放在第一个位置很有用,因此您可以显式它并让FromTDiminA值中推断出来。

---编辑---

OP问

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

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

关键是FromTDim可以从inA论证中推导出来;ToT无法从参数中推导出来,因此您必须明确表示。

但是,如果要显式模板参数,则必须显式显式上述参数。因此,如果您将ToT放在最后的位置,则必须调用cast()解释所有模板参数

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

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

cast<float>(a);