gpt4 book ai didi

c++ - 模板类的统一复制和移动构造函数

转载 作者:行者123 更新时间:2023-11-28 01:22:56 49 4
gpt4 key购买 nike

假设我有一个 DataProcessor 模板类,它包含一个智能指针,指向具有运算符 * 和运算符 -> 的已处理数据:

template <class DataPointer>
class DataProcessor
{
public:

//it is not clear how to implement the constructor
//DataProcessor(DataPointer p) : pData(p) {};

void Process() { /* do something with *pData */ };

private:

DataPointer pData;
}

如何实现构造函数使 DataProcessor 与 std::unique_ptr(构造函数应通过 && 接受它并移动它)和 std::shared_ptr(构造函数应通过 & 接受它并复制它)一起工作?是否可能有某种统一的构造函数?

实际上,我有一个包含智能 Win32 句柄 UniqueHandle 和 SharedHandle 的类,它们具有与 std::unique_ptr 和 std::shared_ptr 类似的语义。因此,如何实现这样的场景是一个普遍的问题。

最佳答案

您的选择基本上是这些:

  1. 按值取参数:

    DataProcessor(DataPointer p) : pData(std::move(p)) {}

    如果DataPointer是移动的,那么用户将不得不通过 std::move 调用它, 这将移动构造 p , 然后用于移动构造 pData .如果它是可复制的,那么 p将根据用户传递值的方式进行复制/移动。从那里,它将移动构造 pData .

    请注意,此版本添加了额外的移动操作。

  2. 始终通过右值引用获取参数:

    DataProcessor(DataPointer &&p) : pData(std::move(p)) {}

    在这种情况下,如果 DataPointer不是只移动的,并且用户想要传递一个左值,用户必须将该值显式复制到用于初始化的临时文件中 p .这看起来像这样:

    DataProcessor<shared_ptr<T>> dp(shared_ptr{sp});

    在哪里sp是现有的 shared_ptr您要从中复制的内容。当给定一个要从中移动的对象时,这只会执行一次移动,但在复制时会执行复制+移动。

  3. 写两个函数,如果DataPointer,使用SFINAE去除复制版本是不可复制的。这个版本的优点是不需要做额外的 Action :

DataProcessor(DataPointer &&p) : pData(std::move(p)) {}
template<typename T = DataPointer>
DataProcessor(std::enable_if_t<std::is_copy_constructible_v<T>, const T&> p)
: pData(p) {}

关于c++ - 模板类的统一复制和移动构造函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55267254/

49 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com