gpt4 book ai didi

c++ - std::iterator 是否继承自某种 auto_ptr?

转载 作者:行者123 更新时间:2023-12-02 10:26:41 24 4
gpt4 key购买 nike

我是 STL 的初学者。我正在尝试编写一个 toySTL 来学习 STL。当我编写有关迭代器的代码时,我很困惑是否应该先编写一个简单的 auto_ptr 并从中继承。
我写了一个叫做迭代器的基类。现在它是这样工作的,

struct iterator{};

template <class T>
struct vector_itorater: public toystl::iterator<toystl::random_access_iterator_tag, T>{};
如果我需要另一个基类,就像“auto_ptr”一样工作?像这样
// firstly define a sort of auto_ptr as base class
struct auto_ptr{};

// secondly inherint from auto_ptr
template <class T>
struct vector_itorater: public auto_ptr{};

这行得通吗?还是 STL 是这样做的?

最佳答案

我认为您混淆了运行时多态性和编译时多态性。当编译器实例化一个模板时,它关心具体对象的可见接口(interface)。它不关心这个对象是否与其他类有继承关系,只要具体对象可以在具体上下文中使用,它就会通过。

template <class C>
void foo(const C& bar)
{
// at the time of writing we don't know anything of C,
// only that it has a callable baz member (either a
// member function or a member with a call operator).
// This works, since the compiler knows the exact type
// during template instantiation, but we don't have to
// care in advance.
bar.baz();
}

struct X
{
void baz() const;
};

void grml()
{
X x;
// The compiler fills in X as the template type
// parameter for us. So the compiler creates a
// void foo<X>(const X&) function for us.
foo(x);
}
在这个例子中,当编译器看到模板时,它不知道以后如何调用这个模板。只有在模板被实例化(使用)后,编译器才会检查传递的类型是否适合该模板。
这里不需要有一个通用的基类来派生每个可能的实现。 STL 使用模板来避免使用此类基类,因为它们会给您以后的设计带来负担,并且如果您在基类中有要覆盖的虚拟成员,您可能会受到严重的性能损失。

关于c++ - std::iterator 是否继承自某种 auto_ptr?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/64202558/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com