首页 > 解决方案 > 取消引用模板化 typedef 的成员

问题描述

我正在使用具有以下功能的库:

typedef std::map<std::wstring, std::vector<std::wstring>* > XmlRecord_t;

当我在此地图上进行迭代时,我会创建变量,例如:

std::wstring& key( mapIter->first );
std::vector<std::wstring>* values( mapIter->second );

这一切都很好。然后我想迭代这些值,所以我有一个for循环,例如:

for( std::vector<std::wstring>::const_iterator it = vals->cbegin();... )

这很好,效果很好。

现在,出于好奇,我想重用库的typedef名称,以防typedef定义更改或为了清洁。换句话说,我想使用:

typedef XmlRecord_t::mapped_type VecPtr;
VecPtr values( mapIter->second )

代替:

std::vector<std::wstring>* values( mapIter->second );  

到目前为止有效。唯一的问题来自for循环。Mytypedef是一个指针vector,而不仅仅是一个vector. 所以我不能用它typedef来代替:

std::vector<std::wstring>::const_iterator

以我所知道的任何方式。

因此,我的问题概括为:如果您在库中(我不允许您修改代码):

typedef map<KEY, T*> Map2Ptrs

你怎么能Map2Ptrs在你的代码中使用来获取T(没有指针)?做一个typedef类型T

显然,图书馆作者应该创建:

typedef std::vector<std::wstring>  XmlRecordVals;
typedef std::map<std::wstring, XmlRecordVals* > XmlRecord_t;

反而。但我只有上面的原始 XmlRecord_t 可以使用;(

标签: c++templatestypedefdereference

解决方案


假设Map2Ptrs总是一个std::map,它的键和映射类型可以分别用Map2Ptrs::key_type和来检查Map2Ptrs::mapped_type

std::remove_pointer_t可以使用(需要 C++14 和)从类型中删除指针#include<type_traits>,例如:

using T = std::remove_pointer_t<Map2Ptrs::mapped_type>;

在现代 C++ 中,您可能不应该手动指定迭代器类型,它们可以很容易地推断出来:

for( auto it = vals->cbegin();... )

此外,还有 range-for,它消除了手动指定迭代器的需要并且具有更好的语法:

for(const auto& x : *vals) { /* Do something with x */ }

从 C++17 开始,可以使用 map 结构化绑定:

for(const auto& [key, vals] : theMap) {
    /* Do something with key and vals */
}

推荐阅读