微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

Rust对于C ++ ADL重载函数的替代方案?

如何解决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 举报,一经查实,本站将立刻删除。