Макрос, включающий цикл как выражение?

0

Я использую много макросов, которые реализуют общие операции цикла. Например:

#define findIdx(count, cond, out) out = count; for (int i = 0; i < count; i++)  \
                                                  if (cond) out= i;

используется как:

int arr[5] = {1, 12, 13, 19, 21};
int idx;
findIdx(5, arr[i] == 13, idx); //idx is set to 2

Есть ли умный способ реализовать эту функциональность в качестве выражения, не жертвуя удобством и без использования С++ 11 (недоступно мне)? Чтобы я мог напрямую присваивать результат переменной или использовать результат в качестве параметра для функции?

  • 0
    Вы можете заменить это на idx = std::find(arr, arr + size, 13) - arr; Оберните это в шаблонную функцию, если хотите.
  • 2
    По какой причине вы должны придерживаться макроса вместо использования встроенной функции?
Показать ещё 4 комментария
Теги:
macros

1 ответ

0

Вставить оператор в выражение:

  • Вы можете использовать выражение оператора GCC

  • Вы можете использовать Clang Block

  • В С++ 03 вы можете взять статический член анонимной структуры в выражении (или, по крайней мере, g++ не жалуется):

    foo(
        ((struct { static void f() { return; } }){}).f
    );
    

    (так что макрос поместил бы код цикла в тело f)

Невозможно сделать это в стандартном C, любой версии (за исключением Greenspunning). Стандарт явно запрещает использование setjmp в запятых-выражениях, что в противном случае является первым, что вы, вероятно, рассмотрите.

  • 1
    Я не думаю, что это делает вещи лучше.
  • 0
    Интересно. К сожалению, предложение c ++ 03 не работает в VS2008.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню