X



C++相談室 part165

0249デフォルトの名無しさん (ワッチョイ ef63-uLm/)
垢版 |
2024/02/11(日) 11:18:50.45ID:4PD3HqyC0
>>244
以下の主張のどこが抽象論なのかkwsk、
1. ライブラリのドキュメントに従い、可能な限り例外を生じない使い方で設計する(>>236
2. 例外が生じない前提としたところは例外が生じないことをテストする(m個のオーダー)(>>229
3. 1と2の過程で意図に反して飛んでくる例外がある場合は原因を調査し、修正を試みる(>>228 例外が飛んで来たらバグ
4. 3を意図通りの形で解決できないことが判明した場合は
  (ライブラリの使用方法の当方の誤解、ライブラリのドキュメントの不備、ライブラリの作りの粗さによりこれはあり得る、
  結果的にtry { } catch (/*省略*/) { ... }を付ける可能性もある(>>228
5. 例外を複数段fall-throughか再スローを許し、かつそれが起きた後もプログラムの
  正常な動作の継続を意図する場合はテストケースが爆発する(>>

設計し、検証し、必要とあらばtry { } catch ( ) の追加も含めた修正を行うと言っているのやぞ;;;

いっぽう藻前らの主張は
1. 例外をせき止めれば良い(←処理不能な未知の例外が飛んでくることが無いというライブラリに対する全幅の信頼
2. 例外を処理したりfall-throughしたり再スローしたりする関数はn*a*m個のテストしなくても動くっしょ
 (←自己のコードに対する無制限の気体
3. ドキュメントは100%信頼せず、読まない
の3成分からなるわけやが……
0250デフォルトの名無しさん (ワッチョイ 16cf-BOeC)
垢版 |
2024/02/11(日) 12:01:58.52ID:XOPhWcHA0
>>248
>例外が関数の階層をぶち抜いてfall-throughしてくることを忘れている発言

やっぱり意味不明だな。catchすれば「階層をぶち抜いて」ってことはないわけだが。

>2. fall-throughする関数が例外による処理の中断でおかしいことにならないか(←要テスト!

もしそのテストが必要なんだとすれば、catchしない場合はその例外が通過する
呼び出し階層全部でテストをしなきゃならないってことになるが。
0251デフォルトの名無しさん (ワッチョイ 16cf-BOeC)
垢版 |
2024/02/11(日) 12:31:22.40ID:XOPhWcHA0
>>249
>1. 例外をせき止めれば良い(←処理不能な未知の例外が飛んでくることが無いというライブラリに対する全幅の信頼

なるほどな。
catchする⇒無視する、握りつぶす って脳内変換されてんだな。

catch書いたからといって上に挙げられたようなテストができなくなるわけじゃないっしょ。必要と思うならやればいい。

3.の意図しない例外の原因調査なんて main() に例外が上がってきてプログラムが落ちてからより
発生個所に近い下層で catch できた方がはるかに調査しやすいと思うんだがな。感覚が違うなあ。
0258デフォルトの名無しさん (ワッチョイ 6fac-ND3n)
垢版 |
2024/02/12(月) 16:40:43.94ID:MdmHk5EH0
ふつう年月日はハイフンで区切るよね
0261デフォルトの名無しさん (ワッチョイ f78f-nOVH)
垢版 |
2024/02/12(月) 18:43:50.33ID:zGvIVge80
Windowsでも / をディレクトリ区切り文字として使えるけど(場面は限定的かもしれないけど)、その認識で使ってるのかな…
0267はちみつ餃子 ◆8X2XSCHEME (ワッチョイ 6332-A7R9)
垢版 |
2024/02/13(火) 11:18:57.32ID:T85IlqBy0
>>266
ISO 8901 は情報交換用 (要するに機械同士のやり取り) の時刻フォーマットを定める規格であって
言葉や文章で使うもの (人間が読み書きする目的) ではないと適用範囲の言及がある。
ファイル名はどちらの用途もありうるので >>256 がどのような状況を想定しているかによって
ISO 8901 が適切かどうかは違う。

もし非技術者向けのシステムなら
文化固有の日付表現に対応できてないほうが意識低いという見方もある。
0268デフォルトの名無しさん (ワッチョイ 5ed7-nvep)
垢版 |
2024/02/13(火) 12:55:27.90ID:c63MYIIQ0
>>267
エンドユーザーの文化的背景に配慮したデータフォーマットの利点は、エンドユーザーの知識やメタファーを利用した学習曲線の低勾配化であって、技術的には負の遺産になりやすいことには注意が必要。

典型的には小組織から始まるURLの並びですな。木構造との相性がひどく悪い。
あるいは大きな桁から始まるバイト列とか。あんなの1桁目から始めればエンディアン問題とか無かった。
0269デフォルトの名無しさん (ワッチョイ 12ad-v2JO)
垢版 |
2024/02/13(火) 13:07:38.28ID:mTl8FNrx0
> 典型的には小組織から始まるURLの並びですな。木構造との相性がひどく悪い。
それは人間から見たときと機械から見たときの見やすさの違いでしかないような気がする

でも日本の住所は大きい方から始まるんだよな
アメリカは個人から始まる
文化の違いやけども、日本人は機械生命体だったのかもしれぬ
0271デフォルトの名無しさん (ワッチョイ d62e-RfGy)
垢版 |
2024/02/16(金) 22:41:08.10ID:/bcZ41DF0
enable_shared_from_thisなクラスで、shared_from_this()はコンストラクタの中では
呼べないようですね
コンストラクタの中の処理でthisを渡したい処理があるのですが、どうしたら...
そもそもそれ自体が間違っているのでしょうか
コンストラクタが呼ばれる行の次でその処理を呼べばいいという説もありますが、
現在のコードがそれをやりにくい形になっていて
0272デフォルトの名無しさん (ワッチョイ ef63-uLm/)
垢版 |
2024/02/17(土) 11:55:24.05ID:hsYxYbKj0
>>250
>>2. fall-throughする関数が例外による処理の中断でおかしいことにならないか(←要テスト!
>もしそのテストが必要なんだとすれば、catchしない場合はその例外が通過する
>呼び出し階層全部でテストをしなきゃならないってことになるが。
その通り。テスト不要としたいなら、例外が出た原因を調べて出ないようにするのが筋

原因を調査して対策せずに予防的にテスト不十分のtry { } catch () をてんこ盛りにする方がソフトウェアー品質が上がるという考えのはおかしい

>>251
>catchする⇒無視する、握りつぶす って脳内変換
脳内変換ではなくて、予防的に入れたtry { } catch ()部分のテストが不十分な限り事実じゃーん?

>>252
>本質的にやってること変わらないのに
別に。
return -1; は呼び出し側のバグで見落とすかもしれないが
throw std::logic_error("*** ERR ***"); なら悪評千里を走ってバグの兆候が嫌でもワカル
むしろ予防的なtry { } catch () が例外のメリットをreturn -1; に縮小してゐる
0274デフォルトの名無しさん (ワッチョイ 12ad-hHXc)
垢版 |
2024/02/17(土) 12:35:51.03ID:mUyTgSzm0
テストって想定した動作環境、データ入力に対して想定した動作をするか確認をするわけで
想定しえないエラーや割り込みに対してはテストのしようがないんだけどな
そのための例外処理だろ
0275デフォルトの名無しさん (ワッチョイ 6332-A7R9)
垢版 |
2024/02/17(土) 13:04:42.05ID:4+T7+QKn0
例外が上がってくるってことはどこかで例外を投げてるってことだぞ。
問題が起きたところでその問題に対して例外を投げるという対処をしてる箇所がある。
想定してないなら例外送出すらできないよ。

その上で人間は大きいプログラムの全体を把握することは困難だし
機械的なチェックがしづらいという現実はあるって話だ。
0276デフォルトの名無しさん (ワッチョイ 12ad-hHXc)
垢版 |
2024/02/17(土) 13:33:26.89ID:mUyTgSzm0
アプリケーションを作っているのとOSを作っている人は別
それと同様に利用するライブラリがどのような例外を投げてくるか、もしくはそのライブラリがさらに下位のライブラリから投げられた例外をどう処理しているか
アプリケーション開発者はそれらすべて想定できているとでも?
ハードウェアやシステム含めて全部ひとりで作り上げる(もしくは密に情報共有できている)ならお前の言う通りだけどな
0278デフォルトの名無しさん (ワッチョイ 12ad-hHXc)
垢版 |
2024/02/17(土) 13:56:12.85ID:mUyTgSzm0
俺も、(もしくは密に情報共有できている)なら、と言う話をしているがな

ただ「現実の話」と言うならば、伝わっていないことをコミュニケーションの問題、自動化の問題と言うのはナンセンスだわな

お前自身がこう言っている
> その上で人間は大きいプログラムの全体を把握することは困難だし
> 機械的なチェックがしづらいという現実はあるって話だ。

ではWindowsと言う巨大プログラムにおいてMSの中の人はどの程度全体を把握していて、発生しうる例外を公開しているのか
アプリケーション開発者はその公開情報をもとに *想定し* プログラムを組まなくてはならない
さてアプリケーション開発者はOSなど下位のモジュールから飛んでくる例外をすべて想定できるのか?

そもそも致命的な例外でアプリケーション自身の継続が困難な場合を除いて
どんな例外でもあっても継続的な処理を可能にするのが例外処理だろうに
(ここで言う継続的な処理とは問題なしとして先に進むだけでなく、異常があったとして正常な(処理の)出発点に戻るという意味でもある)
起こりえる例外をすべて想定せずともプログラムを安全に継続するための仕組みが例外処理だろ
0279デフォルトの名無しさん (ワッチョイ 6332-A7R9)
垢版 |
2024/02/17(土) 15:09:15.47ID:4+T7+QKn0
C++ の設計理念としては「そうは言っても現実はこうなっとるやろが!」という
状況に対処する方法があることも大事にしてはいる。 たとえ綺麗な方法ではなくても。

どのような問題が起こりうるのか (それなりには) きちんと想定するのは当然の大前提で、
それでもこれからリリースするソフトウェアに何が起こるかわからんのは仕方がないという話であって、
想定が不十分でも構わないという話でもない。
よくは無いが悪いときでもなんとかなるという程度の仕組みだよ。
0280デフォルトの名無しさん (ワッチョイ e33b-hZ+C)
垢版 |
2024/02/17(土) 15:39:40.77ID:snTd9S980
>>271
一番いいのはコンストラクタの中でthisを渡す部分を何とかすることだけど、それが必ずしも間違ってるかは分からないので
コンストラクタの中だけでその処理が呼ばれるなら生のthisを渡すことを許容しつつ、その処理の呼び出し可能範囲を限定するか
そのクラスの構築をファクトリ関数経由に限定して、ファクトリ関数の中に構築とその処理呼び出しをまとめてしまうとか
0281デフォルトの名無しさん (ワッチョイ 12ad-hHXc)
垢版 |
2024/02/17(土) 15:49:12.98ID:mUyTgSzm0
> 想定が不十分でも構わないという話でもない。
誰もそれで構わないとは言っていないので
それでも起きてしまうエラーや割り込みに対応するための仕組みが例外処理だろ

身も蓋もない言い方をするなら
そもそも想定できているなら事前に排除するだけで済むわけで例外処理の必要もない
(もちろん分かっていても事前に排除せず意図的に例外処理に丸投げすることもあるのは知っている)
アプリケーション開発者にとってもっとも想定できない問題ってのは実行環境に起因するもの
0282デフォルトの名無しさん (ワッチョイ 16cf-BOeC)
垢版 |
2024/02/17(土) 20:37:07.00ID:QSMcEn770
>>272
>原因を調査して対策せずに予防的にテスト不十分のtry { } catch () をてんこ盛りにする方がソフトウェアー品質が上がるという考えのはおかしい

相変わらずずれてるな。 catch する == 原因を調査しない じゃないわけ。

>return -1; は呼び出し側のバグで見落とすかもしれないが
>throw std::logic_error("*** ERR ***"); なら悪評千里を走ってバグの兆候が嫌でもワカル

戻り値のチェック漏れは静的局所的にチェックできるが例外は出てみなけりゃ結局澪とされるわけだが。

リリース後にユーザーサイドでその見落とされていた例外が発生してプログラムが落ちたりしたらそれはただのバグ。
0283デフォルトの名無しさん (ワッチョイ 1e85-XyAm)
垢版 |
2024/02/17(土) 23:18:00.46ID:v62CV0mD0
>>278
> そもそも致命的な例外でアプリケーション自身の継続が困難な場合を除いて
> どんな例外でもあっても継続的な処理を可能にするのが例外処理だろうに

それは幻想
c++の例外安全の達成がどれだけ難しいか理解していないね
簡単にリークするし、オブジェクトが想定外の状態を持ったりする
動作保証ができない
だから仕様に明示されていない例外が来たら基本は終了だよ
そのまま継続してそれが原因でその後別の場所で落ちられたら無駄な調査の手間が増えるだけ
0287デフォルトの名無しさん (ワッチョイ e3f9-NGC7)
垢版 |
2024/02/18(日) 09:39:44.00ID:9f8IS57r0
ぶっちゃけ>>283がなに言ってるのかわからない

継続してそれが原因で?
いやいやw
突如落ちるより、保存できるデータは保存してもらう機会を与えることは出来るだろ
なんでお前は何事もなかったかのように作業を続ける前提でしか話を聞かないんだ?
オブジェクトの状態が変わっているかも?
変更前のデータと比較して変わっていたらユーザに確認すればいいだろ
例えば図形情報のうちTopの読み込みで例外が発生した場合に想定してないからとアプリ落として全情報ロストさせる気か?
Topは0で初期化させ読み込めなかったことをユーザに伝えて修正、もしくは再読み込みの機会を与えるだけの話だろ
0288デフォルトの名無しさん (ワッチョイ cfcf-sYtR)
垢版 |
2024/02/18(日) 09:41:50.12ID:WHoJTRhT0
>>285
>例外の種類しか頭にないのか

>>283が仕様に明示されていない例外を話題にしているからだが。

>任意の場所での例外発生に対応するなん現実的にできないということ

これはどういう意味なんだろうな。
着目するのは自分が呼び出している処理から上がってくる例外に対して例外安全かどうかであって
それは基本的に局所的に判断できるもの。
下層の、例外が通過してきた処理が例外安全な実装になっているかどうかってのはそっちの責務。
0289デフォルトの名無しさん (ワッチョイ e3f9-NGC7)
垢版 |
2024/02/18(日) 12:27:32.99ID:9f8IS57r0
> これはどういう意味なんだろうな。
そうそれ

tryブロックで囲った部分(つまり任意)の例外発生に対応するのが例外処理なのになにが出来ないというのか
想定している例外が発生して継続できると判断したなら続ければいいし
ダメならユーザに通知してもちょも安全な方法を選択させればいい
でもってそれは想定していない例外の発生でも同じ
ただ致命的でどうしようもないなら強制終了させるだけの話で、想定していない例外はなんでもかんでも強制終了じゃ例外処理使う意味が薄まってしまう
0291デフォルトの名無しさん (ワッチョイ 6f5b-ERL4)
垢版 |
2024/02/18(日) 13:22:22.19ID:JX7gxI3D0
>>287
ファイル保存するなとか言ってない
それぐらい終了処理のひとつだろ
ログファイルもシグナルトラップして必ずフラッシュさせるのが常套手段だろ

意味不明な例外が発生しました
データが破損してないかあなたが確認してください
動作無保証ですが処理継続しますか?yes/no

こんなUIだすやつセンスの欠片もない
0292デフォルトの名無しさん (ワッチョイ e304-hmqi)
垢版 |
2024/02/18(日) 14:01:41.78ID:6Yt/CDIt0
私が20代の頃に見かけた論争が今も繰り返されてるのかわいい🩷
0296デフォルトの名無しさん (ワッチョイ bf9a-/DPD)
垢版 |
2024/02/18(日) 18:17:37.55ID:LeQ06zof0
>>280
実生活のあれと似てますよね。「引っ越すことになりました。新住所はXXです」と早めに
連絡したら、気の早い知人がそこに押しかけてきて「なんやまだ引越しとらんやんけ」となる
やはり引越し作業完了を待ってからの方がいいのか。ってちがうか
0297デフォルトの名無しさん (ワッチョイ 1b63-9XlH)
垢版 |
2024/03/02(土) 23:41:07.84ID:C77pR/Zl0
>>282
>相変わらずずれてるな。 catch する == 原因を調査しない じゃないわけ
>249に賛同いただけていないということは、発生してもいない例外について予防的にtry { } catch () を入れようとしていることは
確定的に明らか

で、例外というブツは「例外なく」悪い知らせなので(∵仮に良い知らせを例外で寄越すライブラリがあったらそれ自体悪い知らせである
普通の人は悪い知らせが来る前に処置しようとする。すわなち例外が来ないように(可能な限り)修正する。
try { } catch ( ) でひっかけて原因調査兼確実な修正でざい、それが一番効率が良い方法論である、などと主張するのはおかしい人だけ……
0298デフォルトの名無しさん (ワッチョイ 1b63-9XlH)
垢版 |
2024/03/02(土) 23:49:37.41ID:C77pR/Zl0
>>284
例外安全というもののスコープに対して考察が足りていない

1.
例外安全なオブジェクト foo のデストラクトが他の例外によって引き起こされるケースでは
foo の安全な終了は(メモリかファイルステムか何かが物理的にぶち壊れてOSがパニックになったとかでない限り
ほぼほぼ保たれるから>>284のような言い方はできるっていやーできるが、
システム全体については>>283の通りであって全然安全ではない

2.
fooの中の例外処理が本当に完璧かはfooのコードに書かれている全てのtry { } catch () について
全ての例外発生条件についてテストか厳格めのコードレビューでも行わないことには安全性が担保されない。
(つまり例外安全にした実装したと主張するだけでは話がただちには簡単にはならない
0299デフォルトの名無しさん (ワッチョイ 1b63-9XlH)
垢版 |
2024/03/02(土) 23:57:46.67ID:C77pR/Zl0
それはそうとして、予防的なtry{ } catch () の何が一番駄目かというと、設計上のトレードオフをわけわかんなくすることが確実な点

例外発生後の状況というのはたいてい>>283の通りのわけなので、何かを捨てて何かを取る
(例えばシステムは最悪落ちても構わないが、例外安全なオブジェクトfooでリソースAの整合性は死守する等)
のトレードオフが発生するがそういうのこそ慎重な設計と考慮が必要な事項であることは確定的にあきらか
プログラムの全階層にtry { } catch ()入れたら完璧などというアフォはやっぱtry { } catch () しないのが正しい
0300デフォルトの名無しさん (ワッチョイ 0fcf-0WZ8)
垢版 |
2024/03/03(日) 21:57:15.41ID:735dldsp0
>>298
自分が呼び出す関数が例外安全にできているかどうかと自分の処理が例外安全かどうかをごっちゃにしてるだろ。
しかも、呼び出す関数からドキュメント化されていない想定外の例外が発生するなら例外安全に作られていないだろうという
変な決めつけが混じってる。
例外安全なコードは例外の種類に依存しない。知ってる冷害に対しては安全だけど知らない例外が飛んできたら安全じゃない
なんてのはそもそも例外安全とは言わない。
0305デフォルトの名無しさん (ワッチョイ 8b63-eOBD)
垢版 |
2024/03/04(月) 07:58:21.27ID:KYG2Ugpe0
なんか予想外に低レなレスポンスを寄越した>>299……
さすがに>>283の後に>>284のような楽天的なことを言えるだけのことはあるということか……

例外安全は確かに目指すべき境地であり、例外安全なオブジェクトだけでコードを書けば
その関数は例外安全となる。try { } catch ()など一切不要、となるわけで一見実現が簡単に思える
が、例外安全なオブジェクトだけかをもれなく機械的に確認する方法は無い上に、
中断したら別物になる(処理の順序が命)というアルゴリズムというものの本質的特性により、
>>183 のような try { } catch () が必要なケースは隙あらば混ざり込んでくるから(※1)
>>284が空想するようなシステム全体の例外安全化などは現実には不可能。
せいぜいある程度の規模のオブジェクトであれば、十分テストすれば
(自分が呼び出す関数が例外安全にできているかどうかと自分の処理が例外安全かどうかを慎重に確認せねばならない)
ほぼほぼの信頼度で実現できるというぐらい。
0307デフォルトの名無しさん (ワッチョイ 8b63-eOBD)
垢版 |
2024/03/04(月) 08:09:49.95ID:KYG2Ugpe0
あと寝てて思ったがプロセスが死んでもサービスが継続したらお客様には迷惑を掛けずに済むので
(直接そういうのをやってちるわけではないので強くは言わんが
 ウォッチドッグタイマー的な死活監視で異常あらばプロセス再起動とかマシンを切り替えるとか方法はいくつもあって、
 十分テストされたプログラムならクラッシュ頻度をポアソン分布とみなして信頼度も出せる
やっぱ「お客様の前で落ちたら恥ずかしいから」というつまらないプライドを基本的動機とする
try {
  ....
} catch (std::exception& e) {
  log_e("std::exceptionがスローされました");
};
みたいなコードをリリースコードに含めましょうという>>282の調査のスタンスは全く正当化されない
100日に一回しか再現しないバグの修正を3日でやれと言われて手元にあるのがメモリダンプの代わりに上の23文字のログメッセージだけだったりしたら
>>282は自○が真剣に考慮すべき選択肢に……
0309デフォルトの名無しさん (ワッチョイ 0fcf-0WZ8)
垢版 |
2024/03/04(月) 08:53:34.53ID:gWJ01aQ50
>例外安全は確かに目指すべき境地であり、例外安全なオブジェクトだけでコードを書けば
>その関数は例外安全となる。try { } catch ()など一切不要、となるわけで一見実現が簡単に思える

例外安全だからといってcatchが不要になるわけないだろ。
根本的なところで勘違いしてるから頓珍漢が主張を続けてるわけだな。
0310デフォルトの名無しさん (ワッチョイ abe4-XE6S)
垢版 |
2024/03/04(月) 10:20:12.57ID:QvxlWFfk0
例外安全には基本保証・強い保証・no-fail保証がある
例外がスローされない関数を作ればno-fail保証がある
基本保証や強い保証は例外発生後も不整合が発生しないもの

たとえば例外が発生した関数をもう一度呼び出すと「すでに実行中です」とエラーを返すようなものは例外安全ではない(おそらく実行中フラグ変数が立ったままになっている)
0311デフォルトの名無しさん (ワッチョイ abe4-XE6S)
垢版 |
2024/03/04(月) 10:23:14.03ID:QvxlWFfk0
10行のデータをファイルに出力するとき、例外が発生して5行だけデータが出力されてしまうのは強い保証があるとはいえない
例外が発生した際にデータを書き込む前のファイル状態に戻れば強い保証がある(例外安全である)といえる
0312はちみつ餃子 ◆8X2XSCHEME (ワッチョイ 3b32-hL5K)
垢版 |
2024/03/04(月) 12:10:26.04ID:ASLjljy+0
誤解のないように念のため補足。
この場合の「強い」という用語は性質の分類であって強いことがより良いというわけではないという話をしてる。(んだよね?)
例外を出さずに済むならそれに越したことはないよ。
でも、ひとつの部品の中では問題を解決できないことがあるからこそ例外を用いて他の部品と連携しての解決を試みるわけ。
連携するには保証の強力さよりも保証範囲の明瞭さ (明瞭でもカバーしようがない設計はあかんが) が大事で、プログラム全体で整合性が保たれていれば例外安全と言える。
仕様が不明瞭なライブラリもあるのが現実だってのはそりゃそうだけど、出来が悪い部品とつじつま合わせをしきらないってのは例外のせいでも C++ のせいでもない。
0316デフォルトの名無しさん (ワッチョイ 7b32-B3tP)
垢版 |
2024/04/09(火) 15:22:07.81ID:hsAXyuRl0
>>313
C++ に配列リテラルはない。
その書き方で出てくる波括弧はリスト初期化の構文の一部で、
波括弧の部分単体は配列リテラルではない。

実行時にオブジェクトの構築を避けるならコンパイル時に構築することになるが
それはそれで色々と制約があるんでほんまにそれが必要なんか?
というのはよく考えないといけない。

あえてやるならこんな感じかな……。
https://wandbox.org/permlink/HStrLq8ddyC3tby2
0317デフォルトの名無しさん (ワッチョイ c3c9-hAMa)
垢版 |
2024/04/09(火) 20:10:25.18ID:T/amOWJO0
とあるtemplateの関数を実装しているのですが、
const指定の振る舞いがよくわからなくなったので
質問させてください。

以下の(だいぶ簡略化した)コードで、
f_without_const<const int*>(const int* a)
はコンパイルが通るのですが
f_with_const<int*>(const int* a)
がコンパイルが通らないのは何故でしょうか。

https://wandbox.org/permlink/OIgKM2DTqvpGduRV
0326デフォルトの名無しさん (ワッチョイ 67b1-Jq5A)
垢版 |
2024/05/01(水) 21:36:46.68ID:/DCu7vsT0
python みたいに何でも格納できる辞書型ってC++には無いよね?
0327はちみつ餃子 ◆8X2XSCHEME (ワッチョイ 8732-nVjz)
垢版 |
2024/05/01(水) 22:29:05.62ID:IV4TsWNk0
>>326
要素を std::any にすればだいたいどんな型の値でも入れられる。
いろんな型を入れたところで使うときには元の型として取り出さないといけないから
処理は煩雑になってあまり良いことはないけど。
0336 警備員[Lv.23] (ワッチョイ 1563-WQ8n)
垢版 |
2024/06/06(木) 07:55:41.85ID:Glzej5210
質問なのですが
Q1. std::fstreamでファイルを開くときのフラグの指定の仕方は次のどれが正義?
 std::fstream ofs("foo.txt", std::ios::out | std::ios::binary); // (1)
 std::fstream ofs("foo.txt", std::basic_ios::out | std::basic_ios::binary); // (2)
 std::fstream ofs("foo.txt", std::fstream::out | std::fstream::binary); // (3)
0339 警備員[Lv.23] (ワッチョイ 1563-WQ8n)
垢版 |
2024/06/06(木) 23:36:07.51ID:Glzej5210
(1)は#include <ios>が要るし、
(2)は「basic_」の6文字×フラグの数 だけ長いし、
(3)も同様でありなおかつ>>337に従ったとき
 use binary = std::fstream::binary;
 use ibinary = std::ifstream::binary;
 use obinary = std::ofstream::binary;
となってしまい、
どれもこれもコード量最小化原則的にビミョーなことに……

ていうかなんで同じことをするのに複数の書き方があるのかっていうか、
Perlじゃあるまいし……
0343はちみつ餃子 ◆8X2XSCHEME (ワッチョイ a932-zlCG)
垢版 |
2024/06/07(金) 05:26:04.94ID:zM43Xr/H0
>>342
そういう雑多な話題のちょうどよいスレは見当たらんし、単発で終わる質問程度なら許容されると思うが……。
質問の内容が漠然としているなら丁寧な回答は得られないと思う。
「よくわからない」という状況になるときってのは大抵の場合に関連する前提知識が足りてないので
質問が連鎖的に発生してダラダラ続いたりするから。
レスを投稿する


ニューススポーツなんでも実況