Как создать один компаратор для сравнения в разных полях. Различные поля могут иметь разные типы (uint
или string
). Должен ли я использовать T *
?Компаратор разных классов
Необходимо уменьшить длину кода.
template<typename T>
class ComparatorSelector
{
public:
struct CompareByLabel{
bool operator() (const T & iRight, const T & iLeft)
{
return iRight->m_label > iLeft->m_label;
}
};
struct CompareByHouseNumber{
bool operator() (const T & iRight, const T & iLeft)
{
return iRight->m_houseNumber > iLeft->m_houseNumber;
}
};
//...
};
template< class T, class C, typename W >
class SearchIndex
{
public:
SearchIndex() {}
void Build(std::vector<T> iElems, C iComparator, std::ofstream oStream)
{
std::map< T *, size_t> numbersOfElems;
for(class std::vector<T>::iterator it = iElems.begin(); it != iElems.end(); ++it){
m_elems.insert(&(*it));
numbersOfElems[&(*it)] = m_elems.end - it ;
}
oStream << m_elems.size();
for(class std::multiset< T * >::iterator it = m_elems.begin(); it!= m_elems.end(); ++it)
oStream << numbersOfElems[*it];
m_compareMode = iComparator;
}
//....
}
Скомпилирует ли этот код? pass ofstream по значению, iRight/iLeft являются ссылкой, но применяется указатель? – billz
... um ... и компараторы возвращают «большее» состояние, а не «меньшее» (да, это * может быть целеустремленным, но что-то говорит мне ... нет – WhozCraig
Да, мне нужно пройти поток по ссылке В компараторе мне нужно передать указатели на объекты, но вопрос не в этом. – YYY