c++ - 以与数组相同的方式在 map 上循环

标签 c++ templates stl iterator

我正在尝试以相同的方式在容器( map 、集合、 vector 、列表)和数组上循环。 这是代码:

template<typename TYPE>
void AddXmlOfContAttribute(TYPE *it)
{
    m_ss<<"<SingleNode ";
    AddXmlAttribute("Value" , *it);
    m_ss<<"/>\n";
}



template<typename TYPE1,typename TYPE2>
void AddXmlOfContAttribute(std::pair<TYPE1,TYPE2> tpair)
{
    m_ss<<"<MapNode ";
    AddXmlAttribute("key"   , tpair->first);
    AddXmlAttribute("Value" , tpair->second);
    m_ss<<"/>\n";
}




template<typename TYPE>
    void AddContainerToXml(std::string str, TYPE it_begin ,  TYPE it_end)
    {
        if(it_begin != it_end)
        {
            m_ss<<"<"<<str<<">\n";

            //std::for_each(it_begin , it_end, AddXmlOfContAttribute);

            for( ; it_begin != it_end ; it_begin++)
                AddXmlOfContAttribute(it_begin);

            m_ss<<"</"<<str<<">\n";
        }
    }

我收到以下错误:

In member function ‘void AddElementToBackupFileFunctor::AddContainerToXml(CrString, TYPE, TYPE) [with TYPE = std::_Rb_tree_const_iterator >]’ instantiated from here error: no matching function for call to
AddElementToBackupFileFunctor::AddXmlOfContAttribute(std::_Rb_tree_const_iterator >&)’

我如何在正常循环中执行此操作? 奖励问题:我如何在 for_each 循环中做到这一点?

最佳答案

所以,简而言之,我构建了一个示例来解释您需要的所有内容 here .

为了做你想做的事,你必须首先将你的处理程序更改为具有静态方法的结构(这是必需的,因为你不能部分特化函数模板,请参阅 here ):

template<typename TYPE>
struct value_handler {
    static void AddXmlOfContAttribute(AddElementToBackupFileFunctor& context, 
                                      TYPE value) {
        // handle normal values here
        // context replaces this-pointer
    }
};

// partial specialization for pairs
template<typename TYPE1, typename TYPE2>
struct value_handler<std::pair<TYPE1, TYPE2> > {
    static void AddXmlOfContAttribute(AddElementToBackupFileFunctor& context, 
                                      std::pair<TYPE1, TYPE2> value) {
        // handle values that are pairs here
        // context replaces this-pointer
    }
};

value 参数不能是引用,因为那样会搞砸 std::bind1st(描述了使用 Boost 的解决方法 here)。要将其与 std::for_each 一起使用,请执行以下操作:

std::for_each(begin, end, std::bind1st(
    std::ptr_fun(&AddElementToBackupFileFunctor::value_handler<typename TYPE::value_type>::AddXmlOfContAttribute), 
    *this));

关于c++ - 以与数组相同的方式在 map 上循环,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6437479/

相关文章:

c++ - 在 C++11 中,我可以为非聚合类型实现类似构造函数的聚合类型初始化吗?如何实现?

c++ - 调用 C++ STL 容器的 value_type 的静态成员函数

c++ - STL 集上的引用运算符 []

c++ - C 程序中需要 LVALUE 作为赋值的左操作数

c++ - 如何在方法中获取 int 数组(方法参数)的长度?

c++ - 如何在没有取消点的情况下取消 pthread

c++ - 每个类型的多实例计数器

c++ - 使用可变参数模板进行委托(delegate)

c++ - 没有为显式模板实例化请求提供合适的定义

c++ - 如何将列表 STL 的迭代器转换为实例 (C++)