Я работаю над некоторым кодом, и у меня есть раздел, где я выполняю одну функцию сортировки. Для его реализации я решил, что проще всего перегрузить оператор <. То, что я бы предпочел сделать, это переместить реализацию сортировки ближе к фактическому вызову, используя какой-то boost :: bind, boost :: phoenix, lambda или какой-либо другой тип реализации. К сожалению, у меня нет доступа к новым функциям C++ 11. Ниже приведен пример кода.Как реализовать функцию лямбда для алгоритма сортировки с участием членов объекта, косвенности и литья?
// In a header
struct foo
{
char * a;
char * c_str() { return a; }
}
// In a header
struct bar
{
foo * X;
bar(foo * _X) : X(_X) {}
bool operator < (const bar& rhs) const
{
return std::string(X->c_str()) < std::string(rhs.X->c_str());
}
};
struct bars : public std::vector<bar> { ... some stuff };
// Some other header
bars Bs;
// A cpp file
... other stuff happens that fills the Xs vector with objects
...::Function()
{
// Current use and it works fine
std::sort(Bs.begin(), Bs.end())
// Would like something that accomplishes this:
// std::sort(Bs.begin(), Bs.end(),
// std::string(lhs.X->c_str()) < std::string(rhs.X->c_str()))
// A non-working example of what I'm trying to do
// std::sort(Xs.begin(), Xs.end(),
// std::string((bind(bar::X->c_str(), _1)) <
// std::string((bind(bar::X->c_str(), _2)))
}
Я теряюсь, пытаясь выяснить, как получить доступ к указателям членов, функций члена и затем отливал результат все в функции подталкивания :: связывания.
Благодарим за помощь.
Хорошо. Просто вспомнил требование C++ 03. Вот ** [все адаптировано к C++ 03] (http: // coliru.stacked-crooked.com/a/36fed5e249b95450)** (обратите внимание на комментарии и протокол 'result_type'). И вот оригинал [C++ 11 для сравнения] (http://coliru.stacked-crooked.com/a/b6d7e77ec7624645) (** ОТКАЗ ОТ ОТВЕТСТВЕННОСТИ ** Я до сих пор не претендую на Phoenix contraption/works /. Он компилируется :)) – sehe
К сожалению, пропущен возврат к 'std :: string': ** [C++ 03 адаптирована версия] (http://coliru.stacked-crooked.com/a/4394162bfd38e6aa) ** , и [C++ 11 тоже] (http://coliru.stacked-crooked.com/a/bec11b3222c3decd) – sehe
Наконец-то у меня появилось некоторое время, чтобы вернуться и на самом деле изучить этот код, и я понимаю, что вы пытаетесь сделать, хотя я действительно чувствую, что это очень сложный код для одного сортировки, а не то, что мерзость звонков с фениксами является отличным решением. C++ 11 делает гораздо более простой один код. Спасибо за хорошо сделанные примеры. – ApockofFork