#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");
};
}
Однако имейте в виду, что как только вы захотите записать данные в эту лямбду, это не сработает. В этот момент вам будет лучше использовать что-то вроде 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));
};
}
Комментарии:
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();
}
Для получения дополнительной информации о лямбдах я приведу ссылку здесь.