C++相談室 part166 (635レス)
上下前次1-新
抽出解除 レス栞
580(2): デフォルトの名無しさん (ワッチョイ d1d6-uNzz) [sage] 2025/08/22(金) 10:49:05.94 ID:hiXhYkKD0(1/2) AAS
>>579579(2): はちみつ餃子◆8X2XSCHEME (ワッチョイ 5932-86vp) [sage] 2025/08/22(金) 10:34:20.59 ID:s1oN92u00(1/3) AAS
Python でも返却値として複数の値を返すことは出来ない。
Python で return にカンマ区切りで複数の式を書くとタプルになってる。
受け取る側で複数の変数を書いておけばタプルが分配 (unpack) されたりはするけど……
関数が返却しているのはあくまでもひとつの値という理屈。
複数の値 (いわゆる多値) を関数が返せる言語はそれほど多くない。
LISP 系は多値のサポートがあることが多いけどそれ以外だと Go くらいじゃないかな?
(マイナー言語だとわからんけどよく知られている主要な言語にはほとんどないと思う。)
シンタクス的には C++ で return にカンマ区切りで複数の値を渡そうとしたとき、
つまり
return 1, 2, 3;
というように書いたときのカンマはカンマ演算子として解釈される。
カンマ演算子は左辺の結果を捨てる (評価はする) ので 3 だけが返却値になる。
C++ で複数の値をひとまとめにするには波括弧で囲む記法があって
std::tuple<int, int, int> foo(void) {
return {1, 2, 3};
}
というように書けるんだが……
この波括弧は初期化の記法であってタプルのリテラルというわけではないのでそこんところは注意。
受け取る方はどうやって受ければいいのですか?
私の頭だと構造体で返せばいいかな なんつて
581: デフォルトの名無しさん (ブーイモ MMb3-Srv/) [sage] 2025/08/22(金) 11:06:34.54 ID:HM+/3rtsM(1) AAS
>>580
構造化束縛で取り出すのが楽
構造体を定義する手間が気にならないならそれでもいい
583: はちみつ餃子◆8X2XSCHEME (ワッチョイ 5932-86vp) [sage] 2025/08/22(金) 12:07:46.82 ID:s1oN92u00(2/3) AAS
>>580
タプルは単にタプル型の値なので普通に受け取れる。
auto bar = foo();
といったように書ける。
タプルから要素を取り出すのは std::get<0>(bar); といった要領になる。
受け取るときに変数に分配するやり方もあって
atuo [r1, r2, r3] = foo();
というようにも書ける。
これを構造化束縛という。
おそらくこれが期待していたものなんじゃないか?
この記法はタプルに限らずタプルライクな型、配列型、データメンバが全て公開直接メンバであるような型などであれば使える。
上下前次1-新書関写板覧索設栞歴
スレ情報 赤レス抽出 画像レス抽出 歴の未読スレ AAサムネイル
ぬこの手 ぬこTOP 1.181s*