我使用的程序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
}
FindOrCreateEntry()
?nullptr
!或者至少,这样做应该是危险的吗?如果我错了,请纠正我。答案 0 :(得分:3)
1为什么没有模板参数传递给FindOrCreateEntry()调用?
因为编译器可以从传递的参数中推断出类型。在这里,C = DefaultEntryConstructor
。
2这次通话不应该崩溃吗?它取消引用了nullptr!或者至少,这样做应该是危险的吗?如果我错了,请纠正我。
但是DefaultEntryConstructor::ConstructHashMapEntry
静态,所以在
e = constructor.ConstructHashMapEntry(e, key);
构造函数的值从未使用过(并且它与nullptr无关) - 只有指针的类型用于解析函数调用
让我们更详细地看一下静态方法调用。当编译器实例化
时e = constructor.ConstructHashMapEntry(e, key);
它知道C
的{{1}}类型。因此,第一步是确定要调用的函数。根据此功能的类型,呼叫站点可以有以下四种类型之一:
constructor
参数的常规方法调用,因此它使用this
对象引用的值 / LI>
constructor
参数的函数调用。此处仅使用了对象的类型,并且值被完全忽略请注意,虽然将静态调用为this
而不是constructor.ConstructHashMapEntry(e, key)
似乎令人困惑,但此表单允许C::ConstructHashMapEntry(e, key)
使用静态和非句柄 - 静态方法,取决于FindOrCreateEntry
的类型。