所以,我有这个项目,我必须重新创建最基本的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个吸气剂中的一个,具体取决于具体情况。
答案 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::foo
和A::bar
都满足CallA
第二个参数中的函数签名,因此您可以同时调用它们:
A a;
CallA(&a, &A::foo);
CallA(&a, &A::bar);