4

在具有多个参数的 C++ 函数中,我希望其中一个参数具有默认值,该值本身就是其他参数的函数。例如,

int f1( int m );
int f2( int n1, int n2 = f1( n1 ) ) {
    // Do stuff with n1 and n2
}

这不会编译,但希望它可以明确我想要函数 f2 的行为。它的调用者应该能够手动将 n2 的值传递给它,但默认情况下,n2 的值应该通过在 n1 上调用 f1 来确定。对于如何最好地实现(或至少近似)这种行为有什么建议?

4

4 回答 4

6

重载该函数:

int f1( int m );
int f2( int n1, int n2 ) {
    // Do stuff with n1 and n2
}
int f2( int n1 ) {
    return f2( n1, f1( n1 ) );
}
于 2013-07-31T19:08:43.543 回答
4

您可以改为使用函数重载

int f2(int n1) {
    return f2(n1, f1(n1));
}

int f2(int n1, int n2) {
    // do stuff
}
于 2013-07-31T19:08:22.757 回答
2

一种解决方案是功能重载,正如其他答案已经建议的那样。

其他解决方案是使用boost::optional类型作为可选参数:

int f2( int n1, boost::optional<int> n2) 
{
    int n2value = n2 != boost::none? n2.get() : f1(n1);

    //use n1 and n2value in the rest of the function!
}

boost::optional当您有多个可选参数时通常会有所帮助,例如:

int f(int a, boost::optional<X> b, boost::optional<Y> c, boost::optional<Z> d)
{
    //etc
}

在这种情况下,函数重载会爆炸式增长,因为函数的数量会随着每个附加的可选参数线性增加。值得庆幸的是,C++ 没有命名参数,否则它将以指数方式而不是线性方式增加。:-)

于 2013-07-31T19:12:59.270 回答
0

这可能不是一个好方法,但您也可以使用如下模板:

类似于 Associate STL Containers 中的默认比较函数(map、set 等)

struct f1{
    int operator() (int m) const {
    //definition for f1 goes here
    };
};

struct f3{
    int operator() (int m) const {
    //definition for any other f3 goes here
    };
};

template < class fun = f1>                 
int f2( int n1,  const fun& f=fun() ) {
       int x=f(n1);
      //std::cout<<x<<std::endl;
}    

int main()
{
  f2<f3>(11); //Call using f3
  f2(12); // Call using default f1
}
于 2013-07-31T21:30:50.887 回答