我正在尝试以相同的方式在容器( 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/