提问人:lordeji 提问时间:10/26/2022 最后编辑:Masoud Keshavarzlordeji 更新时间:10/26/2022 访问量:120
将 typename type 更改为模板函数 (c++)
Change typename type into the template function (c++)
问:
所以我目前正在努力用模板提升我的技能,但我被一些东西困住了。
如果我的一个对象使用数字,并且我对另一个整数类型的对象进行数学运算,我想返回一个浮点类型的对象。
但是我只能知道它们何时已经在函数中,我想知道是否有办法强制我们的类型名称为某种定义的类型。floating_point
编辑:我看到我的帖子缺乏示例,所以我将向您展示我正在开发的功能。
// Addition : +
template <typename TYP_O1, typename TYP_O2, typename TYP_RE>
requires (std::integral<TYP_O1> || std::floating_point<TYP_O1>) &&(std::integral<TYP_O2> || std::floating_point<TYP_O2>)
MultiArray<TYP_RE> operator+(MultiArray<TYP_O1>& rMultiArr1, MultiArray<TYP_O2>& rMultiArr2){
// Création d'un array qui sera la somme des deux MultiArray un à un
std::vector<TYP_RE> Array;
for(int i = 0 ; i < (int)rMultiArr1.getArray().size() ; i++) {
// On les récupère par référence pour faciliter la lecture.
std::vector<TYP_O1>& Arr1 = rMultiArr1.getArray();
std::vector<TYP_O2>& Arr2 = rMultiArr2.getArray();
// On rajoute la somme à la fin du Array
Array.push_back((TYP_RE)Arr1[i] + Arr2[i]);
}
// On crée le MultiArray de la somme des 2
MultiArray<TYP_RE> result_MultiArr = {rMultiArr1.getDim(), rMultiArr1.getShape(), Array};
// On renvoie ce MultiArray nouvellement crée
return result_MultiArr;
}
(我刚刚删除了错误检查)
所以在模板中:是第一个对象的类型,也是第二个对象的类型。TYP_O1
TYP_O2
TYP_RE
是返回类型,如果其中一个是类型(另一个是“积分”),则这是我想要强制为双精度的类型名MultiArray
"floating_point"
答:
通常,可以使用 std::conditional
根据条件选择类型。
一个基本的例子:
template<typename LHS, typename RHS>
auto plus(LHS lhs, RHS rhs) -> std::conditional_t<
std::is_same_v<LHS, double> || std::is_same_v<LHS, double>,
double,
int
> {
return lhs + rhs;
}
如果任一参数是 ,则返回类型为 ,否则为 。请注意,它在这里没有多大意义,因为已经是 if either 或 is(假设它们是基本的算术类型,不包括 or 指针类型)。plus
double
double
int
lhs + rhs
double
lhs
rhs
long double
在你的情况下(因为你已经添加了一个代码片段),你可以做这样的事情:
template<typename TYP_O1, typename TYP_O2>
using MultiArraySumResult = std::conditional_t<
std::is_floating_point_v<TYP_01>,
MultiArray<TYP_01>,
MultiArray<TYP_02>
>
// or...
template<typename TYP_O1, typename TYP_O2>
using MultiArraySumResult = MultiArray<std::conditional_t<
std::is_floating_point_v<TYP_01> || std::is_floating_point_v<TYP_02>,
double,
int
>>
然后,您只需将其用作返回类型。您甚至可以不指定返回类型(没有尾随返回类型),将该声明放在函数中,并将其用于返回的局部变量:MultiArraySumResult<TYP_O1, TYP_O2>
auto
using
template <typename TYP_O1, typename TYP_O2, typename TYP_RE>
requires (std::integral<TYP_O1> || std::floating_point<TYP_O1>) &&(std::integral<TYP_O2> || std::floating_point<TYP_O2>)
auto operator+(MultiArray<TYP_O1>& rMultiArr1, MultiArray<TYP_O2>& rMultiArr2){
using ReturnType = std::conditional_t<
is_floating_point_v<TYP_01>,
MultiArray<TYP_01>,
MultiArray<TYP_02>
>
ReturnType Array;
// [...]
return ReturnType{rMultiArr1.getDim(), rMultiArr1.getShape(), Array};
}
评论
std::trait_t<Ts...>
std::trait<Ts...>::type
上一个:模板函数参数不完整类型 c++
下一个:混淆后 TypeName 错误
评论
Type
double
double
variant
std::conditional_t