Итак, вкратце, я построил пример, который должен объяснить все, что вам нужно здесь .
Чтобы сделать то, что вы хотите, вы должны сначала изменить свои обработчики на структуры со статическими методами (это необходимо, потому что вы не можете частично специализировать шаблоны функций, см. здесь ):
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));