通过模板函数调用类函数

时间:2014-03-12 20:29:58

标签: c++ templates

我有两个功能很多的课程(这些功能不能是静态的')。 我想通过模板函数每次调用另一个函数。 我曾尝试编写模板函数,但我不知道如何使用我想要的类函数调用模板函数。 我附上了一个简单的问题代码:

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

...谢谢

1 个答案:

答案 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。类fT的成员,将由编译器推导出来。要实际调用该函数,您需要使用(甚至更奇怪的)->*语法。请注意,由于必须在对象上调用成员函数,因此需要创建T

但它不必动态分配。你也可以写:

template <typename T>
void Test(void (T::*f)(int), int x)
{
    T a;
    (a.*f)(x);
}

你可以这样调用函数Test

Test(&FirstClass::FirstFunction, 42);