前スレ
C++相談室 part155
https://mevius.5ch.net/test/read.cgi/tech/1616555235/
探検
C++相談室 part156
■ このスレッドは過去ログ倉庫に格納されています
1デフォルトの名無しさん
2021/05/19(水) 10:55:13.24ID:LZZifCH22デフォルトの名無しさん
2021/05/19(水) 11:23:50.45ID:b5zC4CMw 乙
2021/05/19(水) 11:31:17.57ID:FIiQfBQ7
乙でございます
4デフォルトの名無しさん
2021/05/19(水) 11:33:27.40ID:psqzmlBB 乙python
2021/05/19(水) 11:36:23.16ID:FIiQfBQ7
前スレの>>989
> 可変個の参照の組 (vectorでいい) を関数 hoge に渡したいときって、hoge が vector< reference_wrapper<T> > を取るようにして
> hoge({ref(A), ref(B), ref(C)})
> みたいに呼ぶか、可変引数テンプレートを使って hoge の中でパースするかっていうのが普通のやり方かな?
なんですが、もしかして reference_wrapper って構築時に左辺値を渡したらそれの参照を保持してくれる?
だとしたら
hoge({A, B, C})
と呼べるしかなりスッキリしますね
hoge 内でいちいち get() しないといけないのはダルいですが……
> 可変個の参照の組 (vectorでいい) を関数 hoge に渡したいときって、hoge が vector< reference_wrapper<T> > を取るようにして
> hoge({ref(A), ref(B), ref(C)})
> みたいに呼ぶか、可変引数テンプレートを使って hoge の中でパースするかっていうのが普通のやり方かな?
なんですが、もしかして reference_wrapper って構築時に左辺値を渡したらそれの参照を保持してくれる?
だとしたら
hoge({A, B, C})
と呼べるしかなりスッキリしますね
hoge 内でいちいち get() しないといけないのはダルいですが……
2021/05/19(水) 12:17:48.45ID:5AVKLAl8
継承や委譲との付き合い方がよく分からなくなった
あるクラスの機能を全部持っていてほしいが is-a 関係がないとかで継承関係にはないように思える場合ってどうすんの
例えば一辺の長さを表す変数やはみ出し判定メソッドを持つ「グリッド座標クラス」があったとして、今「オセロを解くクラス」を作りたいとき
オセロを解くこと is a グリッド座標では全くないし継承するのは頓珍漢に思える
一方で「オセロを解くクラス」がグリッド座標のインスタンスを委譲として持っていたとして、盤の大きさとかはみ出し判定メソッドにわざわざ「グリッド座標クラス」のインスタンスを通してアクセスするのも果たして正しいだろうか
例えば盤面 a と盤面 b を同時に持ったりもするだろうが、a.size() とか b.size() は同じものを表すのでこのようにアクセスするのは可読性を損なう
だから「オセロを解くクラス」は盤面の大きさとかはみ出し判定メソッドを自分のメンバとして持っていてほしいが、継承するべきようにも思えない
あるクラスの機能を全部持っていてほしいが is-a 関係がないとかで継承関係にはないように思える場合ってどうすんの
例えば一辺の長さを表す変数やはみ出し判定メソッドを持つ「グリッド座標クラス」があったとして、今「オセロを解くクラス」を作りたいとき
オセロを解くこと is a グリッド座標では全くないし継承するのは頓珍漢に思える
一方で「オセロを解くクラス」がグリッド座標のインスタンスを委譲として持っていたとして、盤の大きさとかはみ出し判定メソッドにわざわざ「グリッド座標クラス」のインスタンスを通してアクセスするのも果たして正しいだろうか
例えば盤面 a と盤面 b を同時に持ったりもするだろうが、a.size() とか b.size() は同じものを表すのでこのようにアクセスするのは可読性を損なう
だから「オセロを解くクラス」は盤面の大きさとかはみ出し判定メソッドを自分のメンバとして持っていてほしいが、継承するべきようにも思えない
2021/05/19(水) 12:37:51.61ID:mqAmVEur
複数の盤面持つんならメンバで持つ一択だと思うけど
「解くクラス」に外部からはみ出し判定アクセスするのもおかしな話だけど
描画の都合とかで外部からアクセスするのが欠かせないなら、インデックス受け取って盤面の参照返すメンバ関数でも用意すればいい
「解くクラス」に外部からはみ出し判定アクセスするのもおかしな話だけど
描画の都合とかで外部からアクセスするのが欠かせないなら、インデックス受け取って盤面の参照返すメンバ関数でも用意すればいい
2021/05/19(水) 12:44:45.80ID:mqAmVEur
あ、あるいは解くクラスが単に外部の盤面を参照する形でもいいかもね
2021/05/19(水) 12:46:25.42ID:5AVKLAl8
>>7
> 複数の盤面持つんならメンバで持つ一択だと思うけど
「オセロを解く」といった時点で盤の大きさ等決まるんだから、自分のメンバとして基本的な機能持っててほしいと思うんですが、偏った考え方ですかね
> 「解くクラス」に外部からはみ出し判定アクセスするのもおかしな話だけど
そう思います
> 複数の盤面持つんならメンバで持つ一択だと思うけど
「オセロを解く」といった時点で盤の大きさ等決まるんだから、自分のメンバとして基本的な機能持っててほしいと思うんですが、偏った考え方ですかね
> 「解くクラス」に外部からはみ出し判定アクセスするのもおかしな話だけど
そう思います
2021/05/19(水) 12:47:08.07ID:5AVKLAl8
>>8
それはインスタンスとして盤面を持つという意味ではなくですか?
それはインスタンスとして盤面を持つという意味ではなくですか?
2021/05/19(水) 12:51:42.12ID:NOe9g/vN
フロント部分とオセロを解くソルバー部分で持ち方変えるってのが普通
2021/05/19(水) 12:52:13.78ID:mqAmVEur
そう、内包しようとしない方が自然かもしれない
(読んだ範囲で勝手に考えてるだけだけど)
例えばその解くクラスってのがAI的に自動で解くクラスなら、じゃあその対戦相手に同じ(だがインスタンスは別)AIや
プレイヤーが参戦したらどうなるんだ?と考えると
盤面は独立してるほうが自然な気はする(個人の見解です
(読んだ範囲で勝手に考えてるだけだけど)
例えばその解くクラスってのがAI的に自動で解くクラスなら、じゃあその対戦相手に同じ(だがインスタンスは別)AIや
プレイヤーが参戦したらどうなるんだ?と考えると
盤面は独立してるほうが自然な気はする(個人の見解です
2021/05/19(水) 12:54:28.27ID:A2sERbZl
>>6
オセロを解くアルゴリズムとオセロをプレイするモデル次第なのでなんとも。
まあ、オセロを解くんだったら多数のオセロ盤を持つだろうから、グリッドクラスを派生させてオセロ盤クラスを作るだろうな。
人間がオセロをプレイするのを素直にモデル化してもいいけど、ゲーム機のオセロゲームをプレイするようにモデル化したほうが、オセロを解く側のミスや負担が減る。
オセロを解くアルゴリズムとオセロをプレイするモデル次第なのでなんとも。
まあ、オセロを解くんだったら多数のオセロ盤を持つだろうから、グリッドクラスを派生させてオセロ盤クラスを作るだろうな。
人間がオセロをプレイするのを素直にモデル化してもいいけど、ゲーム機のオセロゲームをプレイするようにモデル化したほうが、オセロを解く側のミスや負担が減る。
2021/05/19(水) 13:23:50.34ID:5AVKLAl8
2021/05/19(水) 13:26:27.55ID:5AVKLAl8
16デフォルトの名無しさん
2021/05/19(水) 14:13:31.63ID:TD1RuTos かんたんだろ
色々判定してくれるオセロ妖精すなわち神を作ればいい
色々判定してくれるオセロ妖精すなわち神を作ればいい
2021/05/19(水) 14:28:08.35ID:mqAmVEur
>is-a を満たさなくても機能を全部引き継ぐなら
どちらも自分で書いてるしグリッドクラスも継承を想定して作れるんだからそれでいいとおも
他人の書いた継承を想定してなさそうなのはやめといた方がいいけどね
てかis-a,has-aはあくまで迷ったときの指針に過ぎんし自分で継承が良さそうと感じたならそれで正解だよ
どちらも自分で書いてるしグリッドクラスも継承を想定して作れるんだからそれでいいとおも
他人の書いた継承を想定してなさそうなのはやめといた方がいいけどね
てかis-a,has-aはあくまで迷ったときの指針に過ぎんし自分で継承が良さそうと感じたならそれで正解だよ
2021/05/19(水) 14:43:02.57ID:A2sERbZl
>>15
この場合、is-aは「グリッドとして同一視できる」を意味するから、オセロ盤をグリッドとして扱うことができるのなら継承もあり。
ただc++の継承は、継承元を総称として扱うという強い意味(継承元と派生クラス全体の強い結びつき)もあるのに注意。
オセロ盤とかその他のゲーム盤とかのクラスを(グリッドとして)使うということでもなければ、継承しないほうが設計の自由度を保てる。
この場合、is-aは「グリッドとして同一視できる」を意味するから、オセロ盤をグリッドとして扱うことができるのなら継承もあり。
ただc++の継承は、継承元を総称として扱うという強い意味(継承元と派生クラス全体の強い結びつき)もあるのに注意。
オセロ盤とかその他のゲーム盤とかのクラスを(グリッドとして)使うということでもなければ、継承しないほうが設計の自由度を保てる。
2021/05/19(水) 14:53:47.60ID:5AVKLAl8
>>18
> ただc++の継承は、継承元を総称として扱うという強い意味(継承元と派生クラス全体の強い結びつき)もあるのに注意。
まさに、そういった意味論的なところで悩んでいます
まあ実際にオセロソルバを作ろうとしているわけではないのですが、同じような局面に何度も出くわして、継承も委譲もどうも適切でないように思えて最終的に「グリッドクラス」の中身をコピペして「オセロソルバクラス」を作るようなこともしばしばしてしまいます
> ただc++の継承は、継承元を総称として扱うという強い意味(継承元と派生クラス全体の強い結びつき)もあるのに注意。
まさに、そういった意味論的なところで悩んでいます
まあ実際にオセロソルバを作ろうとしているわけではないのですが、同じような局面に何度も出くわして、継承も委譲もどうも適切でないように思えて最終的に「グリッドクラス」の中身をコピペして「オセロソルバクラス」を作るようなこともしばしばしてしまいます
2021/05/19(水) 15:26:58.77ID:mqAmVEur
そんなん言い出したらメタプログラミングで取り入れるメンバを選択するための継承なんか全部アウトだぞ
STL内部でやってるようなのも全部
ていうか
>まあ実際にオセロソルバを作ろうとしているわけではないのですが
>まあ実際にオセロソルバを作ろうとしているわけではないのですが
>まあ実際にオセロソルバを作ろうとしているわけではないのですが
STL内部でやってるようなのも全部
ていうか
>まあ実際にオセロソルバを作ろうとしているわけではないのですが
>まあ実際にオセロソルバを作ろうとしているわけではないのですが
>まあ実際にオセロソルバを作ろうとしているわけではないのですが
2021/05/19(水) 15:43:24.71ID:LZZifCH2
継承でできることを別の手段でもできるって言ってるだけでは説得力がない
そんなん言い出したらC++でできることをCで擬似コード書けるしな
特にコード量が増える「別の手段」を推奨するには
格段に強い理由がないと誰も動かせない
そんなん言い出したらC++でできることをCで擬似コード書けるしな
特にコード量が増える「別の手段」を推奨するには
格段に強い理由がないと誰も動かせない
2021/05/19(水) 16:02:58.49ID:XxOLfc+T
cpprefjp によると std::swap の実装って
void swap(T& a, T& b){
auto tmp = move(a);
a = move(b);
b = move(tmp);
}
みたいな感じですよね?
よくされる「move された後のオブジェクトはどうなってる保証もないのでもう触るべきでない」みたいな説明に照らせば、上のコードは move した後のオブジェクトを再利用してるけど大丈夫なのかなって思ってしまいます
大丈夫なんでしょうか?
また、参照をmoveしたら当然参照元のオブジェクトが「どうなってる保証もない」と考えるべきなんでしょうか?
void swap(T& a, T& b){
auto tmp = move(a);
a = move(b);
b = move(tmp);
}
みたいな感じですよね?
よくされる「move された後のオブジェクトはどうなってる保証もないのでもう触るべきでない」みたいな説明に照らせば、上のコードは move した後のオブジェクトを再利用してるけど大丈夫なのかなって思ってしまいます
大丈夫なんでしょうか?
また、参照をmoveしたら当然参照元のオブジェクトが「どうなってる保証もない」と考えるべきなんでしょうか?
2021/05/19(水) 16:39:28.28ID:XxOLfc+T
もう一個質問させてください
引数に参照をとる関数に一時オブジェクトを渡したいこともあるんですが、この場合は const参照か右辺値をとる関数としてオーバーロードするしかないですよね?
引数に参照をとる関数に一時オブジェクトを渡したいこともあるんですが、この場合は const参照か右辺値をとる関数としてオーバーロードするしかないですよね?
24デフォルトの名無しさん
2021/05/19(水) 16:43:38.10ID:TD1RuTos >MoveConstructibleかつMoveAssignable
こうなってるからヨシ!
こうなってるからヨシ!
2021/05/19(水) 19:24:14.37ID:8oBHesVz
>>1
お疲れ様です
お疲れ様です
■ このスレッドは過去ログ倉庫に格納されています
ニュース
- 【速報】 中国国営新聞社 「日本はすでに代価を支払った」 中国SNSで1位に 高市総理の発言めぐり ★2 [お断り★]
- 小泉進次郎防衛相「共産党が日本の弾薬の数や配備を質問してきた、そんなこと言うわけない、手の内を見せるべきではない」 [お断り★]
- スペイン、移民受け入れで成長 1人当たりGDP日本超え [蚤の市★]
- 中国国連大使「日本が中国に武力行使すると脅しをかけたのは初めて」 国連事務総長に書簡★7 [♪♪♪★]
- 【イタリア】ベネチアの運河が緑に、環境活動家グレタ・トゥンベリさんを含む気候活動家が抗議で国内10都市の運河などに染料流し込む [ぐれ★]
- 【芸能】上沼恵美子「大っ嫌いになった…マネジャーが良くない」ゲスト女優の好感度が急降下 「彼女もイケ好かん子やったけどな」 [冬月記者★]
- 他サポ 2025-263
- 【DAZN】フォーミュラGP【F1 2 3 SF P】Lap1808
- 【フジテレビ】2025 FORMULA 1【NEXT】Lap602
- 2025 SUPER FORMULA Lap20
- 【DAZN】フォーミュラGP【F1 2 3 SF P】Lap1809
- とらせん 2
- 小野田大臣に「混血の雑種」…誹謗中傷が限界突破 [545512288]
- ニコニコニッコリ日曜日😆のええよぉっ⁉⁉ちゅちぇっ👶連呼し放題スレ
- 高市早苗、G20遅刻、夕食会欠席 🦎「アタシ絶ッッッ対中国に謝らないから!😡」 [165981677]
- お前ら彼女が膝枕してる時に特大の屁こいたら許せる?
- アベノミクス生みの親「なんで高市はインフレなのに積極財政してんだ?」「なんで利上げしないの?」 [237216734]
- 働いてもねーくせに政治語ってんじゃねえよって言われたんだが
