假设我有一个嵌套的std::unordered_map
,看起来像这样:
std::unordered_map<ResourceName, std::unordered_map<HAL::ResourceFormat::Color, HAL::RTDescriptor>>
我想要一个函数,该函数将基于两个键
HAL::RTDescriptor
和ResourceName
返回指向HAL::ResourceFormat::Color
的指针(如果存在对象),否则返回nullptr
。简单的实现如下所示:const HAL::RTDescriptor* ResourceDescriptorStorage::GetRTDescriptor(ResourceName resourceName, HAL::ResourceFormat::Color format) const
{
auto mapIt = mRTDescriptorMap.find(resourceName);
if (mapIt == mRTDescriptorMap.end()) {
return nullptr;
}
auto& nestedMap = mapIt->second;
auto nestedMapIt = nestedMap.find(format);
if (nestedMapIt == nestedMap.end()) {
return nullptr;
}
return &nestedMapIt->second;
}
有没有办法使用模板来概括逻辑?
带有参数包的东西。将在每个嵌套容器中进行检查,检查对象是否可用,并在最后返回它或
nullptr
:template<
template<class...> class AssociativeContainer,
class... Keys
>
decltype(auto) Find(const AssociativeContainer<...>& rootContainer, Keys&&... keys)
{
...
}
最佳答案
更简单的解决方案(需要C++ 17):
template<class AssociativeContainer, class Key, class... Keys>
auto Find(const AssociativeContainer& container, Key&& key, Keys&&... keys){
auto it = container.find(std::forward<Key>(key));
bool found = it != container.end();
if constexpr(sizeof...(Keys) == 0)
return found ? &it->second : nullptr;
else
return found ? Find(it->second, std::forward<Keys>(keys)...) : nullptr;
}
因为不需要传递所有键,所以这还允许获取对任何中间容器的引用。