У меня есть некоторый код, который можно значительно уменьшить по сложности с помощью лямбды.Однако, к сожалению, мы должны использовать компилятор, который не полностью поддерживает C ++ 11, и мы не можем легко переключаться.Теперь вопрос заключается в том, как сохранить логику как можно ближе к лямбда-выражению с недоступными функциями (т. Е. Доступны std::function
, лямбды нет).
Обычное решение - определить где-то функтореще, а затем используйте его в соответствующем месте:
struct functor{
functor( type & member ) : m_member( member ) {}
void operator()( ... ) {...}
type & m_member;
};
void function() {
use_functor( functor(...) );
}
Я очень привык к этому шаблону, хотя мне он очень не нравится.Основная причина не определения класса обычно заключается в том, что функтор будет использоваться в STL, а шаблоны не похожи на структуры, определенные внутри функции.Однако в моем случае функция use_functor()
будет нормальным методом, поэтому я могу определить функтор внутри самой функции (каждый функтор используется только в одной функции).
void function() {
struct functor{
functor( type & member ) : m_member( member ) {}
void operator()( ... ) {...}
type & m_member;
};
use_functor( functor(...) );
}
Это выглядит несколько лучше, но все еще требует гораздо более некрасивого кода, который я хотел бы.Например, я бы хотел полностью избавиться от имени функтора.Я знаю, что можно создать анонимную структуру, если я использую только одно значение.
void function() {
struct{
// functor( type member ) : m_member( member ) {}
void operator()( ... ) {...}
// type & m_member;
} callback ;
use_functor( callback );
}
Однако на данный момент я понятия не имею, как предоставить необходимые элементы данных.Поскольку структура является анонимной, у нее нет конструктора.Я мог бы легко установить элемент, потому что он общедоступный, но опять-таки это добавило бы строку, которая мне не нравится.
Цель состоит в том, чтобы оставить его в состоянии, которое должно быть изменено как можно меньше, как только мы переключимся.к компилятору, который имеет чистые лямбды, которые позволили бы полностью устранить эту проблему.
Как бы вы поступили с этим?