模板模板函数定义
template template function definition
我有一个名为 Array
的模板 class
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.
}
但是无法通过编译
How should I write this function? I am more interested in how to define it instead of how to implement the detailed casting.
我想是这样的
template <typename ToT, typename FromT, int Dim>
Array<ToT, Dim> cast (Array<FromT, Dim> const & inA)
{
// ...
}
将 ToT
(输入)放在第一个位置很有用,因此您可以显式显示它并让 FromT
和 Dim
从 inA
值推导出来。
--- 编辑 ---
OP 询问
Any insight why I have to put it [ToT
] in the first position?
您不一定要将 ToT
放在第一位。但这会简化您的生活。
重点是 FromT
和 Dim
可以从 inA
论证中推导出来; ToT
不能从参数中推导出来,所以你必须明确它。
但是如果要显式模板参数,则必须显式前面的参数。所以如果你把 ToT
放在最后一个位置,你必须调用 cast()
解释所有模板参数
cast<int, 2, float>(a);
如果您将 ToT
放在第一个位置,您只需显式显示它并让编译器从参数
中推断出 FromT
和 Dim
cast<float>(a);
这里根本不需要模板模板参数。简单的 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<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
.
我有一个名为 Array
的模板 classtemplate<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.
}
但是无法通过编译
How should I write this function? I am more interested in how to define it instead of how to implement the detailed casting.
我想是这样的
template <typename ToT, typename FromT, int Dim>
Array<ToT, Dim> cast (Array<FromT, Dim> const & inA)
{
// ...
}
将 ToT
(输入)放在第一个位置很有用,因此您可以显式显示它并让 FromT
和 Dim
从 inA
值推导出来。
--- 编辑 ---
OP 询问
Any insight why I have to put it [
ToT
] in the first position?
您不一定要将 ToT
放在第一位。但这会简化您的生活。
重点是 FromT
和 Dim
可以从 inA
论证中推导出来; ToT
不能从参数中推导出来,所以你必须明确它。
但是如果要显式模板参数,则必须显式前面的参数。所以如果你把 ToT
放在最后一个位置,你必须调用 cast()
解释所有模板参数
cast<int, 2, float>(a);
如果您将 ToT
放在第一个位置,您只需显式显示它并让编译器从参数
FromT
和 Dim
cast<float>(a);
这里根本不需要模板模板参数。简单的 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<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
.