Установите функцию void внутри другой функции

#c

Вопрос:

Я пытаюсь установить функцию void в c внутри другой пустоты. Мне было поручено использовать этот нефункционирующий код:

 void function() {
    log("Original function")
}
int main(){
function = []()
    { 
        log("New Function");
    };
}
 

и получи это :

ошибка: недопустимое использование функции-члена ‘void функция()’ (вы забыли ‘()’ ?).

Кто-нибудь может помочь? Возможно ли это вообще, и если нет, то может ли кто-нибудь предложить альтернативу? Вся помощь одобрена.

Комментарии:

1. почему ты пытаешься это сделать? Вы не можете назначить подобную функцию. auto function = []()... сработало бы. Какова цель?

2. Вы можете достичь чего-то подобного, используя указатели функций или std::function . Но чего вы пытаетесь достичь? Какую именно проблему вы надеетесь решить?

3. Подобно тому, как если бы 42 в вашем коде была жестко закодирована константа, которую вы хотели бы изменить во время выполнения, вам нужно было бы сохранить значение 42 в переменной , а затем выполнить рефакторинг кода, чтобы ссылаться на переменную вместо жестко закодированного литерала 42 . Вы должны сделать то же самое со своей функцией. Если вы хотите изменить, какая функция будет вызываться во время выполнения, вам понадобится переменная. std::function<void()> был бы разумный тип для такой переменной, которой можно было function бы назначить либо вашу лямбда-функцию, либо вашу, но имя переменной не должно function повторяться.

4. «установите функцию void в c внутри другой пустоты», это не имеет большого смысла. Возможно, вы могли бы процитировать свое задание дословно.

Ответ №1:

Я думаю, что вы хотите function быть указателем функции, а не функцией. Так что, может быть, что-то вроде этого:

 void (*function)();

int main(){
function = []()
    {
        log("New Function");
    };
return 0;
}
 

Комментарии:

1. … и небольшая демонстрация

Ответ №2:

Определения функций не могут быть изменены во время выполнения подобным образом, поэтому вместо этого вам нужно будет использовать какой-то повторно привязываемый объект, который можно вызвать.

Если ваш лямбда-код никогда не будет захватывать значение, то вы можете использовать указатели функций для этой цели-так как не захватывающий лямбда-код может быть преобразован в указатель функции. Например:

 using function_t = void(*)();

void function_default() { 
    log("Original function");
}

function_t function = amp;function_defau<

int main() {
    function = []{
        log("New Function");
    };
}
 

Try it Online

Однако имейте в виду, что как только вы захотите записать данные в эту лямбду, это не сработает. В этот момент вам будет лучше использовать что-то вроде std::function того, что может работать с любым вызываемым объектом:

 using function_t = std::function<void()>;

void function_default() { 
    log("Original function");
}

function_t function = amp;function_defau<

int main() {
    int some_value = 5;
    function = [=]{
        log("New Function with value = "   std::to_string(some_value));
    };
}
 

Try it Online

Комментарии:

1. У меня проблема. Когда в заголовочном файле я получаю эту ошибку, которой нет в файле cpp. ` ошибка: не удается преобразовать ‘void (имя класса::*) () `в «function_t» {он же » void ( * ) ()»} при инициализации»»

2. Исправлена проблема с использованием extern. Большое спасибо за помощь. Теперь я могу продолжить то, к чему стремился.

Ответ №3:

Чтобы ответить на ваш вопрос, да, вы можете это сделать, но для этого потребуется использование лямбда-функции:

 void main()
{
    auto func = []()-> void // Note: This is a lambda function.
    {
         // Code...
    };
    // If you want to run "func" call it in your void, if not, leave it uncalled.
    func();
}
 

Для получения дополнительной информации о лямбдах я приведу ссылку здесь.