#include #include #include #include #include #include #include namespace ATL { template class CAdapt; } namespace test { namespace atl { namespace detail { template struct CAdapt_pointee { }; template struct CAdapt_pointee > { typedef T type; }; template struct m_T_type_add_const_conditionally { typedef typename CAdapt_pointee::type>::type type; }; template struct m_T_type_add_const_conditionally { typedef typename boost::add_const::type>::type>::type type; }; template struct m_T_type { typedef typename m_T_type_add_const_conditionally::type>::type type; }; } template class CAdapt_iterator : public boost::iterator_adaptor < CAdapt_iterator, Iterator, typename detail::m_T_type::type, typename boost::iterator_category::type, typename detail::m_T_type::type & > { private: struct enabler { }; public: CAdapt_iterator() { } CAdapt_iterator(Iterator p) : CAdapt_iterator::iterator_adaptor_(p) { } template CAdapt_iterator(const CAdapt_iterator &other, typename boost::enable_if, enabler>::type = enabler()) : CAdapt_iterator::iterator_adaptor_(other.base()) { } private: typedef typename detail::m_T_type::type &reference_type; friend class boost::iterator_core_access; reference_type dereference() const { return this->base()->m_T; } }; template CAdapt_iterator make_CAdapt_iterator(Iterator i) { return CAdapt_iterator(i); } } } int main() { std::vector > buffer(1, CComBSTR(L"Hello World!")); test::atl::make_CAdapt_iterator(buffer.begin())->Empty(); }