在与Qt相关的代码中,我尝试通过以下方法来减少一些重复的行:
QPainter createPainter(const QColor& color)
{
QPainter painter(&m_image);
painter.setBrush(color);
painter.setPen(color);
return painter;
}
但是
QPainter
的副本ctor被显式删除。它在c++ 11中应该不是问题,但可悲的是它都不是可移动的。是任何原因还是仅仅是API缺陷?它是
createPainter
的好解决方案(提供move-ctor除外)吗?unique_ptr
返回到QPainter
,但是它将为堆分配带来开销。 感谢您的回复!
最佳答案
一种技巧是通过常量引用返回:
选项1:
QPainter createPainter(const QColor& color) //definitely return by value
{
QPointer painter(&m_image);
painter.setBrush(color);
painter.setPen(color);
return painter;
}
然后这样做:
const QPainter& painter = createPainter(const QColor& color);
根据C++标准,这保证不会发生复制,但是返回值的寿命将延长。
选项2:
用户共享或唯一的指针。我知道您说过他们有开销,但是假设您没有在开发游戏引擎并且这是主要的管道,那没什么(我确定您没有在这种游戏引擎中使用Qt)。
选项3:
如果这些都不会让您感到高兴,那么我会建议您讨厌的解决方案,仅仅是为了完整性。使用宏!
#define CreatePainter(painter_name) \
QPointer painter_name(&m_image); \
painter_name.setBrush(color); \
painter_name.setPen(color);
要使用它:
CreatePainter(painter);
painter.begin();
//...
编辑:
选项4 :
我刚刚得知(由于Quentin)这是合法的:
QPainter createPainter(const QColor& color) //definitely return by value
{
QPointer painter(&m_image);
painter.setBrush(color);
painter.setPen(color);
return painter;
}
然后这样:
QPainter&& painter = createPainter(const QColor& color);
检查引用here。这是一种新的C++ 11解决方案,可以延长对象的使用寿命而不使其成为常量。
关于c++ - 如何转让QPainter? (从工厂功能中 move 对象),我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/46049452/