views:

85

answers:

4

Say I get {1,2} from function f(a,b) (it doesnt matter what f is/does), and I want to store it into int s[2]. How would I do it? It seems that I can't just do int s[2] = f(a,b), and I can't separate the output of f, since there is no variable to get the values from. f(a,b)[0] does not work.

+3  A: 

It all depends on what exactly f returns. You can't simply return {1, 2};, so it must be returning something else. Is it a decayed pointer to an array? An std::vector?

If it's a pointer, get the pointer returned and then assign the values.

int* p = f(a, b);
s[0] = p[0];
s[1] = p[1];

If s was bigger than two elements, then it would be better to use std::copy from <algorithm>:

int* p = f(a, b);
std::copy(p, p + 2, s); // where 2 is the size of the array.
Peter Alexander
+2  A: 

Use the std::array array wrapper instead:

std::array<int, 2> f(int, int);

std::array<int, 2> result = f(1, 2);
James McNellis
+2  A: 

To return two things from a function, I prefer std::pair:

#include <utility>

std::pair<int, int> f()
{
    return std::make_pair(1, 2);
}

int main()
{
    std::pair<int, int> p = f();
    int s[2] = {p.first, p.second};
}

If the array already exists, you can make assignment even easier via boost::tie:

    boost::tie(s[0], s[1]) = f();
FredOverflow
+1  A: 

You could copy it, as in memcpy( dest, f(1,2), size ).

Or you could just return a struct. It's an old trick to wrap an array inside a struct to easily copy it via operator=(). E.g.:

struct Foo { int a, b };
Foo f(int, int);
int main()
{
   Foo myF = f(1,2);
}

The struct wrapping becomes useful later on, when your code evolves and you decide to return a third value. Being a struct means you can make it a backward compatible change and avoid changing as much other code...

Mr.Ree
Liked the second part of using `struct`. Did not like the `memcpy` part.
ArunSaha