Итак, допустим, я пишу функцию для установки массива с использованием предоставленного пользователем обратного вызова для каждого элемента. (Я не являюсь, но давайте предположим, что я, для целей минимального примера)
Самым чистым способом, который я могу найти, является следующее:
#include <functional>
template<typename T, typename Y>
void PopulateArray(std::function<int(Y*)> callback, T &pArray)
{
for (int i = 0; i < sizeof(pArray); ++i)
int x = callback(&pArray[i]);
}
int main()
{
uint64_t myArray[5];
uint64_t myUint = 42;
PopulateArray( (std::function<int(uint64_t*)>) [=](auto x) {*x = myUint; return 0; },
myArray);
}
У меня есть две проблемы с кодом выше.
1) Для T
, чтобы быть типом массива, кажется, нет никакого способа изменить параметр. (Я не могу сказать, что мне нужен массив типа T
, то есть я должен объявить Y
отдельно, даже если они оба связаны с uint64_t
.) Я бы предпочел объявить single T
, один из которых является указателем на T
, а другой - массивом T
.
2) Код клиента (в основном) принудительно приводит к лямбде. Изменение auto x
на явный тип, похоже, не помогает.
Существует ли разрешение на № 1 или № 2, которое может сделать код более лаконичным или читабельным?
Код необходимо будет компилировать с помощью gcc, clang и VS. Я думаю, что C ++ 11 - это новейший стандарт, который я могу использовать, хотя я был бы заинтересован в решениях C ++ 14, так как это было бы вопросом обновления нашего процесса сборки clang. Меня не интересуют решения, включающие переключение myArray на std::array
std::vector
и т. Д.