,你有你的两个函数模板之间的区别是没有关联容器和顺序,但在存储类型的局部不同的差异。
为了澄清,std::set
是一个关联容器,但可以与您的printSequence
函数一起使用; map
的问题不是它是关联性的,而是value_type
是pair
,您只对second
部分感兴趣。
最简单的事情就是抽象解引用操作。
E.g.使用这样的:
#include <map>
#include <vector>
template< class X, class Y >
void test(const std::map<X, Y>& mp)
{
printEither(mp.begin(), mp.end(), MakeMapDerefence(mp));
}
template< class Y >
void test(const std::vector<Y>& vec)
{
printEither(vec.begin(), vec.end(), MakeSimpleDereference(vec));
}
定义如下(有锅炉板公平一点这可能是一个提振的一行):
template< class ReferenceType, class IteratorType >
struct SimpleDereference
{
ReferenceType operator() (IteratorType i) const
{
return *i;
}
};
template< class ReferenceType, class IteratorType >
struct MapDereference
{
ReferenceType operator() (IteratorType i) const
{
return i->second;
}
};
// Helper template function to make an appropriate SimpleDerefence instance
template< class Container >
SimpleDereference< typename Container::const_reference
, typename Container::const_iterator >
MakeSimpleDereference(const Container&)
{
return SimpleDereference< typename Container::const_reference
, typename Container::const_iterator >();
}
// Helper template function to make an appropriate SimpleDerefence instance
template< class Container >
SimpleDereference< typename Container::reference
, typename Container::iterator >
MakeSimpleDereference(Container&)
{
return SimpleDereference< typename Container::reference
, typename Container::iterator >();
}
// Helper template function to make an appropriate MapDerefence instance
template< class Container >
MapDereference< const typename Container::mapped_type&
, typename Container::const_iterator >
MakeMapDerefence(const Container&)
{
return MapDereference< const typename Container::mapped_type&
, typename Container::const_iterator >();
}
// Helper template function to make an appropriate MapDerefence instance
template< class Container >
MapDereference< typename Container::mapped_type&
, typename Container::iterator >
MakeMapDereference(Container&)
{
return MapDereference< typename Container::mapped_type&
, typename Container::iterator >();
}
#include <iostream>
#include <ostream>
template <class Iterator, class Dereference> void printEither(Iterator begin, Iterator end, Dereference deref)
{
for (; begin != end; ++begin)
{
std::cout << deref(begin);
}
}
我想我所问的可能是不可能的。 :-( – 2011-02-05 17:36:37