make_comparer это производящая функция, которая возвращает функтор для сравнения членов структуры. data_id, name, top это константные функции ничего не принимающие и возвращающии поля структуры, естественно разного типа.
Ну в общем наверно все поняли что этот код сортировки контейнера структур Data по разным полям.
Здравствуйте, Gorn, Вы писали:
G>Как вариант — можно реализовать тот же перебор внутри make_comparer.
нельзя
G>Либо инкапсулировать этот код, сделав фабрику для создания объектов-функторов:
G>
Такие варианты я рассматривал.
Все они сводятся к тому чтобы убрать этот здоровый switch куда подальше.
Я же хочу чтобы у меня был массив указателей на члены, чтобы по индексу их извлекать.
member member_table[] =
{
long (Data::*i1)()const,
std::string (Data::*i2)()const,
float (Data::*i3)()const,
std::string (Data::*i4)()const,
std::string (Data::*i5)()const,
std::string (Data::*i6)()const,
//...
};
в С++ это невозможно.
Сдаётся мне что от свитча не избавиться никак.
struct member_table
{
long (Data::*i1)()const;
std::string (Data::*i2)()const;
float (Data::*i3)()const;
std::string (Data::*i4)()const;
std::string (Data::*i5)()const;
std::string (Data::*i6)()const;
//...
R operator[](size_t) // что возвращать?
{
// здесь switch
}
};
Ну и чёрт с ним. Всё работает как часики и слава богу.
Мне уже стала просто интересна задача создания такого массива. Или его подобия.
Спасибо. Очень понравилось. Однозначно пойдёт в коллекцию фич.
Что интересно, Comeau компилит без проблем, а VC7.1 при инстанцировании шаблона member_comparator типом std::string foo::* начинает ругаться на оператор меньше для reverse_iterator
Пока не понял в чём дело, но думаю сам разберусь.
Спасибо! В таких случаях остаётся только развести руками и сказать: "Как же я сам не догадался!?"
Я просто зациклился на массиве указателей на члены и поэтому про массив функторов даже не подумал.
Здравствуйте, Кодт, Вы писали:
К>Здравствуйте, korzhik, Вы писали:
К>boost::function< bool(*)(const Data&, const Data&) > К>?
Раз пошла такая тотальная сортировка, то есть boost::multi_index. Как говорится: "жизнь без геморроя".
Здравствуйте, Warturtle, Вы писали:
W>Раз пошла такая тотальная сортировка, то есть boost::multi_index. Как говорится: "жизнь без геморроя".
Я его уже использую
Но мне не хочется хранить 18 индексов для сортировки. Я храню три индекса для фильтрации (equal_range), а по остальным полям сортирую сам.
Здравствуйте, sadomovalex, Вы писали:
S>Предложу еще одно решение:
Спасибо за участие в дискуссии и за ваше решение.
В принципе это вариация на тему массива функторов.
Конкретно ваше решение мне не подходит потому что у меня функция make_comparer это не просто функция — это целое семейство функций — шаблонных и перегруженных, которые возвращает объект-функтор, сам который создаётся в зависимости от многих условий: константный член, не константный также есть возможность композиции функторов, то есть сортировать сразу по нескольким полям структуры и так далее. Поэтому мне нужен массив объектов-функторов, для этого подходит, как здесь уже советовали boost::function<bool (Data const&, Data const&)> table[];