Могу ли я составить таблицу из String + lambdas с одинаковой подписью? - PullRequest
2 голосов
/ 08 ноября 2011

У меня есть такой шаблон:

Thing * y = FindNearestItem();
if (y && (MenuElement * x = FindMenuElementNamed("Identity")))
  x->SetText(FString("%.1f", y));
else if (x)
  x->Clear();
if (y && (MenuElement * x = FindMenuElementNamed("X1")))
  x->SetLocalData(y);
else if (x)
  x->Clear();

По сути, я хочу использовать статическую таблицу: [ПРЕДУПРЕЖДЕНИЕ: действительно небрежный концептуальный код, недействительный, я нуб, вас предупредили]:

struct Table {
  const char * label;
  ?lambda? lambda;
} MyTable[] = {
  "Identity", [] (const char * label, Thing * y) { MenuElement * x = FindMenuElementNamed(label); (y && x) ? x->SetText(FString("%.1f", y)) : x->Clear(); },
  "X1", [] (const char * label, Thing * y) { MenuElement * x = FindMenuElementNamed(label); (y && x) ? x->SetLocalData(y) : x->Clear(); },
};

Thing * y = FindNearestItem();
for (int i = 0; i != countof(MyTable); ++i)
  MyTable[i].lambda(MyTable[i].label, y);

ПОЖАЛУЙСТА, имейте в виду, что действие отличается для каждой метки - для каждой строки в моей таблице.

Таким образом, шаблон в основном такой же, но разница в действиивзят, хотя он использует один и тот же набор данных (x, y, метка) в каждом случае.Но я не могу просто вызвать x-> DoAppresponThingFor (label, y);Я просто вернусь к созданию длинного каскада if / else на основе метки ...

Не стесняйтесь спрашивать меня о дальнейших разъяснениях.Я брожу в темноте с лямбдами, потому что у меня еще не было возможности их реально использовать ...

1 Ответ

5 голосов
/ 08 ноября 2011

Пока все лямбды не записываются (т. Е. [] пусто), вы можете использовать указатель функции:

struct Table {
    const char* label;
    void (*lambda)(const char*, Thing*);
};

Если любая из лямбд находится в состоянии (т. Е.[] не пусто), тогда вы не можете использовать указатель на функцию.Вы можете использовать std::function, хотя:

struct Table {
    const char* label;
    std::function<void(const char*, Thing*)> lambda;
};

Visual C ++ 2010 не поддерживает преобразование лямбда-в-функцию-указатель (это преобразование было добавлено в язык после выпуска Visual C ++ 2010), ноVisual C ++ 11 Developer Preview поддерживает преобразование.Если вы используете Visual C ++ 2010, вы можете использовать решение std::function.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...