У меня есть следующие функции, где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
Функция C++ как параметр, где ее параметр можно передать по значению или по ссылке. ⇐ C++
Программы на C++. Форум разработчиков
1716990845
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[i]);
}
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&));
Подробнее здесь: [url]https://stackoverflow.com/questions/78549596/c-function-as-a-parameter-where-its-parameter-can-be-passed-by-value-or-by-ref[/url]
Ответить
1 сообщение
• Страница 1 из 1
Перейти
- Кемерово-IT
- ↳ Javascript
- ↳ C#
- ↳ JAVA
- ↳ Elasticsearch aggregation
- ↳ Python
- ↳ Php
- ↳ Android
- ↳ Html
- ↳ Jquery
- ↳ C++
- ↳ IOS
- ↳ CSS
- ↳ Excel
- ↳ Linux
- ↳ Apache
- ↳ MySql
- Детский мир
- Для души
- ↳ Музыкальные инструменты даром
- ↳ Печатная продукция даром
- Внешняя красота и здоровье
- ↳ Одежда и обувь для взрослых даром
- ↳ Товары для здоровья
- ↳ Физкультура и спорт
- Техника - даром!
- ↳ Автомобилистам
- ↳ Компьютерная техника
- ↳ Плиты: газовые и электрические
- ↳ Холодильники
- ↳ Стиральные машины
- ↳ Телевизоры
- ↳ Телефоны, смартфоны, плашеты
- ↳ Швейные машинки
- ↳ Прочая электроника и техника
- ↳ Фототехника
- Ремонт и интерьер
- ↳ Стройматериалы, инструмент
- ↳ Мебель и предметы интерьера даром
- ↳ Cантехника
- Другие темы
- ↳ Разное даром
- ↳ Давай меняться!
- ↳ Отдам\возьму за копеечку
- ↳ Работа и подработка в Кемерове
- ↳ Давай с тобой поговорим...
Мобильная версия