これを読んだ人なら誰でもデフォルトの引数について知っていることを願っています:
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
}
デフォルトの引数を使用することの 1 つの欠点は、デフォルトの引数をリストの最後から開始する必要があることです。場合によっては、引数を並べ替えて、使用するのがかなりばかげているように見えることがあります。これを回避するには、個別のオーバーロードを作成する必要があります。
例として、クラス名、タイトル、またはその両方を介してウィンドウを検索するウィンドウ 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)
);
これをラップするために、デフォルトの検索オプションをタイトルにしたいかもしれません。これを実装するには、3 つの理想的な方法があります (他のラッピング手法が使用されていると仮定します)。完璧な解決策は、次のようになる可能性があります。
Window FindWindow (LPCTSTR className = 0, LPCTSTR windowName){...}
2 番目の解決策は、関数の 1 つのバージョンをオーバーロードしてタイトルのみを受け入れ、別のバージョンを両方を受け入れることです。3 つ目は、パラメーターの順序を切り替えることです。
2 番目の主な問題は、長いリストの場合、リストが大きくなるにつれて、オーバーロードによるスペースの量が非常に大きくなる可能性があることです。3 番目の主な問題は、以前にこの関数を使用していた人は、最初にクラス名を指定することに慣れていることです。これは、通常の C++ 関数にも当てはまります。パラメータは自然な順序を持つ傾向があります。
もちろん、最初の解決策の主な問題は、C++ 言語でサポートされていないことです。私の質問は
、これが将来利用可能になる可能性はありますか?
たとえば、コンパイラは必要に応じて適切なオーバーロードを自動的に生成できますか?