C++相談室 part134

■ このスレッドは過去ログ倉庫に格納されています
2018/01/20(土) 09:05:42.21ID:mJKRg6iz0
次スレを立てる時は本文の1行目に以下を追加して下さい。
!extend:on:vvvvv:1000:512

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

前スレ
C++相談室 part133
http://mevius.5ch.net/test/read.cgi/tech/1511509970/

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

■長いソースを貼るときはここへ。■
 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
2018/02/19(月) 13:19:17.15ID:gMMBYzvP0
使う側の都合に合わせろよ。 ラップしてるのに中身のスタイルが漏れてるんじゃラップの甲斐がなくね?
中身を知ってる人がちょっとした便利のためだけに薄いラッパを作る場合ならそういう選択もあるだろうけど。
255デフォルトの名無しさん (ワッチョイ 9f9d-MriG)
垢版 |
2018/02/19(月) 14:36:30.11ID:00nJVfHA0
コンバータにあわせろよ。C#で作ってコンバータかけた方が綺麗スッキリするんだから。
2018/02/19(月) 19:36:41.65ID:2cNNs3G6M
>>253
そりゃAPIに渡す構造体でdwSizeとか使われてたらそこだけは合わせざるを得ないけど自分のコードスタイルを合わせる必要はないだろ
2018/02/19(月) 20:29:38.46ID:czaD+lHv0
>>230
m_のmは目立つのm、

>>228
ここ構造体メンバとか、
2018/02/21(水) 00:43:21.00ID:jU0tYaxw0
Windows メインで作業されている方で、
valgrind を併用している方はおられませんか?
もしよろしければ使用感をお聞かせいただけませんか

operator new()/operator delete() 乗っ取りデバッグに限界を感じてしまっている状況です
(cl や bcc32/bcc32c/bcc64 では new/delete 乗っ取りができません)
いや、さっさと入れればいいのですが、仮想環境とかよくわからないし…Vine Linux 以来触ってないし…
2018/02/21(水) 01:13:14.52ID:wPLJFyuu0
windowsならapplication verifier使えば?
2018/02/21(水) 09:49:28.54ID:8k15W99L0
以下のURLのプログラムでSFINAEを試してみていて
https://wandbox.org/permlink/LqKmn50PaPbtohs5

BOOST_TTI_HAS_MEMBER_FUNCTIONを使えば
has_funcというメタ関数を使わずに済んで、短くできないかと試行錯誤中なのですが
うまく行きません。

どうやったらビルドが通るようになるでしょうか?
2018/02/21(水) 18:31:01.90ID:8+abUSIR0
まずはそのうまく行かないコードを示したら?
2018/02/21(水) 19:26:19.92ID:UifE8nP3d
>>260
https://stackoverflow.com/questions/87372/check-if-a-class-has-a-member-function-of-a-given-signature
2018/02/21(水) 19:34:37.06ID:EmINyJBAF
すみません、BOOST_TTI_HAS_MEMBER_FUNCTIONを使って短くする以前に元々が間違っていました。
以下の3つでオーバーロードしたかったのでした。
・funcというメンバ関数を持つダブルポインタ
・funcというメンバ関数を持たないダブルポインタ
・それ以外

それで思ったのですが多分、Boost.TTIライブラリで
〇〇というメンバ関数を持つクラス、を識別するメタ関数は作れても
〇〇というメンバ関数を持つクラスのダブルポインタ、は無理な気がしてきました。
一旦諦めようと思います。
2018/02/21(水) 23:10:49.37ID:EmINyJBAF
msvcでもGCCでもビルドできるのが
どうにかできました。お騒がせしてすみませんでした。
https://wandbox.org/permlink/HDwsuoVReqJEXWsO
2018/02/22(木) 10:26:41.79ID:qwLRFwLN0
>>263
あと2年待てばconceptできるかもよ
2018/02/22(木) 21:31:34.66ID:SOkZDC9P0
(VBみたいな名前付き引数が実現されたら
 システムハンガリアン否定論者をぎゃふんと言わせられるのに…
2018/02/22(木) 21:55:24.65ID:qwLRFwLN0
システムハンガリアン発祥の会社が何か作ったら否定論者がぎゃふんと言うのか?
おまえの頭の中は論点先取だか循環論法だかがグルグル回っているようだな
2018/02/23(金) 22:10:42.23ID:XlnyEs6k0

想像してごらん全ての人々が
 dwRet = ::WaitForSingleObject( hHandle = m_hThread, dwMillisecond = m_hTCTmo )
と書く世界を、
2018/02/23(金) 22:11:40.62ID:XlnyEs6k0
ごめ
誤: m_hTCTmo
正: m_dwTCTmo

見れば間違いがワカルのがハンガリアンの極めて良いところ
2018/02/23(金) 22:21:40.17ID:R3lraTlNM
>>269
>>196
2018/02/24(土) 10:44:07.22ID:mn7A8TMg0
一分間で間違いに気づいてはいるものの
そもそもの書く瞬間にはどうやら人智を用いても気付けないらしいから
IDEにエラー出してもらった方が早いんじゃあねえの

実は人間の集中力を超えたところにある方法論で、実践するとストレスが溜まるっぽいから、機械任せにした方がいい
それに、書いてる最中は変数の型まで考えたくない

見て分かることは、機械任せにすれば見なくても分かるから、
今のご時世、人間の有限の集中力を目視チェックなんかに使いたくない
脳みそのリソースはもっと別のところに使うべきだ

つまりは、書いてる最中は脳みそが「それが正しい」と思い込んでるから、
間違いは自分自身では絶対に分からない
これがバグを作り込む
hだったかdwだったかを脳が自動的に混同してるから、その分だけ余計に脳のリソースを使っている

「なんで書いている最中に自分自身で気付かないのか」、これ、とても重要だよ
272デフォルトの名無しさん (スップ Sd02-2/+O)
垢版 |
2018/02/24(土) 11:11:20.01ID:51zBno3Kd
変数名と型が一致してるという保証がゼロだからシステムハンガリアンなんて無駄以外の何物でもない
無駄というか悪
2018/02/24(土) 12:15:45.87ID:mm9B9rZ50
>>272
俺のレスもプログラムも表現と意図が一致してるという保証がゼロ、
まで読んだ
2018/02/24(土) 12:23:50.23ID:b3ZDZ7IS0
その場合、やめられる方だけやめればいいな
つまりハンガリアンを。
2018/02/24(土) 12:27:42.98ID:pqM6ijVV0
まともな開発環境使っていれば必要ないのでは
2018/02/24(土) 12:34:43.53ID:B9f7/evx0
ハンガリアンはもうだめだ。
ポーランドを使おう。
2018/02/24(土) 12:51:07.68ID:d7+fd25J0
>>272
そういう事言い出すと「関数名と機能が一致してる保証がゼロ」や「クラスメンバの隠蔽が完璧である保証がゼロ」などといくらでも難癖を付けれるナリ
ヒューマンエラーを理由に不要と結論付けるのならあらゆるコーディング規約が不要という結論になってしまう、これはいけない
命名規則は可読性の向上に結びつくものでなければならない、規約を違反する事で起きるトラブルはプログラマ側の責任、それは分かるよね?
2018/02/24(土) 13:26:14.86ID:b3ZDZ7IS0
ヒューマンエラーが起きる部分は極力排除して機械任せにできる部分は機械任せにすればいい
ハンガリアンを導入する理由はもはや無いな。可読性悪いし。
2018/02/24(土) 14:24:10.94ID:yWQ45jBy0
>>278
いや、ハンガリアンは可読性はよくなる方だよ
整合性維持に難があるだけで
2018/02/24(土) 14:29:08.35ID:mm9B9rZ50
可読性ぐらいテンプレートによる高度なメタプログラミングに慣れた諸兄なら
ハンガリアンごとき目を慣らして解決できるはずなんじゃ…
2018/02/24(土) 15:03:19.72ID:ohURjCBl0
https://www.google.co.jp/search?q=%E5%8D%8A%E5%88%88%E3%82%8A&;tbm=isch
2018/02/24(土) 15:06:09.97ID:ohURjCBl0
>>276
Lisper「せやな!」
2018/02/24(土) 17:03:03.20ID:agv5rOmv0
>>276 >>282
両者は共存不可能な対立概念ではないけどね。

細かいことを言わせてもらえば、
「ハンガリアンとポリッシュ」か「ハンガリーとポーランド」と
並べてくれた方が座りがいい気もするけど…。
「ハンガリアン記法とポーランド記法」だとあまり気にならない不思議。
2018/02/24(土) 17:08:35.75ID:4JIC+wG/M
なぁにその内、ロシアが併呑してくれるさ
2018/02/25(日) 14:16:53.97ID:8l5JrV0a0
>>266
名前付き引数イディオムとenable_if<is_same<...>::value>が最強と言うことだな

※プログラマが、使用者が型を間違えないようにと気を使うのが正しいなら、間違えたらコンパイルエラーになるこれが最強だろ?
2018/02/25(日) 14:35:24.31ID:zhzj1IkW0
>>277
ちげえんだよんぁ
可読性じゃねえんだよ

>>268を見てみろよ、
読む時じゃなくて書く時のヒューマンエラーだ
なんで入り込んだのか全く分からんようなミステイクだ
プログラミングが工業的生産の一種なら、その手のヒューマンエラーは無い方がいい

で、改めて>>268を見てみると、「可読性」があってプレフィクスの間違いに気付いてはいるものの、
そもそも書く段でなんで間違えたのか、それが全く分からない
他人はおろか本人すらも自覚できない謎の理由でプレフィクスを間違えてる(これがヒューマンエラーなんだけどな)

なんで、後だしジャンケンだと、「プレフィクスが最初から無ければ、間違いも発生しえなかった」、とも言える

もしかすると、書く時に間違える/読む時に間違える の比率を考えると、ハンガリアン記法は書く時に間違えやすいが読むときに間違いにくい……のトレードオフなだけかもしれん
要するに、可読性と生産性のトレードオフだけなんじゃあねえのか?
それに、読む時のヒューマンエラーと書く時のヒューマンエラーをわざと混同してるのはいただけない
2018/02/25(日) 16:15:03.29ID:s5td7qK+0
void func(int a)
{
2018/02/25(日) 16:15:31.06ID:s5td7qK+0
void func(int a)
{
//aが何型かわからない
//アホかおまえは
}
2018/02/25(日) 16:46:37.12ID:s5td7qK+0
template <typename T>
void func(T lpszA)
{
//lpszって書いてあるからTはLPSTR型だな
//アホかおまえは
}
2018/02/25(日) 19:14:43.19ID:4jIr3vvu0
>>288
func()が常に1画面に収まって1万行の関数とかでありえないという根拠は

>>289
テンプレート定義時の引数に対して引数内容固有の命名が難しいのは
ハンガリアンに限ったことではないからハンガリアンに対する批判になんね

テンプレート批判論者には考える力がないのかね…
2018/02/25(日) 19:15:39.42ID:4jIr3vvu0
ごめ
×:テンプレート批判論者
○:ハンガリアン批判論者
292デフォルトの名無しさん (ワッチョイ df7f-x4Or)
垢版 |
2018/02/25(日) 19:29:08.16ID:s+qaK1zS0
テンプレートに対してはハンガリアンは全くの無力だよなあ
一貫性の観点からやっぱりハンガリアンは無い方がいいわ
2018/02/25(日) 19:48:52.19ID:4jIr3vvu0
.>>290のレスを見てテンプレートの実体化時までハンガリアンが無力なことにされてはかないませんなあ…
2018/02/25(日) 20:11:05.52ID:fbPK05Px0
そもそも関数が長い場合は型情報を持たすのもありだよな
システムハンガリアンをやめさせようとして先に関数を短くしなきゃだめだなと追う結論に至って放置した
2018/02/25(日) 20:37:38.24ID:s5td7qK+0
//1万行の最長不倒関数を書く
//アホかおまえは
2018/02/25(日) 21:00:14.67ID:s5td7qK+0
void func(int lpszA)
{
//lpszって書いてあるからLPSTR型だな
//アホかおまえは
}
2018/02/25(日) 21:58:30.83ID:qLuvVokt0
システムハンガリ理解してない人の例上げてね?
2018/02/25(日) 22:45:03.97ID:4jIr3vvu0
>>295
「1画面に収まらない」を都合よく無視しないように
2018/02/25(日) 23:43:59.89ID:yscCG2q60
システムハンガリアンはDWORDをintに型名変更するだけでその変数名全部終わるからなしかも一瞬で
300デフォルトの名無しさん
垢版 |
2018/02/25(日) 23:57:37.89
>>299
dwをiに置換するだけだからリファクタリングが楽っていう意味?
2018/02/26(月) 00:59:51.78ID:VDQLjiDS0
まったく逆だ
dwからiに全部置換していかないと変数名の意味を為さなくなるからシステムハンガリアンは愚かさ甚だしいと云うておる
2018/02/26(月) 01:02:48.27ID:VDQLjiDS0
アンパンマン調で例えるなら型名変えるだけでメンテ百倍みたいな
2018/02/26(月) 01:10:40.33ID:jQ6YvoyL0
組み込み型はいいけどクラスはどうすんのさ
意味の分からないサフィックスを付けられても困るぞ
2018/02/26(月) 01:11:26.04ID:VDQLjiDS0
ハンガリアン!新しい型だよ!
有難う!デザパタ娘ちゃん!
メンテ百倍!ハンガリアン!
2018/02/26(月) 01:55:04.49ID:4PPe6ndQ0
そもそもDWORDをintに変えることが滅多にない
2018/02/26(月) 02:10:59.71ID:jQ6YvoyL0
dwとか書かれてもDWORDの定義を知らないと意味不明だし
やるなら符号の有無とサイズが分かるように書かないと意味ないでしょ
2018/02/26(月) 04:56:46.87ID:lxlU26hn0
>>298
おまえは間違いなく1万行と書いた
その史実を誤魔化すことはできない

「ありえないという根拠は」という問いを反論として用いるのは
俺が「ありえない」と言った(事実と違うが)ことが
おまえが「ありうる」と思っているのと違ったからだろう

いずれにせよ「アホかおまえは」にふさわしいハチャメチャだな
2018/02/26(月) 08:02:35.99ID:SPD4iDfM0
ポインタのpとか参照のrとかは今でも使ってる
309デフォルトの名無しさん
垢版 |
2018/02/26(月) 08:09:57.39
>>307
史実とか言っちゃうのって。。。
2018/02/26(月) 08:16:32.18ID:TvC1o7QC0
>>307
もうちょっとまとめて喋れ
読みづらい
2018/02/26(月) 09:55:53.14ID:lxlU26hn0
>>308
俺も使う
ただし名前そのものをポインタっぽくするだけで
ハンガリアンのプリフィックスとしてではない
2018/02/26(月) 09:56:14.50ID:lxlU26hn0
>>310
ニホンゴワカリマスカ?
2018/02/26(月) 10:44:04.77ID:U+kFnN5D0
ハード直叩きのドライバ屋はデータバスやレジスタの幅を間違えると大変だから
物理層の実装ではハンガリアン使うこともあるよ
2018/02/26(月) 10:55:31.04ID:n/n1Eejna
>>313
むしろそれはアプリケーションハンガリアンじゃね?
315デフォルトの名無しさん (スップ Sdc4-aBV2)
垢版 |
2018/02/26(月) 11:21:30.74ID:mt/mMzV6d
間違えると大変だからハンガリアンを使ってはならないんだよ
偽の情報に頼るんではなくて元を逐一確かめないと
2018/02/26(月) 11:33:14.68ID:yfGCkThX0
今勉強してるんだけどC++ではポインタを使わずに参照で書くのがデフォルトなの?
2018/02/26(月) 11:36:50.47ID:TvC1o7QC0
>>315
不一致が存在しない事が保証されてれば問題無いんやな
そういう事ならつまり変数宣言とプレフィックスが全て一致してるかチェックするスクリプトとかがあれば満足って事でええんか?
2018/02/26(月) 11:38:09.46ID:n/n1Eejna
>>316
ポインタも必要に応じて使うけど、メモリ管理の煩雑さとミスの危険性を避けるために参照やスマートポインタやコンテナ、イテレータなど他に適切な物がある時はなるべくそちらを使うのが流儀かな。
2018/02/26(月) 11:51:17.55ID:lxlU26hn0
>>316
デフォ・・・まあ、そう言えなくもないか
参照でもポインタでもどっちでもいい用途には参照
ポインタでしかできないことはNULLに++や絶対番地指定
参照でしかできないことは一時オブジェクトやコピコン類
2018/02/26(月) 12:15:47.61ID:z/vehsiL0
書き込むときは参照ではなくポインタにしろと言ってた人がいた。
理由を聞いたら「なんか書き込んでる感がない」だった。
2018/02/26(月) 12:17:18.65ID:lxlU26hn0
std::cin >> &a;
やだよ、こんなの
322デフォルトの名無しさん (ワッチョイ df7f-x4Or)
垢版 |
2018/02/26(月) 12:21:09.58ID:W3q5coR10
グーグル規約だと書き込む引数は参照ではなくポインタにしろってなってる
でも標準ライブラリが普通に参照で書き込んでるので意味ないかなと思う
2018/02/26(月) 13:05:03.30ID:LqmnPPXld
やC++糞
2018/02/26(月) 13:30:49.55ID:jQ6YvoyL0
好きな方使えとしか言いようがない
ただ参照はnullポインタが無いという特性はある
2018/02/26(月) 13:42:09.37ID:z/vehsiL0
>>322
自分もその人の気持ちは理解できた。
func(a, &b);
と書かれていると、bに結果を書き込んでいる感があるし。
2018/02/26(月) 13:44:00.32ID:yfGCkThX0
レスサンクス
cからだからポインタで書いちゃいそうだわ
327デフォルトの名無しさん (アウーイモ MM3a-QuQl)
垢版 |
2018/02/26(月) 18:25:47.85ID:aHz4HBvIM
ローカルで宣言したunique_ptrを他のメソッドに渡してデータをつめたいばあいってどういう引数で渡せば良いの?
unique_ptr<Hoge> ptr(new Hoge);
hogehoge(ptr);

Hogehoge::hoge(const unique_ptr<Hoge>& ptr){
ptr->aaa = 123;
}

これでいける?
なんかウェブサイトみてると&&二つとかあったりするの見かけて混乱してきた
2018/02/26(月) 18:46:48.22ID:6OgFttId0
&&は所有権ごとぶん投げる時に使う
渡した後も呼び出し元で使うんだったらそれて合ってるぞ
2018/02/26(月) 19:00:19.12ID:r2m2Cr000
>>327
それだったらunique_ptrじゃなくて参照渡せば良いだけじゃ
2018/02/26(月) 19:31:15.52ID:NcBRNf650
知らない間に、&& みたいな参照渡しもできた

Rust の所有権ムーブの事
2018/02/26(月) 19:58:16.47ID:jQ6YvoyL0
何年も前からある
332デフォルトの名無しさん (ワッチョイ 8610-QuQl)
垢版 |
2018/02/26(月) 21:01:42.73ID:k0ghrbBh0
所有権を渡すのってstd:move()だと思ってたんだけどconst &&でもいけるの??
2018/02/26(月) 21:42:25.99ID:adcc2IaV0
C++17でstd::iteratorが非推奨ってなっているみたいだけど代わりに何使うの?
2018/02/26(月) 23:56:58.87ID:4PPe6ndQ0
[]
2018/02/27(火) 00:00:22.09ID:o+FKgYKC0
>>333
自分で実装する
2018/02/27(火) 02:00:32.40ID:+XEdVvf40
>>332
std::move は rvalue にキャストするだけで、それ自体にはムーブする機能はない。
実際にムーブの処理をするのはムーブコンストラクタやムーブ代入演算子の方やで。
2018/02/27(火) 02:10:59.44ID:+XEdVvf40
&& は単純に右辺参照って意味しかないから、 rvalue を受け取れるってだけ。
だけど lvalue でもムーブしてぇってときは std::move で rvalue にキャストすんの。
2018/02/27(火) 02:19:45.35ID:o+FKgYKC0
そこら辺はめんどくさいからテンプレート使え
339デフォルトの名無しさん (ワッチョイ 8610-QuQl)
垢版 |
2018/02/28(水) 18:07:41.72ID:IZRayiSM0
右辺値参照とか難しいなー
最近ようやくC++11使えるようになったから全然いってることがわからん
2018/02/28(水) 18:34:51.95ID:jmOf6Upnd
右辺値参照が使えなかった頃は、std::swapでスピード最適化していた。ポインタとメモリー確保を含む構造体は、
単純にスワップしたり、単純にバイト単位コピーしたりするのはまずいことがある。
そういうときに、std::swapを使う。右辺値参照は、それよりちょっと速くて賢いが、テンプレート型を理解してないと多分理解できないと思われる。
2018/02/28(水) 18:43:18.32ID:jmOf6Upnd
右辺値参照の型はテンプレートを使った特殊な型だと考えるのが自然。

T&& === rvalue_ref<T>.

std::move(T&)はrvalue_ref<T>という型。
2018/02/28(水) 18:44:28.64ID:jmOf6Upnd
訂正。
std::move(T&)の戻り値はrvalue_ref<T>という型。
2018/02/28(水) 19:01:47.21ID:jmOf6Upnd
すみません、テキトーなことを書いたので、銃殺されます。
2018/02/28(水) 19:18:07.29ID:7ezW7mFb0
実際のところヘッダファイルから std::move の定義を抜き出すとこんな感じ。

template<typename _Tp>
constexpr typename std::remove_reference<_Tp>::type&&
move(_Tp&& __t) noexcept {
return static_cast<typename std::remove_reference<_Tp>::type&&>(__t);
}

テンプレートの都合で面倒くさくなってるけど、実態としては static_cast してるだけ。
2018/02/28(水) 19:24:03.59ID:jmOf6Upnd
そのstd::remove_reference<T>::typeはTから左辺値参照や右辺値参照をはずした型になるね。それに&&を付けるんだから、左辺値参照が右辺値参照になる。
2018/02/28(水) 19:25:31.22ID:AZJp7LrB0
やはり、constexprやnoexceptを付けた方が性能がいいんだな。
2018/02/28(水) 19:35:33.38ID:7ezW7mFb0
C++17 では noexcept は型の一部という扱いに変更された。
例外を投げないなら投げないと書いておかないと他のライブラリとの組合せで型エラーになったりすることもあるかもしれんぞ。
2018/02/28(水) 19:43:54.33ID:jmOf6Upnd
やっぱ江添亮様ってスゲーや。
2018/02/28(水) 21:22:30.07ID:BlsGZA5I0
江添本にこの辺りのチートシートと問題集いれたら100部くらい売り上げ増えるのでは
2018/02/28(水) 21:27:43.47ID:LDTKKB+20
江添ってあれか。ニートの時にやることないからたまたま目についたC++の仕様書を読み込んでたら
いつの間にかすごく強くなったという、ホリランみたいな。
2018/02/28(水) 21:32:34.60ID:eOQjYTv40
おまえそれをバカにできるのか?
仕事ってそういうもんだぜ
目の前の案件のために必死こいても付け焼き刃にできることは知れてるんだよ
「ヒマ」なときに遠くを見て投機的にコツコツ努力したことが
あとで花咲くことがあるし咲かないこともある
賭に勝った者を、降りたやつがバカにできるのか? え、おい
2018/02/28(水) 22:02:12.40ID:debsNNov0
>>320
>>322
書き込むときポインタ渡しにするのは
C++には参照渡しがin/out/refのどの意味なのか表すシンタックスが現状無いから
というのが主要な動機だと思うが
inならconst T& aというのは比較的読み筋だが
T* pと書いただけだとoutなのかrefなのかやっぱりわからん…
2018/02/28(水) 22:22:45.57ID:n9jVMobsM
>>352
outは**だろ
■ このスレッドは過去ログ倉庫に格納されています
5ちゃんねるの広告が気に入らない場合は、こちらをクリックしてください。