2013-03-31 75 views
0

新手问题。 请参阅下面的代码:从一个函数返回不同值的正确方法

FB::variant TestPluginAPI::getmidX() 
{ 
RECT rect; 
HWND hWnd; 
hWnd = getBrowserHwnd(); 
if(GetWindowRect(hWnd, &rect)) 
    { 

    int width = rect.right - rect.left; 
    int height = rect.bottom - rect.top; 
    int left = rect.left; 
    int mid = (rect.right + rect.left)/2; 
    return mid; 
    } 
else {return 0;} 
} 

我想 - 就是能够从这个函数mid获得,例如left,在我的另一个函数使用它在不同的变量。我当然可以复制它,并使功能,只返回left ...是做这种事情的正确方法,或有更优雅的?

回答

2

你想是这样的:

return std::make_pair(mid,left) 

和返回类型的功能,你就必须std::pair<int, int>。然后当你打电话给你需要的话是这样的:std::pair<int,int> value = getmidX();,如果你需要的中期,你会做int mid = value.first,如果您需要在左边,你会做int left = value.second;

要使用这一点,你需要一个比较现代的C++编译器(很确定最近的VC++会工作),你需要#include<utility>

+0

哦,谢谢,这是intresting –

2

如果你想返回更多的东西,你可以定义结构和返回结构的函数。 例如:

struct funcRetrun 
{ 
    int left; 
    int mid; 
    int right; 
} 

可以再返回函数里面的东西,但是,这一点,因为你需要你的函数的返回类型更改为funcReturn是不是很优雅。

由于C++ 11,你可以使用std::tuple,如果你想返回更多:

Tuples are objects that pack elements of -possibly- different types together in a single object, just like pair objects do for pairs of elements, but generalized for any number of elements.

3

有几种选择。已经给出了struct解决方案,但是(在我看来)他们不是最好的方法。

你应该知道,你可以修改参数的函数,因此你可以这样做:

int getMidX(int &left, int &width) { 
    // do stuff 
    left = theLeftNumber; 
    width = theWidthNumber; 
    return theMidNumber; 
} 

,并用此称呼它:

int l; 
int w; 
int m = getMidX(l, w); 

你也可以用指针来代替引用,它可以使返回值为可选项,并且可以在C中工作(使用*而不是&,并将呼叫更改为getMidX(&l, &r)。还应该检查函数中的NULL以了解用户感兴趣的值在)。

+0

是的,知道它,但我认为这不是我的情况,因为我需要返回一些值,只是不同的计算方法,从相同的功能值给出。但thx无论如何) –

+0

@SinnerSmile我不认为你理解;该函数不读*'l'和'w'的值,它*设置*它们。因此给你3个“返回”值。 – Dave

+0

ooooooh,我现在明白了,谢谢。 –