gpt4 book ai didi

C++ 代码与模板方法调用混淆

转载 作者:太空狗 更新时间:2023-10-29 21:23:52 28 4
gpt4 key购买 nike

我使用的程序 API 的文档缺少所需的信息,因此我试图自己了解如何使用 HashMap::FindOrCreateEntry() 方法。

template <typename C> Entry* FindOrCreateEntry(const K& key, C& constructor, Bool& created)
{
/* ... */
Entry* e = (Entry*) _allocator.Alloc(SIZEOF(Entry), C4D_MISC_ALLOC_LOCATION);
if (!e)
{
created = false;
return nullptr;
}
e = constructor.ConstructHashMapEntry(e, key);
/* ... */
return e;
}

我怀疑的部分是第二种同名方法:

struct DefaultEntryConstructor
{
static Entry* ConstructHashMapEntry(void* ptr, const K& key)
{
return new (ptr) Entry(key);
}
};

Entry* FindOrCreateEntry(const K& key, Bool& created)
{
return FindOrCreateEntry(key, *(DefaultEntryConstructor*) nullptr, created); //lint !e413
}
  1. 为什么没有模板参数传递给 FindOrCreateEntry() 的调用?
  2. 这个调用不应该崩溃吗?它取消引用 nullptr!或者至少,这样做应该是危险的?如果我错了,请纠正我。

最佳答案

1 Why are there no template parameters passed to the call of FindOrCreateEntry()?

因为编译器可以从传递的参数中推导出类型。在这里,C = DefaultEntryConstructor .

2 Shouldn't this call crash? It dereferences a nullptr! Or at least, it should be dangerous to do it this way? Please correct me if I'm wrong.

但是DefaultEntryConstructor::ConstructHashMapEntry静态的,所以在行中

e = constructor.ConstructHashMapEntry(e, key);

永远不会使用构造函数的(并且它是一个 nullptr 并不重要) - 只有指针的类型 用于解析函数打电话。


让我们更详细地看一下静态方法调用。当编译器实例化

e = constructor.ConstructHashMapEntry(e, key);

它知道类型 Cconstructor .因此,第一步是确定要调用的函数。根据此函数的类型,调用站点可能具有以下四种类型之一:

  1. 一个常规的非虚拟方法调用:这将生成一个带有隐式 this 的常规方法调用。参数,因此它使用 constructor对象引用
  2. 一个虚拟方法:这将使用某种机制(通常是 vtable)在运行时查找函数指针:查找和调用都依赖于对象引用的或指针
  3. 一个静态方法(我们的案例):这将生成一个没有隐式 this 的函数调用范围。这里只使用了对象的类型,完全忽略了
  4. 一个constexpr:对象的运行时值显然不能影响它,所以没有被使用

请注意,虽然将静态称为 constructor.ConstructHashMapEntry(e, key) 似乎令人困惑而不是 C::ConstructHashMapEntry(e, key) , 这种形式允许 FindOrCreateEntry使用处理静态 非静态方法,这取决于 C 的类型.

关于C++ 代码与模板方法调用混淆,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17298578/

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