以与数组相同的方式在映射上循环

loop on a map same way as array

本文关键字:映射 循环 方式 数组      更新时间:2023-10-16

我正试图以同样的方式在容器(map、set、vector、list)和数组上循环。这是代码:

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";
        }
    }

我得到以下错误:

在成员函数"void AddElementToBackupFileFunctor::AddContainerToXml(CrString,TYPE,TYPE)[其中TYPE=std::_Rb_tree_const_iterator>]'从这里实例化错误:对
的调用没有匹配的函数AddElementToBackupFileFunctor::AddXmlOfContAttribute(std::_Rb_tree_const_iterator>&)'

如何在正常循环中进行?附加问题:如何在for_each循环中执行此操作?

因此,简而言之,我构建了一个示例,应该可以解释您在这里需要的所有内容。

为了完成您想要的操作,您必须首先将处理程序更改为具有静态方法的结构(这是必需的,因为您不能部分专门化函数模板,请参阅此处):

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的解决方法)。要将其与std::for_each一起使用,请执行以下操作:

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

编译错误来自以下行:

AddXmlOfContAttribute(it_begin);

这应该是:

AddXmlOfContAttribute(*it_begin);

我是个白痴我没有意识到第一次超负荷。。。这应该是sc所说的参考。