Vektor 007
Vektor 007

Reputation: 35

How to create two functions with the same name and different return type and runned based on boolean parameter

I have two functions with the same name but different return types. I want to run the function based on their third parameter. If the third parameter is true I want to run the first and If the parameter is false to run the second function. I was trying different things on my own because I couldn't find information online and I wasn't sure how is this called. Here is what I tried to do:

static int function(int a, int b, const bool=true);
static std::string function(int a, int b, const bool=false);

I would be grateful if someone can explain how to do this or at least give me a link to some information.

Upvotes: 1

Views: 921

Answers (2)

darclander
darclander

Reputation: 1811

This solution is not about having two different functions but if you wanted the function to return a different type depending on the bool value using boost::any.

boost::any function(int a, int b, const bool c) {
    std::string str = "Hello world!";
    int num = 10;

    if ( c ) {
        return boost::any(num);
    } else {
        return boost::any(str);
    }
} 

This would use the third parameter in the function in order to decide which return you should do. Depending on how big function is this might be a worse solution but if you really wanted to use a boolean as a parameter I believe this should work.

Docs: Boost

Related question to this answer: Function which returns an unknown type

Upvotes: 2

cigien
cigien

Reputation: 60228

You can create a function template and add specializations for the different return types. Then you could use the bool argument as a template parameter:

template<bool>
auto function(int, int);

template<>
auto function<true>(int a, int b)
{
    // ...
    return int{};
}

template<>
auto function<false>(int a, int b)
{
    // ...
    return std::string{};
}

The functions would then be called like this:

int a = function<true>(1,2);
std::string b = function<false>(1,2);

Here's a demo.

Note the important caveat that the bool parameter must be known at compile time, and can't be a run time argument.

While this technique will work, do be aware that this will confuse a lot of c++ programmers. They usually expect a function to always return a particular type.

More relevant to your question; this is not actually going to make the code much more readable. Instead, having separate named functions is probably a more readable approach:

int int_function(int a, int b);
std::string str_function(int a, int b);

which could be called like this:

int a = int_function(1,2);
std::string b = str_function(1,2);

Upvotes: 2

Related Questions