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);
    }
}
Другие вопросы по тегам