如何在另一个向量中包含向量包装类时使用它?

keb*_*ebs 8 c++ vector wrapper stdvector

考虑第三方库中的一个自由函数,它需要一个std::vectoras参数:void foo( std::vector<sometype>& );

现在,我在这个类型周围编写一个包装器,这样我就可以添加成员函数了.为了能够使用foo()该类型,我添加了一个访问功能.

class Wrapper
{
   private:
      std::vector<sometype> _data;
   public:
       std::vector<sometype>& data() { return _data; }
       const std::vector<sometype>& data() const { return _data; }
       //... other stuff
};
Run Code Online (Sandbox Code Playgroud)

这样,我仍然可以使用foo():

Wrapper a;
foo( a.data() );
Run Code Online (Sandbox Code Playgroud)

但现在考虑另一个函数,它需要一个矢量向量sometype(编辑:并将元素添加到该向量中):

void bar( std::vector<std::vector<sometype>>& );
Run Code Online (Sandbox Code Playgroud)

但我的数据类型是 std::vector<Wrapper> vec;

有没有办法使用我的包装类型来调用bar() 我想要做的是:

 std::vector<Wrapper> vec;
 bar( ??? );
Run Code Online (Sandbox Code Playgroud)

我想避免的一点是先调用bar()所需的类型,然后逐个将元素复制到我的中vector<Wrapper>.

起初,我会说"不",但也许有一些聪明的解决方案?

编辑2:举个例子,考虑以下玩具实现bar()introot数据类型:

void bar( std::vector<std::vector<int>>& vv )
{
   std::vector<int> v1 = { 1,2,3 };
   std::vector<int> v2 = { 4,5,6 };
   vv.push_back(v1);
   vv.push_back(v2);
}
Run Code Online (Sandbox Code Playgroud)

小智 1

代替 std::vector<Wrapper> vec;

使用

std::vector< std::vector<sometype> > vec;
Run Code Online (Sandbox Code Playgroud)

无论如何,您可以将 Wrapper 对象插入 vec

vec.push_back(a.data());
Run Code Online (Sandbox Code Playgroud)

然后打电话 bar(vec);