是否有一种方法从Boost多索引容器在c++中继承

Is there a way to inherit from Boost multi index container in C++?

本文关键字:索引 继承 c++ Boost 方法 一种 是否      更新时间:2023-10-16

我正在寻找一种方法来创建继承boost多索引容器功能的基容器类。我希望能够添加其他函数到这个基类,并创建其他类,可以使用这个基类的函数,并利用boost的多索引容器。

我试过这样做:

template < class D, E >
class BoostModelContainer : public boost::multi_index_container<D, E>
{
public:
    D* AddItem( const D& item)
    {
        //code here
    }
};

,然后创建继承基类的其他类,如:

class ExampleContainer : public BoostModelContainer< CItem,
boost::multi_index::indexed_by<
  boost::multi_index::ordered_unique< 
     boost::multi_index::tag<id_tag>, boost::multi_index::member< CItem, ItemId, &CItem::m_id > >,
  boost::multi_index::ordered_unique< 
     boost::multi_index::tag<name_tag>, boost::multi_index::member< CItem, String, &CItem::m_name > >
  >
>

但是这不会编译。有人有其他的想法或知道如何让它工作吗?

谢谢! !

你传递了两个模板参数,但是你的模板只接受一个。

template < class D, class E >
class BoostModelContainer : public boost::multi_index_container<D, E>
{
public:
    D* AddItem( const D& item)
    {
        //code here
    }
};

如果没有一个最小的、完整的和可验证的例子,要弄清楚你的问题到底是什么有点困难。但是rightfold的回答明确指出了你发布的代码的主要问题。本质上,您在template声明中缺少class关键字:

template < class D, class E >
// missing ---------^^^^^
class BoostModelContainer : public boost::multi_index_container<D, E>
{ /* ... */ };
除此之外,它应该工作得很好,如下面的完整的代码示例所示(编译良好,参见实时演示):
#include <boost/multi_index_container.hpp>
#include <boost/multi_index/member.hpp>
#include <boost/multi_index/ordered_index.hpp>
#include <string>
template <class D, class E>
class BoostModelContainer : public boost::multi_index_container<D, E>
{
public:
  D* AddItem( const D& item)
  {
    //code here
  }
};
struct Foo
{
  int id;
  std::string name;
};
struct id_tag { };
struct name_tag { };
// Requires -std=c++11    
using ExampleContainer = BoostModelContainer<
  Foo,
  boost::multi_index::indexed_by<
    boost::multi_index::ordered_unique<
      boost::multi_index::tag<id_tag>, boost::multi_index::member<Foo, int, &Foo::id> >,
    boost::multi_index::ordered_unique<
      boost::multi_index::tag<name_tag>, boost::multi_index::member<Foo, std::string, &Foo::name> >
    >
  >;
// works with c++03 as well
struct ExampleContainer2 : public BoostModelContainer<
  Foo,
  boost::multi_index::indexed_by<
    boost::multi_index::ordered_unique<
      boost::multi_index::tag<id_tag>, boost::multi_index::member<Foo, int, &Foo::id> >,
    boost::multi_index::ordered_unique<
      boost::multi_index::tag<name_tag>, boost::multi_index::member<Foo, std::string, &Foo::name> >
    >
  >
{ };
int main()
{
  ExampleContainer ec1;
  ExampleContainer2 ec2;
}