Краткий ответ: Формы цепочки не рассчитаны на полную динамику.
Более длинный ответ: В руководстве box2d.org объясняется, что формы Цепи предназначены для построения ваших статических миров. В этом отношении формы цепочек аналогичны формам краев:
они могут сталкиваться с кругами и многоугольниками, но не с самими собой.
blockquote>Кроме того, они не предназначены для полностью динамического поведения, такого как фигуры, такие как многоугольник.
Надеюсь, что это отвечает на ваш вопрос.
Вы можете построить небольшую систему цепочек, например, так:
struct Type {
string first, last;
int age;
};
struct CmpFirst {
bool operator () (const Type& lhs, const Type& rhs) { return lhs.first < rhs.first; }
};
struct CmpLast {
bool operator () (const Type& lhs, const Type& rhs) { return lhs.last < rhs.last; }
};
struct CmpAge {
bool operator () (const Type& lhs, const Type& rhs) { return lhs.age < rhs.age; }
};
template <typename First, typename Second>
struct Chain {
Chain(const First& f_, const Second& s_): f(f_), s(s_) {}
bool operator () (const Type& lhs, const Type& rhs) {
if(f(lhs, rhs))
return true;
if(f(rhs, lhs))
return false;
return s(lhs, rhs);
}
template <typename Next>
Chain <Chain, Next> chain(const Next& next) const {
return Chain <Chain, Next> (*this, next);
}
First f;
Second s;
};
struct False { bool operator() (const Type& lhs, const Type& rhs) { return false; } };
template <typename Op>
Chain <False, Op> make_chain(const Op& op) { return Chain <False, Op> (False(), op); }
Затем использовать ее:
vector <Type> v; // fill this baby up
sort(v.begin(), v.end(), make_chain(CmpLast()).chain(CmpFirst()).chain(CmpAge()));
Последняя строка немного многословно, но я думаю, что ясно, что предназначено.
Один стандартный способ обработать это состоит в том, чтобы отсортировать в нескольких передачах и использовать стабильный вид. Заметьте это std::sort
обычно не стабильно. Однако существует std::stable_sort
.
Тем не менее я записал бы обертку вокруг функторов, которые возвращают с тремя состояниями (представляющий меньше, равняется, больше).
std::sort
как гарантируют, не будет стабилен, потому что стабильные виды обычно медленнее, чем нестабильные... настолько использующий стабильный вид многократно похож на рецепт для проблемы производительности...
И да это - действительно позор, который вид просит предикат: Я не вижу никакой другой путь, чем создают функтор, принимающий вектор функций с тремя состояниями...
Решение для объединения в цепочку является подробным. Вы могли также использовать повышение:: свяжите в сочетании со станд.:: logical_and для создания предиката сортировки. См. связанную статью для получения дополнительной информации: То, как повышение связывает библиотеку, может улучшить Ваши программы C++