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迭代器。性状]“迭代器特征”:
仅在术语中实现算法
对于迭代器,通常需要
确定值和差异
对应于特定类型的类型
迭代器类型。因此,它是
要求ifIterator
是类型
对于迭代器,类型
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>和