Я читал сообщения/статьи о lambdas, указатели функций, анонимные функции вообще и другие связанные вещи, но ничего, что я видел (я думаю), не ударил точно что я хочу делать.Передача анонимной функции как только параметра другой функции (C++)
Похоже, что выполнение этого должно быть довольно простым, но сказать, что у меня есть функция, содержащая вещи, которые я всегда хочу делать при вызове, но каждый раз, когда я ее называю, я хочу, чтобы она запускала функцию, которую я описываю (и только нужно используйте один раз) в аргументе (эта анонимная функция является единственным аргументом).
Предполагая, что эта функция, которая принимает мою анонимную функцию в качестве аргумента, находится в main.cpp, поэтому она вызвана из main, можно ли реализовать это простым способом?
В основном я пытаюсь выяснить синтаксис в C++ для выхода из этого:
// Some function with partially duplicated code
void OriginalA()
{
DoThingsA();
// unique code
DoThingsB();
}
// Another function with partially duplicated code
void OriginalB()
{
DoThingsA();
// unique code
DoThingsB();
}
Для этого:
// Encapsulate shared functionality
// <param name="action">User defined action</param>
void UniqueWrapper(Action action)
{
DoThingsA();
action();
DoThingsB();
}
// New implmentation of A
void NewA()
{
UniqueWrapper(() =>
{
// unique code
});
}
// New implementation of B
void NewB()
{
UniqueWrapper(() =>
{
// unique code
});
}
Который я нашел, как # 1 здесь: http://www.wildbunny.co.uk/blog/2012/11/01/10-steps-to-becoming-a-better-programmer/
Но установка, подобная этой, где буквально все, что вам нужно будет сделать для вызова, является:
theFunctionName(() => { /*unique things to do*/ });
Если этот ^^ является синтаксисом легального вызова, то я просто не уверен, как этот параметр выглядит в определении FunctionName, очевидно, что это не действие (действие), как в приведенном выше примере.
Это работает только потому, что вы ничего не захватили в лямбда. Как только вы это сделаете, это ломается тонкими способами. IMO лучший способ принять вызываемый аргумент в C++ - это шаблон (он работает для всего без накладных расходов). 'std :: function' всегда вводит служебные данные, указатель функции предотвращает inlining и не работает для функторов. Это действительно резервные копии, если вы не можете использовать шаблон по любой причине. – pmr