gpt4 book ai didi

c++ - 如何调用 boost multi_index 元素的非常量成员函数

转载 作者:太空狗 更新时间:2023-10-29 12:20:28 28 4
gpt4 key购买 nike

我发布这个是因为我有点不明白 boost 教程是如何工作的。

我有一个类,其对象是 boost multi_index 容器的元素。

我需要使用成员函数更新对象的成员变量。我不知道该怎么做。请问你能帮帮我吗。我准备了一个简单的例子:

#include <string>
#include <iostream>
#include <boost/multi_index_container.hpp>
#include <boost/multi_index/member.hpp>
#include <boost/multi_index/ordered_index.hpp>
#include<vector>

using boost::multi_index::multi_index_container;
using boost::multi_index::ordered_non_unique;
using boost::multi_index::ordered_unique;
using boost::multi_index::indexed_by;
using boost::multi_index::member;

class employee_entry
{
public:
employee_entry( const std::string& first,
const std::string& last,
long id):
first_name_(first),
last_name_(last),
id_(id)
{}
void change(){id_++;}//causing the problem
std::string first_name_;
std::string last_name_;
std::vector<int> mySet;
long id_;

std::vector<int>::iterator mySet_begin() {return mySet.begin(); }
};


typedef multi_index_container<
employee_entry, indexed_by<
ordered_unique<member<employee_entry, std::string, &employee_entry::first_name_> >
, ordered_non_unique<member<employee_entry, std::string, &employee_entry::last_name_> >
, ordered_non_unique<member<employee_entry, long, &employee_entry::id_> >
>
> employee_set;

//employee set.... multi-index
employee_set m_employees;


int main()
{
using boost::multi_index::nth_index;
using boost::multi_index::get;

typedef nth_index<employee_set, 0>::type first_name_view;
first_name_view& fnv = get<0>(m_employees);

fnv.insert(employee_entry("John", "Smith", 110));
fnv.insert(employee_entry("Fudge", "Hunk", 97));

///get employees sorted by id
typedef nth_index<employee_set, 2>::type id_view;
id_view& idv = get <2> (m_employees);
for(id_view::reverse_iterator it = idv.rbegin(), it_end(idv.rend()); it != it_end; ++it)
{
std::cout << it->first_name_ <<" "
<< it->last_name_ << ":"
<< it->id_ << std::endl;
it->change();//calling the troublesome function
}

return 0;
}

产生的错误是:

 $c++ dr_function.cpp 
dr_function.cpp: In function ‘int main()’:
dr_function.cpp:65:19: error: passing ‘const employee_entry’ as ‘this’ argument of ‘void employee_entry::change()’ discards qualifiers [-fpermissive]

最佳答案

您发布的解决方案将不起作用:充其量它会得到一个乱码索引,最坏的情况是您的应用程序会崩溃。由于您的最后一个索引取决于 employee_entry::id_,因此您无法随意更改它,因为您隐式地破坏了索引顺序。对于此类内容,Boost.MultiIndex 提供了更新函数replacemodify,如讨论的那样here .在您的特定情况下,您可以调用您的 change 成员函数,如下所示:

idv.modify(idv.iterator_to(*it),boost::bind(&employee_entry::change,_1));

一点解释:idv.iterator_to(*it) 只是将您的反向迭代器转换为常规迭代器,这正是 modify 所需要的。至于 boost::bind 部分,它将 &employee_entry::change 封装到一个合适的修改仿函数中。这样,您就可以让 Boost.MultiIndex 知道 id_ 即将发生的变化,并相应地更新索引。

关于c++ - 如何调用 boost multi_index 元素的非常量成员函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10754359/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com