1

我有一个双精度函数,通常返回变量的新值,但有时我不想更改变量,我想通过返回一个特殊值来表示这一点,例如 void。那可能吗?

例如:

double GetNewValue(int feature) {
    switch( feature ) {
        case TYPE1:
            return void; // or maybe use return; here?
        case TYPE2:
            return 2.343;
        default:
            return featureDefaultValue;
    }
}

PS:我知道我可以使用 NaN,但我已经将它用作具有另一种含义的有效值(还没有可用的数字)。

/ EDIT:谢谢大家的回答,这3个答案都适用于我的问题并且都同样有效。我现在正在努力选择我要使用哪一个(这将是我会接受的那个,但我希望我能全部接受!)。

4

3 回答 3

5

在这种情况下,您需要从一个函数中返回两件事,而不是一件。这样做的一种常见方法是获取一个指向返回值的指针,并返回一个是/否标志来指示实际的有效性double

int GetNewValue(double *res, int feature) {
    switch( feature ) {
    case TYPE1:
        return 0; // no change to res
    case TYPE2:
        *res = 2.343;
        return 1;
    default:
        *res = featureDefaultValue;
        return 1;
}

现在而不是这样做

double res = GetNewValue(myFeature);

您的功能的用户需要这样做:

double res;
if (GetNewValue(&res, myFeature)) {
    // use res here - it's valid
} else {
    // do not use res here - it's not been set
}
于 2013-05-06T15:29:13.930 回答
4

一种方法是将结果变量作为指针传递:

void AssignNewValue(int feature, double* result)
{
    switch( feature ) {
    case TYPE1:
        return;
    case TYPE2:
        *result = 2.343;
        break;
    default:
        *result = featureDefaultValue;
        break;
    }
}

像这样使用:

double featureValue = 42.0;

/* ... */

AssignNewValue(feature, &featureValue);
于 2013-05-06T15:27:40.323 回答
0

听起来您想要一个“可选”返回参数。您似乎(并且正确地)不想使用 0.0 作为“无价值”结果,因为这意味着 0.0 不能用于实际值。

您有时会看到 2 个很好的解决方案是使用“结果代码”,或者使用指针作为返回结果。(指针更复杂)。我先从#1开始:

1.结果代码

// definitions for result codes
#define FAIL 0
#define OK 1

int GetNewValue(int feature, double *result) {
    switch( feature ) {
        case TYPE1:
            *result = 0.0 ;
            return FAIL ; // caller of the function should recognize
                          // the call "failed"
        case TYPE2:
            *result = 200.0 ;
            return OK ;
        default:
            *result = 47.0 ;
            return OK;
    }
}

// use:
double feature ;
int result = GetNewValue( 5, &feature ) ;
if( result == OK )
{
    // do something with "feature"
}

2. 使用指针

double* GetNewValue(int feature) {
    switch( feature ) {
        case TYPE1:
            return NULL ; // NO POINTER means FAIL
        case TYPE2:
            return new double(200) ;
        default:
            return new double( 47 ) ;
    }
}

// use:
double* result = GetNewValue( 5 ) ;
if( result != NULL )
{
    // result had a value, so you can use it
}

带指针的问题是你需要delete记住result

delete result ; // when done with pointer that was created
                // with `new`, you must `delete` it after
                // otherwise you'll get a memory leak
于 2013-05-06T15:33:48.597 回答