在与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除外)吗?
  • 它可以接受QPainter引用,但这会降低方法的含义,并给调用者的代码增加噪音。
  • 可以将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/

    10-13 03:58