c ++类函数作为另一个类函数的参数

时间:2016-05-26 03:49:08

标签: c++ function class templates methods

我试图将一个类的模板化成员函数作为另一个类的模板化成员函数的参数传递。我已经看过几个使用函数指针的例子,但我试图直接传递这个函数参数。

template <class Item> 
class MinHeap

我有功能

tempmlate <class Item>
template <class Process>
void inorder (Process f, const int index)
{
    if (index < size())
    {
        inorder(f, index*2 +1);
        f(data[index]);
        inorder(f, index*2 +2);
    }
}

并在

template<item>
class sequ

我有一个名为

的功能
void insert(const Item& x);

我正在尝试在main中执行此操作:

MinHeap<int>* tree = new MinHeap<int>();
//insert some stuff
sequ<int>* s = new sequ<int>();
tree->inorder(s->insert);

但是最后一行给出了错误:

error: reference to non-static member function must be called
tree->inorder(s->insert);

当我用函数替换s-&gt; insert时,打印

void print(int x)
{
    printf("%d\n", x);
}

它工作正常。

如何使用成员函数作为参数?

1 个答案:

答案 0 :(得分:1)

&sequ<int>::insert为您提供指向insert类的成员函数sequ<int>的指针。但是,要调用成员函数,还需要该类的实例。换句话说,您无法在f(data[index]);函数中执行inorder,因为您需要一个对象实例来调用f成员函数。

示例代码

#include <iostream>
#include <string>
#include <vector>

template<typename T>
class Bar
{
public:
    void barFn(const std::string& data) { std::cout << "Bar<T>::barFn: " << data << "\n"; }
};

template<typename T>
class Foo
{
public:
    Foo() : mData{ "Hello World" } {}

    template<typename C, typename F>
    void fooFn(C* instance, F memFn, size_t n)
    {
        (instance->*memFn)(mData[n]);
    }

private:
    std::vector<std::string> mData;
};

int main()
{
    Bar<int> bar;
    Foo<int> foo;
    foo.fooFn(&bar, &Bar<int>::barFn, 0);

    return 0;
}

示例输出

Bar<T>::barFn: Hello World

Live Example