,你有你的兩個函數模板之間的區別是沒有關聯容器和順序,但在存儲類型的局部不同的差異。
爲了澄清,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