我很确定这是不可能的,但是如果存在(可能通过编译器提供的宏),它对我来说非常有用,所以我在这里发布它。假设我有一个功能:
void func( int param1, bool param2=false){ ... }
param2
已在此处获得默认值。是否有任何机制来确定param2
是否已显式设置为其默认值false
还是自动传递?换句话说,从函数func
中,是否可以区分以下两个调用?我正在使用Microsoft Visual C ++编译器。
func(1, false);
和
func(1);
答案 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 ...
}