【发布时间】:2012-04-15 15:55:54
【问题描述】:
在网上我找到了一些关于函数对象(被调用者)的示例,但它们没有演示如何将它们用作回调函数(调用它们,调用者)的参数,而只是使用 sort 时的使用方式或 for_each。因此,我自己做了一个:
class CBase
{
public:
virtual int operator()(int a, int b)
{
return 10;
}
};
class CSmaller: public CBase
{
public:
int operator()(int a, int b)
{
return a < b;
}
int Compute(int a, int b)
{
return a < b;
}
};
class CLarger: public CBase
{
public:
int operator()(int a, int b)
{
return a > b;
}
int Compute(int a, int b)
{
return a > b;
}
};
int caller(CBase &f, int x0, int x1)
{
return f(x0,x1);
}
int main()
{
CLarger callee1; /*this callee is being called by caller*/
CSmaller callee2; /*idem*/
int q=caller(callee1,0,1);
int z=caller(callee2,0,1);
printf("%d\n",q);
printf("%d\n",z);
}
那些 STL 函数对象(如更大的 Less)是否以这种方式实现(因为它通常只在一个通用名称/类“模板”之前)?即,它们(CLarger 和 CSmaller)是否有一个关系/公共锚点,每个类都扩展了一个虚函数,或者它们也可以是一些通用函数对象(只要它们用两个参数实现 () 运算符)?像这样(虽然没有测试):
template<class F>
float integrate(const F &f,float x0,float x1)
{
..f(x)..;
}
float derive(const F &f,float x0,float x1)
{
..f(x)..;
}
class CSquare
{
public:
float operator()(float x)
{
return x*x;
}
};
class CTwoX
{
public:
float operator()(float x)
{
return 2*x;
}
};
如果这是正确的方式,这些不相关的类将如何以非 STL 方式实现?我知道使用模板并保持底层机制(以这种方式它们是相关的),但只有类型不同。但是否需要这样的关系(即相同的锚点)?
在函数对象中使用重载 () 仅仅是为了方便吗?因为我也可以使用 CLarger 的 Compute。例如,我还可以将那些分离的类(它们使用 virtual 来实现不同的功能)合并到一个 CCompute 类中,其中成员为 Larger 和 Smaller。顺便说一句,我想我也可以将派生和集成放在一个类中。我的问题是否有道理,或者我的想法是否与 STL 理论相矛盾?
【问题讨论】:
-
注意:STL != 标准库。
标签: c++ function object callback