C++, выполнять функцию на каждом члене массива
У меня есть вопрос, касающийся C++ и массивов.
скажем, у меня есть класс, который называется CustomArray, и это не что иное, как универсальный массив, который имеет атрибуты для размера и емкости, чтобы сделать массив динамическим. определяется как:
template<typename T>
class CustomArray
{
public:
int capacity, size;
T* items;
//constructor
//destructor
//function1
//function2
//etc...
};
теперь я немного застрял, я хочу реализовать такую функцию, как:"
void performOnAllItems(/*function?*/)
{
for(int i = 0; i < size; i++)
{
//perform function on element
}
}
это берет другую функцию как параметр (если это возможно?) и выполняет это на всех элементах. это возможно? и если так... как?
заранее спасибо.
3 ответа
Добавить участников begin
а также end
вот так:
T *begin() { return items; }
T *end() { return items + size; }
Создать функтор, производный от std::unary_function
,
Например
template <typename T>
class MyFunc : std::unary_function<T, void> {
public:
void operator()(T& t) {
// ...
}
};
Тогда позвони std::foreach(foo.begin(), foo.end(), MyFunc);
Обновить
В C++11 вы можете использовать лямбду для foreach:
std::foreach(foo.begin(), foo.end(),
[/* (1) */](T& t) { /* ... */ }
);
Если (1)
не пусто, тогда лямбда - это закрытие; это известно как захват лямбды, и Visual C++ 10 лямбда-выражений является хорошим примером этого.
template<class functionptr>
void performOnAllItems(functionptr ptr)
{
for(int i = 0; i < size; i++)
ptr(items[i]);
}
или же
typedef void (*functionptr)(T&);
void performOnAllItems(functionptr ptr)
{
for(int i = 0; i < size; i++)
ptr(items[i]);
}
Второй сильно ограничивает, какие функции можно использовать, а первый - нет.
Конечно. Вы просто должны изменить performOnAllItems
взять указатель на функцию, которая возвращает void
и принимает в качестве параметра либо T
или указатель на T
(согласно моему решению ниже), который вызывает указатель этой функции для каждого элемента в списке.
template <typename T>
void CustomArray::performOnAllItems(void (*action)(T*))
{
for(int i = 0; i < size; i++)
{
action(items + i);
}
}