#include <iomanip>
#include <iostream>
#include <string>
#include <sstream>
#include <functional>
#include <map>
// for map
using MapVisitResult = std::pair<bool, std::string>;
template<class MapContainerT>
class MapReadVisitorT {
public:
MapContainerT& owner_;
MapVisitResult& visitResult_;
MapReadVisitorT(MapContainerT& owner, MapVisitResult& visitResult)
: owner_(owner), visitResult_(visitResult)
{}
void operator()(const typename MapContainerT::value_type& v)
{
visitWithNoLock(v);
}
private:
void visitWithNoLock(const typename MapContainerT::value_type& v)
{
visitResult_.first = true;
std::ostringstream os;
os << v;
visitResult_.second += os.str();
}
};
template<class MapContainerT, class ReadVisitorT = MapReadVisitorT<MapContainerT>>
MapVisitResult readVisitMapContainer_mt(MapContainerT& c)
{
MapVisitResult result = { true, "" };
std::function<void(const typename MapContainerT::value_type&)> visitor(std::bind(ReadVisitorT(c, result), std::placeholders::_1));
for (typename MapContainerT::const_iterator iter = c.begin(); iter != c.end(); ++iter) {
visitor(*iter);
}
return result;
}
using LockableObjHashMap = std::map<int32_t, int32_t>;
std::ostream& operator << (std::ostream& os, const LockableObjHashMap::value_type& v)
{
os << v.second;
return os;
}
int main(void)
{
LockableObjHashMap hashMap{ {1, 1}, {2, 2}, {3, 3}, {4, 4} };
using ObjMapReadVisitor = MapReadVisitorT<LockableObjHashMap>;
{
MapVisitResult visitResult(readVisitMapContainer_mt<LockableObjHashMap, ObjMapReadVisitor>(hashMap));
std::cout << visitResult.first << ", " << visitResult.second << std::endl;
}
return 0;
}
error: no match for ‘operator<<’ (operand types are ‘std::ostringstream’ {aka ‘std::__cxx11::basic_ostringstream’} and ‘const std::map<int, int>::value_type’ {aka ‘const std::pair<const int, int>’})
29 | os << v;
我已经定义了 << 的重载,但貌似没起作用
std::ostream& operator << (std::ostream& os, const LockableObjHashMap::value_type& v)