Moo*_*ice 14 c++ templates move-constructor c++11
我有一个基类,它基本上将一个类附加到任意窗口句柄(例如,HWND,HFONT),并使用策略类来附加/分离和销毁:
// class SmartHandle
template<typename THANDLE, class TWRAPPER, class TPOLICY>
class SmartHandle : boost::noncopyable
{
private:
TPOLICY* m_pPolicy; // Policy
bool m_bIsTemporary; // Is this a temporary window?
SmartHandle(); // no default ctor
SmartHandle(const SmartHandle<THANDLE, TWRAPPER, TPOLICY>&); // no cctor
protected:
THANDLE m_hHandle; // Handle to the underlying window
TPOLICY& policy() {return(*m_pPolicy);};
// ctor that attaches but is temporary
SmartHandle(const THANDLE& _handle, bool _temporary) : m_hHandle(_handle)
, m_bIsTemporary(_temporary)
{
m_pPolicy = new TPOLICY(reinterpret_cast<TWRAPPER&>(*this));
if(_handle)
m_pPolicy->attach(_handle);
}; // eo ctor
// move ctor
SmartHandle(SmartHandle<THANDLE, TWRAPPER, TPOLICY>&& _rhs) : m_hHandle(_rhs.m_hHandle)
, m_bIsTemporary(_rhs.m_bIsTemporary)
{
m_pPolicy = new TPOLICY(reinterpret_cast<TWRAPPER&>(*this));
m_pPolicy->attach(m_hHandle);
const_cast<SmartHandle&>(_rhs).m_hHandle = NULL;
}; // eo mtor
// dtor
virtual ~SmartHandle()
{
if(m_hHandle)
{
m_pPolicy->detach(m_hHandle);
if(!m_bIsTemporary)
m_pPolicy->destroy(m_hHandle);
m_hHandle = NULL;
};
delete(m_pPolicy);
m_pPolicy = NULL;
}; // eo dtor
Run Code Online (Sandbox Code Playgroud)
请注意,我已经声明了拷贝构造函数私有(不执行),因为我不希望类被复制做,但此举被允许的.
我的Window班级源于此:
class GALLOW_API Window : SmartHandle<HWND, Window, detail::_hWndPolicy>
{
friend class Application;
private:
static LRESULT CALLBACK wndProc(HWND _hWnd, UINT _message, WPARAM _wParam, LPARAM _lParam);
// no copy/default ctor
Window();
Window(const Window&);
protected:
public:
static const String ClassName;
Window(const HWND& _hWnd);
Window(const WindowCreateInfo& _createInfo);
Window(Window&& _rhs);
virtual ~Window();
}; // eo class Window
Run Code Online (Sandbox Code Playgroud)
再一次,复制默认/复制ctors.移动构造函数的实现是:
Window::Window(Window&& _rhs) : SmartHandle(_rhs)
{
}; // eo mtor
Run Code Online (Sandbox Code Playgroud)
但是,在编译期间,我在移动构造函数实现的第一行得到以下错误:
1>c:\\documents\visual studio 2010\projects\gallow\gallow\window.cpp(81): error C2248: 'gallow::SmartHandle<THANDLE,TWRAPPER,TPOLICY>::SmartHandle' : cannot access private member declared in class 'gallow::SmartHandle<THANDLE,TWRAPPER,TPOLICY>'
Run Code Online (Sandbox Code Playgroud)
所以,看起来好像它试图调用复制构造函数(我已经声明为私有)而不是移动构造函数.我在这里缺少一些简单的东西吗?
提前致谢.
编辑:修改了mtor所以它是非const,错误仍然存在.EDIT2:我正在使用Visual C++ 2010.
小智 12
实际上它应该是这样的.
Window::Window(Window&& _rhs) : SmartHandle( std::forward<SmartHandle>( _rhs ) ) { }; // eo mtor
Run Code Online (Sandbox Code Playgroud)
http://msdn.microsoft.com/en-us/library/ee390914.aspx
Mot*_*tti 10
命名参数不被视为您必须使用的右值引用move.
Window::Window(Window&& _rhs) : SmartHandle(std::move(_rhs))
{
}
Run Code Online (Sandbox Code Playgroud)
参数不被视为右值的原因是它可以使用两次而移动通常会更改值,因此您必须明确知道此变量是否已移出.
例如
void f(string&& first, string&& second)
{
string local = first;
cout << first; // I would be surprised if this is different from `local`
local = std::move(second);
// If I'm surprised after explicitly moving from second it's my problem
}
Run Code Online (Sandbox Code Playgroud)
最好使用move而不是forward在你想要移动的情况下,因为a)它更清晰,b)你需要指定一个forward冗长且容易出错的类型.
| 归档时间: |
|
| 查看次数: |
6532 次 |
| 最近记录: |