【发布时间】:2020-12-06 12:46:10
【问题描述】:
有一个提供通用函数和一些实现的库:
#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 代码中实现相同的目标? (如果我不能,是否有类似的计划?)
【问题讨论】:
-
顺便说一句,我可以用 C# 或 Java 等语言以某种方式做到这一点吗?
-
这是一个相当具有误导性的示例(也就是说,它会让您远离解决方案)。您应该始终尝试在标准库的基本功能中找到示例,因为您很可能在其他语言的标准库中找到类似的功能。考虑具有用户定义的
operator<的对象容器的std::sort。就像在您的人工示例中一样,std::sort对您的类型一无所知,也不执行动态调度,但完全能够调用您的operator<。 Rust 如何处理这个问题?
标签: rust overloading generic-programming argument-dependent-lookup open-closed-principle