【问题标题】:c++, perform function on every array memberc++,对每个数组成员执行函数
【发布时间】:2011-12-30 19:47:26
【问题描述】:

我有一个关于 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
    }
}

将另一个函数作为参数(如果可能的话?)并在所有元素上执行它。那可能吗?如果是的话……怎么办?

提前致谢。

【问题讨论】:

  • 你真的想要标签中的“c”吗? C++ 和 C 的答案将大不相同。
  • C 没有模板。 OP 显然是在要求 C++ 的答案。
  • 更喜欢使用std::vector,因为它已经支持begin(), end()迭代器

标签: c++ arrays delegates function-pointers


【解决方案1】:

像这样添加成员beginend

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 使用 lambda:

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

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

【讨论】:

  • 我觉得他的问题是函数的参数类型应该是什么
  • 编辑添加 std::unary_function 示例
【解决方案2】:

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

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

【讨论】:

  • 啊,你在我的代码中发现了一个不同的错误。让我帮你编辑一下。
【解决方案3】:
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]);
}

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

【讨论】:

  • 我要补充一点,正如所写,Mooing 的第一个函数也应该与仿函数一起使用(参见here
猜你喜欢
  • 1970-01-01
  • 2015-12-14
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-02-15
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多