所以,我正在努力理解C++中的整个CRTP问题.我在网上找到的关于你为什么应该在意使用它的理由有几个(1) (2),那就是它允许以半自动的方式向你的代码添加功能.我的意思是,我可以让编译器为我演绎一些功能,只要求我实现几个小功能.
例如,我可能想要形式化一个Comparable
"特征"(使用Rust单词),迫使用户提供<
和==
的实现,并仅使用这两个来推断所有其他比较.IIRC,这是当您实例化自定义类的std::set时发生的情况(编译器要求您提供operator<()
实现).
因此,我对C++的CRTP有两个问题:
- 从这个意义上说,"trait "这个词的用法合适吗?我可以更进一步地说抽象数据类型吗?CRTP是实现这一点的C++习惯用法吗(请原谅C++纯粹主义者)?因为在我看来它们非常相似:您定义了一些基本实现,并遵循一些演绎规则,您可以获得其他行为/功能
- 我可以通过使用抽象类来获得相同的东西(类似于特征的东西)吗?如果是这样,为什么我要使用CRTP呢?
谢谢!
EDIT:在 comments 中我被告知,在C++中,"特征"一词指的是一个特定的concept,这与例如在Rust中使用的不同.因此,我稍微改变/澄清了我的问题:CRTP类似于Rust's个特征(IIUC,特别是#[derive]
d特征)吗?