c++ 这个移动和复制 Package 是否健全和完整?

2eafrhcq  于 2023-06-25  发布在  其他
关注(0)|答案(1)|浏览(106)

我只是为移动和复制操作做了一个 Package 器,以注入到代码中,看看在默认实现的情况下调用了哪个。我越来越接近理解什么是所谓的,但想再次检查的时候。
我不确定using T::T;的方法1对于构造函数来说是否比方法2更好,方法2转发了unique_ptr之类的参数。我在这个帖子里找到了Forwarding all constructors in C++0x
在移动构造函数和赋值中,我使用std::move传递给超类。这应该是std::forward吗?如果是,怎么做?我尝试使用它时出错。

#ifndef MOVECOPY_OBSERVER_H
#define MOVECOPY_OBSERVER_H

#include <iostream>

template<class T>
class MoveCopyObserver : public T {
public:
    //1: Use "using" for constructors 
    //From https://stackoverflow.com/questions/3119929/forwarding-all-constructors-in-c0x
    using T::T;

    //2: Forward all args, unique_ptr style.
    /*
    template<typename... Args>
    MoveCopyObserver(Args&&... args) 
        : T(std::forward<Args>(args)...) 
    {
    };*/

    // *************************************************************************
    virtual ~MoveCopyObserver() = default;

    // *************************************************************************
    MoveCopyObserver(const MoveCopyObserver& other)
        : T(other)
    {
        std::cout << "Copy constructor " << typeid(T).name() << std::endl;
    }

    // *************************************************************************
    MoveCopyObserver(MoveCopyObserver && other)
        : T(std::move(other)) //3: std::forward instead?
    {
        std::cout << "Move constructor " << typeid(T).name() << std::endl;
    }

    // *************************************************************************
    MoveCopyObserver& operator=(const MoveCopyObserver& other)
    {
        T::operator=(other);
        std::cout << "Copy assignment " << typeid(T).name() << std::endl;
        return *this;
    }

    // *************************************************************************
    MoveCopyObserver& operator=(MoveCopyObserver&& other)
    {
        T::operator=(std::move(other)); //3: std::forward instead?
        std::cout << "Move assignment " << typeid(T).name() << std::endl;
        return *this;
    }
};

#endif //MOVECOPY_OBSERVER_H

使用方法是在堆栈上或通过智能指针,如下所示:

class A {
public:
    A(std::string ss)
    {
        s = ss;
    }

    void f()
    {
        std::cout << "\"" << s << "\"" << std::endl;
    }

private:
    std::string s;
};

A a("Test instance");
a.foo();

MoveCopyObserver<A> b("Another instance");
b.foo();
aydmsdu9

aydmsdu91#

另一个问题解决了继承构造函数的问题,它确实在几个方面上级转发 Package 器。请注意,neither方法为您提供了复制/移动构造函数(出于不同的原因),这在这里很好,因为您希望记录这些。
std::forward用于转发引用;你不需要或不需要这些(甚至T&&class模板中的普通右值引用),所以std::move在这里是正确的。

相关问题