user3219841
user3219841

Reputation: 33

Using an input string as a function name c++

First time posting so be gentle. I've started to teach myself C++ as I've always had an interest and also it will be useful for work in the future.

Ok so i have written a very basic program that will either Add, Subtract, Multiply or Divide depending on the user input.

My question is can i use an input from the user as string and use that to call a function?

See code below:-

#include <iostream>
#include <string>

using namespace std;

// Addition Function
int Add (int a, int b)
{
int r; //Result
r=a+b; //formula
return r; //return result of formula
}

// Subtraction Function
int Subtract (int a, int b)
{
int r; //Result
r=a-b; //formula
return r; //return result of formula
}

// Multiply Function
int Multiply (int a, int b)
{
int r; //Result
r=a*b; //formula
return r; //return result of formula
}

// Divide Function
int Divide (int a, int b)
{
int r; //Result
r=a/b; //formula
return r; //return result of formula
}

// Main
int main()
{
int ip1, ip2, z;
string option;


cout << "Enter first number: ";
cin >> ip1;
cout << "Enter second number: ";
cin >> ip2;
cout << "What would you like to do?, Please type an option (Options: Add, Subtract, Multiply, Divide)\n";
getline(cin,option);
z = option (ip1,ip2);
cout << "The result is " << z;
}

So i ask the user to type in an option i.e. Add, the program then takes that string(Add) and uses it to call the Add function.

At the moment im getting a 'no match for call to '(std::string {aka std::basic_string}) (int&, int&)' error on compile

Any help would be appreciated

Thanks Lewis

Upvotes: 3

Views: 1529

Answers (1)

Shoe
Shoe

Reputation: 76240

You can use a pretty simple if conditional tree:

     if (option == "Add")         z = Add(ip1, ip2);
else if (option == "Subtract")    z = Subtract(ip1, ip2);
else if (option == "Multiply")    z = Multiply(ip1, ip2);
else if (option == "Divide")      z = Divide(ip1, ip2);

Alternatively you can use an std::map to map an std::string to the corresponding function pointer. It possibly cleaner but definitely longer to write:

std::map<std::string, std::function<int(int, int)>> mapping;
mapping["Add"]      = &Add;
mapping["Subtract"] = &Subtract;
mapping["Multiply"] = &Multiply;
mapping["Divide"]   = &Divide;

if (mapping.find(option) == mapping.end())
    // there's no such an option
z = mapping[option](ip1, ip2);

In this particular case you can even do without std::function and just use C function pointers (for non-std::function lovers):

std::map<std::string, int(*)(int, int)> mapping;

On a side note, notice that you can get rid of a lot of lines of code and temporary variables in your function declarations:

int Add (int a, int b)      { return a + b; }
int Subtract (int a, int b) { return a - b; }
int Multiply (int a, int b) { return a * b; }
int Divide (int a, int b)   { return a / b; }

Upvotes: 3

Related Questions