gpt4 book ai didi

c++ - 在 "Modern C++ Design"为什么 Prototype Factory Unit::GetPrototype 必须调用 DoGet Prototype?

转载 作者:行者123 更新时间:2023-11-30 04:28:38 27 4
gpt4 key购买 nike

在 Andrei Alexandrescu 的书“现代 C++ 设计”中,为什么 PrototypeFactoryUnit::GetPrototype 必须调用友元函数 DoGetPrototype?为什么它不能直接将传入的指针设置为原型(prototype)本身? PrototypeFactoryUnit::SetPrototypeDoSetPrototype 函数也完成了同样的事情。

最佳答案

一些上下文!

template <class, class Base>
class PrototypeFactoryUnit: public Base {
public:
typedef typename Base::ProductList::Head AbstractProduct;

friend void DoGetPrototype(const PrototypeFactoryUnit& me,
AbstractProduct*& pPrototype)
{
pPrototype = me.pPrototype_;
}

template <class U>
void GetPrototype(U*& p) {
return DoGetPrototype(*this, p);
}
private:
AbstractProduct* pPrototype_;
};

(虽然它确实让我有机会清理这个上面的灰尘......)

因为GetPrototype 是模板,它可以用许多不同的类型实例化。然后,重载决议将发挥作用!

例如,我写了一个 DoGetPrototype(...& me, DerivedProduct*& p) 然后说:

DerivedProduct* p =0;
factory.GetPrototype(p);

然后,调用我的重载。

因此,这是一个定制点:一个静态分派(dispatch),类似于具有默认实现的 virtual 函数的运行时对应物。

关于c++ - 在 "Modern C++ Design"为什么 Prototype Factory Unit::GetPrototype 必须调用 DoGet Prototype?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9982814/

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