模板多态性:当模板发挥不佳时
在 C 中,模板为泛型编程提供了强大的机制。然而,它们的多态行为存在局限性。本文回答了特定场景下模板多态性缺失的问题。
查询
用户在调用构造函数时遇到“无匹配函数”错误它采用 Container
深入研究多态性
多态性允许不同类的对象被视为公共基类的对象。但是,此行为不会扩展到 C 中的模板。尽管 Foo 派生自 Interface,但它不会自动使 Container
模板的非协方差
这里的关键方面是缺乏模板协方差。在协变模板中,派生类型会自动被视为需要其基类型的模板的有效参数。然而,在 C 中,模板不是协变的。
协变的后果
考虑以下示例:
class Fruit {...}; class Apple : public Fruit {...}; class Orange : public Fruit {...}; std::vector<Apple>& apple_vec; // Vector of apples std::vector<Fruit>& fruit_vec = apple_vec; // Assignment allowed fruit_vec.push_back(Orange()); // Oops, added an orange to the apple vector!
正如解释所指出的,协变处理模板可能会导致应不兼容的类型被视为兼容的情况,从而破坏类型安全。
替代解决方案
因为不支持协变模板C,需要采用替代解决方案。静态断言或有界通配符(在 Java 中可用)可用于强制执行所需的类型关系。在查询中提到的具体场景中,一个简单的静态断言就可以验证传入的Container类型确实是Container
以上是为什么我不能将“Container”传递给需要“Container”的构造函数?的详细内容。更多信息请关注PHP中文网其他相关文章!