Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/132.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 是否可以从任意迭代器(C+;+;)获取值类型?_C++_Templates - Fatal编程技术网

C++ 是否可以从任意迭代器(C+;+;)获取值类型?

C++ 是否可以从任意迭代器(C+;+;)获取值类型?,c++,templates,C++,Templates,我有一节课 template <typename Iterator, typename Value> class Foo { public: Foo(const Iterator& it) { ... } ... private: map<Value, int> m_; } }; 模板 福班{ 公众: Foo(常量迭代器&it){…} ... 私人: 地图m_; } }; 有没有办法去掉模板中的值?迭代器可能是也可能不是STL迭代器,但它

我有一节课

template <typename Iterator, typename Value>
class Foo {
 public:
  Foo(const Iterator& it) { ... }
  ...
 private:
   map<Value, int> m_;
  }
};
模板
福班{
公众:
Foo(常量迭代器&it){…}
...
私人:
地图m_;
}
};
有没有办法去掉模板中的值?迭代器可能是也可能不是STL迭代器,但它保证*it type是Value

我知道STL迭代器的
iterators\u traits::value\u type
,但想知道是否有任何方法可以自动获取任意迭代器类型的值类型

我正在考虑的一个技巧——比如说,我们有一个助手类

template <typename Iterator, typename Value>
class Bar {
 public:
  Bar(const Iterator& dummy_iterator, const Value& dummmy_value) {}
  ...
};
模板
分类栏{
公众:
Bar(常量迭代器和伪迭代器,常量值和伪值){}
...
};

然后,如果我们将Bar实例化为Bar(it,*it),则值的类型将在Bar中已知。但是我找不到一个很好的方法把酒吧和美食结合起来。

对不起。去除
Value
的正确方法是按照您的建议使用
iterator\u traits

如果您的非STL迭代器是裸指针,那么您可以免费获得正确的迭代器。否则,非STL迭代器类必须定义正确的typedef

有关更多信息,请参见。

任何迭代器都应提供
迭代器特征::值类型
。如果不是,则它不是迭代器。ISO C++ 2003 24.3.1[LIB迭代器。性状]“迭代器特征”:

仅在术语中实现算法 对于迭代器,通常需要 确定值和差异 对应于特定类型的类型 迭代器类型。因此,它是 要求if
Iterator
是类型 对于迭代器,类型

iterator_traits<Iterator>::difference_type
iterator_traits<Iterator>::value_type
iterator_traits<Iterator>::iterator_category
迭代器特征::差异类型
迭代器特征::值类型
迭代器特征::迭代器类别
被定义为迭代器的 差异类型、值类型和 迭代器类别


除此之外,没有一种通用的方法来获得任意类型的C++表达式。C++0x将通过提供
decltype

来纠正它,以获取迭代器的值类型。以前的答案是正确的

但还有更多。你所想的诀窍在课堂上是行不通的。如果
Bar
是如下函数:

template <typename Iterator, typename Value>
void bar(const Iterator& dummy_iterator, const Value& dummmy_value) {}
模板
无效条(常量迭代器和伪迭代器,常量值和伪值){}
然后类型推断将适用于
bar(it,*it)
,并且您将在
bar
中具有值类型。(但请记住,要使用此技巧,您仍然需要一个可取消引用的迭代器,这并不总是好的—那么如何处理空序列呢?)


使用类<代码> Bar <代码>,您必须提供模板参数<代码> Iterator < /C>和Value/Cuth>,因为没有类的类型推导,使用<代码> bar(it,*it)< /C++ >将不编译。我对使用bar作为函数也有同样的想法,但我想也许我遗漏了一些东西。