这个移动和复制包装声音和完整吗?

时间:2016-05-05 10:23:19

标签: c++ templates c++11 wrapper

我刚刚为移动和复制操作创建了一个包装器,以便注入代码以查看在默认实现的情况下调用哪个。我已经接近了解所谓的什么,但有时会仔细检查。

我不确定using T::T;的方法1对于构造函数是否比转发像unique_ptr这样的参数的方法2更好?我在这个帖子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();

0 个答案:

没有答案