引用函数指针
Function Pointers by Reference
大家好,我正在创建一个列表 class 以便能够像在 python 中那样操作数据,但在 C++ 中。
我想出了一个主意。基本上是一种遍历每个节点并在满足特定条件时将其删除的方法。但我希望该条件由库的用户确定,因此我实现了一个指向 bool 函数的指针,该函数将一个模板数据(与列表相同的类型)作为其唯一参数。
到目前为止,我设法 运行 这个...
.h 文件:
int delIf(bool (*)(T));
.cpp 文件:
template <typename T>
int List<T>::delIf(bool (*ptr)(T)){
int tot=0;
T aux;
for (int i=0;i<tam;i++)
{
aux=(*this)[i]; //Ive overloaded the [], and it works fine
if ((*ptr)(aux))
{
tot++;
this->del(i);
}
}
return tot;
}
main.cpp:
#include <iostream>
#include "lists.cpp"
using namespace std;
bool check(int);
int main()
{
List<int> 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
编写为函数模板,并允许任何可以使用 T
调用的函数,并且函数结果可以隐式转换为 bool
.
template <typename Pred>
void delIf(Pred pred) {
...
}
这将允许用于捕获 lambda 和一般的仿函数。
另外,你说的这个CPP文件是什么?模板必须在头文件中实现。查看 this question.
的答案
(注意:"Pred" 是 "predicate" 的缩写,这是标准对此类函数的称呼。)
大家好,我正在创建一个列表 class 以便能够像在 python 中那样操作数据,但在 C++ 中。 我想出了一个主意。基本上是一种遍历每个节点并在满足特定条件时将其删除的方法。但我希望该条件由库的用户确定,因此我实现了一个指向 bool 函数的指针,该函数将一个模板数据(与列表相同的类型)作为其唯一参数。
到目前为止,我设法 运行 这个...
.h 文件:
int delIf(bool (*)(T));
.cpp 文件:
template <typename T>
int List<T>::delIf(bool (*ptr)(T)){
int tot=0;
T aux;
for (int i=0;i<tam;i++)
{
aux=(*this)[i]; //Ive overloaded the [], and it works fine
if ((*ptr)(aux))
{
tot++;
this->del(i);
}
}
return tot;
}
main.cpp:
#include <iostream>
#include "lists.cpp"
using namespace std;
bool check(int);
int main()
{
List<int> 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
编写为函数模板,并允许任何可以使用 T
调用的函数,并且函数结果可以隐式转换为 bool
.
template <typename Pred>
void delIf(Pred pred) {
...
}
这将允许用于捕获 lambda 和一般的仿函数。
另外,你说的这个CPP文件是什么?模板必须在头文件中实现。查看 this question.
的答案(注意:"Pred" 是 "predicate" 的缩写,这是标准对此类函数的称呼。)