移动而不是复制boost :: dynamic_bitset BlockInputIterator构造函数?

时间:2016-01-13 22:06:08

标签: c++ boost

是否可以创建另一个boost::dynamic_bitset BlockInputIterator构造函数来使用move而不是std::vector的副本?

我相信以下构造函数使用了副本boost docs

template <typename BlockInputIterator>
dynamic_bitset(
    BlockInputIterator first,
    BlockInputIterator last,
    const Allocator& alloc = Allocator());

以下是我编写的一些代码,用于说明我的要求:

#include <iostream>
#include <vector>
#include <boost/dynamic_bitset.hpp>

using namespace std;
using namespace boost;

int main(int argc, char* argv[])
{
    // Notice the vector opposed to dynamic_bitset
    vector<uint8_t> data;

    // put in dummy data
    data.push_back(0x1a);
    data.push_back(0xcf);
    data.push_back(0xfc);
    data.push_back(0x1d);
    for (auto i = data.begin(); i != data.end(); ++i)
    {
      cout << hex << (int)*i << dec << ' ';
    }
    cout << std;
    cout << "data.data(): " << hex << (uint64_t)data.data() << dec << endl;

    // I believe this is a copy opposed to a move
    boost::dynamic_bitset<uint8_t> bs0(data.begin(), data.end());

    // I would like to be able to do this which would use move,
    // is that possible considering the vector?
    boost::dynamic_bitset<uint8_t> bs1 = data;

    return 0;
}

所以基本上我想知道boost是否可以为boost::dynamic_bitset添加额外的构造函数来使用move而不是std::vector的副本?

1 个答案:

答案 0 :(得分:3)

除非vector更改其界面,否则不会。

看,运动是一个非常私密的对象操作;这就是移动支持需要该类型的成员函数的原因。这不是你可以从外面强迫对象的东西。

vector无法采用任意的,用户分配的内存缓冲区作为其内部存储。从理论上讲,它可能需要通过某种方式来实现,但目前还没有这样的接口。如果没有这样的支持,其他代码就无法给予std::vector内存。

Boost可能会给boost::container::vector这样的界面。但这不会改变std::vector

同样,你不能潜入std::vector的内存存储。嗯,你可以,但只能通过分配器技巧。也就是说,当vector告知分配器时,你必须告诉分配器不要实际释放分配或销毁对象。这将是棘手的,因为vector::get_allocator返回分配器的副本。

当然,dynamic_bitset也无法获得任何分配;它希望拥有它。很像vector。因此即使你可以潜入std::vector的存储,dynamic_bitset也无法采用它。