基于类型的元编程(类型到类型转换)在Rust中可能吗?

g2ieeal7  于 2023-03-30  发布在  其他
关注(0)|答案(1)|浏览(111)

考虑以下玩具示例:

struct SignedAndUnsigned<S, U> {
    s: S,
    u: U,
}

type SignedAndUnsignedInteger = SignedAndUnsigned<i32, u32>;
type SignedAndUnsignedDouble  = SignedAndUnsigned<f64, f64>;

这里,我有一个类型S用于“有符号”类型,另一个类型U用于“无符号”类型。我可以很容易地将它们声明在一起,但在更复杂的情况下,只包含一个泛型参数可能会很有用,并从中计算其他参数的类型:

struct SignedAndUnsigned<S> {
    s: S,
    u: <???>
}

在C++中,这可以通过使用类似类型特征的东西来实现;例如

template <typename S>
class SignedAndUnsigned {
    S s;
    typename std::make_unsigned<S>::type u;
}

在Rust中有类似的东西吗?

lx0bsm1f

lx0bsm1f1#

类似的事情也可以通过traits来完成。例如:

trait SignedType {
    type UnsignedType;
}

impl SignedType for i32 {
    type UnsignedType = u32;
}

// ... other impls for other signed types ...

struct SignedAndUnsigned<S> where S: SignedType {
    signed: S,
    unsigned: <S as SignedType>::UnsignedType,
}

type SignedAndUnsignedInteger = SignedAndUnsigned<i32>;

有一些限制,需要(IIUC)来避免C++在SFINAE中的一些复杂性。特别是,泛型类型S需要受到某些提供必要类型Map的trait的约束。

相关问题