c++ - 取消引用模板化 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 可以使用;(
解决方案
假设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 */
}
推荐阅读
- python - 使用循环时读取功能如何工作?
- ios - 图像如何在 Lauchscreen 和 View 中居中?
- apache-kafka - ksqldb 是否支持流的创建或替换?
- python-3.x - 如何检查python中嵌套字典中存在的元素列表?
- docker - k8s 如何知道 Pod 内部进程的目标端口?
- javascript - 会话结束后在 C# 代码中弹出一个简单的 JavaScript 警报
- javascript - 使用 react 实现动态搜索栏
- c# - 换行 Listboxitem 的文本
- kotlin - 未注册在 Android 中使用 VisualStudio AppCenter 发送指标
- java - Android Studio 我无法显示传入的数据