C ++将平凡可构造的结构隐式转换为成员

时间:2019-01-24 23:52:55

标签: c++ struct gdi implicit-conversion

我觉得它不太可能,但是我想看看一个函数是否可以从一个简单包装的结构中推断出它的参数。例如:

struct wrapped_float
{
  float f;

  wrapped_float(float f) : f(f) {}
};

float saxpy(float a, float x, float y)
{
  return a * x + y;
}

int main()
{
  wrapped_float a = 1.1, x = 2.2, y = 3.3;

  auto result = saxpy(a, x, y); // ofc compile error
}

其背后的动机是使用设备上下文句柄(HDC)围绕GDI调用进行轻量级包装。有很多使用HDC的遗留代码,我想逐步重构许多代码。我的策略是像这样围绕HDC制作轻量级包装:

#include <Windows.h>

struct graphics
{
  HDC dc;

  graphics(HDC dc) : dc(dc) {}

  void rectangle(int x, int y, int w, int h)
  {
    Rectangle(dc, x, y, x + w, y + h);
  }
};

void OnPaint(HDC dc)
{
  Rectangle(dc, 1, 2, 3, 4);
}

int main()
{
  HDC dc;
  // setup dc here
  graphics g = dc;

  OnPaint(g);
}

因此,如果可以将g隐式转换为HDC,则所有旧代码通常都可以编译,但是我可以缓慢地将代码重构为:

void OnPaint(graphics g)
{
  g.rectangle(1, 2, 3, 4);
}

也欢迎任何建议,因为这在C ++(或任何编程语言)中根本不可能实现。

1 个答案:

答案 0 :(得分:1)

从注释中,我不知道C ++具有转换运算符。简单的解决方案是添加:

struct graphics
{
  HDC dc;

  graphics(HDC dc) : dc(dc) {}

  void rectangle(int x, int y, int w, int h)
  {
    Rectangle(dc, x, y, x + w, y + h);
  }

  operator HDC()
  {
    return dc;
  }
};