是否可以创建另一个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
的副本?
答案 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
也无法采用它。