C++相談室 part141

■ このスレッドは過去ログ倉庫に格納されています
2019/02/22(金) 03:07:43.52ID:MgOIx7iK
次スレを立てる時は本文の1行目に以下を追加して下さい。
!extend:on:vvvvv:1000:512

C++に関する質問やら話題やらはこちらへどうぞ。
ただし質問の前にはFAQに一通り目を通してください。
IDE (VC++など)などの使い方の質問はその開発環境のスレにお願いします。

前スレ
C++相談室 part137 (正しくはpart138)
http://mevius.5ch.net/test/read.cgi/tech/1535353320/
C++相談室 part139
https://mevius.5ch.net/test/read.cgi/tech/1538755188/
C++相談室 part140
https://mevius.5ch.net/test/read.cgi/tech/1547326582/

このスレもよろしくね。
【初心者歓迎】C/C++室 Ver.103【環境依存OK】
https://mevius.5ch.net/test/read.cgi/tech/1530384293/

■長いソースを貼るときはここへ。■
 http://codepad.org/
 https://ideone.com/

[C++ FAQ]
https://isocpp.org/wiki/faq/
http://www.bohyoh.com/CandCPP/FAQ/ (日本語)

----- テンプレ ここまで -----
-
VIPQ2_EXTDAT: default:vvvvv:1000:512:----: EXT was configured
2019/03/15(金) 20:59:33.43ID:UMZlK7qa
江添勝てなかったか・・
2019/03/15(金) 21:09:50.31ID:2KXTO6ja
>>336
微妙に修正はされてる。
てかクソなc++本読むよりかよっぽど各機能の利点、問題点が簡潔に書けてると思うが。
2019/03/15(金) 21:13:26.14ID:BCAT3j7k
まだひっくり返る可能性はあると思うね
2019/03/15(金) 21:50:38.17ID:fLDhqMRG
>>335
pimplに限った話じゃないけど、前方宣言とそれによる定義の隠蔽が推奨されていない。
2019/03/15(金) 22:07:25.54ID:qA/WFgyI
Googleはな
2019/03/15(金) 22:38:20.91ID:4qwaELjT
>>338
大規模なところでも例外禁止あるから
mozillaもそうでしょ
AAAなゲームスタジオでも多い
性能引き出したかったらそういう厳しい制約がいるんだよ
2019/03/15(金) 22:40:04.57ID:q2a9nFaz
>>352
グーグルのガイドラインが極端なのは当たり前だ。
超巨大なエコシステムで成り立ってるわけだし。
例外を使わない派がしばしばグーグルのガイドラインを持ち出すんだけど、
そのガイドラインにすら、最初から設計してたら違ったかもしれないという
文言があるので、 C++ を使った設計理念一般としての強い根拠にならんのよな。

私としては、一般的な C++ での設計の参考にするべきは標準ライブラリだと思う。
標準ライブラリはその言語の思想をよりはっきりと体現するものだし、
それに沿って作ったものは連携しやすくもある。
(昔からあるライブラリの一部は変な個所もあるが。)

>>346
C++ はクソ設計でもどうにか形には出来るっていう方向性だと思う。
まともな設計ならそれが一番良いにきまってるけど、
それが期待できない場合が大半だという現実がある。
360KAC
垢版 |
2019/03/15(金) 22:48:06.41ID:rqfh3/aR
例外禁止とかの環境って、
newの失敗とか毎回チェックするの?
2019/03/15(金) 22:54:50.21ID:2KXTO6ja
規約を守る守らんってことにしか目がいかんのな。
やっぱ馬鹿ばっかだわ。
2019/03/15(金) 22:54:57.62ID:12ZNVc6t
>>360
newの失敗のチェックって何するの?
null返ったかどうかのチェック?
2019/03/15(金) 23:03:42.33ID:L+hp7qbL
例外処理機構が無かったら、メモリ確保に失敗しても、
そこから過去のロールバックができない

自己流で、long jump するぐらいなら、例外処理の方がよい
2019/03/15(金) 23:09:45.82ID:12ZNVc6t
>>363
いや、失敗したら駄目だろ。失敗しないのが正しい。
プログラミング言語如きが考慮すべき問題ではない。
2019/03/15(金) 23:18:26.60ID:fLDhqMRG
>>363
そのロールバックってのはCとmallocじゃできないようなものなのかな。
2019/03/15(金) 23:25:12.09ID:qA/WFgyI
new失敗とかコンピュータが壊れてるからチェックしても意味ない
2019/03/15(金) 23:27:22.88ID:qA/WFgyI
当然特殊なケースは除くからな
一応言っておかないと組み込みガー君とか宇宙線でエラーガー君が飛んでくるからな
2019/03/15(金) 23:37:27.23ID:WyRx2/31
>>359
>私としては、一般的な C++ での設計の参考にするべきは標準ライブラリだと思う。
設計ではなく使い方の参考に、という意味では賛成だけど
テンプレートバリバリの設計はあまりにもコストがかかるというのを知っといて欲しい
ああいうのは湯水のごとく時間をかけられるからやれるんであって
2019/03/15(金) 23:38:17.19ID:iTKvW/zw
きみらはあれか、元記事とか全然読まずにコメントするクチか
リンク元には「例外は全く新規のプロジェクトならデメリットよりメリットが優先するので使って良い。
ただ既存のグーグルプロジェクトは元々例外を想定していないのでこれに例外のパターンを導入する
とリスクのほうが多いのでやめるべき。ただし Windows については例外がある(駄洒落ではない)」
と書いてあるんだがちゃんと読んだか。ちなみに駄洒落ではない、は俺が追加したのでなく元の文にある
2019/03/15(金) 23:45:56.39ID:q2a9nFaz
>>368
そんな極端な意味では言ってない。
手間が合理的な範囲内で「参考」には出来るよって程度の話。
2019/03/15(金) 23:48:42.07ID:5dVML2o5
エラーにはリカバリーすべきものとそうでないものがある
あとそのエラーが起こる頻度の違い

リカバリーしないものはその時点で即死するのが正しい
リカバリーするものでかつエラーが普通に起こるものはエラーコードで処理するのが正しい

となると残りのリカバリーするものでかつたまにエラーがおこるようなのが例外にする価値があるエラー
あと例外発生時のunwindが重いからそれでも問題にならないもの
となるとあんまり使えるとこないんだよね
そういうわけで最近例外なしの言語がでてきてる流れなんだろう
372KAC
垢版 |
2019/03/15(金) 23:51:56.30ID:rqfh3/aR
>>366
コンピュータが壊れない限りメモリ確保が失敗しない環境って凄いな。。。
2019/03/15(金) 23:54:45.92ID:qA/WFgyI
出、出〜www
一名いらっしゃいましたwww
2019/03/16(土) 00:07:16.61ID:HR8X4dmV
例外ってcatchしなきゃ投げたその場で落ちてくれるのがこの上なく便利だろう
問題残したまま実行続けて別の関係ないところで落ちるのが最悪
runtimeで落ちて困るような用途でも、
ソースコードあるやつなら静的解析で例外発生箇所網羅出来そうなものだが
網羅できればリソースリークする危険な場所わかるし、対処も出来るのにね

逆にソースコード無いライブラリやダイナミックリンクする奴は、例外含めて外部仕様としてかっちり決まっているべきものじゃね
2019/03/16(土) 00:11:00.29ID:oXtW8C30
>>374
> 例外ってcatchしなきゃ投げたその場で落ちてくれるのがこの上なく便利だろう

その場じゃなくstackが全部巻き戻ってからでしょ
2019/03/16(土) 00:15:00.35ID:U94TV9G4
>逆にソースコード無いライブラリやダイナミックリンクする奴は、例外含めて外部仕様としてかっちり決まっているべきものじゃね
んなもんコンテナで隔離する以外使い道ねーわ。
2019/03/16(土) 00:18:04.69ID:HR8X4dmV
>>376
仕様ってのは例外外に出すか出さないか、
出すなら出し得る例外の種類のリスト
出さないならエラー毎にエラーコードやら返し方やら決めるって話
2019/03/16(土) 00:23:45.45ID:oXtW8C30
そうなんだよね
例外の仕組みわかってないやつは平気で動的ライブラリの界面に
例外使ったりするんだよね
あと標準ライブラリ丸出しにするやつもしかり
それ誰も互換性保証してねーから
379デフォルトの名無しさん
垢版 |
2019/03/16(土) 00:24:47.11ID:UXq90ll9
>>376
核戦争を生き抜くには。
2019/03/16(土) 00:24:57.90ID:HR8X4dmV
まあ標準ライブラリの例外の使い方のおかしさも気になるが

std::stoiで例外投げるバージョンしか無い上に何故かlogic_error扱いのinvalid_argumentやout_of_range投げる

いや、これ出る状況普通runtime_errorだよね
2019/03/16(土) 00:29:24.58ID:cz3ooqCT
>例外含めて外部仕様としてかっちり決まっているべきものじゃね

そこを言語の機構で保証できない、動的言語みたいななあなあ状態なのが残念なところだね。
それをきっちり保証しようとした検査例外はそれはそれで扱いづらいところがあるし。
2019/03/16(土) 00:29:25.98ID:U4afEAjj
>>371
リカバリーするかしないか、頻度が高いか低いか、どちらもプログラム(特にライブラリ)を書いてる時点では
言い切れないから困るんですよねぇ。
383デフォルトの名無しさん
垢版 |
2019/03/16(土) 00:36:35.46ID:UXq90ll9
そこでプロパティ型なんですよ。
2019/03/16(土) 06:11:19.71ID:7Yfqh0Zg
>>372
無限にnewできる理想郷に住んでるんだろw
相手しなくていいよ
385デフォルトの名無しさん
垢版 |
2019/03/16(土) 06:46:32.47ID:TLiwIm0H
復旧不可能な例外もあれば、些細な例外もあるよね。
戻り値チェックで十分でしょと思うようなところで例外を投げるJava/C#みたいな流儀だと、いちいちキャッチするのが面倒。
386デフォルトの名無しさん
垢版 |
2019/03/16(土) 06:52:39.99ID:TLiwIm0H
Cでは戻り値で判定できたはずのエラー種別が例外クラスで細かく分類されてしまったことで、
エラー処理で書かなければならないコード量が増えて例外のキャッチ漏れまで起きる危険性が生み出された。
2019/03/16(土) 07:31:06.00ID:5/K53Ire
その程度の知識で語ってる奴は戻り値方式でも処理漏れするだろw
2019/03/16(土) 07:35:15.72ID:/kg6KhNe
例外の嫌なところは
処理できない案件を低水準側に丸投げするところなんだよな…

ユニックスのプロセスの死亡順序もそうだが、
計算機業界は常識が逆転してゐる…
2019/03/16(土) 07:38:02.24ID:/kg6KhNe
というわけでおそらくアプリの設計シチュの99%ぐらいは
 例外発生=プログラムの死亡
、とみなして良いはず
ここまで割り切るならはじめて例外はお手軽で便利と言える
390デフォルトの名無しさん
垢版 |
2019/03/16(土) 12:28:02.50ID:UXq90ll9
例外をキャッチしたらプランBに移行するのが、真の戦闘のプロ。
2019/03/16(土) 12:49:25.73ID:V15J7n/y
例外なんてグローバル変数みたいなもの。
だから低レイヤで使うのは仕方ない
2019/03/16(土) 12:50:47.84ID:jRc2/nMs
std::cin >> a;

は入力を延々と待っている。
これ別スレッドから止めさせる方法はありますか?
2019/03/16(土) 13:10:50.41ID:V15J7n/y
stdin閉じるとどうなる?
2019/03/16(土) 15:40:22.15ID:/kg6KhNe
(組み込みはともかくアプリの場合は呼び出し元の方が高水準レイヤにあたるのではないかというツッコミが来ると思ったが
 来なかったので黙っていよう…
2019/03/16(土) 17:27:11.59ID:/kg6KhNe
>>390
プランBったって、プログラム起動時にあらかじめmallocしておいた何キロバイトかをfreeして
ダイアログを出して[OK]で終了、ぐらいなんじゃ…
2019/03/16(土) 19:15:22.19ID:zOgp3uDK
>>388
いや、プログラムでは、呼び出し側の方が高レベル、呼び出された側が低レベル
なので、呼び出された側が例外を投げた場合、高レベル側の関数で処理できる
ので適切。
397デフォルトの名無しさん
垢版 |
2019/03/16(土) 20:00:47.57ID:TLiwIm0H
多くの例外の基底クラスになる exception にエラーコード整数値を出力する関数があればもう少しC寄りのエラー処理ができたと思うのだが。
既存のexceptionメンバ関数 const char *what() だけでは扱いが困難。
398デフォルトの名無しさん
垢版 |
2019/03/16(土) 20:14:28.85ID:1JRLHvWf
std:::to_string();
2019/03/16(土) 20:14:39.74ID:w9XKSp7E
>>397
必要ならそういうクラスを定義するだけだろ
2019/03/16(土) 20:15:00.26ID:1JRLHvWf
sage
2019/03/16(土) 20:39:18.42ID:cz3ooqCT
ユーザーにエラー原因を示すだけならconst char*でも大して問題ないし、
catchした側でエラーコードによって何かするというのはたいていアンチパターン。
2019/03/16(土) 22:15:57.75ID:HR8X4dmV
文字をwchar_tで処理しているプログラムだと例外文字列作るのが面倒
まあ詳細な情報出さずに固定文字列にしてしまえばいいんだけど
2019/03/17(日) 00:42:25.28ID:OzxlZzXh
templateの使い道がいまいちわからん
STLやboostみたいなものは非常に有益だが

同僚がドヤ顔でコンテナを作ったって自慢してたが、
stlのコンテナを使わずにそいつのコンテナを使う理由が無い
2019/03/17(日) 00:46:12.21ID:aA4z/LNt
>>403
困ってないなら使わなくてもいいと思うよ。
困る場面がある人のための機能。
2019/03/17(日) 00:48:31.10ID:UT79+Nc/
同じコードをコピペしなくて済むから、作業量も減るし、保守も楽になる。
2019/03/17(日) 00:56:16.88ID:NYZE0cFr
>>403
せやな
ただそれは作るものの需要の有無の問題だ
2019/03/17(日) 00:58:29.44ID:aA4z/LNt
重複があることを事前に発見するのは難しい場合もあるから、
同じことを何度も書いている気がするなと思ったら
どうにかしてまとめることを検討するという程度でもいいかもね。

同じことをしないようにする、いわゆる DRY 原則というものはあるけど、
一方で、それを意識するあまりしなくてよい抽象化層を設けるのも馬鹿らしいということで、
必要になってからやるという YAGNI という考え方もある。

こういうのは程度問題なので、なんでもほどほどにね。
2019/03/17(日) 01:15:02.15ID:7ciqStwp
テンプレート(のパラメータにおける型の自動推論)と
関数のオーバーロードの合わせ技によるコードのまとめ力は異常
2019/03/17(日) 01:37:37.76ID:7ciqStwp
例えばストレージからintを読み込む関数、doubleを読み込む関数、unsigned charを読み込む関数を
同じ関数名と同じ引数の並び(例えばbool read(FILE* fp, <目的とする型>& x とか)ででオーバーロードしておけば、
template<class T1, class T2, class T3>
bool read_x3(FILE* fp, T1& x1, T2& x2, T3& x3) {
 if (!read(fp, x1)) { return false; }
 if (!read(fp, x2)) { return false; }
 if (!read(fp, x3)) { return false; }
 return true;
}
でもって、オーバーロードを実装した任意の型3個の組み合わせについて読込関数が実体化される
(実装されていない型に行き当たったらエラーになるからワカル
これはn個の関数と1個のテンプレートを書いただけで、n^3パターンもののユースケースに網羅的に対応できたことになるからスゲー強力

※ 個人の感想です
410デフォルトの名無しさん
垢版 |
2019/03/17(日) 01:43:06.21ID:Jta37aFk
>>409
そこはfpも抽象化でしょ。
intハンドル、FILE*、iostream、HANDLE などなど派生関係のないものをtemplate化できる。
2019/03/17(日) 01:44:01.66ID:7ciqStwp
なおこのテクをつきつめれば、テンプレートの特殊化というのは普通の意味では要らなくなるキモス、
むしろ特定の型の組み合わせについて自動展開を禁止したいときに使う
(例えば可変長データのread関数を、データの先頭にデータの個数を書く約束で作ったとして、
 個数を読み込む関数を整数のread(fp, x)に限定したい場合、個数の型をdoubleにした特殊化テンプレートを書いてわざとエラーにするとか、
2019/03/17(日) 01:47:31.21ID:7ciqStwp
>>410
FILE* fpは十分汎用的でしかも最大限高速なので他への代替の必要性はほとんど考えられないし、
サンプルコードでむやみに凝っても仕方が無い

※ 個人の感想です
2019/03/17(日) 01:58:32.33ID:ADoP4x2u
テンプレートはヘッダに全部書かなきゃいかんのなんとかならんか?
2019/03/17(日) 02:06:35.73ID:NYZE0cFr
原理上どうにもならない
2019/03/17(日) 02:10:16.54ID:7ciqStwp
テンプレートの分割コンパイルは一度実装されたが1年がかりの複雑な仕事になったし
あまりに複雑すぎて普及に至っていないというようなことがプログラミング言語C++で読んだ記憶、

しかし、importキーワードがC++の予約語であるうちはまだ希望がある
416デフォルトの名無しさん
垢版 |
2019/03/17(日) 02:10:32.44ID:Jta37aFk
FILE* fp は 標準のfgetc()の実行速度が遅くて残念。バッファリングしている甲斐がない。
2019/03/17(日) 02:26:35.34ID:UT79+Nc/
使いたい型決まっているなら別にできるだろ?
ヘッダで宣言だけ書いて、ソースで定義と明示的インスタンス化すればいいだけ
2019/03/17(日) 02:34:45.67ID:61bjcvzF
3大C++無限ループ話題

テンプレート実装の分割記述
getsetの実装

あと一つは?
2019/03/17(日) 03:18:11.89ID:4v9XGq5+
多重ループの抜け方
420デフォルトの名無しさん
垢版 |
2019/03/17(日) 03:19:37.14ID:XP0TJBl2
STLにツリーがない理由を教えてください。
2019/03/17(日) 04:14:30.81ID:OzxlZzXh
あるクラスが非トリビアルなコピーコンストラクタをもっていることを検出したい
そのクラスのメンバの型が非トリビアルなコピーコンストラクタを持っていたとしても。
2019/03/17(日) 06:02:45.37ID:NYZE0cFr
>>418
メモリが云々
2019/03/17(日) 06:48:43.74ID:WBoQCy0z
>>413
テンプレートを抜き出してヘッダーファイルを生成するプリプリプロセッサを作ればいい
2019/03/17(日) 08:23:20.60ID:h3PfG3Ac
>>421
トリビアルコピー出来ないことを検出したいならis_trivially_copyableで充分だけどそれ以上のことがしたいの?
2019/03/17(日) 08:28:29.93ID:qh1L90Cw
>>409
糞抽象化の見本みたいなコードだなw。
そのうち使われなくなる種類のコードだ。
2019/03/17(日) 08:33:05.90ID:NYZE0cFr
名人様一名いらっしゃいました
2019/03/17(日) 11:20:51.42ID:2Lg7N/Z5
>>411
> 個数の型をdoubleにした特殊化テンプレートを書いてわざとエラーにするとか、
そういうときはdelete指定が使えるんじゃね?
というかis_floating_pointとかで弾いた方がいいとも思うけど
2019/03/17(日) 12:03:09.87ID:UT79+Nc/
>>409
x3とかつけない方が良くね?
てかvariable template使うところだね
2019/03/17(日) 13:22:57.65ID:UT79+Nc/
variadicだた
430デフォルトの名無しさん
垢版 |
2019/03/17(日) 13:42:47.24ID:XP0TJBl2
バリスティック・テンプルね。
2019/03/17(日) 15:09:36.00ID:WBoQCy0z
>>425
サンプルにまでマウントするとかw
432デフォルトの名無しさん
垢版 |
2019/03/17(日) 15:29:33.79ID:XP0TJBl2
マウントの定義を教えてください。
433デフォルトの名無しさん
垢版 |
2019/03/17(日) 16:01:22.88ID:Ymi5ijHL
明確な定義があるわけじゃないけど、主に「勘違いした高卒が高等な他人を見下してること、もしくはその様」を指す語としてつかわれてんじゃないの
2019/03/17(日) 21:10:58.21ID:NYZE0cFr
>>432
意識高い系
435KAC
垢版 |
2019/03/17(日) 21:23:45.76ID:nO6ODsyT
>>432
猿などが優位だと主張するために
相手に馬乗りになること

こういう場では、
相手に反論した(つもり)なら満足し、
反論を受けると過剰反応を示す奴をさすことが多い。
2019/03/17(日) 21:42:19.60ID:2Lg7N/Z5
>>435
>相手に反論した(つもり)なら満足し、
>反論を受けると過剰反応を示す奴をさすことが多い。
その説明だと某クソコテしか思い当たらないんだが・・・w
2019/03/17(日) 21:57:43.35ID:8PHb1ymW
>>436
誰?
2019/03/17(日) 22:22:05.53ID:VD3ReUoA
オープンソース化されたWindowsの電卓を見たが、クッソ綺麗でモダンなコードだな
2019/03/17(日) 22:25:37.54ID:NYZE0cFr
多分7に入ってた電卓とは別物だな
2019/03/17(日) 23:22:31.89ID:0FN5yhQH
>>438
あの手のコードって意味ないよな
無意味に11や14で追加された機能をなんかを使いたがるやついるわー
そういったやつに限って仕事が遅い

ウンチクはいいから、さっさと終わらせろよ
2019/03/18(月) 00:13:57.67ID:HNvbYtsL
Windowsカーネルのオープンソース化待ってます
2019/03/18(月) 05:32:24.67ID:+E07qlDR
sort関数の比較関数を、クラスのメンバ関数として定義すると invalid use of non-static member function というエラーが出ます。
なぜこれは禁止されるのでしょうか。
また、どうやって解決したら良いですか。
2019/03/18(月) 05:33:36.55ID:HNvbYtsL
エラーメッセージ読みなよ
2019/03/18(月) 06:41:53.05ID:8TZ/BLJn
理屈を知ってる人には当然だけど、初めての人は混乱する部分じゃないかな。
sort で使う比較関数は色んな形で宣言できるけど、宣言する場所によって
エラーにならずに使える関数の形式が違うってやつ。

>>442 メンバ関数にした比較関数のプロトタイプ宣言はどんな感じ?
2019/03/18(月) 08:08:37.98ID:HNvbYtsL
非staticメンバをstaticのように使おうとしたときに出るエラーだからsortとか関係ない
Class::funcをsortに入れたんでしょ
Class().funcとするかfuncをstaticにするだけ
2019/03/18(月) 08:49:38.19ID:fJqFZa8b
今時はClass().funcでいけるんすか
2019/03/18(月) 09:58:55.92ID:7+YzgLjV
Class::funcってstaticじゃないの?
2019/03/18(月) 10:42:04.28ID:9EOa0iNV
->*みたいな書き方の意義がわかったら一人前どすな
2019/03/18(月) 11:13:12.39ID:27d4/ixp
ちなみにどんな意義があるの?
2019/03/18(月) 19:22:09.39ID:SgtRGl5R
>>444
bool mycomp(string a, string b);

です
2019/03/18(月) 20:05:14.79ID:c3AGzLzz
結局その場でラムダ式書くのが一番わかり易いんだよね
2019/03/18(月) 20:09:56.80ID:e40iBeRc
>>448
>>449
https://mevius.5ch.net/test/read.cgi/tech/1434079972/39
なんと! private なメソッドを呼び出せるのです!
■ このスレッドは過去ログ倉庫に格納されています
5ちゃんねるの広告が気に入らない場合は、こちらをクリックしてください。

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