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 に答える