首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何重用泛型函数类型边界?

如何重用泛型函数类型边界?
EN

Stack Overflow用户
提问于 2016-08-22 08:55:00
回答 1查看 58关注 0票数 0
代码语言:javascript
复制
pub type ESign = i8;
const CONCAVE: i8 = -1;
const TANGENTIAL: i8 = 0;
const CONVEX: i8 = 1;

fn signum_enum(a: f64) -> ESign {
    if a > 0.0 { CONVEX } else if a < 0.0 { CONCAVE } else { TANGENTIAL }
}

pub fn area_tri_signed_v2_alt_2x(v1: &[f64; 2], v2: &[f64; 2], v3: &[f64; 2]) -> f64 {
    ((v1[0] * (v2[1] - v3[1])) + (v2[0] * (v3[1] - v1[1])) + (v3[0] * (v1[1] - v2[1])))
}

pub fn span_tri_v2_sign(v1: &[f64; 2], v2: &[f64; 2], v3: &[f64; 2]) -> ESign {
    return signum_enum(area_tri_signed_v2_alt_2x(v3, v2, v1));
}

我设法将这些转换为泛型函数,但最终不得不复制类型边界。

代码语言:javascript
复制
use std::ops::{Mul, Sub, Add};

fn signum_enum<T: Default + PartialOrd>(a: T) -> ESign {
    let zero = T::default();
    if a > zero { CONVEX } else if a < zero { CONCAVE } else { TANGENTIAL }
}

pub fn area_tri_signed_v2_alt_2x<T: Default + PartialOrd + Copy + Mul<Output=T> + Sub<Output=T> + Add<Output=T>>(
    v1: &[T; 2],
    v2: &[T; 2],
    v3: &[T; 2]) -> T
{
    ((v1[0] * (v2[1] - v3[1])) + (v2[0] * (v3[1] - v1[1])) + (v3[0] * (v1[1] - v2[1])))
}

pub fn span_tri_v2_sign<T: Default + PartialOrd + Copy + Mul<Output=T> + Sub<Output=T> + Add<Output=T>>(
    v1: &[T; 2],
    v2: &[T; 2],
    v3: &[T; 2]) -> ESign
{
    return signum_enum(area_tri_signed_v2_alt_2x(v3, v2, v1));
}

有办法在一个地方定义这些功能并在多个泛型函数中重用它们吗?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2016-08-22 09:02:25

最简单的方法是定义一个新的特性,这两者都需要您所处理的所有边界:

代码语言:javascript
复制
pub trait Floatlike: Default + PartialOrd + Copy +
    Mul<Output=Self> + Sub<Output=Self> + Add<Output=Self> {}

并由满足这些界限的所有类型实现:

代码语言:javascript
复制
impl<T> Floatlike for T where T: Default + PartialOrd + Copy + 
    Mul<Output=T> + Sub<Output=T> + Add<Output=T> {}

然后绑在这个特征上:

代码语言:javascript
复制
pub fn area_tri_signed_v2_alt_2x<T: Floatlike>(...)
pub fn span_tri_v2_sign<T: Floatlike>(...)
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/39075126

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档