2010-12-31 4 views
2

Давайте нового типа пользовательского TList представленного набора объектов шаблона:Компаратора для объектов класса шаблона, C++

template <class T> 
struct TList 
{ 
    typedef std::set <Object <T>, sortByVal > TObjects;  
}; 

Должен быть компаратором sortByVal также шаблон класса или, достаточно шаблонный метод из не-шаблонный класс?

class sortByVal 
{ 
    public: 
     template <class T> 
     bool operator() (const Object <T> &o1, const Object <T> &o2) const 
     { 
      return o1.getVal() < o2.getVal(); 
     } 
}; 

или

template <class T> 
class sortByVal 
{ 
    public: 
     bool operator() (const Object <T> &o1, const Object <T> &o2) const 
     { 
      return o1.getVal() < o2.getVal(); 
     } 
}; 
+0

Это называется _class template_, потому что это шаблон, из которого создаются классы, а не наоборот. – sbi

ответ

1

Вы можете сделать это один, так или иначе, это дело вкуса.

Однако, во втором случае, вы должны использовать его как это:

typedef std::set <Object <T>, sortByVal<T> > TObjects; 
1

Я бы двигаться компаратор класса TList. И так как он не имеет состояния, то проще сделать его статическую функцию:

template<typename T> 
struct TList 
{ 
    static bool Compare(const TObject<T> &o1,const TObject<T> &o2); 
... 
0

Как правило, вы будете использовать функцию шаблонного члена, потому что смысл писать <T> каждый раз, когда вы хотите, чтобы обратиться к нему?