【发布时间】:2020-09-04 21:16:28
【问题描述】:
所以我只是在学习 rust - 我已经设置了工具并使其在结构上正常工作,交叉编译,链接库等等......但是现在我正在探索我现在想编写的一些简单函数之后的语言一些模板(我有 C++ 背景)。所以在 c++ 谈话中我想这样做:
C++
template<typename A, typename B>
auto add(A a, B b)
{
return a + b;
}
int main() {
std::cout << "add int int: " << add(1, 2) << std::endl;
std::cout << "add int double: " << add(1, 2.3f) << std::endl;
std::cout << "add int float: " << add(1, 2.3) << std::endl;
std::cout << "add char int: " << add('g', 2.3) << std::endl;
std::cout << "add str str: " << add(std::string("bob"), std::string("fred")) << std::endl;
}
输出:
add int int: 3
add int double: 3.3
add int float: 3.3
add char int: 105.3
add str str: bobfred
这增加了“事物”。如果您尝试使用正确的操作数添加两个未实现正确的 + 运算符的东西,您将收到编译错误(例如添加字符串和 int) - 非常简单。
锈
现在要生锈了(我完全没有掌握它的窍门。
普通添加功能
pub fn add(a: u64, b: u64) -> u64 {
return a + b;
}
到目前为止还可以。
尝试 1 对此进行模板化
我通过听取错误并使用建议的更改来实现此实现(使用std::ops::Add<Output = T> 我有点理解它,但我真的不知道为什么我必须指定它。
pub fn add<T: std::ops::Add<Output = T>>(a: T, b: T) -> T
{
return a + b;
}
println!("add int int: {}", add(1, 2)); // ok
println!("add int float: {}", add(1, 2.3)); // fails to compile
这是意料之中的,因为我只告诉它一种类型....所以现在尝试两种类型 A,B - 但这是我迷路的地方:
pub fn add<A: std::ops::Add<Output = A>, B: std::ops::Add>(a: A, b: B) -> A
{
return a + b;
}
我得到的错误是:
error[E0308]: mismatched types
--> utils/src/lib.rs:19:16
|
17 | pub fn add<A: std::ops::Add<Output = A>, B: std::ops::Add>(a: A, b: B) -> A
| - expected type parameter - found type parameter
18 | {
19 | return a + b;
| ^ expected type parameter `A`, found type parameter `B`
|
= note: expected type parameter `A`
found type parameter `B`
= note: a type parameter was expected, but a different one was found; you might be missing a type parameter or trait bound
= note: for more information, visit https://doc.rust-lang.org/book/ch10-02-traits.html#traits-as-parameters
error: aborting due to previous error
For more information about this error, try `rustc --explain E0308`.
所以现在我完全迷路了。首先,我似乎必须指定一个返回类型——但我希望为我推断出它。我怎么做?其余的错误可能都是由于返回类型为A - 但我似乎必须指定一些东西......这里的任何帮助都会很棒! - 如果可能的话,我想归档与上面的 c++ 模板相同的基本功能
【问题讨论】:
标签: c++ templates generics rust