大家好,我正在创建一个List类,以便能够像在python中一样操作数据,但是在c ++中.我想出了一个主意.基本上是一个遍历每个节点的方法,如果它满足特定条件,则删除它.但是我希望这个条件由库的用户决定,所以我实现了一个指向bool函数的指针,它将一个模板数据(与List相同的类型)作为唯一的参数.
到目前为止,我设法运行这个......
int delIf(bool (*)(T));
templateint List ::delIf(bool (*ptr)(T)){ int tot=0; T aux; for (int i=0;i del(i); } } return tot; }
#include#include "lists.cpp" using namespace std; bool check(int); int main() { List a; for (int i=0;i<10;i++) a.push(i); a.delIf(&check); return 0; } bool check(int a){ if (a%2==0) return true; else return false; }
这工作正常,但是,我想知道是否可能重载delIf方法,以便它不需要指向函数的指针作为参数,而是对它的引用,因此库的用户可以调用:
delIf(check); //No '&' required
而不是
delIf( & check);
目前这是强制性的.我已经尝试将原型更改为:
int delIf( (bool (*)(T)) & );
但我一直都有错误.
在此先感谢大家.
你的前提是假的.您不需要&
在函数前面传递它delIf
.函数的名称几乎在表达式中使用的任何位置衰减为指向函数的指针.(包括当你调用函数时!)事实上,它唯一没有的地方就是当它被用作参数时&
- 所以
func &func
具有完全相同的类型和价值.
话虽如此,是的,你可以通过参考.函数指针的第一条规则 - 写一个typedef
typedef bool pred_t(T); void delIf( pred_t& pred );
但!我强烈建议您编写delIf
一个函数模板,并允许任何可以使用a调用T
的函数,并且函数结果可以隐式转换为bool
.
templatevoid delIf(Pred pred) { ... }
这将允许用于捕获lambda和一般的仿函数.
此外,您所说的CPP文件是什么?模板必须在头文件中实现.查看此问题的答案.
(注意:"Pred"是"谓词"的缩写,这是标准所称的这种功能.)