如何解决Rust对于C ++ ADL重载函数的替代方案?
#include <iostream>
namespace lib {
struct Impl1 {};
struct Impl2 {};
void process(Impl1) { std::cout << 1; }
void process(Impl2) { std::cout << 2; }
template<typename T> void generalize(T t) { process(t); }
}
我想通过外部代码扩展它。这是C ++允许这样做的方式:
#include <lib.h> // the prevIoUs snippet
namespace client {
struct Impl3 {};
void process(Impl3) { std::cout << 3; }
}
int main() { // test
lib::generalize(client::Impl3{}); // it couts 3
}
注意:lib
的代码对client
的代码一无所知,并且不执行任何动态调度。如何在Rust代码中实现相同目的? (如果我做不到,有什么计划吗?)
解决方法
当然,这正是traits的用途:
pub mod lib {
pub trait Impl {
fn process(&self);
}
pub struct Impl1 {}
pub struct Impl2 {}
impl Impl for Impl1 {
fn process(&self) {
println!("1");
}
}
impl Impl for Impl2 {
fn process(&self) {
println!("2");
}
}
pub fn generalize<T: Impl>(t: T) {
t.process();
}
}
mod client {
pub struct Impl3 {}
impl super::lib::Impl for Impl3 {
fn process(&self) {
println!("3");
}
}
}
fn main() {
lib::generalize(client::Impl3 {});
}
在Playground上看到它。
,铁锈更加严格,可能需要lib
才能表现出色。可以通过定义一个trait
来定义,该定义定义某些内容支持process
:
trait Processable {
fn process(self);
}
struct Impl1 {}
impl Processable for Impl1 {
fn process(self) {/*TODO*/}
}
fn generalize<T: Processable>(t: T) { t.process(); }
然后,Processable
可以由“外部人员”用来通知系统Impl3
满足所需的接口:
struct Impl3 {}
impl Processable for Impl3 {
fn process(self) {/*TODO*/}
}
然后,generalize
也可以被称为Impl3
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。