Follow

Keep Up to Date with the Most Important News

By pressing the Subscribe button, you confirm that you have read and are agreeing to our Privacy Policy and Terms of Use
Contact

Member function that can return multiple references? (C++)

I have a member function that needs to return multiple references of char member variables.

class Foo {
public:
    Foo() {// ... constructor }
    
    std::string& func();

private:
    char ch1 = 'a', ch2 = 'b', ch3 = 'c';
};

The code below is something would obviously not fulfill my purpose, because the lifetime of the local variable is limited to the scope of the function call:

std::string& func()
{
    std::string total = "";
    total += this-> a;
    total += this-> b;
    total += this-> b;
    
    return total;
}

I would also prefer not to use the method of allocating memory for the local variable using new, then having to delete it after.

MEDevel.com: Open-source for Healthcare and Education

Collecting and validating open-source software for healthcare, education, enterprise, development, medical imaging, medical records, and digital pathology.

Visit Medevel

I also would not prefer to add a new member variable to the class that is used in the member function and returned.

First of all, is doing this even possible? If so, how can I achieve this?

Many thanks for help.

>Solution :

You can return a std::tuple of references :

std::tuple<char&, char&, char&> foo::func()
{
    return std::tie(ch1, ch2, ch3);
}

You can also use structured binding to unpack the return value :

int main()
{
    foo f;
    auto [a, b, c] = f.func();
    b = 'z';    // Modifies `f.ch2`
}

Live example : https://godbolt.org/z/eM1h6qaxx


Edit for C++14 :

Instead of structured binding, you can use std::get to access one of the return values :

int main()
{
    foo f;
    auto result = f.func();
    std::get<1>(result) = 'z';    // Modifies `f.ch2`
}

C++14 live example : https://godbolt.org/z/jrjsr4K7e

Add a comment

Leave a Reply

Keep Up to Date with the Most Important News

By pressing the Subscribe button, you confirm that you have read and are agreeing to our Privacy Policy and Terms of Use

Discover more from Dev solutions

Subscribe now to keep reading and get access to the full archive.

Continue reading