模板模板函数定义
template template function definition
我有一个名为 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.
}
但它无法通过编译。
这里根本不需要模板模板参数。 简单的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
。
我应该如何编写此函数?我更感兴趣的是如何定义它,而不是如何实现详细的强制转换。
我想像
template <typename ToT, typename FromT, int Dim>
Array<ToT, Dim> cast (Array<FromT, Dim> const & inA)
{
// ...
}
将ToT
(to-type(放在第一个位置很有用,因此您可以显式它并让FromT
和Dim
从inA
值中推断出来。
---编辑---
OP问
有什么见解为什么我必须把它放在第一个位置[
ToT
]?
您不一定要将ToT
放在第一位。但这简化了你的生活。
关键是FromT
和Dim
可以从inA
论证中推导出来;ToT
无法从参数中推导出来,因此您必须明确表示。
但是,如果要显式模板参数,则必须显式显式上述参数。因此,如果您将ToT
放在最后的位置,则必须调用cast()
解释所有模板参数
cast<int, 2, float>(a);
如果将ToT
放在第一位,则只需显式显示它,并让编译器从参数中推断出FromT
和Dim
cast<float>(a);
相关文章:
- 在命名空间中定义函数还是限定函数
- 为什么在定义函数之前先声明它
- 使用用户定义函数的字符串反转
- 用户定义函数中的指针和输入
- 这个c++代码是如何在没有定义函数的情况下运行的
- 具有外部"c"和程序集的未定义函数
- 已定义函数时出现 G++ "未定义的引用"错误
- 将自定义函数传递到基抽象类中以延迟执行
- C++使用 rand 定义函数语法
- Arduino:在 loop() 和自定义函数中运行相同的代码时出现问题
- 将具有固定签名的自定义函数名称注入 CRTP
- 使用定义函数模板别名
- 是否可以使用单个定义定义函数的常量和常规版本?(使用模板,自动,decltype等)
- 在内联程序集中定义函数和从 C++ 调用时出现问题
- 在 Metal 着色器代码中,如何定义函数的 in/out 参数变量?
- 声明和定义函数静态会产生"undefined reference to function_name()"
- 朋友定义函数的名称空间是什么
- 介子 对用户定义函数的未定义引用
- 如何使用 "using" 关键字定义函数原型/签名
- 在 C 结构中定义C++函数