У меня есть следующие функции, где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++
-
- Похожие темы
- Ответы
- Просмотры
- Последнее сообщение
-
-
Зачем передавать по ссылке rvalue (&&) вместо передачи по ссылке (&)? [дубликат]
Anonymous » » в форуме C++ - 0 Ответы
- 26 Просмотры
-
Последнее сообщение Anonymous
-