【问题标题】:Can I Create a Higher Order Function With Funciton Parameters from Different Classes?我可以使用来自不同类的函数参数创建高阶函数吗?
【发布时间】:2014-12-26 23:14:26
【问题描述】:

所以,我有这个项目,我必须在其中重新创建最基本的 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 中的一个,视情况而定。

【问题讨论】:

  • 也许您现有代码的示例会有所帮助。

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


【解决方案1】:

您想使用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);

【讨论】:

  • 顺便说一句,您的第一个模板示例在 obj->(*memFuncPtr)(); 上给了我一个错误。行 - 之前的不合格 ID(令牌
  • 最后一件事大声笑...我认为您在特定于类的 (CallA) 版本上也犯了一个错误。而不是: (A* obj, void (A::*)() memFuncPtrOfA) 参数列表应该是: (A* obj, void (A::*memFuncPtrOfA)()) 以及函数本身的调用
  • 完全没问题。 HTH。
猜你喜欢
  • 2020-12-31
  • 1970-01-01
  • 2021-12-30
  • 2022-11-18
  • 2019-09-22
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多