powered by simpleCommunicator - 2.0.58     © 2025 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / C++ [игнор отключен] [закрыт для гостей] / стандартный функциональный объект с одним полем
6 сообщений из 6, страница 1 из 1
стандартный функциональный объект с одним полем
    #39816986
teo609
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Здравствуйте.

Есть ли сейчас стандартный функциональный объект с одним полем?
Хочется улучшить код. Он работает, но мне не нравится то, что параметр this путешествует по всей цепочке вызовов, хотя используется только в конце, как wnd, где и без того известен.
Заводить переменную уровня модуля не очень интересно, хотя текст короче будет.
Свой тип городить для этого тоже не хочется, короче не выйдет.

Есть обработчик в главном окне, его задача показать историю использования файлов, такой:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
void MyFrame::OnShowHistory(wxCommandEvent& WXUNUSED(evt))
{
	history_->ShowHistory(this, 
		[](wxWindow *wnd, const wstring& openFileName) 
		{ 
			MyFrame *frame = (MyFrame *)wnd;  
			frame->OpenFile(openFileName); 
		});
}



У класса истории есть внутренний класс диалога, который запускается модально:

Код: plaintext
1.
2.
3.
4.
5.
void History::ShowHistory(wxWindow *parent, const std::function<void(wxWindow *, const wstring&)>& onOpenReactor)
{
	Dlg dlg(parent, onOpenReactor);
	dlg.ShowModal();
}



В диалоге есть кнопка Открыть, по нажатию которой надо запустить метод MyFrame::OpenFile:
Код: plaintext
1.
2.
3.
4.
void History::Dlg::OnOpen(wxCommandEvent& evt)
{
	onOpenReactor_(GetParent(), L"sample_file.txt");
}




Хотелось бы чего-то наподобие:

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
void MyFrame::OnShowHistory(wxCommandEvent& WXUNUSED(evt))
{
	history_->ShowHistory(this, 
		functional_object_with_1_field<wxWindow *>(this,
		[](const wstring& openFileName) 
		{ 
			MyFrame *frame = (MyFrame *) get_this_functional_object_field_1();  
			frame->OpenFile(openFileName); 
		});
}


Но я не знаю какой класс использовать как functional_object_with_1_field
и что написать в качестве
const std::unknown_function_object_class_with_1_field<void(const wstring&)>& onOpenReactor
в void History::ShowHistory и в конструкторе диалога и соответственно в мембере
...
Рейтинг: 0 / 0
стандартный функциональный объект с одним полем
    #39817422
a guest
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Функциональный объект с одним полем — достойный кандидат на добавление в стандартную библиотеку!
Конечно же нет, лол.
...
Рейтинг: 0 / 0
стандартный функциональный объект с одним полем
    #39817499
Siemargl
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
teo609,

так передай в свою лямбду параметр
...
Рейтинг: 0 / 0
стандартный функциональный объект с одним полем
    #39818099
teo609
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Siemarglteo609,

так передай в свою лямбду параметр

Смысл вопроса в том, чтобы убрать параметр, который уже передается, с сокращением общего количества кода.
Код: plaintext
1.
2.
history_->ShowHistory(this, 
		[](wxWindow *wnd, const wstring& openFileName)



Здесь в лямбду приходит параметр wnd, который не что иное как this в том же вызове

И даже по смыслу, задача этой лямбды открыть файл, для чего использовать метод этого же класса.
Код: plaintext
1.
frame->OpenFile(openFileName); 



Для открытия файла нужно только его имя, которое берется из диалога, который открывается из метода другого класса.
И в методе
Код: plaintext
1.
void History::ShowHistory(wxWindow *parent, const std::function<void(wxWindow *, const wstring&)>& onOpenReactor)


в описании реактора параметр wxWindow * не нужен ни за чем, кроме как затем, чтобы он добрался до лямбды.
Таких описаний реактора еще два, в мембере диалога и в его конструкторе, а вызывается реактор, он же лямбда, по кнопке диалога Открыть .
И нигде в этих типах лямбд указатель wxWindow *wnd, который будет использоваться только как frame->, по логике программы не нужен, поэтому и хочется его убрать.

Пока я придумал два пути решения:
а) переменную уровня модуля, что будет короче, но не канонично как-то;
б) сделать свой класс с мембером, но тогда общее количество кода не уменьшится, что тоже плохо.

Если бы функциональный объект с одним полем был бы в std, он бы здесь пригодился.
А так пока идет к тому что пойду на вариант а), так меньше кода изучать при сопровождении.

Сорри за повтор, но похоже в исходном комменте я недостаточно ясно описал вопрос.
...
Рейтинг: 0 / 0
стандартный функциональный объект с одним полем
    #39818114
Siemargl
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
teo609,

я про лямбды и захват, ежели что ( это типа [=myvar]{a+=myvar;} )
...
Рейтинг: 0 / 0
стандартный функциональный объект с одним полем
    #39818852
teo609
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Siemargl,

Спасибо, это то что нужно.
...
Рейтинг: 0 / 0
6 сообщений из 6, страница 1 из 1
Форумы / C++ [игнор отключен] [закрыт для гостей] / стандартный функциональный объект с одним полем
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]