У меня была идея управлять указателями функций симметричным способом, как это делает .net, и я думаю, что, может быть, нехватка памяти, мне нужно подтверждение этого.
Когда я звоню action(5);
что происходит с 5 в функции Test? По моему мнению, он остается в стеке навсегда и может привести к исключению stackoverflow
#include <iostream>
union Action
{
void (*action)();
void (*action1)(int);
void operator()(int i)
{
this->action1(i);
}
void operator=(void (*action)())
{
this->action = action;
}
void operator=(void (*action)(int))
{
this->action1 = action;
}
};
void Test()
{
std::cout << "test";
}
int main()
{
Action action;
action = Test;
action(5);
char c;
std::cin >> c;
}
Чтение от члена профсоюза, который не является последним записанным, приводит к неопределенному поведению.
Но чтобы ответить на ваш вопрос: это зависит от соглашение о вызовах в использовании. Более конкретно, какая часть программы отвечает за очистку стека (вызывающий или вызываемый). Если вызывающий объект очищает стек, все должно работать нормально. С другой стороны, если вызываемый должен очистить стек, вызывающий имеет поврежденный кадр стека после возврата функции. Мы надеемся, что следующий доступ к переменной, размещенной в стеке, приведет к сбою программы, или, что еще хуже, к ошибочному поведению, которое трудно отладить.
Других решений пока нет …