Я реализовал свой собственный контейнер:
template<typename T>
class MyContainer
{
// body where in some point 2 elements of collection are compared (-1, 0 and 1 possible comparison results)
};
То, что я хочу сделать, это добавить поддержку функциональных объектов, как в std :: set, где можно сделать функциональный объект следующим образом:
struct Comparator
{
bool operator()(const char* s1, const char* s2) const
{
return strcmp(s1, s2) < 0;
}
};
и затем передайте это как установленный параметр:
std::set<const char*, Comparator> SomeSet;
Я не каждый день программист C ++, поэтому мне нужна помощь, чтобы достичь этого. Что я должен сделать, чтобы добавить поддержку этому? Должен ли я создать поле в MyContainer
для того, чтобы сохранить объект функции в нем, чтобы использовать его в моих методах сортировки внутри контейнера?
Я решил это, добавив значение шаблона по умолчанию и определив класс сравнения по умолчанию:
template<typename T, class Compare = DefaultTreeOrder<T>>
class MyContainer
{
private:
Compare compare;
public:
MyContainer()
{
compare = Compare();
}
};
где DefaultTreeOrder
является:
template<typename T>
class DefaultTreeOrder
{
public:
int operator()(T value1, T value2)
{
less<T> l;
greater<T> g;
if(l(value1, value2))
{
return 1;
}
else if(g(value1, value2))
{
return -1;
}
return 0;
}
};
Других решений пока нет …