如何确定函数参数是自动设置为默认值还是在C ++中显式设置?

时间:2014-09-15 07:38:47

标签: c++ default-parameters

我很确定这是不可能的,但是如果存在(可能通过编译器提供的宏),它对我来说非常有用,所以我在这里发布它。假设我有一个功能:

void func( int param1, bool param2=false){ ... }

param2已在此处获得默认值。是否有任何机制来确定param2是否已显式设置为其默认值false还是自动传递?换句话说,从函数func中,是否可以区分以下两个调用?我正在使用Microsoft Visual C ++编译器。

func(1, false);

func(1);

3 个答案:

答案 0 :(得分:2)

您无法区分您的询问方式,但您可以这样做:

void func(int param1, boost::optional<bool> param2=boost::none);

然后你可以检查param2是否为none(它有自己的运算符bool)。如果它已设置,则表示它已被传入。调用站点看起来与之前相同,因为可以从其值类型隐式构造可选站点。

答案 1 :(得分:1)

false的值是相同的,无论是默认设置还是其他机制(注意默认参数在编译时解析,因此在运行时绝对没有办法检查它是否是给定与否)。

你可以写两个函数:

void func( int param1, bool param2 )
{
  ...
}

void func( int param1 )
{
  ... do things differently ...
  func( param1, false );
}

(当然,您可能需要从func( int )拨打func (int, bool)

另一种选择是将bool更改为某种用户定义的类型:

enum TriState { False, True, Unknown };

void func( int param1, TriState parma2 = Unknown )
{
  ... 
}

当然,您现在需要将所有true更改为True,将false更改为False,您可能会遇到问题,因为if (someTriStateVar)是对于Unknown也是如此。

答案 2 :(得分:1)

http://coliru.stacked-crooked.com/a/f6bcee72b5c957d1

#include <iostream>

struct CheckDefault {
    CheckDefault() : value(false), param_default(true) {}
    CheckDefault(bool b) : value(b), param_default(false) {}
    bool value;
    bool param_default;
};

void func(int param1, CheckDefault s = CheckDefault()) {
    if (s.param_default)
        std::cout << "with default, ";
    else
        std::cout << "not default, ";
    if (s.value)
        std::cout << "and value is true" << std::endl;
    else
        std::cout << "and value is false" << std::endl;
}

int main() {
    func(5);
    func(5, false);
    func(5, true);
}

输出:

$ ./test2
with default, and value is false
not default, and value is false
not default, and value is true

除了单一的bool之外,还需要更多的信息,所以我们引入了第二个bool并将它们以新的形式包装在一起。使用显式bool调用该函数会触发将bool作为唯一参数的CheckDefault构造函数。此构造函数还将param_default初始化为false。没有显式bool的调用会触发不带参数的构造函数。它使用false初始化记录s.value,但将param_default设置为true以注意这是默认值。

编辑显示true和false的输入。

其他人建议使用过载是一个很好的建议。更明确一点,这就是看起来的样子:

void func(int param1) {
    bool b = false;
    // do stuff ...
}

void func(int param1, bool b) {
    // do stuff ...
}