Специфика шаблона C ++ для реализации - PullRequest
0 голосов
/ 18 марта 2012

Я пишу код, который использует шаблоны для поддержки типов данных int и char *. скажем

struct node {
    KeyType key;
    struct node *next;
};

И это отсортированный узел связанного списка, поэтому всякий раз, когда я вставляю узел, я должен сравнивать. Для этого я создал один заголовочный файл comparison.h, в котором я определил операцию сравнения, такую ​​как

LT(a,b)..
GT(a,b)..

И когда я использую node<int>, я определяю LT(a, b) as a<b, а в случае node<char*> strncmp(a, b, SIZE) (используя макрос, я переключаю определение) Так есть ли способ, которым я минимально вмешиваюсь в это comparison.h. Какими должны быть лучшие способы использования сравнения или конкретных операций, характерных для типов данных, при использовании шаблонов?

1 Ответ

0 голосов
/ 18 марта 2012

Использовать шаблон специализации .Например:

#include <iostream>
#include <string>
using namespace std;

template <class T>
class node {
    T data;
  public:
    node(){}
    static bool GT (const T& first, const T& second);
};

template <class T>
bool node<T>::GT(const T &first, const T &second)
{
    std::cout << "general use" << std::endl;
    return first > second;
}

template <>
bool node<string>::GT(const string &first, const string &second)
{
    std::cout << "called from a string" << std::endl;
    return first.compare(second)>0;
}

int main () {
  std::cout << node<int>::GT(10,20) << std::endl;
  std::cout << node<string>::GT("Hello","World") << std::endl;
  return 0;
}

Вывод будет:

general use
0
called from a string
0
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...