dsm*_*ith 5 c++ templates boost map
我的问题是对这一点的略微概括.为了便于讨论,我将专注于迭代地图的键.我想有一个通用的辅助函数,key_iterator它接受一个map迭代器并返回一个map key迭代器.例如,以下代码:
#include "key_iterator.hpp"
#include <algorithm>
#include <iostream>
#include <iterator>
#include <map>
int main(int argc, char** argv)
{
std::map<std::string, int> m;
m["One"] = 1;
m["Two"] = 2;
std::copy(key_iterator(m.begin()), key_iterator(m.end()), std::ostream_iterator<std::string>(std::cout, " "));
return 0;
}
Run Code Online (Sandbox Code Playgroud)
应该产生以下输出:
One Two
Run Code Online (Sandbox Code Playgroud)
正如上面提到的问题的解决方案中所建议的那样,boost :: transform_iterator似乎是实现的适当起点key_iterator.我有一个针对key_iterator.hpp的中间解决方案:
#pragma once
#include <functional>
#include <map>
#include <boost/iterator/transform_iterator.hpp>
template <typename Key, typename Value>
class KeyGetter : public std::unary_function<std::pair<Key,Value>, Key>
{
public:
const Key& operator()(const std::pair<Key,Value>& p) const {return p.first;}
};
template<typename Key, typename Value>
boost::transform_iterator<KeyGetter<Key,Value>, typename std::map<Key,Value>::iterator>
key_iterator(typename std::map<Key,Value>::iterator itr)
{
return boost::make_transform_iterator<KeyGetter<Key,Value>, typename std::map<Key,Value>::iterator>(itr, KeyGetter<Key,Value>());
}
Run Code Online (Sandbox Code Playgroud)
但是通过这种实现,Key和Value类型不会自动推断出来,我需要手动提供它们以使其编译:
std::copy(key_iterator<std::string,int>(m.begin()), key_iterator<std::string,int>(m.end()), std::ostream_iterator<std::string>(std::cout, " "));
Run Code Online (Sandbox Code Playgroud)
关于如何按照我想要的方式工作的任何想法?
试试这个:
template <typename Iter>
struct KeyGetter : std::unary_function<typename Iter::value_type,
typename Iter::value_type::first_type>
{
const typename Iter::value_type::first_type& operator()
(const typename Iter::value_type& p) const
{ return p.first; }
};
template<typename Iter>
boost::transform_iterator<KeyGetter<Iter>, Iter> key_iterator(Iter itr)
{
return boost::make_transform_iterator<KeyGetter<Iter>, Iter>
(itr, KeyGetter<Iter>());
}
Run Code Online (Sandbox Code Playgroud)
这个想法是调用站点上的函数应该直接在其参数上进行模板化,以避免必须明确指定模板参数.