Лямбда из C++0x упростила жизнь для тех, кто постоянно использует алгоритмы, принимающие на вход функтор (который приходилось вытаскивать в виде отдельного класса или функции). Но часть проблем остались нерешёнными. Например, есть задача хранить в std::set не объекты, а указатели на них.
Как я делал это раньше:
struct Item
{
...
};
struct ItemPtrComparer
{
bool operator() (const Item *item1, const Item *item2) const
{
...
// тут сравнивались данные объектов на которые указывают item1 и item2
}
};
std::set<Item*, ItemPtrComparer> set_of_items;
Хотелось бы получить от новой лямбды возможность обойтись без создания класса ItemPtrComparer:
struct Item
{
...
};
std::set<
Item*,
decltype([] (const Item *item1, const Item *item2) { /* Переносим сравнение сюда */;}) // Как-то так
> set_of_items;
насколько такое реально сейчас или в будущем?
Здравствуйте, ArtDenis, Вы писали:
AD>насколько такое реально сейчас или в будущем?
auto comp = [](int* x1, int* x2){return *x1 > *x2;};
std::set<int*, decltype(comp)> set (comp);
set.insert(new int (10));
set.insert(new int (15));
set.insert(new int (5));
Здравствуйте, remark, Вы писали:
R>R> auto comp = [](int* x1, int* x2){return *x1 > *x2;};
R> std::set<int*, decltype(comp)> set (comp);
R> set.insert(new int (10));
R> set.insert(new int (15));
R> set.insert(new int (5));
R>
Я некоторое время назад всякие варианты перебирал. Этот мне тогда пришёл в голову один из первых
Но к сожалению, он не прокатил (по крайней мере на VC2010)
Здравствуйте, ArtDenis, Вы писали:
AD>Я некоторое время назад всякие варианты перебирал. Этот мне тогда пришёл в голову один из первых Но к сожалению, он не прокатил (по крайней мере на VC2010)
Всё, дошло. Я тогда забыл comp передать в конструктор
Работает, спасибо!
Здравствуйте, Trapper, Вы писали:
T>А ещё есть boost.ptr containers
Хранение указателя в контейнере было использовано лишь для того, чтобы продемонстрировать проблему