我有一个名为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.
}
但是它无法通过编译。
答案 0 :(得分:3)
这里完全不需要模板模板参数。简单的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)
{
// ...
}
仅在要接受不同类型的模板时才需要模板模板参数。例如,如果您希望cast
能够接受Array
或std::array
,则可以使用模板template参数:
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
使用{{ 1}}。
答案 1 :(得分:2)
我应该如何编写此函数?我对如何定义它而不是如何进行详细的转换更感兴趣。
我想类似
template <typename ToT, typename FromT, int Dim>
Array<ToT, Dim> cast (Array<FromT, Dim> const & inA)
{
// ...
}
将ToT
(待键入)放在第一位置很有用,因此您可以显式显示它,并让FromT
值推导Dim
和inA
。
---编辑---
OP询问
有什么见解,为什么我必须把它[[
ToT
]放在第一位?
您不一定必须将ToT
放在第一位。但这简化了您的生活。
要点是,FromT
和Dim
可从inA
参数推导出; ToT
不能从参数中推论出来,因此您必须将其明确。
但是,如果要显式指定模板参数,则必须显式前面的参数。因此,如果将ToT
放在最后一个位置,则必须调用cast()
来说明所有模板参数
cast<int, 2, float>(a);
如果将ToT
放在第一位,则只需将其显式显示,并让编译器从参数中推断出FromT
和Dim
cast<float>(a);