Функция C++ как параметр, где ее параметр можно передать по значению или по ссылке.C++

Программы на C++. Форум разработчиков
Ответить Пред. темаСлед. тема
Anonymous
 Функция C++ как параметр, где ее параметр можно передать по значению или по ссылке.

Сообщение Anonymous »

У меня есть следующие функции, гдеprocessArray — это универсальная функция, используемая для обработки массива. В качестве параметра ему передается функция, чтобы каждый элемент также мог быть обработан.
template
size_t processArray(const TItem* value, const size_t length, size_t (*processItem)(const TItem)) {
size_t output = length;

for (auto i = 0; i < length; ++i) {
output += processItem(value);
}

return output;
}

size_t processInt(const int value) {
return value;
}

size_t processString(const std::string& value) {
return value.length();
}

Затем я хочу обработать массив int и std::string, но сталкиваюсь с ошибкой компиляции (потому что (*processItem)(const TItem) не принимает параметр ссылочного типа).
// Int
const int intArray[2] { 1, 2 };
const auto intArrayResult = processArray(intArray, 2, processInt); // OK

// String
const std::string strArray[2] { "123", "456" };
const auto strArrayResult = processArray(strArray, 2, processString); // Error: No matching function for call to 'processArray'

Однако, если я изменю объявление параметраprocessItem на size_t (*processItem)(const TItem&) - заставлю его принять ссылочный тип, тогда я невозможно передать процессInt.
const int intArray[2] { 1, 2 };
const auto intArrayResult = processArray(intArray, 2, processInt); // Error: No matching function for call to 'processArray'

// String
const std::string strArray[2] { "123", "456" };
const auto strArrayResult = processArray(strArray, 2, processString); // OK

Итак, кто-нибудь знает, как можно написать ProcessArray, чтобы функция объявлялась только один раз и могла принимать ProcessItem, который может обрабатывать как значения, так и ссылочные типы ? Или нет способа это сделать?
// NG function declaration is repeated

template
size_t processArray(const TItem* value, const size_t length, size_t (*processItem)(const TItem));

template
size_t processArray(const TItem* value, const size_t length, size_t (*processItem)(const TItem&));


Подробнее здесь: https://stackoverflow.com/questions/785 ... -or-by-ref
Реклама
Ответить Пред. темаСлед. тема

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

  • Похожие темы
    Ответы
    Просмотры
    Последнее сообщение

Вернуться в «C++»