我可以使用来自不同类的函数参数创建一个高阶函数吗?

Can I Create a Higher Order Function With Funciton Parameters from Different Classes?

本文关键字:函数 一个 高阶 创建 参数 可以使 同类 我可以      更新时间:2023-10-16

所以,我有这个项目,我必须重新创建最基本的MySQL函数,在歌曲数据库上运行(在一个类中表示)。

我创建了另一个类,它是我的界面(用户界面)。我用它来获取命令、识别参数等。我想创建一个高阶函数,它需要几个参数。其中一些将是原始数据类型,但也将有两个函数作为参数。

现在,其中一个函数来自同一个类(接口),但另一个函数来自 Songs 类。问题是我无法弄清楚如何在该类中引用函数?

我正在考虑使类成为静态的,因为无论如何您只能创建一个类型为 Songs 的数据库。这很可能会让我有可能使用 Songs:: 参考,但我不确定这是否会解决我的问题。

除了解决方案之外,我还要求对C++中的高阶函数进行更详细的解释,我似乎找不到好的资源。我找到的所有资源都没有提到从其他类获取函数参数的高阶函数。

class Song
{
public:
    string getName() const;
    string getSinger() const;
    unsigned int getLength();
    unsigned short getYear() const;
private:
    char singer[51];
    char name[51];
    unsigned int length;
    unsigned short year;
};

然后在界面中:

bool isEqual(string, string);
template<typename T>
bool isSmaller(T firstElement, T secondElement);
template<typename T>
bool isGreater(T firstElement, T secondElement);

我想创建一个高阶函数来检查比较器函数的值。但是,比较器必须采用的值之一必须来自 Songs 对象。换句话说,根据情况,我还必须通过 4 个 getter 中的一个。

你想要使用成员函数指针。下面是一个通用高阶函数的简单示例:

template <typename T, typename Func>
void Call(T* obj,  Func T::* memFuncPtr)
{
 (obj->*memFuncPtr)();
}

Call接受泛型对象指针和指向该对象类的成员函数的指针,并简单地调用该函数。例如

class A
{
public:
 void foo()
 {
   cout<<"A::foo() calledn";
 }
 void bar()
 {
   cout<<"A::bar() calledn";
 }
};
int main()
{
 A a;
 Call(&a, &A::foo);
 return 0;
}

除了成员函数指针之外,Boost.FunctionTypes 库还为您提供了函数签名的句柄。这些技术应该是一个很好的起点。

请注意,如果您不想使用模板,可以通过指定对象类型和成员函数签名来写出非泛型定义。

void CallA(A* obj,  void (A::*)() memFuncPtrOfA)
{
 (obj->*memFuncPtr)();
}

由于A::fooA::bar都满足CallA第二个参数中的函数签名,你可以同时调用它们:

A a;
CallA(&a, &A::foo);
CallA(&a, &A::bar);
相关文章: