質問: divmod2(10, 3); std::cout << "q: " << q << ", r: " << r << std::endl; // q: 3, r: 1 } ```
回答: C++標準ライブラリにタプル型(`std::tuple`)が導入されたのはC++11以降と比較的新しいため、OpenCVのように歴史の長いライブラリでは積極的に切り替えてまでは利用されていません。 (OpenCVはもともとC言語APIから始まったほど歴史の古いライブラリですから、保守的にAPIを移行しているようです。最新のOpenCV 4系でようやくC APIが廃止されました。) > > 引数経由だと入力と出力がわかりづらくなるので、可読性の面ではタプルで返すほうが直感的のような気がします。 > > > はい。最新のC++17では 構造化束縛(structured bindings) も導入されたため、Python風の多値返却も可読性高く記述できるようになっています。 ``` #include #include // タプル(int型, string型, double型)を返す関数 std::tuple func(); // 構造化束縛により戻り値タプルから個別変数へ代入 auto [vi, s, vd] = func(); // vi := int型変数 // s := string型変数 // vd := double型変数 ``` C++ Core Guildlinesでも F.21: To return multiple "out" values, prefer returning a struct or tuple にてタプル(や構造体)による多値返却スタイルを推奨しています。