MochiuWiki : SUSE, EC, PCB
案内
メインページ
最近の更新
おまかせ表示
MediaWiki についてのヘルプ
ツール
リンク元
関連ページの更新状況
特別ページ
ページ情報
We ask for
Donations
検索
個人用ツール
ログイン
Toggle dark mode
名前空間
ページ
議論
表示
閲覧
ソースを閲覧
履歴を表示
C++の基礎 - 可変長引数のソースを表示
提供: MochiuWiki : SUSE, EC, PCB
←
C++の基礎 - 可変長引数
あなたには「このページの編集」を行う権限がありません。理由は以下の通りです:
この操作は、次のグループのいずれかに属する利用者のみが実行できます:
管理者
、new-group。
このページのソースの閲覧やコピーができます。
== 概要 == C++で可変長の引数を使用する場合は、テンプレートを用いる必要がある。<br> <br><br> == 可変長引数テンプレート == この方法は、最も簡潔な方法である。<br> <source lang="c++"> template<typename... T> int sum(T... args) { int s = 0; for (int i : std::initializer_list<int>{args...}) { s += i; } return s; } </source> <source lang="c++"> // 使用方法 std::cout << sum(); // 0 std::cout << sum(1); // 1 std::cout << sum(1, 2); // 3 std::cout << sum(1, 2, 3); // 6 </source> <br> パラメータパックT... argsは配列ではないため、for文で処理することはできないが、<br> パラメータパックを初期化リストstd::initializer_listに展開することで、for文を用いた可変長引数の操作が可能になる。<br> <br> '''再帰呼び出しによるパラメータパックの展開'''<br> この方法は、より伝統的な方法である。<br> <br> テンプレート関数(2)が処理の肝である。<br> テンプレート内のtypename... Restという記述により、可変長のテンプレートパラメータを受け取ることが可能になる。<br> また、第2引数Rest... restという記述により、関数呼び出し側の第2引数以降に指定した実引数は、全てこのrestに集約される。<br> これらは、パラメータパックと呼ばれる。(Rest : テンプレートパラメータパック、rest : 関数パラメータパック)<br> <br> 集約された複数の引数はRest...という記述で展開する。(アンパック)<br> 以下のサンプルコードでは、sum(1, 2, 3)という記述は、引数firstに1、引数restに2と3という形に展開される。<br> よって、sum(1, 2, 3)という呼び出しは、関数内ではreturn 1 + sum(2, 3);という展開が行われる。<br> <br> sum(2, 3)は再帰呼び出しとなるため、再びテンプレート関数(2)呼び出され、先程と同じ手順による展開が行われる。(return 2 + sum(3);)<br> 最後に、sum(3)がテンプレート関数(1)に適用される形となる。<br> <source lang="c++"> // (1) template<typename First> int sum(First first) { return first; } // (2) template<typename First, typename... Rest> int sum(First first, Rest... rest) { return first + sum(rest...); } int main(int argc, char *argv[]) { int v = sum(1, 2, 3); std::cout << v; // 6 } </source> <br> これら一連の展開が完了すると、およそ以下のような実行コードが形成されることになる。<br> <source lang="c++"> int sum(int c) { reutrn c; } int sum(int b, int c) { reutrn b + sum(c); } int sum(int a, int b, int c) { reutrn a + sum(b, c); } int main() { int v = sum(1, 2, 3); } </source> <br><br> == 初期化子リスト == 若干趣旨が異なるが、初期化子リストを受け取るためのクラスstd::initializer_listを活用する方法もある。<br> ソースコードの役割を明確化したり、可読性を高めたりするための用途として活用できる。<br> <source lang="c++"> int sum(std::initializer_list<int> list) { int sum = 0; for (int i : list) { sum += i; } return sum; } void test() { int v = sum({1, 2, 3}); std::cout << v; // 6 } </source> <br> <source lang="c++"> return contain(extention, {"cpp", "cc", "cp"}); </source> <br><br> == 可変個数の実引数 == C言語の仕組みを利用する方法もある。<br> この方法は、[[可変長引数を実現する方法(C)|こちらのページ]]を参照すること。<br> <br><br> __FORCETOC__ [[カテゴリ:C++]]
C++の基礎 - 可変長引数
に戻る。
案内
メインページ
最近の更新
おまかせ表示
MediaWiki についてのヘルプ
ツール
リンク元
関連ページの更新状況
特別ページ
ページ情報
We ask for
Donations
Collapse