c ++,对每个数组成员执行函数

时间:2011-11-16 21:16:52

标签: c++ arrays delegates function-pointers

我有一个关于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 个答案:

答案 0 :(得分:9)

像这样添加成员beginend

T *begin() { return items; }

T *end() { return items + size; }

创建一个派生自std::unary_function

的仿函数

E.g。

template <typename T>
class MyFunc : std::unary_function<T, void> {
public:
    void operator()(T& t) {
    // ...
    }
};

然后拨打std::foreach(foo.begin(), foo.end(), MyFunc);

<强>更新

在C ++ 11中,你可以使用lambda作为foreach:

std::foreach(foo.begin(), foo.end(),
              [/* (1) */](T& t) { /* ... */ }
            ); 

如果(1)不为空,则lambda是一个闭包;这被称为捕获lambda,Visual C++ 10 Lambda Expressions提供了一个很好的例子。

答案 1 :(得分:6)

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]);
}

第二个极大地限制了可以使用哪些功能,但第一个没有。

答案 2 :(得分:1)

不确定。您只需要修改performOnAllItems以获取一个函数指针,该指针返回void并将T或指向T的参数作为参数(根据我的解决方案),为列表中的每个项调用该函数指针。

template <typename T>
void CustomArray::performOnAllItems(void (*action)(T*))
{
    for(int i = 0; i < size; i++)
    {
        action(items + i);
    }
}