13,009
回編集
細 (Wiki がページ「可変長引数を実現する方法(C++)」を「C++の基礎 - 可変長引数」に、リダイレクトを残さずに移動しました) |
細 (文字列「<source lang」を「<syntaxhighlight lang」に置換) |
||
5行目: | 5行目: | ||
== 可変長引数テンプレート == | == 可変長引数テンプレート == | ||
この方法は、最も簡潔な方法である。<br> | この方法は、最も簡潔な方法である。<br> | ||
< | <syntaxhighlight lang="c++"> | ||
template<typename... T> | template<typename... T> | ||
int sum(T... args) | int sum(T... args) | ||
18行目: | 18行目: | ||
} | } | ||
</source> | </source> | ||
< | <syntaxhighlight lang="c++"> | ||
// 使用方法 | // 使用方法 | ||
std::cout << sum(); // 0 | std::cout << sum(); // 0 | ||
43行目: | 43行目: | ||
sum(2, 3)は再帰呼び出しとなるため、再びテンプレート関数(2)呼び出され、先程と同じ手順による展開が行われる。(return 2 + sum(3);)<br> | sum(2, 3)は再帰呼び出しとなるため、再びテンプレート関数(2)呼び出され、先程と同じ手順による展開が行われる。(return 2 + sum(3);)<br> | ||
最後に、sum(3)がテンプレート関数(1)に適用される形となる。<br> | 最後に、sum(3)がテンプレート関数(1)に適用される形となる。<br> | ||
< | <syntaxhighlight lang="c++"> | ||
// (1) | // (1) | ||
template<typename First> | template<typename First> | ||
66行目: | 66行目: | ||
<br> | <br> | ||
これら一連の展開が完了すると、およそ以下のような実行コードが形成されることになる。<br> | これら一連の展開が完了すると、およそ以下のような実行コードが形成されることになる。<br> | ||
< | <syntaxhighlight lang="c++"> | ||
int sum(int c) { reutrn c; } | int sum(int c) { reutrn c; } | ||
int sum(int b, int c) { reutrn b + sum(c); } | int sum(int b, int c) { reutrn b + sum(c); } | ||
81行目: | 81行目: | ||
若干趣旨が異なるが、初期化子リストを受け取るためのクラスstd::initializer_listを活用する方法もある。<br> | 若干趣旨が異なるが、初期化子リストを受け取るためのクラスstd::initializer_listを活用する方法もある。<br> | ||
ソースコードの役割を明確化したり、可読性を高めたりするための用途として活用できる。<br> | ソースコードの役割を明確化したり、可読性を高めたりするための用途として活用できる。<br> | ||
< | <syntaxhighlight lang="c++"> | ||
int sum(std::initializer_list<int> list) | int sum(std::initializer_list<int> list) | ||
{ | { | ||
100行目: | 100行目: | ||
</source> | </source> | ||
<br> | <br> | ||
< | <syntaxhighlight lang="c++"> | ||
return contain(extention, {"cpp", "cc", "cp"}); | return contain(extention, {"cpp", "cc", "cp"}); | ||
</source> | </source> |