C ++ неявно преобразует тривиально конструируемую структуру в член - PullRequest
0 голосов
/ 25 января 2019

Я чувствую, что это маловероятно, чем нет, но я хотел бы посмотреть, может ли функция выводить свои параметры из тривиально обернутой структуры.Например:

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
}

Мотивация заключается в том, чтобы сделать легкую оболочку вокруг вызовов GDI с помощью дескрипторов контекста устройства (HDC).Существует много унаследованного кода, который использует 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, тогда весь устаревший код будет нормально компилироваться, но я могу медленно реорганизовать код, чтобы он сталthis:

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

Любые рекомендации также приветствуются, поскольку это может быть просто невозможно в C ++ (или любом другом языке программирования).

1 Ответ

0 голосов
/ 25 января 2019

Из комментариев я не знал, что в 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;
  }
};
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...