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

时间:2014-12-26 23:14:27

标签: c++ class oop higher-order-functions

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

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

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

我正在考虑让这个类保持静态,因为你只能创建一个类型为Songs的数据库。这很可能会让我有可能使用Songs :: reference,但我不确定这是否可以解决我的问题。

除了解决方案之外,我还要求对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个吸气剂中的一个,具体取决于具体情况。

1 个答案:

答案 0 :(得分:2)

您想使用member function pointers。这是一个通用高阶函数的简单例子:

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

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

class A
{
public:
 void foo()
 {
   cout<<"A::foo() called\n";
 }

 void bar()
 {
   cout<<"A::bar() called\n";
 }
};

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);