2012-11-16 82 views
3

我有一个模板Node用于在数组中存储一些数据。添加之前我想检查一个条目是否存在相同的值(我的插入逻辑需要它)。对于字符串类型,我想实现一个特定的方法进行比较。C++模板:为特定数据类型创建专用函数

template <class T> class Node 
{ 
private: 
    short noOfEntries; 
    T data[MAX_VALUES]; 
public: 
    Node() { noOfEntries = 0; } 
    int Compare(int index, T *key); 
    int Insert(T *key); 
}; 

template <class T> 
int Node<T>::Compare(int index, T *key) 
{ 
    if(data[index] > *key) 
     return 1; 
    else if(data[index] == *key) 
     return 0; 
    return -1; 
} 

template <> 
class Node <string> { 
    public: 
    int Compare(int index, string *key) 
    { 
     return (data[index].compare(*key)); 
    } 
}; 

这使误差作为属性“数据”和“noOfEntries”不在Node <string>类。 看来,我将不得不将所有属性从节点放到字符串的专用版本。方法也一样。

有没有更好的方法,以便我将只有一个为Node定义的插入方法,它将调用正确的compare()方法,具体取决于T的实际类型?我想避免重复的方法。

+0

不同字符特征或分配器的字符串呢? –

回答

4

只是专注的一个成员:

template <> int Node<std::string>::Compare(int index, std::string *key) 
    { 
     return (data[index].compare(*key)); 
    } 

更惯用的方式来做到这一点是使用比较策略模板参数,或者可能描述元素类型的默认比较策略的特点。

+0

这真棒。我非常感谢你帮助我:)你从哪里学到的?我是一个新手,并想提高自己。 –

+0

我推荐“C++模板完整指南”。另请参阅我们的[权威图书列表](http://stackoverflow.com/questions/388242/the-definitive-c-book-guide-and-list) – sehe