考虑以下玩具示例:
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中有类似的东西吗?
1条答案
按热度按时间lx0bsm1f1#
类似的事情也可以通过traits来完成。例如:
有一些限制,需要(IIUC)来避免C++在SFINAE中的一些复杂性。特别是,泛型类型
S
需要受到某些提供必要类型Map的trait的约束。