MochiuWiki : SUSE, EC, PCB
案内
メインページ
最近の更新
おまかせ表示
MediaWiki についてのヘルプ
ツール
リンク元
関連ページの更新状況
特別ページ
ページ情報
We ask for
Donations
検索
個人用ツール
ログイン
Toggle dark mode
名前空間
ページ
議論
表示
閲覧
ソースを閲覧
履歴を表示
C++の基礎 - タプルのソースを表示
提供: MochiuWiki : SUSE, EC, PCB
←
C++の基礎 - タプル
あなたには「このページの編集」を行う権限がありません。理由は以下の通りです:
この操作は、次のグループのいずれかに属する利用者のみが実行できます:
管理者
、new-group。
このページのソースの閲覧やコピーができます。
== 概要 == C++のタプルは、異なる型の要素を固定長で格納できるコンテナ型である。<br> C++11から導入された機能であり、<code>std::tuple</code>として実装されている。<br> <br> 最大の特徴は、複数の異なる型の値を1つの単位として扱えることである。<br> 例えば、整数、文字列、浮動小数点数といった異なる型の値を1つのタプルにまとめることができる。<br> <br> 関数やメソッドから複数の値を返すこともできる。<br> 従来の方法では、参照引数を使用する等の工夫が必要であったが、タプルを使用すれば複数の値を直接返却できる。<br> <br> C++17からは構造化束縛という機能も導入されており、タプルの要素を簡単に個別の変数に分解できるようになった。<br> これにより、可読性の高いコードを記述することができる。<br> <br> また、<code>std::tie</code>を使用することにより、既存の変数にタプルの値を展開、タプル同士の比較を行うことも可能である。<br> <br> ただし、要素数は固定長であり、実行時に要素数を変更することはできないという制約がある。<br> この点は、可変長のコンテナ型であるvectorやlistとは異なる。<br> <br> タプルは、複数の戻り値が必要な関数の実装、または、複数の値をまとめて扱う必要がある場合に有効となる。<br> <br><br> == タプルの作成 == <syntaxhighlight lang="c++"> #include <tuple> std::tuple<int, std::string, double> t = {1, "hello", 3.14}; </syntaxhighlight> <br><br> == 要素へのアクセス == <syntaxhighlight lang="c++"> #include <tuple> int first = std::get<0>(t); // インデックスによるアクセス auto str = std::get<std::string>(t); // 型によるアクセス </syntaxhighlight> <br><br> == std::tieを使用した比較や代入 == <syntaxhighlight lang="c++"> #include <tuple> int x; std::string y; double z; std::tie(x, y, z) = t; // タプルの要素を既存の変数に展開 </syntaxhighlight> <br><br> == 構造化束縛を使用して分解 (C++17以降) == <syntaxhighlight lang="c++"> // 構造化束縛の例 auto [num, text, value] = t; // 各要素を個別の変数に分解 </syntaxhighlight> <br><br> == 外部プロセスから構造化データを受け取る == <u>C++のmain関数の戻り値は、規格上、int型に限定されている。</u><br> そのため、tuple型を直接戻り値とすることはできない。<br> <br> 外部プロセスの戻り値も同様、一般的なOSではint型 (終了コード) のみを返す。<br> <br> もし、外部プロセスからタプル型のデータを受け取る場合、以下に示すような方法がある。<br> * 構造化データをファイルやパイプを通じて受け渡す。 * 環境変数を使用する。 * 標準出力に構造化データ (JSON等) を出力して、親プロセスで解析する。 <br> ==== 標準出力を使用する場合 ==== この方法では、JSON形式でデータを受け渡すことで複数の値を構造化して取得することができる。<br> <br> <syntaxhighlight lang="c++"> #include <cstdio> #include <string> #include <array> #include <nlohmann/json.hpp> std::tuple<int, char, std::string> execute_piyo() { std::array<char, 128> buffer; std::string result; // 外部プロセスの実行 FILE* pipe = popen("./piyo", "r"); while (fgets(buffer.data(), buffer.size(), pipe) != nullptr) { result += buffer.data(); } // JSON形式のデータの取得 int status = pclose(pipe); // JSON形式のデータの解析 auto j = nlohmann::json::parse(result); return std::make_tuple( j["code"].get<int>(), j["character"].get<char>(), j["message"].get<std::string>() ); } </syntaxhighlight> <br> <syntaxhighlight lang="c++"> // これは、外部プロセスとして実行される #include <iostream> #include <nlohmann/json.hpp> int main() { nlohmann::json result = { {"code", 1}, {"character", 'a'}, {"message", "hello"} }; // 標準出力 (送信するJSON形式のデータ) std::cout << result.dump() << std::endl; return 0; } </syntaxhighlight> <br><br> {{#seo: |title={{PAGENAME}} : Exploring Electronics and SUSE Linux | MochiuWiki |keywords=MochiuWiki,Mochiu,Wiki,Mochiu Wiki,Electric Circuit,Electric,pcb,Mathematics,AVR,TI,STMicro,AVR,ATmega,MSP430,STM,Arduino,Xilinx,FPGA,Verilog,HDL,PinePhone,Pine Phone,Raspberry,Raspberry Pi,C,C++,C#,Qt,Qml,MFC,Shell,Bash,Zsh,Fish,SUSE,SLE,Suse Enterprise,Suse Linux,openSUSE,open SUSE,Leap,Linux,uCLnux,Podman,電気回路,電子回路,基板,プリント基板 |description={{PAGENAME}} - 電子回路とSUSE Linuxに関する情報 | This page is {{PAGENAME}} in our wiki about electronic circuits and SUSE Linux |image=/resources/assets/MochiuLogo_Single_Blue.png }} __FORCETOC__ [[カテゴリ:C++]]
C++の基礎 - タプル
に戻る。
案内
メインページ
最近の更新
おまかせ表示
MediaWiki についてのヘルプ
ツール
リンク元
関連ページの更新状況
特別ページ
ページ情報
We ask for
Donations
Collapse