C++ 模板 : Create a specialized function for a specific data type

标签 c++ string templates generics

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

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));
    }
};

这会产生错误,因为属性“data”和“noOfEntries”不在类 Node <string> 中. 看来我必须将 Node 的所有属性都放到字符串的专用版本中。方法也一样。

有没有更好的方法让我只为 Node 定义一个插入方法,它会根据 T 的实际类型调用正确的 compare() 方法?我想避免方法的重复。

最佳答案

只专门化一个成员:

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

执行此操作的更惯用的方法是使用比较策略模板参数,或者可能是描述元素类型的默认比较策略的特征。

关于C++ 模板 : Create a specialized function for a specific data type,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13425086/

相关文章:

python - 我需要比较 2 个不同数据帧的 2 个字段(如果匹配),我们需要填充详细信息,否则在 python 中填充空值

java - == 运算符对 String 有什么用?

c++ - 有没有办法在 Windows 的 basic_iostream 上获得非锁定流插入/提取?

templates - ansible 的模板包含上下文

c++ - std::is_same_v与非专业模板

c++ - 按成员复制、按位复制、浅复制和深复制有什么区别?

c++ - for 循环初始化中的 auto 和 decltype

c++ - 在 C++ 中是否可以有可变数量的字符串数组?

c++ - 如何清理或销毁QJSEngine?

c++ - 如果 T 不是默认可构造的,如何优雅地初始化 std::array<T, n>?