我只是为移动和复制操作做了一个 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();
1条答案
按热度按时间aydmsdu91#
另一个问题解决了继承构造函数的问题,它确实在几个方面上级转发 Package 器。请注意,neither方法为您提供了复制/移动构造函数(出于不同的原因),这在这里很好,因为您希望记录这些。
std::forward
用于转发引用;你不需要或不需要这些(甚至T&&
是class模板中的普通右值引用),所以std::move
在这里是正确的。