我有一个关于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
}
}
将另一个函数作为参数(如果可能的话?)并在所有元素上执行它。那可能吗?如果是的话......怎么样?
提前感谢。
答案 0 :(得分:9)
像这样添加成员begin
和end
:
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);
}
}