希望读到这里的人都知道默认参数:
void setCase (string &str, int form = UPPERCASE)
{
for (char &c : str)
c = (form == UPPERCASE ? c & ~0x20 : c | 0x20); //this bit differentiates english uppercase and lowercase letters
}
int main()
{
string s1 = "HeLlO", s2 = s1, s3 = s1;
setCase (s1, UPPERCASE); //now "HELLO"
setCase (s2, LOWERCASE); //now "hello"
setCase (s3); //now "HELLO" due to default argument
}
使用默认参数的一个缺点是您必须在列表末尾开始默认参数。有时这涉及将参数重新排列成一个看起来很愚蠢的顺序。为了解决这个问题,必须进行单独的重载。
让我以一个 Window API 函数FindWindow为例,它通过类名、标题或两者来查找窗口:
HWND WINAPI FindWindow( //returns handle to window
__in_opt LPCTSTR lpClassName, //param equivalent to const TCHAR *, classes are like templates for windows
__in_opt LPCTSTR lpWindowName //the text that appears on the title bar (for normal windows, for things like buttons, it's what text is on the button)
);
为了包装这一点,人们可能希望默认搜索选项是标题。有三种理想的实现方式(假设使用了其他包装技术)。完美的解决方案很可能如下:
Window FindWindow (LPCTSTR className = 0, LPCTSTR windowName){...}
第二种解决方案是重载该函数的一个版本以仅接受标题,而另一个版本则接受两者。第三个是切换参数的顺序。
第二个主要问题是对于更长的列表,随着列表的增长,重载的空间量可能会变得非常大。第三个的主要问题是任何事先使用过这个函数的人都会习惯于首先指定类名。这也适用于常规 C++ 函数。参数往往具有自然顺序。
当然,第一个解决方案的主要问题是它不受 C++ 语言的支持。我的问题是:
将来是否有可能实现这一点?
例如,编译器能否在需要时自动生成适当的重载?