bad_function_call std::function
Возникала проблема с std::function, генерируется исключение, с обычными указателями на функции все работает нормально, когда пытаюсь сделать через std::function выскакивает исключение, не получается исправить
#include <iostream>
#include <functional>
typedef int (*pArithmeticFcn1)(int, int);
using pArithmeticFcn2 = int (*)(int, int);
using pArithmeticFcn3 = std::function<int(int, int)>;
int add(int num1, int num2);
int subtract(int num1, int num2);
int multiply(int num1, int num2);
int divide(int num1, int num2);
int numInput();
char symbolInput();
bool inputError();
pArithmeticFcn3 getArithmeticFcn(char symbolMatOperator);
struct ArithmeticStruct {
char mathOperator = ' ';
pArithmeticFcn3 pFunc = nullptr;
};
static ArithmeticStruct arithmeticArray[4] {
{ arithmeticArray[0].mathOperator = '+', arithmeticArray[0].pFunc = add },
{ arithmeticArray[1].mathOperator = '-', arithmeticArray[1].pFunc = subtract },
{ arithmeticArray[2].mathOperator = '*', arithmeticArray[2].pFunc = multiply },
{ arithmeticArray[3].mathOperator = '/', arithmeticArray[3].pFunc = divide }
};
int main()
{
int num1;
int num2;
int variant;
char arithmeticSymbol;
pArithmeticFcn3 pFunction;
do {
std::cout << "Ввести числа - 1 (или выйти 0)";
variant = numInput();
if (variant == 1) {
num1 = numInput();
arithmeticSymbol = symbolInput();
num2 = numInput();
pFunction = getArithmeticFcn(arithmeticSymbol);
try {
std::cout << "\nResult: " << pFunction(num1, num2) << "\n\n";
}
catch (const std::bad_function_call& e) {
std::cout << e.what() << '\n';
}
} else if (variant == 0) {
break;
} else {
std::cout << "error!!! введены некорректные данные\n\n";
continue;
}
} while (true);
return 0;
}
int add(int num1, int num2)
{
return num1 + num2;
}
int subtract(int num1, int num2)
{
return num1 - num2;
}
int multiply(int num1, int num2)
{
return num1 * num2;
}
int divide(int num1, int num2)
{
return num1 / num2;
}
int numInput()
{
int num = 0;
do {
std::cout << "\nВведите число: ";
std::cin >> num;
if (inputError()) {
continue;
} else {
break;
}
} while (true);
return num;
}
char symbolInput()
{
char symbol = ' ';
do {
std::cout << "\nВыберите математическую функцию (+, -, *, /): ";
std::cin >> symbol;
if (inputError()) {
continue;
} else {
break;
}
} while (true);
return symbol;
}
bool inputError()
{
bool result = false;
std::cin.ignore(32767, '\n');
if (std::cin.fail()) {
std::cin.clear();
std::cin.ignore(std::numeric_limits<std::streamsize>::max(), '\n');
std::cout << "error!!! ошибка ввода\n\n";
result = true;
return result;
} else {
return result;
}
}
pArithmeticFcn3 getArithmeticFcn(char symbolMatOperator)
{
for (const auto &i : arithmeticArray) {
if (symbolMatOperator == i.mathOperator) {
return i.pFunc;
}
}
std::cout << "error!!! Введен некорректный арифметический символ, "
<< "разрешены символы (+, -, *, /)\n\n";
return nullptr;
}