如何使用decltype访问依赖类型?

时间:2011-11-17 22:44:32

标签: c++ visual-studio-2010 c++11

首先:如果我的命名错误,我道歉!

基本上,我有一个非常罕见的想要声明基于堆栈的容器,例如:

std::map<CString, size_t> ecounts;

然后我想在函数体中进一步迭代ecounts的内容,但我真的不想要输入一些东西,也不需要重新输入上面的类型以便让编译器能够与我所拥有的一起工作......

std::foreach(ecounts.begin(), ecounts.end(), [&] (>>>here is the problem<<< e)
{
  ... whatever I want to do with e ...
}

当然,我可以使用typedef,也可以手动使用ecounts声明:

std::foreach(ecounts.begin(), ecounts.end(), [&] (std::pair<CString,size_t> e)
...

但是,哎呀!我宁愿单独声明ecounts是什么,只是以某种方式使用它的value_type。但这似乎不起作用:

std::foreach(ecounts.begin(), ecounts.end(), [&] (decltype(ecounts)::value_type e)
...

这仅仅是我的编译器(vs2010)的限制,还是这是C ++的限制?

我如何为这样的代码制定一种单一定义规则,最好不必使用typedef来实现它(即,我可以执行以下操作):

typedef std::map<CString, size_t> maptype;
typedef maptype::value_type valuetype;
maptype ecounts;
...
std::foreach(ecounts.begin(), ecounts.end(), [&] (valuetype e)
...

显然,这不是世界末日,但如果我可以使用decltype,我会因为思维的减少而感到高兴。回溯以实现上述目标......

2 个答案:

答案 0 :(得分:8)

VS2010的局限性,因为您想要的添加进入标准为时已晚。它应该使用一致的编译器进行编译。作为一个工作流程,只需使用decltype(*ecounts.begin()) e。或身份模板:

template<class T>
struct identity{ typedef T type; };
// usage: identity<decltype(ecounts)>::type::value_type

答案 1 :(得分:2)

如果您只想对容器进行正常迭代,只需使用新样式进行循环:

for (auto e: ecounts)
{
   // whatever you want to do with e
}

或者,如果您想修改地图中的元素:

for (auto& e: ecounts)
{
  // ...
}