C++ 不确定如何使用模板调用类函数

C++ 不确定如何使用模板调用类函数,c++,templates,C++,Templates,我正在使用模板制作自己的词典(不,我不能也不会使用STL中的任何内容) 我想有一个非常简单的搜索功能,但我有一个小问题 template <typename TElement> void Dictionary<TElement>::search(TElement ADT, int key) { // Abstract Data Type inf flag = 0; index = int (key % max); temp[index] = r

我正在使用模板制作自己的词典(不,我不能也不会使用STL中的任何内容)

我想有一个非常简单的搜索功能,但我有一个小问题

template <typename TElement>
void Dictionary<TElement>::search(TElement ADT, int key) {  // Abstract Data Type
    inf flag = 0;
    index =  int (key % max);
    temp[index] = root[index]; // root of the hash
    while (temp[index]->next != NULL) {
        if(temp[index]->data->key_actual_name == key) { @things happen }
    }
}

此外,如果我确实为key_actual_name使用了一个模板,那么实现将如何工作,我将如何调用该函数?

您可以从标准库函数中获得一些灵感,例如
find_if
,它有一个额外的参数用于比较

template <class InputIterator, class Predicate>
InputIterator find_if ( InputIterator first, InputIterator last, Predicate pred );

并传递不同的
pred
函数以将密钥与相应的成员进行比较。

如果我理解正确:

temp[index]->data->key_actual_name
解析为TElement的一个数据成员,它是一个int,您希望它成为一个模板。 如果是这种情况,您可以这样做:

template <template <class> class TElement, typename TKey>
struct node_type
{
    TElement<TKey> data;
    node_type *next;
};

template <template <class> class TElement, typename TKey>
class Dictionary
{
    typedef node_type<TElement, TKey> node_t;
    node_t _root;

    void search(node_t& node, const TKey& key)
    {
        TKey& thekey = node.data.key_actual_name;
        // Do some algorithm
    }
public:
    void search(const TKey& key)
    {
        search(_root, key);
    }
};

template <class T>
struct Element
{
    T key_actual_name;
};

int main(int argc, char ** argv)
{
    Dictionary<Element, int> dic1;
    dic1.search(1);

    Dictionary<Element, char> dic2;
    dic2.search('a');

    return 0;
}
模板
结构节点类型
{
远程通讯数据;
节点类型*下一步;
};
模板
类词典
{
类型定义节点\u类型节点\u t;
节点t根;
无效搜索(节点和节点、常量和键)
{
TKey&thekey=node.data.key\u实际\u名称;
//做一些算法
}
公众:
无效搜索(const TKey和key)
{
搜索(_根,键);
}
};
模板
结构元素
{
T键的实际名称;
};
int main(int argc,字符**argv)
{
字典dic1;
dic1.搜索(1);
字典dic2;
dic2.搜索(“a”);
返回0;
}

正如您所看到的,元素有一个模板参数,因此您可以将key_actual_name的类型更改为适合您的情况的任何类型,同时让搜索函数以一种通用的方式访问它(假设它具有运算符==重载)。

标记为粗鲁和无礼,但我希望有人能解释这有什么问题?如果你愿意解释而不是。。。不管@KerrekSB做了什么。请问为什么或者如何使用关键字
typedef
?我偶尔看到过这样发布
typedef
的代码,但我承认我从来都不理解它的用途。对我来说,<代码> TyPorfF存在定义一个现有类型的别名:你的代码是什么?我认为老Borland C++习惯。我甚至不明白为什么,但老师坚持。没有意识到这不是正常的。它看起来很像C,或者是非标准C++。我强烈建议不要养成这种习惯。在C++中只说结构{{}};定义类型A,不需要前缀struct,也不需要类型def,那么为什么要经历所有的麻烦呢对不起,我只是个初学者,我不懂<代码>pred(数据、键)?。我也不可能只使用某种
模板
然后
temp[index]->getFunction==key
我在哪里有getNumber或getID并使用它?+1我在写一个答案,建议查看find_if实现看看这个链接如果
pred
可以是一个比较
数据->某物
key
的函数,那么find_的实现就是。为您需要的每个比较创建一个函数,并将其传递给
搜索
。不需要模板技巧。:-)@Kalec pred是一个一元模板类,它有一个重载运算符(),带有以下签名bool operator()(T&lhs,T&rhs),它将比较lhs和rhs,并确定它们是否相等。是的,这就是我想要说的,我认为这应该可以实现,谢谢!。我会选择你的答案,一旦我尝试了这个。
temp[index]->data->key_actual_name
template <template <class> class TElement, typename TKey>
struct node_type
{
    TElement<TKey> data;
    node_type *next;
};

template <template <class> class TElement, typename TKey>
class Dictionary
{
    typedef node_type<TElement, TKey> node_t;
    node_t _root;

    void search(node_t& node, const TKey& key)
    {
        TKey& thekey = node.data.key_actual_name;
        // Do some algorithm
    }
public:
    void search(const TKey& key)
    {
        search(_root, key);
    }
};

template <class T>
struct Element
{
    T key_actual_name;
};

int main(int argc, char ** argv)
{
    Dictionary<Element, int> dic1;
    dic1.search(1);

    Dictionary<Element, char> dic2;
    dic2.search('a');

    return 0;
}