我有两个功能很多的课程(这些功能不能是静态的')。 我想通过模板函数每次调用另一个函数。 我曾尝试编写模板函数,但我不知道如何使用我想要的类函数调用模板函数。 我附上了一个简单的问题代码:
class FirstClass
{
public:
FirstClass()
{
int y = 7;
y++;
}
void FirstFunction(int x)
{
x++;
}
};
class SecondClass
{
public:
SecondClass()
{
int y = 7;
y++;
}
void SecondFunction(int y)
{
y--;
}
void ThirdFunction(int y)
{
y--;
}
};
template<class OBJECT, void (*FUNCTION)>
void Test(int x)
{
OBJECT *a = new OBJECT();
a->FUNCTION();
delete a;
}
void main()
{
Test<FirstClass, &FirstClass.FirstFunction>(5);
Test<SecondClass, &SecondClass.SecondFunction>(5);
Test<SecondClass, &SecondClass.ThirdFunction>(5);
}
...谢谢
答案 0 :(得分:3)
C ++编译器特别擅长推断类型。而不是直接指定要调用的成员函数的类型,为什么不让编译器为您执行此操作呢?
template <typename T>
void Test(void (T::*f)(int), int x)
{
auto a = new T;
(a->*f)(x);
delete a;
}
请注意奇怪的T::*
语法。它说f
是指向成员函数的指针,它返回void
并取int
。类f
是T
的成员,将由编译器推导出来。要实际调用该函数,您需要使用(甚至更奇怪的)->*
语法。请注意,由于必须在对象上调用成员函数,因此需要创建T
。
但它不必动态分配。你也可以写:
template <typename T>
void Test(void (T::*f)(int), int x)
{
T a;
(a.*f)(x);
}
你可以这样调用函数Test
:
Test(&FirstClass::FirstFunction, 42);