цикл на карте так же, как массив - PullRequest
0 голосов
/ 22 июня 2011

Я пытаюсь зациклить контейнеры (карту, набор, вектор, список) и массив одинаково. Вот код:

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?

Ответы [ 2 ]

1 голос
/ 22 июня 2011

Итак, вкратце, я построил пример, который должен объяснить все, что вам нужно здесь .

Чтобы сделать то, что вы хотите, вы должны сначала изменить свои обработчики на структуры со статическими методами (это необходимо, потому что вы не можете частично специализировать шаблоны функций, см. здесь ):

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));
0 голосов
/ 22 июня 2011

Ошибка компиляции исходит из этой строки:

AddXmlOfContAttribute(it_begin);

Это должно быть:

AddXmlOfContAttribute(*it_begin);

Я идиот, я не осознал первую перегрузку ... которая должнабыть ссылкой, как сказал sc.

...