我可以使用来自不同类的函数参数创建一个高阶函数吗?
Can I Create a Higher Order Function With Funciton Parameters from Different Classes?
所以,我有这个项目,我必须重新创建最基本的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::foo
和A::bar
都满足CallA
第二个参数中的函数签名,你可以同时调用它们:
A a;
CallA(&a, &A::foo);
CallA(&a, &A::bar);
相关文章:
- 函数向量_指针有不同的原型,我可以构建一个吗
- 为什么在没有显式默认构造函数的情况下,将另一个结构封装在联合中作为成员的结构不能编译
- 创建一个函数以在输入为负数或零时输出字符串.第一次执行用户定义的函数
- 基于另一个成员参数将函数调用从类传递给它的一个成员
- 如何仅为一个函数添加延迟
- 构造函数正在调用一个使用当前类类型的函数
- C++-试图将函数指针推回到另一个CPP文件中的矢量时出错
- 有一个打印语句的函数是一种糟糕的编程实践吗
- 有没有什么方法可以使用一个函数中定义的常量变量,也可以由c++中同一程序中的其他函数使用
- 输入到文件并输出到另一个文件,并将流文件传递给函数
- 我不明白为什么我声明一个空的内部结构并将其传递给构造函数
- 如何创建函数管道,以便函数一个接一个地运行?
- 如何巧妙地编写两个函数——一个用于检查是否存在解决方案,另一个用于获取所有解决方案
- 在c++中的复制构造函数/一个声明语句中的初始化的延续中使用chain方法
- C :基类调用自己的虚拟函数 - 一个反图案
- 如何在这个交换函数(一个单独的链表)中找到错误
- 两个相同的函数(一个使用模板模式,另一个不使用)
- 你怎么能一次给一个函数一个参数呢
- 为什么要做两个函数?(一个是非const,另一个是const)
- 当代码在其他地方使用时,如何保证函数一个接一个地被调用