1

我有以下结构:

template <typename T> struct avl_tree {
    T data;
    int balance;
    struct avl_tree <T> *Link[2];
    int (*comp)(T, T);
};

我想做的是comp在运行时将函数指针指向一个有效的函数,然后让所有实例都struct avl_tree<T>能够访问这个函数。

int compare(int a, int b) {
    return ( a - b );
}

是否可以这样做,以便我可以执行以下操作:

avl_tree<int> tree(new avl_tree<int>);
tree = insert(tree, 9);
std::cout << tree->comp(tree->data, 9) << '\n';//Should print 0

终于得到了这个问题的答案。解决方案:

在结构 avl_tree 中:

typedef int (*compare)(T, T);
static compare comp;

以上主要:

template <typename T> int (*avl_tree<T>::comp)(T, T);//Initialise the pointer

主要:

avl_tree<int>::comp = compare;//Set the static member function pointer to the function to use

针对我之前的问题,以下是如何使用它:

avl_tree<int> tree(new avl_tree<int>);
tree = insert(tree, 9);
std::cout << avl_tree<int>::comp(tree->data, 9) << '\n';//Should print 0

简单:D

4

3 回答 3

1

声明comp静态:

template <typename T> struct avl_tree {
    T data;
    int balance;
    struct avl_tree <T> *Link[2];
    static int (*comp)(T, T);
};
template <typename T> int(*::comp)(<T>, <T>);

您可以稍后将其分配给特定的模板实例:

avl_tree<int>::comp = int_compare;

有关模板类的静态成员初始化的更多信息,请参阅此 SO 问题和此外部站点。

于 2013-09-03T20:32:22.927 回答
1

我有一些难以理解你的问题,但我想你为什么不简单地做这样的事情:

template <typename T> struct avl_tree {
    T data;
    int balance;
    struct avl_tree <T> *Link[2];
    int comp(T x) { return compare(data, x);}
};

并确保您的 T 结构或类型具有转换为 int 的方法。

于 2013-09-03T20:05:36.130 回答
0

Do like following

avl_tree<int> *tree =new avl_tree<int>;

tree->comp =compare; //Your function
std::cout << tree->comp(tree->data, 9) << '\n';

See here

于 2013-09-03T19:52:06.627 回答