Я использую много макросов, которые реализуют общие операции цикла. Например:
#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 (недоступно мне)? Чтобы я мог напрямую присваивать результат переменной или использовать результат в качестве параметра для функции?
Вставить оператор в выражение:
Вы можете использовать выражение оператора GCC
Вы можете использовать Clang Block
В С++ 03 вы можете взять статический член анонимной структуры в выражении (или, по крайней мере, g++ не жалуется):
foo(
((struct { static void f() { return; } }){}).f
);
(так что макрос поместил бы код цикла в тело f
)
Невозможно сделать это в стандартном C, любой версии (за исключением Greenspunning). Стандарт явно запрещает использование setjmp
в запятых-выражениях, что в противном случае является первым, что вы, вероятно, рассмотрите.
idx = std::find(arr, arr + size, 13) - arr;
Оберните это в шаблонную функцию, если хотите.