希望誰讀取該知道默認參數:參數列表中任意點的默認參數是否可能?
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
}
使用默認參數的一個缺點是,你必須在列表的末尾開始拖欠參數。有時候這需要將參數重新排列成一個看起來很笨的命令。爲了解決這個問題,必須分開重載。
讓我帶一個窗口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++語言支持。我的問題是:
未來有沒有這種可能性?
例如,編譯器能否在需要時自動生成適當的重載?
不喜歡嗎?使用不同的語言,如Python,它使用[keyword arguments](http://docs.python.org/release/1.5.1p1/tut/keywordArgs.html)。 ['subprocess.Popen'](http://docs.python.org/library/subprocess.html#subprocess.Popen)就是一個很好的例子。 – 2012-04-05 03:06:33
我可以和它一起生活。我只是有興趣知道(可能很多其他人也是如此),如果隨着更新的C++新增功能進入語言,這可能會發生變化。我記得另一種語言(可能是Python)適合傳遞參數,因爲能夠判斷參數是否默認或用戶是否傳遞了默認值。 – chris 2012-04-05 03:10:35
也許閱讀[爲什麼可選參數必須出現在聲明的末尾](http://stackoverflow.com/questions/2896106/why-optional-parameters-must-appear-at-the-end-of-the-declaration ) 可能有幫助。 – 2012-04-05 03:11:48