簡體   English   中英

C ++默認函數參數

[英]C++ default function parameter

我想實現這個目標:

- second parameter by default set to first argument

就像是:

int foo (int a, int b = a);

但是怎么做呢?

非常感謝!

這是禁止的:

8.3.6默認參數[dcl.fct.default]

9)每次調用函數時都會計算默認參數。 函數參數的評估順序未指定。 因此,函數的參數不應在默認參數表達式中使用,即使它們未被計算。 在默認參數表達式之前聲明的函數的參數在范圍內,並且可以隱藏名稱空間和類成員名稱。 [例如:

int a;

int f(int a , int b = a); / / error: parameter a

/ / used as default argument

typedef int I;

int g( float I , int b = I (2)); / / error: parameter I found

int h(int a , int b = sizeof (a )); / / error, parameter a used

/ / in default argument

- 末端的例子]

另一種方法是重載:

int foo(int a, int b);

int foo(int a)
{
   return foo(a,a);
}

這個被禁止的原因已經得到解決,但是@Vyktor的另一個解決方案是使用boost::optional而不是幻數(與創建重載相比,這有利有弊):

int foo(int a, boost::optional<int> b = boost::none)
{
    if(!b) b = a;
}

我建議像Luchian Grigore所建議的那樣對這個特殊任務使用重載,但通常的做法是保留一些值來說“這是默認值”。 例如

int foo( int a, int b = -1)
{
    if( b == -1){
       b = a;
    }
}

使用對象(不是標量值)這可以很好地實現(通過創建保留的新傳遞類來表示默認值),但是使用int你必須這樣做。

請注意,您必須100%確定b無法獲得值-1 (或任何保留值)。

這是一個有趣的答案 - 但有效:

#define TWO_FROM_ONE(a) (a),(a)

f(TWO_FROM_ONE(12));

一個缺點是這將調用一些函數兩次(一個已知的宏缺點):

f(TWO_FROM_ONE(sin(123 / PI)));

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM