如何在派生构造函数的初始化列表中有条件地选择基构造函数



示例:std::vector的包装器。我有两个移动构造函数:

template <class Allocator>
class MyVector {
....
MyVector(MyVector&&) = default;
MyVector(MyVector&& other, const Allocator<int>& alloc) : vec(std::move(other.vec), alloc) {}
private:
std::vector<int, Allocator<int>> vec;
...
}

然而,我想做一个优化,以避免在给定的内存分配器与移动的参数相同的情况下,使用代价高昂的向量构造函数。类似于:

class MyVector {
MyVector(MyVector&& other, const Allocator<int>& alloc)
: if (other.vec.get_allocator() == alloc) 
vec(std::move(other.vec)) 
else 
vec(std::move(other.vec), alloc) 
{}
}

这在C++中可能吗?

注意:问题有条件初始化C++成员变量的正确方法?不相似,因为我无法在基构造函数调用中推送条件。我需要它在外部选择基本构造函数。


Context:我无法更改的第三方库代码使用了错误的移动构造函数(在不应该传递分配器的情况下传递分配器(,我正在尝试修复此问题,因为它会极大地损害性能。

更多上下文:有问题的代码是std::scoped_allocator_adaptor。它将std::pair视为一个容器,这就产生了这个问题。

有了set<pair<int,MyVector>>,并且对所有内存分配使用1个作用域分配器,它在allocator_traits::construct()中生成了错误的构造函数。移动的MyVector确实使用了相同的分配器,但它被pair所掩盖,并且vec.get_allocator() == set.get_allocator()被忽略。因此pair构造使用不必要的alloc参数调用MyVector的move构造函数。

感谢您对该问题的评论。将它们概括为一个asnwer。

  1. 似乎不可能使用条件来选择基本构造函数
  2. 作为一个解决方案,我删除了作用域分配器适配器,只是将代码从MyVector v; v.emplace_back()更改为v.emplace_back(MyVector::value_type{v.get_allocator()};,从而有效地由我自己添加了作用域行为。这绕过了有问题的慢速构造函数,我确实测量到了相当大的速度增益。对其他容器(如集合(进行了相同的更改
  3. 不会添加示例代码,因为它是针对我的问题的,与最初的问题无关,而最初的问题纯粹是关于C++语法的

最新更新