[表示 : 全て 最新50 1-99 101- 201- 301- 401- 501- 601- 701- 801- 901- 1001- 2ch.scのread.cgiへ]
Update time : 11/06 13:22 / Filesize : 268 KB / Number-of Response : 1011
[このスレッドの書き込みを削除する]
[+板 最近立ったスレ&熱いスレ一覧 : +板 最近立ったスレ/記者別一覧] [類似スレッド一覧]


↑キャッシュ検索、類似スレ動作を修正しました、ご迷惑をお掛けしました

C++相談室 part145



1 名前:デフォルトの名無しさん [2019/09/13(金) 17:13:24.60 ID:/ygW08Jq.net]
C++に関する質問やら話題やらはこちらへどうぞ。
ただし質問の前にはFAQに一通り目を通してください。
IDE (VC++など)などの使い方の質問はその開発環境のスレにお願いします。

前スレ
C++相談室 part144
https://mevius.5ch.net/test/read.cgi/tech/1563769115/

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

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

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

----- テンプレ ここまで -----

2 名前:デフォルトの名無しさん mailto:sage [2019/09/13(金) 21:32:39.97 ID:yAkItK0j.net]
前スレ1000>
>vtableがあればdynamic_castもできるのに何でダウンキャストなんだ?

dynamic_castはたいていダウンキャストに使うし、逆にvtableとdynamic_castは関係ないだろ。

3 名前:デフォルトの名無しさん mailto:sage [2019/09/13(金) 21:40:45.55 ID:/ygW08Jq.net]
> vtableとdynamic_castは関係ないだろ。

おまえさん、そもそもdynamic_castとは何か理解しているか?

4 名前:デフォルトの名無しさん mailto:sage [2019/09/13(金) 21:41:31.76 ID:/ygW08Jq.net]
あ、ID出るんだったな
「スレ主」としての発言ではないんで気にしないでくれ

5 名前:デフォルトの名無しさん mailto:sage [2019/09/13(金) 22:48:38.62 ID:ZW8mwhnp.net]
整理すると
安全にダウンキャストするにはdynamic_castを使うし
その際vtableが必要
そんだけ

6 名前:デフォルトの名無しさん [2019/09/13(金) 22:49:53.22 ID:ZW8mwhnp.net]
ちなみにdynamic_castでアップキャストする場合はvtable要らね
どうでもいいが

7 名前:デフォルトの名無しさん mailto:sage [2019/09/14(土) 01:51:42.11 ID:2JV3tdJj.net]
このvtable言いたいだけ感

8 名前:デフォルトの名無しさん mailto:sage [2019/09/14(土) 02:09:30.09 ID:SgsUVSB1.net]
vtable言いたいだけちゃうんかと

9 名前:デフォルトの名無しさん mailto:sage [2019/09/14(土) 02:29:08.06 ID:plkfGFM5.net]
vtable iitai dake.

10 名前:デフォルトの名無しさん mailto:sage [2019/09/14(土) 07:29:57.19 ID:keXkMGsc.net]
dynamic castでアップキャストする事あるの?



11 名前:デフォルトの名無しさん mailto:sage [2019/09/14(土) 09:31:35.63 ID:MJsGg5EL.net]
ない

12 名前:デフォルトの名無しさん mailto:sage [2019/09/14(土) 11:41:42.14 ID:Hd+E1riT.net]
そもそもアップキャストはリスコフの置換原則が成り立つクラスになってんなら何もしなくも勝手にできる

13 名前:デフォルトの名無しさん mailto:sage [2019/09/14(土) 11:56:51.87 ID:JExEJ5Ds.net]
SOLIDなんて馬鹿が意識してるわけねーだろw

14 名前:デフォルトの名無しさん mailto:sage [2019/09/14(土) 14:12:14.01 ID:2JV3tdJj.net]
今まで仕事でRTTI有効だったプロジェクトはひとつもないわ

15 名前:デフォルトの名無しさん mailto:sage [2019/09/14(土) 16:26:48.85 ID:Hd+E1riT.net]
そりゃあサイズ削減しなきゃいけないからじゃね?

16 名前:デフォルトの名無しさん mailto:sage [2019/09/14(土) 17:28:56.46 ID:KFCQQ8F2.net]
サイズ以前の問題じゃないの

17 名前:デフォルトの名無しさん mailto:sage [2019/09/14(土) 17:57:41.80 ID:JExEJ5Ds.net]
バッチ処理系統の仕事ならポリモルフィズムなんて糞の役にも立たんどころか
かえって有害だわ。

18 名前:デフォルトの名無しさん mailto:sage [2019/09/14(土) 18:14:18.81 ID:MJsGg5EL.net]
COBOLでもEVALUATE文なんて普通に出てくるだろ
力技でダッセーけどあれもポリモだぞ

19 名前:デフォルトの名無しさん mailto:sage [2019/09/14(土) 18:26:33.88 ID:JExEJ5Ds.net]
そういうカスなことやってるからメンテ不能になるんだよ。。

20 名前:デフォルトの名無しさん mailto:sage [2019/09/14(土) 19:17:35.55 ID:qjGOgUak.net]
rttiに使う必要がでた時点でc++はミスチョイス
もちろん趣味ならご自由に



21 名前:デフォルトの名無しさん mailto:sage [2019/09/14(土) 19:52:02.94 ID:iEVwPiY+.net]
RTTI嫌ってるけど実際どの程度パフォーマンスに影響するの

22 名前:デフォルトの名無しさん mailto:sage [2019/09/14(土) 20:10:10.91 ID:MJsGg5EL.net]
正直、初めてポリモの話を聞いたときは
混ぜちまってから後で選別なんてアホだろって思った

23 名前:デフォルトの名無しさん mailto:sage [2019/09/14(土) 20:36:36.84 ID:BTqGkHHG.net]
まあ結局コールバックだからな

24 名前:デフォルトの名無しさん mailto:sage [2019/09/14(土) 20:39:19.28 ID:SgsUVSB1.net]
ポリホーモきっしょ

25 名前:デフォルトの名無しさん mailto:sage [2019/09/15(日) 01:12:05.95 ID:+QluEOXC.net]
C++は型の実行時識別をvtblのアドレスでやるからdynamic_castする以上はアップだろうがダウンだろうが対象クラスに仮想関数が一つは含まれないといけない
さもないとゼロコストの原則からクラスにvtblが作られない
ただし、仮想関数であれば良く、必ずしも仮想デストラクタである必要は無い、、、ハズ、、、

26 名前:デフォルトの名無しさん mailto:sage [2019/09/15(日) 01:37:29.11 ID:0kzqJJdX.net]
vtableおじさんまたきたよ

27 名前:デフォルトの名無しさん mailto:sage [2019/09/15(日) 01:44:54.25 ID:+QluEOXC.net]
>>22
ポリモとダウンキャスト(RTTIを使うか否かを問わず)を混同するとは情け
ナサス、

28 名前:デフォルトの名無しさん mailto:sage [2019/09/15(日) 01:47:31.12 ID:+QluEOXC.net]
コールバック関数ならいちいちポリモとかしなくとも無名関数とかで良いやんジャバじゃあるまいし、

29 名前:デフォルトの名無しさん mailto:sage [2019/09/15(日) 01:59:40.68 ID:LMFjfaUx.net]
vtableとvtblでNGしたった(´・ω・`)

30 名前:デフォルトの名無しさん [2019/09/15(日) 03:24:46.48 ID:2F/PGB+Q.net]
>>28
ラムダをどっこかに登録してコールバックしてもらうとき
自分が死ぬとき登録を解除するのが面倒じゃね?
結局thisとpairで登録する羽目に
だったら初めから仮想関数で良くね?



31 名前:デフォルトの名無しさん mailto:sage [2019/09/15(日) 04:39:33.80 ID:+QluEOXC.net]
コールバック関数を渡す側がコールバックされるより先に死ぬ可能性があるとか
一体何がしたいのかっていうか、

32 名前:デフォルトの名無しさん mailto:sage [2019/09/15(日) 04:41:18.12 ID:+QluEOXC.net]
仮にそうであるとしても死ぬ際に空のコールバック関数に登録し直せば良い
なお関数オブジェクト自体の破棄は関数オブジェクトをコピー渡しなりすれば何の問題も無い

33 名前:デフォルトの名無しさん mailto:sage [2019/09/15(日) 07:15:57.55 ID:o13gcpb2.net]
>>25
ゼロコスト? ああゼロオーバーヘッドのことかw

34 名前:デフォルトの名無しさん [2019/09/15(日) 09:03:14.13 ID:XPArYK5v.net]
C言語がなんとか使えるようになりました。
今度は、生産性の向上とstringとか面白そうなので、
C++を学習しようと思っています。

おすすめの書籍があったら、教えてください。
ちなみにC言語の理解は、独習Cで勉強しました。
なんだか、独習C++は実用的ではない気がしました。

知りたいのは、C++のstringとかvectorとかです。

それとも、こういう書き込みはだめですか。

35 名前:デフォルトの名無しさん [2019/09/15(日) 09:10:08.07 ID:XPArYK5v.net]
34です。

宣伝みたいになりましたが、
独習C++の新版が出ていました。
書籍は11月、電子ならすぐに手に入るようです。
期待してみます。

ほかにもあれば教えてください。

36 名前:デフォルトの名無しさん mailto:sage [2019/09/15(日) 09:16:38.35 ID:8KX++KfV.net]
cpprefjp

37 名前:デフォルトの名無しさん mailto:sage [2019/09/15(日) 09:45:21.89 ID:oPlgEsHO.net]
EzoeRyoのgithubに公開しているcppbook
cpprefjp

38 名前:デフォルトの名無しさん mailto:sage [2019/09/15(日) 09:47:48.80 ID:uSEm3H+m.net]
ただで読めるし「江添亮のC++入門」とかでいいんじゃない?
どうしても書籍が良ければ9/20発売みたいだし

39 名前:デフォルトの名無しさん mailto:sage [2019/09/15(日) 10:08:14.78 ID:j54Ms8Tr.net]
どいつもこいつも嵌める気しかねーのか。。
せめてロベールとかビャーネのやつを紹介しろよ。

40 名前:デフォルトの名無しさん mailto:sage [2019/09/15(日) 10:14:24.35 ID:uK9KHo8O.net]
>>34
もちろんこういう書き込みは駄目だね
まず言語を学ぶ時点で実用性がない
学ぶならフレームワークだね
それにどうせ金にならないんだから、実用性なんて最初ならない



41 名前:デフォルトの名無しさん [2019/09/15(日) 10:29:15.30 ID:Fzt4Iz1L.net]
ビャーネはまだしもロベール古くない?

42 名前:デフォルトの名無しさん mailto:sage [2019/09/15(日) 10:30:20.14 ID:+TjQqAK6.net]
いまさら03以前の本を勧めるのはちょっと…

43 名前:デフォルトの名無しさん mailto:sage [2019/09/15(日) 10:35:30.95 ID:Pt8t6mL1.net]
C++で生産性は向上しない
学習動機の根本が間違ってる

44 名前: mailto:sage [2019/09/15(日) 10:37:36.53 ID:gb0f216/.net]
>>35
>書籍は11月、電子ならすぐに手に入るようです。
電子キンドル版もやはり11月まで入手できないとのことでした

45 名前:デフォルトの名無しさん mailto:sage [2019/09/15(日) 10:47:37.02 ID:j54Ms8Tr.net]
cやったばっかの人に江添とか薦めるくらいならc++03のとこから地道に教える方を選択するわ。
あんな糞本でc++なんかいじられると目も当てられん結果になる。

46 名前:デフォルトの名無しさん [2019/09/15(日) 10:49:41.53 ID:Fzt4Iz1L.net]
もちろんC++11,14,17,20と教えていくんだろうな?
今時C++03なんて使ってられんぞ

47 名前:デフォルトの名無しさん mailto:sage [2019/09/15(日) 10:56:43.80 ID:+TjQqAK6.net]
今となっては「auto_ptrはコンテナに入れるな」だの「vectorのメモリ領域が連続してると仮定するな」だのを
初心者に教える方が有害だと思う

48 名前:デフォルトの名無しさん mailto:sage [2019/09/15(日) 10:57:27.95 ID:I9cvwq9U.net]
基礎が全く出来てない単発だらけのこんなとこで聞くのが間違い

49 名前:デフォルトの名無しさん [2019/09/15(日) 12:29:28.22 ID:qCqOeXfn.net]
ビャーネを勧めるとかw

否定が多いスレ

猫とかやさしいでも、まずは読んどけ。

50 名前:デフォルトの名無しさん mailto:sage [2019/09/15(日) 13:03:00.40 ID:o13gcpb2.net]
>>34
最も大事なのは本人のやる気だ
モノになるか否かを本のせいにするようではそれがない

俺自身の経験から言うと
変にかみ砕いたバカ用の本や
筆者の思い込みを熱く語っている本よりも
ドライなやつがいい
具体的には禿の本や規格票が俺にとってのそれだった

必要な情報は客観的事実でどっかの馬の骨の主張じゃない
解らんところをどう攻めるかも自分の頭で考えるのが大事だ



51 名前:デフォルトの名無しさん mailto:sage [2019/09/15(日) 13:17:14.19 ID:d26DY9ov.net]
>>34
stringとかをライトに使いたいのならサンプルコード探して真似るだけでもいいかと
ただ、stringやvectorがどういう仕組みで出来ているのかはいずれ理解する必要出てくるから
独習みたいな本を手元に置いといた方がいい(>>47みたいに古い本だと一部仕様が違ってたりするけど

52 名前:デフォルトの名無しさん mailto:sage [2019/09/15(日) 15:21:24.21 ID:2F/PGB+Q.net]
言っちゃなんだが、実際使ってみるっつーか
何かソフト書いて覚えるしかないと思うよ
参考書はネットに転がってる文献で十分でしょ

53 名前:デフォルトの名無しさん mailto:sage [2019/09/15(日) 15:29:29.02 ID:WnktybSj.net]
プログラミング勉強する前にコンピュータアーキテクチャ勉強しろ

54 名前:デフォルトの名無しさん mailto:sage [2019/09/15(日) 15:30:29.64 ID:w00J0OPy.net]
https://en.cppreference.com/w/cpp/language/namespace


using namespace ns_name;      //(5)

という形式の 「using-directive (using 指令)」の説明に

5) using-directive: From the point of view of unqualified name lookup of
any name after a using-directive and until the end of the scope in which
it appears, every name from ns_name is visible as if it were declared
in the nearest enclosing namespace which contains both the using-directive
and ns_name.

とあるのですが、

as if it were declared in the nearest enclosing namespace which contains
both the using-directive and ns_name.

の部分の正確な意味が分かりません。個人的には (5) の ns_name までを含めた行全体が、
「using-directive」であるという理解なのですが。

as if it were declared in the nearest enclosing namespace which contains the using-directive.

であるなら分かりますが。どなたか分かる人にご教授いただければ幸いです。

55 名前:デフォルトの名無しさん mailto:sage [2019/09/15(日) 15:53:13.28 ID:58rKn0L9.net]
using directiveにはnamespace以外にも用途があるからと思われ

56 名前:54 mailto:sage [2019/09/15(日) 15:59:33.27 ID:w00J0OPy.net]
>>54
さっき、名前探索の「優先順位」に違いが出てくるからかもしれないと気付きました。
using-directive を書いた namespace よりも、その親や先祖となっている
namespace で名前が宣言されているかのよに振舞うということは、
その分、名前探索では優先順位が少し低くなります。このことによって
同名の名前が内側に宣言されていた場合、振る舞いが変わってきそうです。

57 名前:デフォルトの名無しさん mailto:sage [2019/09/15(日) 16:52:00.99 ID:LMFjfaUx.net]
>>39
ロヴェールはウンコ

58 名前:デフォルトの名無しさん [2019/09/15(日) 18:52:44.08 ID:XPArYK5v.net]
34です。
みなさん、ありがとうございました。
詳しい人多いですね。

stringとかを使えば、pythonやC#みたいに
使えるかなと思ったものです。

59 名前:デフォルトの名無しさん mailto:sage [2019/09/15(日) 21:18:39.85 ID:zWVpxi69.net]
C覚えたんならC++やらずに他の言語やってもいいんじゃね。と思った。

60 名前:デフォルトの名無しさん mailto:sage [2019/09/15(日) 22:33:44.86 ID:2F/PGB+Q.net]
他の言語なんかやめとけ
C++かそれが嫌ならRustにしとけ
ただRustは難しいからC++でいいだろう



61 名前:デフォルトの名無しさん mailto:sage [2019/09/16(月) 11:16:31.34 ID:ViJ7kb/C.net]
>>57
残念ながらc++に関してはそのうんこを超える入門書がないだわ。

62 名前:デフォルトの名無しさん [2019/09/16(月) 18:51:38.35 ID:JVpNk5dm.net]
今時本で勉強しているやつは時代遅れ。
情報が更新されるcpprefjp,cppreference等にかなうものはないのだ。

63 名前:デフォルトの名無しさん mailto:sage [2019/09/16(月) 19:14:58.26 ID:GDraKDQQ.net]
辞書と教科書は違う

64 名前:デフォルトの名無しさん mailto:sage [2019/09/16(月) 19:35:00.11 ID:GUsgf22q.net]
辞書がメインだよ
どっかの馬の骨はこう見ているというのは
あまり1つに囚われずに数多く見聞きして
誰もが口を揃えるのは何かを参考にする程度だ

65 名前:デフォルトの名無しさん mailto:sage [2019/09/16(月) 19:49:19.85 ID:Bd17ulHe.net]
やっぱ言語を作った人が書いた「プログラミング言語(言語名)」を読むのがとっかかりとしては一番良い
言語の設計思想が一番間違いのない形で書かれている(何しろ本人が書いたのだから
最新規格は差分で追えば宜しい

次点はオライリーのやつ「プログラミング(言語名)」

66 名前:デフォルトの名無しさん [2019/09/16(月) 20:12:19.52 ID:ViJ7kb/C.net]
>今時本で勉強しているやつは時代遅れ。
>情報が更新されるcpprefjp,cppreference等にかなうものはないのだ。
なるほど、こういう浅はかな輩がいることを考えるとまだまだ本の価値は下がらんな。

67 名前:デフォルトの名無しさん mailto:sage [2019/09/16(月) 20:17:58.22 ID:Hp9aP4N/.net]
でも今、本の値段が上がってるない?
昔はよく買ってたのに、9,800円ではちょっと躊躇してしまう。

68 名前:デフォルトの名無しさん mailto:sage [2019/09/16(月) 20:29:19.55 ID:Xl3jboOR.net]
間違いがあっても更新出来ないのは本の欠点やと思う

69 名前:デフォルトの名無しさん mailto:sage [2019/09/16(月) 21:59:17.57 ID:sIsNtkL6.net]
てか導入なら本がいいかもだけど、一度覚えれば更新はネットのコンテンツの方が良いからなぁ

最近仕様更新の頻度が高いから、
最新仕様に追従できている入門書でしかも実績のある奴なんてあるのかね?

70 名前:デフォルトの名無しさん mailto:sage [2019/09/16(月) 22:01:20.50 ID:iDbWACrZ.net]
やっぱgoogleで検索が最強だからな



71 名前:デフォルトの名無しさん mailto:sage [2019/09/16(月) 23:01:30.54 ID:MvRcz04q.net]
でもネットだと最新のものが上位に来やすく、しかも、そのサイトを書いている人は
新しいものを推奨しがちだが、本を読んでみると新しく入ったやり方より
古いやり方のほうが多くの場合には推奨される、ということが理由とともに
丁寧に説明されている場合もある。本を書いている人は経験豊富で、能力も
高い場合が多いのに対し、ネットで書いている人は必ずしもそうではないので
仮に結果は正しいことを書いていても、「理由」は間違っている場合などもある。
だから正しい見解を学びたいなら本の方がよいと思う。
例えばの話、本だと学歴や経歴なども分かって、それと本文の内容を
照らし合わせると「立場」「立ち位置」が分かって言外の内容が読み取れることもある。

72 名前:デフォルトの名無しさん mailto:sage [2019/09/16(月) 23:10:11.04 ID:iDbWACrZ.net]
本だと一人の人の考え方に偏りがち

73 名前:デフォルトの名無しさん mailto:sage [2019/09/16(月) 23:19:15.84 ID:XEOx1c9f.net]
本も読んでネットも見て自分で判断するんだよ
一つのソースに依存して信じ込むのはプログラミングの勉強に限らずなんでもダメ

74 名前:デフォルトの名無しさん mailto:sage [2019/09/16(月) 23:41:43.90 ID:FH41VMpz.net]
>>54
>の部分の正確な意味が分かりません。
訳「ボクは馬鹿です」

>全体が、
>「using-directive」であるという理解なのですが。
まあそのページの下の方にもそう書いてあるな

75 名前:デフォルトの名無しさん mailto:sage [2019/09/17(火) 00:06:57.73 ID:e0hwvXZA.net]
何の助けにもならず何の意味もない全く必要のないレス

76 名前:デフォルトの名無しさん mailto:sage [2019/09/17(火) 06:05:19.69 ID:mC1Fem4G.net]
cout << sizeof "abc";
これで4と表示されるから
文字列リテラルはポインタだなんて書いてるサイトもあるしな

77 名前:デフォルトの名無しさん mailto:sage [2019/09/17(火) 08:44:15.33 ID:TMSCi5y8.net]
そんなサイト、あるの?

78 名前:デフォルトの名無しさん mailto:sage [2019/09/17(火) 09:03:18.20 ID:kyKgfAv0.net]
sejukuの侍エンジニア塾ブログじゃねえの?

あそこC言語の説明でやらかしただろ
もう絶対に信用しないよ

読んじゃいけないサイトのトップにランクインしてる
さっさと検索結果から消えてほしい

79 名前:デフォルトの名無しさん mailto:sage [2019/09/17(火) 11:47:19.71 ID:hai8m3HY.net]
いい加減だよな
うちは64bitだから8だぞ
cout << sizeof "Hello!!"

80 名前:デフォルトの名無しさん mailto:sage [2019/09/17(火) 12:04:06.87 ID:MolJflMP.net]
色々ツッコミどころがあるんだよねあれ

・C言語初心者はスクールがオフィシャルで出す解説を書くべきではない
・掲載前にはレビューするべき
・サイレント修正ではなく、お詫びと訂正を実施すべき



81 名前:デフォルトの名無しさん [2019/09/17(火) 17:38:47.21 ID:IoM9hprN.net]
>>65

82 名前:デフォルトの名無しさん mailto:sage [2019/09/17(火) 19:24:38.79 ID:vP5fcRYP.net]
実際糞記事読むくらいなら
ビャーネの本とかeffective modern c++読んだ方がよっぽど良い。

83 名前:デフォルトの名無しさん mailto:sage [2019/09/17(火) 19:31:26.02 ID:u1m7mz7R.net]
effectiveは古い

84 名前:デフォルトの名無しさん mailto:sage [2019/09/17(火) 19:34:51.97 ID:u1m7mz7R.net]
初心者には難しいし使ってる人には知ってることしか書いてない

85 名前:デフォルトの名無しさん mailto:sage [2019/09/17(火) 20:08:04.08 ID:g1BlUkdv.net]
>>84
極端だな。初心者が次のステップに進むにはちょうどいいだろう。

86 名前:デフォルトの名無しさん mailto:sage [2019/09/17(火) 20:26:03.45 ID:vP5fcRYP.net]
そうか?ここの連中なんてほとんど理解してるように思えんが。。

87 名前:デフォルトの名無しさん [2019/09/17(火) 22:10:10.83 ID:txYKQrA6.net]
あるグローバル変数を変更しているpublicメソッドA、Bがあります。
このグローバル変数の排他制御をするために

CCriticalSection cs;

void A()
{
CSingleLock lock( &cs, TRUE ) ;
...
}

void B()
{
CSingleLock lock( &cs, TRUE ) ;
...
}
このようにしようと思ったのですが、Aの中からBを呼び出しています。
どうしたらよいでしょうか?

88 名前:蟻人間 mailto:sage [2019/09/17(火) 22:12:04.47 ID:vrvr50SL.net]
>>87
ロックカウンター変数

89 名前:デフォルトの名無しさん [2019/09/17(火) 22:15:18.09 ID:D0xFlgCf.net]
C++に限らないが仕様が膨大だから一冊の本にするのは無理があるのに
色々網羅して中途半端な本多いよな。特には和書は。

90 名前:蟻人間 mailto:sage [2019/09/17(火) 22:21:08.25 ID:vrvr50SL.net]
カウント変数を追加し、ゼロで初期化。ロックがかかるときにカウントを1増やす。増やす直前にゼロだったら実際にロックする。ロックを解除するときにカウントを1減らす。ゼロになったら、実際にロックを解除する。



91 名前:デフォルトの名無しさん mailto:sage [2019/09/17(火) 22:23:33.48 ID:cgXPZZnO.net]
MZうyちゃーーーん♪こんなとこにいたのかw

92 名前:デフォルトの名無しさん mailto:sage [2019/09/17(火) 22:51:59.37 ID:/ZgM52F4.net]
>>87
同じスレッドでAの中からBが呼び出せるのは正常な動作です
逆に同じスレッドでAの中からBを呼び出したとき、Bでロックしてしまったら
誰がロックを解除するんですか?

93 名前:デフォルトの名無しさん mailto:sage [2019/09/17(火) 22:55:25.93 ID:cgXPZZnO.net]
ルンルン腹話術のお時間です(^ワ^)ワハハ!!

94 名前:デフォルトの名無しさん mailto:sage [2019/09/17(火) 23:02:25.13 ID:iJB0hxCG.net]
>>88
安易にそれ勧めない
まず再帰ロック不要な設計にするのが基本

95 名前:デフォルトの名無しさん mailto:sage [2019/09/17(火) 23:05:20.26 ID:cgXPZZnO.net]
問題集回しコピペワロタw

96 名前:デフォルトの名無しさん [2019/09/17(火) 23:06:00.71 ID:TcK6H4+J.net]
マイクロソフトがgithubにSTLの実装を公開してる。
どんどんオープンにしていくのな・・・

https://github.com/microsoft/STL

97 名前:デフォルトの名無しさん mailto:sage [2019/09/17(火) 23:08:28.20 ID:cgXPZZnO.net]
ガーガーバカw

98 名前:デフォルトの名無しさん mailto:sage [2019/09/17(火) 23:15:14.52 ID:aYbHZN9j.net]
>>92
それはwindowsのCRITICAL_SECTIONが再帰的ロック取得を認めているというだけで、
普遍的に通用する話じゃない。例えばstd::mutexを使った場合とかな。
>>87みたいなケースでは高階インターフェースのB()とinner_B()を分離するとかが常套手段だな。

99 名前:デフォルトの名無しさん mailto:sage [2019/09/17(火) 23:17:56.03 ID:f5N3Fp86.net]
サウンド鳴るようになったのか!

100 名前:デフォルトの名無しさん mailto:sage [2019/09/17(火) 23:22:32.62 ID:/ZgM52F4.net]
>>98
CCriticalSection
って書いてあるからCRITICAL_SECTIONの話では?



101 名前:デフォルトの名無しさん mailto:sage [2019/09/17(火) 23:23:20.44 ID:f5N3Fp86.net]
はい今日も完成品なしw

102 名前:デフォルトの名無しさん mailto:sage [2019/09/17(火) 23:35:00.33 ID:aYbHZN9j.net]
>>100
だからwindowsのCRITICAL_SECTIONなら通用する話だけど一般に通用する話じゃないってことだよ。
そういう環境だと

>逆に同じスレッドでAの中からBを呼び出したとき、Bでロックしてしまったら
>誰がロックを解除するんですか?

誰が解除するか心配する以前にBでロックを試みた時点で例外が飛んだりする。

103 名前:デフォルトの名無しさん mailto:sage [2019/09/17(火) 23:35:10.09 ID:5UuHJcwd.net]
recursive lock

104 名前:デフォルトの名無しさん mailto:sage [2019/09/17(火) 23:40:43.31 ID:ZBXs33c7.net]
>>87
CCriticalSection cs;

void B_Core() {
 /*元々のB()でやろうとしていた処理・lockは抜き*/
}

void A() {
 CSingleLock lock( &cs, TRUE ) ;
 ...
 B_Core(); // A()の中からはB()の代わりにこれを呼ぶ
 ...
}

void B() {
 CSingleLock lock( &cs, TRUE );
B_Core();
}

もちろんB_Core()は外部から呼べないようにするべきである。

105 名前:デフォルトの名無しさん mailto:sage [2019/09/17(火) 23:46:17.48 ID:/ZgM52F4.net]
>>102
それはWindowsのCRITICAL_SECTIONでは再ロック可能にしてある理由の説明なんですが

106 名前:デフォルトの名無しさん mailto:sage [2019/09/17(火) 23:47:40.49 ID:ZBXs33c7.net]
ジャヴァのsynchronizeとか再帰ロックオールOK
なんでかわ知らん
ていうかwait()をsynchronizeでかこわなけっればならないという
謎仕様
意味わからん…

107 名前:デフォルトの名無しさん mailto:sage [2019/09/18(水) 00:06:04.33 ID:ccSwOulV.net]
まあこんなクロージャとの組み合わせのときにちょっと意味があるのかもしれんが…
// UIスレッド
Handler handler = new Handler();
...
// バックグラウンドスレッド
synchronize (this) {
 final Foo thisObj = this;
handler.post(new Runnable() {
   @Override
   void run() { /*...*/ thisObj.notify(); /*...*/ } // クロージャ内から仕掛け元のthis.wait()を起こす
 });
wait();
}

つかnotify()とwait()の1対1対応とかを言語が暗黙のうちに仮定しているからか、
今わかったわ糞が…!!

108 名前:デフォルトの名無しさん mailto:sage [2019/09/18(水) 00:06:06.17 ID:WgADinsd.net]
謎じゃない
condをどうやって実装するか調べてみ

109 名前:デフォルトの名無しさん mailto:sage [2019/09/18(水) 11:06:38.20 ID:FwmyHFG9.net]
BASIC未満のゴミw

110 名前:デフォルトの名無しさん mailto:sage [2019/09/18(水) 12:20:05.69 ID:gxRTPgch.net]
主語が足りてないぞチミ。



111 名前:デフォルトの名無しさん mailto:sage [2019/09/18(水) 12:54:00.14 ID:1Vhu13ZT.net]
algorithmだけで5000行あんのか
https://github.com/microsoft/STL/blob/master/stl/inc/algorithm
有り難くて目が潰れる

112 名前:デフォルトの名無しさん [2019/09/18(水) 15:09:43.97 ID:cX0n8f6q.net]
ファイルにテキストを書き込みする際に、
ファイルにどれだけ書き込んだかを取得してプログレスバー的な処理をしたいのですが、
どのようにして書き込んだ量を取得すればいいのでしょうか?

113 名前:蟻人間 mailto:sage [2019/09/18(水) 15:14:37.40 ID:d3y9L0GY.net]
書き込んだバイト数の合計を数えるしかない。fprintfなら戻り値。文字列ならstrlen。

114 名前:蟻人間 mailto:sage [2019/09/18(水) 15:19:25.37 ID:d3y9L0GY.net]
合計バイト数がわからない場合は最初に全部数えるか、バイト数の代わりに行数などを使う手もある。

115 名前:デフォルトの名無しさん mailto:sage [2019/09/18(水) 23:17:12.89 ID:UKnFRk4i.net]
頑張ってプログレスバーを実装したはいいがいざ実行すると
一瞬で表示が終り実装した意味あったのか・・と嘆く >>112 の未来の姿がみえる・・

116 名前:デフォルトの名無しさん mailto:sage [2019/09/19(木) 00:44:38.80 ID:zP6ZrAr3.net]
書き込んだ量を取得することより、書き込み総量を計算するほうが難しい
ですよね。特にプログレスバーが必要になるほどトータル時間の掛かる処理の場合
に正確な総量を計算するとなれば莫大な時間が掛かってしまう可能性が高くて。
だから推定量を何らかの方法で求めるしかない事が多いでしょう。

117 名前:デフォルトの名無しさん mailto:sage [2019/09/19(木) 01:08:08.89 ID:pXxp02XD.net]
いや足していくだけだけど

118 名前:デフォルトの名無しさん mailto:sage [2019/09/19(木) 01:11:02.88 ID:b8NtymRi.net]
つーかテキストだろ?ギガ単位のサイズじゃないんなら
一回メモリにバコバコ貯めといて一気にブワァーッと書くほうが早いよいろいろと

119 名前:デフォルトの名無しさん mailto:sage [2019/09/19(木) 01:23:42.33 ID:wlX+Ifsh.net]
だな
今のコンピュータなら数十MBくらいガバっと読み込んでいいのに、いまだに少しずつみたいな解説してる本やウェブサイト大杉

120 名前:デフォルトの名無しさん mailto:sage [2019/09/19(木) 06:29:12.29 ID:TNTldw8V.net]
プログレスバーとかユーザーの気を静めるためのインテリアみたいなもんなので
過度に精度に凝っても仕方が無い
例えばウィンドーズのファイルシステムで1フォルダに10万個ぐらいファイルがあって
それをリモートのウィンドーズのファイルシステムにコピーするとかな場合は
ファイルのトータル容量とか気にせずに
 進捗率(%) = 100 * コピーしたファイル数/10万個ぐらい
でも役に立つ



121 名前:デフォルトの名無しさん mailto:sage [2019/09/19(木) 06:32:56.13 ID:1k0/HGmS.net]
いやプログレスバーは「きちんと」「しっかり」作らないと
ユーザーのイライラゲージを却って煽ることになるぞ

122 名前:デフォルトの名無しさん mailto:sage [2019/09/19(木) 06:34:12.46 ID:TNTldw8V.net]
長らくぴくりとも動かなかったプログレスバーが一気に進んだとき
ユーザーに爽快感を与えることができうる

123 名前:デフォルトの名無しさん mailto:sage [2019/09/19(木) 07:48:55.38 ID:FVuvug5W.net]
>>122
自分でそれを見たらイライラするタイプだろう

124 名前:デフォルトの名無しさん mailto:sage [2019/09/19(木) 08:27:53.76 ID:UG8ew1B1.net]
99%で止まるやつはイライラするな。
進捗率よりも、書き込んだバイト数とか表示してくれると動いてるのがわかるから好きだな。

125 名前:デフォルトの名無しさん mailto:sage [2019/09/19(木) 08:40:01.59 ID:X+5OT7FX.net]
>>121
windows update

126 名前:デフォルトの名無しさん mailto:sage [2019/09/19(木) 23:28:31.87 ID:TdUlR93V.net]
progress_displayたん…どうして死んじゃったの…

127 名前:デフォルトの名無しさん mailto:sage [2019/09/20(金) 08:56:12.04 ID:Qo6+tgpY.net]
全支店のファイルを集計するツール作った時
九州支店とか遠方の支店に入ると突然90%とかから進まなくなって
イライラおじさんに「なら最初から期待させるな」みたいなお説教された思い出

そこの回線だけやたら細かったというオチなんですけどね
今ならどうやって作るかなあ?
前処理で軽くテスト集計して予想回線速度をチェックしたうえで
拠点ごとに速度の重みづけをして見積もるか?

きちんとやるなら面倒だけどやるしかないよな
それとも運用方法の変更なりで逃げるか
プログレスバーの工数見積り怖い・・・

128 名前:デフォルトの名無しさん mailto:sage [2019/09/20(金) 09:04:34.21 ID:Qo6+tgpY.net]
処理中のファイル名をリアルタイム表示して
進捗率の方はあくまで参考値という体にする手もあるか
あとは費用対効果を説明してこれで我慢してもらう交渉でって感じで
キャンセルボタンも付けるべきだよな上司はイランて言ってたけど

129 名前:デフォルトの名無しさん mailto:sage [2019/09/20(金) 09:12:44.78 ID:hmm5+Tdj.net]
プログレスバーの下に店名と店長の名前表示すりゃいいじゃん

130 名前:デフォルトの名無しさん mailto:sage [2019/09/20(金) 09:29:35.36 ID:JFYTR1x6.net]
その支店に接続するのにかかった時間を計測しておいて
それをベースに表示してみたら



131 名前:デフォルトの名無しさん mailto:sage [2019/09/20(金) 10:44:26.44 ID:BhKigXRx.net]
接続先と毎秒の処理したバイト数でも表示すればいいんでね。

132 名前:デフォルトの名無しさん mailto:sage [2019/09/20(金) 11:11:25.39 ID:Qo6+tgpY.net]
>>129
店長の名前は関係ないだろ
うっかり考え込んでしまったわ

133 名前:デフォルトの名無しさん mailto:sage [2019/09/20(金) 11:36:45.41 ID:hmm5+Tdj.net]
クレーム先だよ
なんなら電話番号も出せばいい

134 名前:デフォルトの名無しさん mailto:sage [2019/09/20(金) 12:02:27.62 ID:l/kiVjID.net]
ロード中にテトリスで遊べるようにしておけばいいよ

135 名前:デフォルトの名無しさん mailto:sage [2019/09/20(金) 14:12:27.16 ID:RTklMOF0.net]
>>134
それたしかナムコが特許もってたような

136 名前:デフォルトの名無しさん mailto:sage [2019/09/20(金) 14:57:59.95 ID:KQX84Fxf.net]
とっくに消滅してる

137 名前:デフォルトの名無しさん mailto:sage [2019/09/20(金) 18:37:33.58 ID:xrPkbjYn.net]
あるクラスのインスタンスを生成するときに、必ずあるメンバを初期化してほしいとします。
このとき、コンストラクタで初期化することにしたのですが、初期化は必ずやってほしいためデフォルトコンストラクタは禁止したいです。

デフォルトコンストラクタを禁止するのはどうやりますか。

138 名前:デフォルトの名無しさん mailto:sage [2019/09/20(金) 18:43:14.50 ID:MFrl2Bhu.net]
deleteすりゃいいじゃん。これ以上は言わぬ

139 名前:さまよえる蟻人間 mailto:sage [2019/09/20(金) 19:02:34.17 ID:sJdfK6qv.net]
>>137
モダンなやり方は = delete;だろう。

古臭いやり方はprivateにして定義を書かないようにすれば、アクセスできないようになる。

140 名前:デフォルトの名無しさん mailto:sage [2019/09/20(金) 19:30:48.34 ID:HuG+DEnO.net]
5年ぐらい前に失効してたのか・・時の流れるのは早いのう
https://automaton-media.com/articles/newsjp/loading-screen-mini-games-patent-will-be-expired-at-united-states/



141 名前:デフォルトの名無しさん mailto:sage [2019/09/20(金) 19:32:15.62 ID:mfXfj+Qu.net]
どうでもいいがC++界隈はハチミツギョーザとか蟻人間とか
なかなかユニークなコテが多い印象

142 名前:デフォルトの名無しさん mailto:sage [2019/09/20(金) 19:58:49.42 ID:xrPkbjYn.net]
>>138-139
ありがとうございます。
やりたいことそのものです。

143 名前:デフォルトの名無しさん mailto:sage [2019/09/20(金) 21:54:40.66 ID:Q9EEZSVd.net]
キャンセルボタンなしの進捗ダイアログ表示して安心してたらESCキーで閉じられて不正動作

144 名前: mailto:sage [2019/09/21(土) 12:33:44.52 ID:HPdvwX1r.net]
>>141
「蟻人間」のコテは最近それに改名されたものですよ…

145 名前:デフォルトの名無しさん [2019/09/21(土) 17:28:53.63 ID:hvfc00gO.net]
Visual Studio 2019 C++ community editionを使用して
PythonをC++で使いたいのですが、

Pythonライブラリーの Python.h ファイルに
#pragma comment(lib,"Python37.lib")
といった記述があり、それがリンクエラーの原因となっております。

プロジェクトプロパティ>VC++ディレクトリ>ライブラリディレクトリには
「$(Path)libs」と記述して、パスは通したのですが改善されません。

これのリンクを通したいのですが、どのようにして対処すればよいのでしょうか?
お願いします。

146 名前:デフォルトの名無しさん mailto:sage [2019/09/21(土) 17:46:36.63 ID:B7P1QhOW.net]
$(Path)という定義済みマクロが無いか、あるいは環境変数PATHの内容が
そのまま(つまり複数のパスを「;」を挟んで連接した文字列に)展開されているのかもしれんから、
展開結果を確認するか、それができないのであれば
絶対間違いのない絶対パス指定でうまくリンクできることを確かめてから改めて来なちゃい

147 名前:デフォルトの名無しさん [2019/09/21(土) 18:20:26.50 ID:hvfc00gO.net]
>>146 さん。ありがとうございます。

絶対パス指定ならリンクは通りました。
ただ、相対パス自体はあるのですが展開結果が連結しているようです。

重ねての質問になるのですが、
#pragma 等で相対パスを使用する際に、
相対パスが連結している場合はどう対処すればいいのでしょうか?

148 名前:デフォルトの名無しさん mailto:sage [2019/09/21(土) 18:54:54.04 ID:B7P1QhOW.net]
ライブラリをソリューション相対指定可能なフォルダに置いて
Visual Studioの定義済みマクロ($(SolutionDir)なり$(ProjectDir)なり)を正しく使えば良いだけの話なのでは…

あるいは、ライブラリのインストール先が決まっておりライブラリの位置を勝手に動かせないということであれば、
絶対パス指定で何の問題も無いはず…

ソースコードなりプロジェクトファイルなりに絶対パス指定が書かれることによるプロジェクトの可搬性が問題になるなら
適当な環境変数を設けてそれにただ1個のパスだけ定義して$(環境変数名)で展開させるか、
絶対パス部分をVisual Studioの機能でユーザーマクロ定義して最小化することができうる
※ [表示]→[その他のウィンドウ]→[プロパティーマネージャ]、とすればプロパティーマネージャータブが現れるので
  そこで継承元の設定を変更でき、その中でマクロのユーザー定義が可能

いじょ 耕運を祈る、

149 名前:デフォルトの名無しさん mailto:sage [2019/09/22(日) 06:52:19.04 ID:wJwJ26l5.net]
std::variantってテンプレートによる静的ポリモーフィズムを実現しつつ一つのコンテナで管理したいという要求から生まれたんでしょうか
であるとしたら今後継承による動的ポリモーフィズムは下火になっていくのでしょうか

150 名前:デフォルトの名無しさん mailto:sage [2019/09/22(日) 10:30:22.84 ID:dVD4vVZj.net]
variantは共用体の代わり



151 名前:デフォルトの名無しさん mailto:sage [2019/09/22(日) 22:04:08.49 ID:P121omqV.net]
> std::variantってテンプレートによる静的ポリモーフィズムを実現
継承もstd::variantも実際に格納されている型が実行時まで分からないのだから、
静的(コンパイル時)ポリモーフィズムにはならないのでは?

152 名前:デフォルトの名無しさん mailto:sage [2019/09/23(月) 00:26:21.21 ID:7kwjfJuy.net]
gcc, clang, VC++, その他
仕事で使われるのはどれ?

153 名前:デフォルトの名無しさん mailto:sage [2019/09/23(月) 00:50:57.87 ID:QJYuDw18.net]
>>152
gcc, clang, VC++

154 名前:デフォルトの名無しさん mailto:sage [2019/09/23(月) 01:06:32.53 ID:4WIp5ctr.net]
intelも使われるし、C++ Builderも使われてる

155 名前:デフォルトの名無しさん mailto:sage [2019/09/23(月) 01:21:58.30 ID:7kwjfJuy.net]
仕事でC++14より上使っている?

156 名前:デフォルトの名無しさん mailto:sage [2019/09/23(月) 03:12:30.92 ID:aMvJGSmY.net]
iccって高いだけで性能もgccとほぼ変わらないなら値段に見合う利点あるのか?

157 名前:デフォルトの名無しさん mailto:sage [2019/09/23(月) 09:16:12.73 ID:QJYuDw18.net]
メニーコアなCPUとSIMDを使ったときのプロファイラが優秀
おそらく <

158 名前:デフォルトの名無しさん mailto:sage [2019/09/23(月) 11:42:56.67 ID:rVs/BJT1.net]
普通に17使うだろ
filesystemやvariant,optional使わんの?

159 名前:デフォルトの名無しさん mailto:sage [2019/09/23(月) 11:57:29.62 ID:f1jovMGd.net]
だよな

160 名前:デフォルトの名無しさん mailto:sage [2019/09/23(月) 12:02:46.51 ID:P5eYiou7.net]
お仕事だとそうぽんぽんバージョンあげられないし
使っていい標準ライブラリのしばりもあったりするんですよ
特にプラットフォーム抽象する系はあんまり使わない
そんなのにべったり頼るぐらいならc++でなくてよくね?ってなる



161 名前:デフォルトの名無しさん mailto:sage [2019/09/23(月) 12:08:09.26 ID:rVs/BJT1.net]
最近はmsvcがバイナリ互換保ち続けているから安心してあげられる。
gccやclangはもともと対応早いから安心だったし。

162 名前:デフォルトの名無しさん mailto:sage [2019/09/23(月) 12:19:16.90 ID:f1jovMGd.net]
>>160
filesystem使って見た?
まだ荒削りで所々変なところがあるけど
方向性としてはいい線ついてると思うぜ

163 名前:デフォルトの名無しさん mailto:sage [2019/09/23(月) 12:24:31.61 ID:EI75oq0E.net]
あ、こいつバギーなライブラリ入れて現場荒らすタイプだわw

164 名前:デフォルトの名無しさん mailto:sage [2019/09/23(月) 12:31:48.66 ID:rVs/BJT1.net]
勝手にライブラリ追加できる時点で糞みたいな職場じゃね

165 名前:デフォルトの名無しさん mailto:sage [2019/09/23(月) 12:47:46.83 ID:f1jovMGd.net]
難癖つけるのは構わんが
脇が甘いぞおまえら

166 名前:デフォルトの名無しさん mailto:sage [2019/09/23(月) 13:15:30.01 ID:WS0TgAIm.net]
まあケースバイケースだろ
ポンポンバージョン上げられないって言うだけで古い環境使い続ける職場もどうかと思うし

167 名前:デフォルトの名無しさん mailto:sage [2019/09/23(月) 13:21:49.79 ID:P5eYiou7.net]
>>162
ファイルシステムまわりはこてこてにネイティブ依存の内製のものがあるので出番はないでしょうね
パフォーマンス第一の仕事なもので
あと標準ライブラリはデバッガやプロファイラのことがスコープ外なのでそのあたり自分達で整備しないと採用できないってのもある

168 名前:デフォルトの名無しさん mailto:sage [2019/09/23(月) 13:33:54.17 ID:f1jovMGd.net]
なるほどね
パフォーマンス第一か
どっちかつーと標準なんぞ糞くらえつーか
標準の意味が違ったりするわけか

169 名前:デフォルトの名無しさん mailto:sage [2019/09/23(月) 14:04:13.62 ID:JqkYM16h.net]
同じじゃん標準ライブラリは一般性重視故に特定の問題領域において必ずしも最高の性能は発揮しない(最高の性能となる保証がない)ことは確定的に明らかよって80-20の法則の80部分からパフォチューしていく

170 名前:デフォルトの名無しさん mailto:sage [2019/09/23(月) 14:07:39.82 ID:QJYuDw18.net]
頭悪い書き込みしか無くて草



171 名前:デフォルトの名無しさん mailto:sage [2019/09/23(月) 14:31:50.86 ID:JqkYM16h.net]
天 才 現 る

172 名前:デフォルトの名無しさん mailto:sage [2019/09/23(月) 22:59:04.40 ID:EI75oq0E.net]
てかc++でやることじゃねーだろどう考えても。
糞の役にも立たんわ。

173 名前:デフォルトの名無しさん mailto:sage [2019/09/24(火) 00:22:06.58 ID:iXMkuGmM.net]
C++でやる事って何よ?

174 名前:デフォルトの名無しさん mailto:sage [2019/09/24(火) 01:05:00.80 ID:blreVUO1.net]
templateで遊ぶくらいしかやることないね。

175 名前:デフォルトの名無しさん mailto:sage [2019/09/24(火) 06:38:35.03 ID:3E9gAKbz.net]
仕事がないって話はマ板でやんな

176 名前:デフォルトの名無しさん mailto:sage [2019/09/24(火) 18:32:13.78 ID:9F3bEWFD.net]
汎用性・可搬性を重視するかパフォーマンスを重視するかのスタンスの違いだけでしょ

177 名前:デフォルトの名無しさん mailto:sage [2019/09/24(火) 19:39:45.71 ID:bRBDEgqh.net]
>>173
filesystemみたいなライブラリの実装。

178 名前:デフォルトの名無しさん [2019/09/24(火) 20:52:11.47 ID:ZtSwhx8Z.net]
visual studio 2019 16.3でついにconceptが使えるように(赤線でるけど。。。

179 名前:デフォルトの名無しさん mailto:sage [2019/09/25(水) 00:19:35.27 ID:T/Q1Hzp4.net]
conceptはいい
人類は真の抽象化を手にする

180 名前:デフォルトの名無しさん mailto:sage [2019/09/25(水) 00:39:03.31 ID:0gY/IvgH.net]
C++98の俺には1ミリも関係ない話だな。



181 名前:デフォルトの名無しさん mailto:sage [2019/09/25(水) 00:43:58.99 ID:ROl8Z6BD.net]
じゃあ出て行け

182 名前:デフォルトの名無しさん mailto:sage [2019/09/25(水) 01:15:27.21 ID:zpsuJSx5.net]
98とかVB6と同レベルの化石

183 名前:デフォルトの名無しさん mailto:sage [2019/09/25(水) 16:32:45.50 ID:5a ]
[ここ壊れてます]

184 名前:P+8CuP.net mailto: >>181
お前が出て行け
[]
[ここ壊れてます]

185 名前:デフォルトの名無しさん mailto:sage [2019/09/25(水) 21:10:30.42 ID:065+eRsw.net]
じゃあ俺が

186 名前:デフォルトの名無しさん mailto:sage [2019/09/25(水) 21:20:37.77 ID:SmUxqnJ3.net]
いやおれが

187 名前:デフォルトの名無しさん mailto:sage [2019/09/28(土) 01:40:31.76 ID:cIYNjYIc.net]
重複スレの方が謎の盛り上がり

188 名前:デフォルトの名無しさん mailto:sage [2019/09/28(土) 02:11:00.78 ID:intFUv+k.net]
void君はあのスレから出られないからな

189 名前:デフォルトの名無しさん [2019/09/28(土) 14:48:43.27 ID:nKwEArCO.net]
このスレはwinapiを扱ってますか?
sendmessageとか。

190 名前:デフォルトの名無しさん mailto:sage [2019/09/28(土) 16:09:42.06 ID:EwMBvois.net]
>>188
Win32API質問箱 Build125 :
mevius.5ch.net/test/read.cgi/tech/1551247748/l50



191 名前: mailto:sage [2019/09/28(土) 16:12:26.72 ID:QJtrgyVU.net]
>>188
win32api ならやってる人は少なからず居ると思います

192 名前:デフォルトの名無しさん [2019/09/28(土) 16:37:07.73 ID:nKwEArCO.net]
>>190
サンクス!

193 名前:デフォルトの名無しさん mailto:sage [2019/09/29(日) 07:24:31.34 ID:wVCOjSn/.net]
文法とか開発思想の初歩的な質問なんだが、例えば最大流問題を解くプログラムと最小費用流問題を解くプログラムで「Edge」という構造体や「dfs」という関数の意味を変えたいときに使うのが名前空間だという理解でOK?
(関数の意味を変えたいだけなら名前空間じゃなくて別のクラスを用意すれば良いだけかな?)


あと、名前空間の中でグローバル変数を使うのは通常のグローバル変数と同じで慎重にやった方が良い(と言われてる)?
例えば最小費用流問題を解くときに経路の情報を記録したりするんだが、この経路を mincostflowという名前空間におけるグローバル変数にするとか

194 名前:デフォルトの名無しさん mailto:sage [2019/09/29(日) 09:01:23.18 ID:thkZayt3.net]
名前空間は名前をまとめるだけであって隠蔽したり上書きしたりする機能はない
素直にクラス使え

195 名前:デフォルトの名無しさん mailto:sage [2019/09/29(日) 10:02:14.52 ID:sih8o/+S.net]
>>192
そのくらいのプログラムでは名前空間は使わない方がいい。
使うべきなのはクラス。

196 名前:デフォルトの名無しさん mailto:sage [2019/09/29(日) 10:24:44.95 ID:MP9GBJ11.net]
いや同じ識別子を違う意味で使いたいのなら名前空間だ
名前をどうかしたいというだけでクラス化するといらん制限がかかって邪魔なだけ

197 名前:デフォルトの名無しさん mailto:sage [2019/09/29(日) 10:27:55.39 ID:lvoGL429.net]
>>192
その例では明らかにグローバル変数を使う必要はない。
「最小費用流を解くクラス」のメンバに押し込めるのが普通だと思われる。

198 名前:デフォルトの名無しさん mailto:sage [2019/09/29(日) 12:21:02.27 ID:xopwPRlT.net]
名前空間は一連の処理や機能をライブラリとしてまとめるときに他のライブラリと名前衝突しないようにするためのものだ
minとmaxの違いだけなら名前空間分けずに変数名や関数名に直接反映させればいいのでは

199 名前:デフォルトの名無しさん mailto:sage [2019/09/29(日) 15:27:39.30 ID:sih8o/+S.net]
>>197
個人的には自分もそう理解しています。
自分が作るプログラムでは namespace は基本的に使う必要はほぼ
有りません。古い時代に既に作ってしまったプログラムで名前が衝突して
困るような場合に使うと便利な機能として登場したのではないかと思っています。

200 名前:デフォルトの名無しさん mailto:sage [2019/09/29(日) 15:31:08.94 ID:MP9GBJ11.net]
せっかくの回避策をマクロでばっちり透過してくれた素敵なマイクロソフトw



201 名前:デフォルトの名無しさん mailto:sage [2019/09/29(日) 16:03:17.31 ID:k4CvVXqN.net]
>>198
昔作ったものに対してだけでなく、いま作ったものが将来使うときに名前の衝突を回避するという目的もあるぞ。

202 名前:デフォルトの名無しさん mailto:sage [2019/09/29(日) 16:52:41.21 ID:1aVYpaid.net]
なぜ日本人c++プログラマの99%はstd::vectorもstd::find_ifも見たことすらないのだろう。
c言語風の生ポインタ、生配列、if文、for文のみを使ったプログラムしか読めない。
外国の人でそういう人は見たことがない。

203 名前:デフォルトの名無しさん mailto:sage [2019/09/29(日) 17:03:09.76 ID:bY9zxDl0.net]
99%は盛り過ぎでは・・・

204 名前:デフォルトの名無しさん mailto:sage [2019/09/29(日) 17:06:09.85 ID:cKDPFQQS.net]
>>201
ワイド文字知らん人見たことあるわ

205 名前:デフォルトの名無しさん mailto:sage [2019/09/29(日) 17:28:35.45 ID:TRtZnyIq.net]
体感で8割ぐらいかな
まず規格があって改訂されてるってことも知らないのもいる

これは他の言語にも言えることだが
職場で使ったことのあるJavaやPHPのバージョンと環境がすべてみたいな

206 名前:デフォルトの名無しさん mailto:sage [2019/09/29(日) 17:37:04.15 ID:MP9GBJ11.net]
>>201
おまえ豚小屋にでも住んでるのか?w

207 名前:デフォルトの名無しさん mailto:sage [2019/09/29(日) 17:38:36.19 ID:MCSEZmay.net]
C++20に入るauto変数を使った簡易関数テンプレートは宣言と実装を分割してコンパイルできますか?

208 名前:デフォルトの名無しさん mailto:sage [2019/09/29(日) 18:02:01.75 ID:xopwPRlT.net]
全部ヘッダーファイルに書いてしまえ

209 名前:デフォルトの名無しさん mailto:sage [2019/09/29(日) 18:13:05.80 ID:Lkb9fNY1.net]
vector知らんのはいたとしても組み込みマンくらいだろ

210 名前:デフォルトの名無しさん mailto:sage [2019/09/29(日) 19:02:41.77 ID:bY9zxDl0.net]
>>206
多分戻り値型と同じで、1つの翻訳単位内ならできると思う
宣言だけヘッダに書いたりするとautoのままだと呼び出せない



211 名前:デフォルトの名無しさん mailto:sage [2019/09/29(日) 19:46:49.92 ID:qdFsd7WD.net]
>>208
組み込みマンはC言語だろ
C++使っててstd::vector知らないのは流石に勉強不足

212 名前:デフォルトの名無しさん mailto:sage [2019/09/29(日) 19:56:43.66 ID:MCSEZmay.net]
>>209
ありがとう
やっぱだめか

213 名前:デフォルトの名無しさん mailto:sage [2019/09/29(日) 21:36:43.15 ID:MP9GBJ11.net]
>>210
組み込みマンだからprinf知りませんみたいなもんだなw

214 名前:デフォルトの名無しさん mailto:sage [2019/09/29(日) 21:44:06.01 ID:xcXauKC9.net]
vectorの存在は知っていても中身は知らんやつばっかだろ
いまだに生配列の方が速いとか言ってるやついるし

215 名前:デフォルトの名無しさん mailto:sage [2019/09/29(日) 21:51:00.97 ID:lvoGL429.net]
まあ実際計ってる奴はそんなにはいないわな。
てきとうな演算するくらいなら配列だろうとvectorだろうとほとんど変わらん
(ただしコンパイルオプションによる。
O2 ならそんな変わらんが最適化しないとvectorは本当に遅い。)

216 名前:デフォルトの名無しさん mailto:sage [2019/09/29(日) 21:57:52.25 ID:OYiClG3B.net]
まあ最適化有効にすれば、すればそこいらの玄人が生配列でごちゃごちゃ書くより速くなることが多いがな

217 名前:デフォルトの名無しさん mailto:sage [2019/09/29(日) 22:09:42.47 ID:7KCLRAec.net]
サイズを変えない操作でvectorと生配列の効率に違いなんかないだろ

218 名前:デフォルトの名無しさん mailto:sage [2019/09/29(日) 22:16:27.22 ID:C35/CdkS.net]
ただ最近のc++の最適化前提のスタンスはいただけないな
デバッグのためにデバッグビルド使おうとするが一桁二桁遅くなって実用に耐えないとか
問題再現できないとか多々あって困る

219 名前:デフォルトの名無しさん mailto:sage [2019/09/29(日) 22:58:28.58 ID:UVnMNq40.net]
>>217
そういうのはコンパイラベンダに言わないと変わらないでしょ。
言語規格としては知ったことではない。

220 名前:デフォルトの名無しさん mailto:sage [2019/09/29(日) 23:03:53.99 ID:7KCLRAec.net]
もし最適化の有無で速度の変わらないコードがあったとしたら、まず間違いなく人が読めるものではないだろうな



221 名前:デフォルトの名無しさん mailto:sage [2019/09/29(日) 23:06:55.39 ID:C35/CdkS.net]
こういう開き直りのスタンスって何か固有名詞ついてなかったっけ?
マッチポンプではないし・・なんかなかったかな?

222 名前:デフォルトの名無しさん mailto:sage [2019/09/29(日) 23:10:51.16 ID:C35/CdkS.net]
>>219
Cはコードはそこまでひどく遅くならないからね

223 名前:デフォルトの名無しさん mailto:sage [2019/09/29(日) 23:28:02.53 ID:bY9zxDl0.net]
そのおかげで実行時の速度と抽象化した書き方の両立ができるのでまあ仕方ないのでは

224 名前:デフォルトの名無しさん mailto:sage [2019/09/29(日) 23:34:47.03 ID:C35/CdkS.net]
仕事でやってるので仕方ないで済まないんですよね
かつ遅いところは自分達では手が入れられないところだったり
こういうところ共感できる人いないのかな

225 名前:デフォルトの名無しさん mailto:sage [2019/09/29(日) 23:37:19.27 ID:SfsnISLI.net]
>>217
良いPC買え

226 名前:デフォルトの名無しさん mailto:sage [2019/09/29(日) 23:39:36.92 ID:C35/CdkS.net]
>>224
10、100倍遅い問題がPC買い替えてなんとかなると思います?
あと使ってるPC結構いいスペックですよ
開発環境には金かけてくれる会社なんで

227 名前:デフォルトの名無しさん mailto:sage [2019/09/29(日) 23:53:13.21 ID:7KCLRAec.net]
仕事でやってようと高水準言語とはそういうものなのだから仕方ないものは仕方ない
仕方ないで済まされないなら仕事をやめるしかない
仕事は不可能を可能にするものではない

そんなに最適化が気に入らないなら最適化なしでリリースすりゃいい
プロダクトとデバッグ環境が同一になる

228 名前:デフォルトの名無しさん mailto:sage [2019/09/29(日) 23:55:18.86 ID:lvoGL429.net]
仕方ないで済まないのでc++使わずc使うっていう話だな。
そこまで無理してc++を使う必然性はない。
結局組み込み系で行われる判断というのはそういったものなんだろう。

229 名前:デフォルトの名無しさん mailto:sage [2019/09/29(日) 23:56:29.88 ID:SfsnISLI.net]
じゃあ使わなければいい終わり
苦行を強いられているなら文句を言わずに甘んじて受け入れてくれうざい
デバッグができないくらい時間がかかるのであればデバッグ用にデータを減らすかデバッガを使わずにデバッグすればいいだけ

230 名前:デフォルトの名無しさん mailto:sage [2019/09/30(月) 00:01:41.09 ID:1t7BL5a5.net]
c++の問題を指摘したら自分が否定されてる気持ちになる人ですね?
こういうのって何か固有名詞ついてましたよね?
心理学かなにかの



231 名前:デフォルトの名無しさん mailto:sage [2019/09/30(月) 00:07:48.80 ID:K1luVxXx.net]
自分以外は仕事でC++使ってないと思ってるのかねえ

232 名前:デフォルトの名無しさん mailto:sage [2019/09/30(月) 00:12:05.55 ID:d3KN1ocd.net]
C++の問題ではなく、トレードオフなものを両取りできないことに腹を立てている馬鹿の頭が問題

233 名前:デフォルトの名無しさん mailto:sage [2019/09/30(月) 00:29:11.50 ID:BjVWgoML.net]
debugバージョンでもinline有効にすれば良い

234 名前:デフォルトの名無しさん mailto:sage [2019/09/30(月) 00:41:06.86 ID:BjVWgoML.net]
gccなら-Ogとか使えば楽

235 名前:デフォルトの名無しさん [2019/09/30(月) 08:38:56.00 ID:96lznZkD.net]
>>217
問題再現できないのってUB踏んでるんじゃ...

236 名前:デフォルトの名無しさん mailto:sage [2019/09/30(月) 20:10:40.43 ID:m19D9tLr.net]
c++ほどサンクコストに引っ張られる輩を作り出す言語はないだろうな。

237 名前:デフォルトの名無しさん mailto:sage [2019/09/30(月) 20:22:13.77 ID:H9c5jpU6.net]
つまり他の言語は底の浅いオモチャ、と

238 名前:デフォルトの名無しさん mailto:sage [2019/09/30(月) 20:56:24.52 ID:m19D9tLr.net]
そんな掘ってもしょうがないところが深くても邪魔なだけなんだよ。

239 名前:デフォルトの名無しさん mailto:sage [2019/09/30(月) 21:49:42.53 ID:A2h+ApYr.net]
あっさ

240 名前:デフォルトの名無しさん mailto:sage [2019/09/30(月) 21:53:05.92 ID:eLbbGbO7.net]
速度や効率を度外視すれば実はプログラミングはものすごく簡単になることが多い。
ところがそれだと劇的に遅くなってしまう。うまく工夫して書かれたプログラムの
所要時間を1とすると、何にも考えずに書かれたプログラムの所要時間は、
100兆位になることがある。そこまで極端でないにしても何にも考えなければ
100位にはなる。その意味で高速化を常に意識しながら組むことは結構
大切な事だと思う。特にアルゴリズム的な部分においては。



241 名前:デフォルトの名無しさん mailto:sage [2019/09/30(月) 22:05:07.81 ID:JjfJ0hCF.net]
アルゴリズム的に改善できる話なら言語関係ないじゃん

242 名前:デフォルトの名無しさん mailto:sage [2019/09/30(月) 22:28:45.63 ID:29SpHEC8.net]
固定少数が速いとかdoubleよりもfloatが速いとか割算は遅いから掛け算だとか色々な噂聞いたけど・・・

今時ほとんど変わらんよね?

243 名前:デフォルトの名無しさん mailto:sage [2019/09/30(月) 22:34:03.50 ID:/hygPyRQ.net]
>>241
実際測ってみりゃいいよ

244 名前:デフォルトの名無しさん mailto:sage [2019/09/30(月) 22:48:36.98 ID:ypiuCBLp.net]
その時のためのtemplateです。

245 名前:デフォルトの名無しさん mailto:sage [2019/09/30(月) 23:07:55.69 ID:ypiuCBLp.net]
https://ideone.com/p9ISAq
これなんで通らんのやろう?
コード補完で読み切れないのはいいけど、コンパイラさんは読めても良いのでは?

246 名前:デフォルトの名無しさん mailto:sage [2019/09/30(月) 23:15:32.33 ID:d3KN1ocd.net]
class A :public T...{
にすりゃ通る

247 名前:デフォルトの名無しさん mailto:sage [2019/09/30(月) 23:19:40.15 ID:d3KN1ocd.net]
もしくは
struct A :T...{
継承元にアクセスできんのが原因

248 名前:デフォルトの名無しさん mailto:sage [2019/09/30(月) 23:29:43.59 ID:ypiuCBLp.net]
>>245-246
あ、俺環だったか。
マジで通った。。。@vc

https://ideone.com/Eahhnl

249 名前:デフォルトの名無しさん mailto:sage [2019/09/30(月) 23:42:29.68 ID:ypiuCBLp.net]
>>247
自分で作っておいてあれだが、なにに・・・つか・・・えるん・・・だ・・・。ぐああああ。
考えれば考えるほどもやもやする。

250 名前:デフォルトの名無しさん mailto:sage [2019/09/30(月) 23:50:49.59 ID:ypiuCBLp.net]
ヴェーダに接続するときに使うんかいな。とかおかしなことしか思い浮かばねー。



251 名前:デフォルトの名無しさん mailto:sage [2019/10/01(火) 10:39:26.07 ID:SeWV7ZFb.net]
>>217
この場合に A<B,C,D>とした場合、public T... の部分は、
public B, public C, public D
と展開されるんでしたっけ?

252 名前:デフォルトの名無しさん mailto:sage [2019/10/01(火) 15:52:31.87 ID:vnyPyC//.net]
>>193-194,196
では、Edgeという名前の構造体の定義を問題によって変えたいときはどうすれば良いですか?

253 名前:デフォルトの名無しさん mailto:sage [2019/10/01(火) 21:48:01.50 ID:9tGbOXPW.net]
>>241
今どきのプロセッサではdoubleは速いよ
doubleは専用チップ積んでるから。floatはdoubleに内部的に変換かけられるから、原理的にdoubleより速くはならない

254 名前:デフォルトの名無しさん mailto:sage [2019/10/01(火) 21:50:51.00 ID:sOAgszt0.net]
いや、今時のプロセッサはSIMDで不動小数点演算するからdoubleよりfloatの方が速いよ
演算やプロセッサによるが、大抵2〜4倍差が出る

255 名前:デフォルトの名無しさん mailto:sage [2019/10/01(火) 23:04:08.95 ID:+hOGjxeQ.net]
floatが早い今どきのプロセッサってGPUの話か?
ちゃんと区別しろ

256 名前:デフォルトの名無しさん mailto:sage [2019/10/01(火) 23:06:13.36 ID:geI6I9WY.net]
直前の計算結果を次の計算で使うようなありがちな状況だと、SIMDじゃ一切早くならないのでは?よく知らんけど

257 名前:デフォルトの名無しさん mailto:sage [2019/10/01(火) 23:06:54.09 ID:sOAgszt0.net]
x86とかも典型的だろ
doubleよりfloatの方が倍速いよ
最近はbfloat16の方がさらに速いまである

258 名前:デフォルトの名無しさん mailto:sage [2019/10/01(火) 23:26:39.35 ID:5ranOfZi.net]
SIMDで1語で複数のfloat演算を並列にやったら早くなる
しかしコンパイラの最適化が普通はそこまでやってくれない

259 名前:デフォルトの名無しさん mailto:sage [2019/10/01(火) 23:28:12.34 ID:DRbEIshC.net]
今はfloatのが速い
amd64出てからsse基本なので
昔とは状況が違う

260 名前:デフォルトの名無しさん mailto:sage [2019/10/01(火) 23:28:49.51 ID:DRbEIshC.net]
>>257
やるけど



261 名前:デフォルトの名無しさん mailto:sage [2019/10/01(火) 23:30:04.90 ID:5ranOfZi.net]
>>259
やるんか?

262 名前: mailto:sage [2019/10/01(火) 23:32:20.09 ID:3zNRBOOL.net]
>>253
1個のプログラムの中に一個か二個の float しか使わなくても、 double の場合より速くなるのですか?
そもそもイントリンシックを書かないのに SIMD のコードが出力されるのですか?

私は、コンパイラは fpu のコードしか吐かないじゃないか?って考えています

263 名前:デフォルトの名無しさん mailto:sage [2019/10/01(火) 23:37:45.74 ID:KZgN44vw.net]
>>261
それはお前の頭が老害だから

264 名前:デフォルトの名無しさん mailto:sage [2019/10/01(火) 23:39:09.19 ID:84uW7JaU.net]
速さ計測すればいいじゃん
逆アセンブル見ればいいじゃん

265 名前: mailto:sage [2019/10/01(火) 23:40:49.69 ID:3zNRBOOL.net]
>>262
1個のプログラムの中に一個か二個の float しか使わなくても、 double の場合より速くなるのですか?
そもそもイントリンシックを書かないのに SIMD のコードが出力されるのですか?

266 名前:デフォルトの名無しさん mailto:sage [2019/10/01(火) 23:44:09.36 ID:sOAgszt0.net]
そもそもx64ではFPUは無かったことにされている
doubleやfloatの計算したかったらSIMDで1レーンだけ使って計算する仕組み

267 名前:デフォルトの名無しさん mailto:sage [2019/10/01(火) 23:54:05.20 ID:5ranOfZi.net]
>1個のプログラムの中に一個か二個の float しか使わなくても、 double の場合より速く
その条件だとどっちを使っても良い大して変わらん

やっぱループアンローリングできるぐらいループリッチな課題でないと意味が無い
https://www.isus.jp/products/c-compilers/compiler_part2/
https://cpplover.blogspot.com/2015/03/blog-post_30.html

268 名前:デフォルトの名無しさん mailto:sage [2019/10/02(水) 00:10:27.89 ID:eo8nmuYy.net]
しかしコンパイラの最適化はイマイチっぽい
https://www.isus.jp/products/c-compilers/compiler_part4/

269 名前: mailto:sage [2019/10/02(水) 07:48:44.41 ID:BafSfR+Q.net]
>>265
いいえ x64 でも fpu コードは使えますよ、嘘はやめて!

270 名前:デフォルトの名無しさん mailto:sage [2019/10/02(水) 07:54:44.99 ID:Y2eIpMbX.net]
>>228
こういうやつって何かしらソフト完成させたこともない初心者のクセしてイキってるんだろ
マジ邪魔だから消えて欲しい
テンプレート使ったコードで遅くなるというのがわからんならboostのspiritとか使ってみたらいいわ
言ってる意味わかるから



271 名前:デフォルトの名無しさん mailto:sage [2019/10/02(水) 07:59:03.00 ID:Y2eIpMbX.net]
あ、もちろんデバッグビルドの話な
最適化ありならspiritは当然速い

272 名前:デフォルトの名無しさん mailto:sage [2019/10/02(水) 08:01:33.95 ID:sddCZQNP.net]
C++を使わないと言っているやつに、どうぞご勝手にということと何の関係が?

273 名前:デフォルトの名無しさん mailto:sage [2019/10/02(水) 08:22:40.25 ID:QmwKmz4W.net]
>>268
でもアセンブラで直接使わないと無かったことにされるだろ

274 名前:デフォルトの名無しさん mailto:sage [2019/10/02(水) 08:29:18.29 ID:0zoKeqvU.net]
>>261
amd64でfpuコード吐かせるほうが手間じゃwwww

275 名前:デフォルトの名無しさん mailto:sage [2019/10/02(水) 08:30:44.39 ID:0zoKeqvU.net]
そもそもプログラム中に一個か二個の浮動小数点演算なんて最適化ポイントちゃうがなwwww
自説を通すためにバカな例を仮定するアホに絡むだけ無駄やなw

276 名前:デフォルトの名無しさん mailto:sage [2019/10/02(水) 11:21:30.36 ID:iITLzrzf.net]
>>272
プロジェクトの設定でfpも選べるよ
既定だとsse使われると思うけど

277 名前:デフォルトの名無しさん mailto:sage [2019/10/02(水) 22:05:22.14 ID:VK3sSC9+.net]
コンパイラの種類変わったら算術演算ぶん回す場合は結構差が出るだろうけど、同じコンパイラでバージョンかわると最適化とかの進化で結構かわるのかな?
gccの3と4、msvcの2005と2017とかそういう違いで

278 名前:デフォルトの名無しさん mailto:sage [2019/10/03(木) 04:57:05.82 ID:vAL7lUst.net]
質問です
既にクラスHogeとAがあり
クラスAとは別に新たにクラスBを追加することになった
BはA専用の関数が無く呼び出す必要も無いし逆のことは無い
その場合BにA専用の関数と同じ名前の空の関数を用意するか、呼び出されているHoge内で切り分けるかどちらの方が良いですか?
なおAは絶対に継承しなければならないし改変することもできない

class Hoge : A か class Hoge : Bをプリプロセッサかテンプレートで切り分ける

これを
void Hpge::func() {
  A_func(); //Bは持っていない
}

プリプロセッサで切り分けるのが良いのか
void Hpge::func() {
#if defined(USE_A)
  A_func();
#endif
}


それとも空の関数を書いた方が良いのか
class Hoge : B {
  A_func() {}
}

詳しい方がいたら教えていただきたいです
これ以外の賢いやり方があればそれでも大丈夫です

279 名前:デフォルトの名無しさん mailto:sage [2019/10/03(木) 07:04:32.42 ID:damPur2/.net]
絶対に、の理由が知りたいところだけど、普通はA_funcを仮想関数にしてBは空関数でオーバーライド。

280 名前:デフォルトの名無しさん mailto:sage [2019/10/03(木) 07:05:22.94 ID:OJdSM3QH.net]
c++17以降ならif constexprとstd::is_sameでできるんじゃない?
template < typename T >
class Hoge : T{
void func() {
  if constexpr(std::is_same<T,A>){ //基底クラスTがAであればA_func()を実行する
    A_func();
  }
}
}



281 名前:デフォルトの名無しさん mailto:sage [2019/10/03(木) 07:12:55.92 ID:OJdSM3QH.net]
std::is_same<T,A> じゃなくて std::is_same_v<T,A> か

282 名前:デフォルトの名無しさん mailto:sage [2019/10/03(木) 07:31:04.45 ID:5EMHpFEj.net]
>>278
HogeがAかBを継承するんだからそれじゃだめやろ
ただ設計見直したいところだけどそういうわけにもいかんのかね

283 名前:デフォルトの名無しさん mailto:sage [2019/10/03(木) 07:54:23.64 ID:r73Y/293.net]
c++17が使えなくて、Bの定義を関係ないAのために汚染したくないなら一層増やせばいい

template<typename T>
class HogeBase;

template<>
class HogeBase<A> : A {}

template<>
class HogeBase<B> : B { A_func(){} }

template<typename T>
class Hoge : HogeBase<T> { /*...*/ }

284 名前:デフォルトの名無しさん mailto:sage [2019/10/03(木) 09:13:02.91 ID:r91xqmRv.net]
>>2

285 名前:81
なにか問題起きる?
[]
[ここ壊れてます]

286 名前:デフォルトの名無しさん mailto:sage [2019/10/03(木) 11:57:14.92 ID:z1c5xmGq.net]
>>277
基底クラスを切替たいってこと?
しかも片方の基底クラスにしかないメソッドを派生クラス側で呼出すとかどんな状況なんだろう…
まあ、やっつけでやるなら素直にB側に空のメソッド追加しとけばいいと思うよ
どう見てもまともな設計じゃなさそうだし、かと言って設計を見直すこともできなさそうだしね
プリプロセッサなんて愚の骨頂にしかならん

287 名前:281 mailto:sage [2019/10/03(木) 12:22:59.66 ID:GJuckdYX.net]
>>283
A_funcを持つものを継承するならオーバーライドが理想的だろうけど、基底がAかBってことだから無理っしょ
しかもAは書き換えられないときてる

すでに言われてるようにテンプレートで基底を指定させるか単純に空のA_funcを書くか、プリプロセッサか

でもそもそも利用者側がAを使うのかBを使うのか決めるのなら、クラス側で対処せずに利用者がプリプロセッサで分けた方がいいと思う(でないとぐちゃぐちゃになりそう)

それだと修正箇所が多すぎるのかもしれんけど

288 名前:デフォルトの名無しさん mailto:sage [2019/10/03(木) 13:00:06.78 ID:t4NBMq8s.net]
こんなマトモじゃないケースに
ベストな解答なんかないわな

289 名前:デフォルトの名無しさん [2019/10/03(木) 13:00:33.56 ID:YSTER/9m.net]
>>284
Qtをdisってんの

290 名前:デフォルトの名無しさん mailto:sage [2019/10/03(木) 15:51:04.04 ID:z1c5xmGq.net]
まさかと思うがQtを盲信してるのか?w



291 名前:デフォルトの名無しさん [2019/10/03(木) 16:04:15.58 ID:LjcEi/T6.net]
ちょとっ猛進

292 名前:デフォルトの名無しさん mailto:sage [2019/10/03(木) 16:37:32.38 ID:vAL7lUst.net]
回答ありがとうございます
プリプロセッサまみれになるより空の関数生やした方が見通しよさそうですね

293 名前:デフォルトの名無しさん mailto:sage [2019/10/03(木) 18:04:25.67 ID:SL8wP/0a.net]
>>288
え、qt便利じゃん

294 名前:デフォルトの名無しさん mailto:sage [2019/10/03(木) 19:00:51.01 ID:BEqWQnsI.net]
旧版は知らんけどQt5はかなり良いと思う
不満に思うのはベンチ厨くらいでは

295 名前:デフォルトの名無しさん mailto:sage [2019/10/03(木) 19:22:01.27 ID:z1c5xmGq.net]
>>291
便利かどうかなんて言ってないのにいきなりどうした?w

296 名前:デフォルトの名無しさん mailto:sage [2019/10/03(木) 21:53:13.09 ID:Uq6PP8Ux.net]
コンパイル通らないので助けてください。
メンバテンプレートを持つクラスを継承して、派生先からメソッドが呼べません。
一見問題なさそうにはみえるのですが・・・

template<typename _T1>
class A{

public :

template<typename _T2> _T2 get() { return _T2(); };

};

template<typename _T3>
class B : public A<_T3> {
std::string hogehoge() { return A<_T3>::get<std::string>();}
};

297 名前:デフォルトの名無しさん mailto:sage [2019/10/03(木) 21:59:37.34 ID:A/fPHEZe.net]
>>294 エラーメッセージとか出てないの?

298 名前:デフォルトの名無しさん mailto:sage [2019/10/03(木) 22:06:09.67 ID:BrhogHgJ.net]
>>294
clangさんが教えてくれた
std::string hogehoge() { return A<_T3>::template get<std::string>();}

299 名前:デフォルトの名無しさん mailto:sage [2019/10/03(木) 22:13:42.78 ID:Uq6PP8Ux.net]
ありがとうございました。
通りました。

つか、そんなtemplate文の使い方初めて知った・・

300 名前:デフォルトの名無しさん mailto:sage [2019/10/03(木) 22:31:15.90 ID:zkquM/gX.net]
この場合Aがテンプレートなので、Aの先のgetが何者かコンパイラは判断つかないので
"<" が比較演算なのかテンプレートのかっこなのか判断つかないから
らしい
clangは教えてくれるんだから判断ついてるわけだが・・・
まったく醜い文法を持った言語だよ



301 名前:デフォルトの名無しさん mailto:sage [2019/10/03(木) 22:49:50.59 ID:BrhogHgJ.net]
この場合のエラーメッセージ、GCCはほんとに何言ってるのか分からないのを出すのでclang様様

302 名前:デフォルトの名無しさん mailto:sage [2019/10/04(金) 01:11:35.70 ID:gSpEwnzq.net]
C++テンプレートのプログラミングでのエラーを読み解く訓練をしているうちに
実世界での初心者が投げてくる質問へのエスパー力がやしなわれる
これ豆

303 名前:デフォルトの名無しさん mailto:sage [2019/10/04(金) 02:30:32.92 ID:gpJXYiEy.net]
そのうちエラーメッセージを見ずにエラーを修正できるようになる

304 名前:デフォルトの名無しさん mailto:sage [2019/10/04(金) 02:54:08.89 ID:P4b1n6up.net]
ちなVC2015か2017か忘れたけど、一時期までのVCは
その場合のtemplateを書くと逆にエラーにされてた

305 名前:デフォルトの名無しさん [2019/10/04(金) 03:18:41.39 ID:I4catYuR.net]
goで変数用いて
*******
*****
***
*
***
*****
*******
って出力するにはどうすりゃいいのっと

306 名前:デフォルトの名無しさん [2019/10/04(金) 03:19:28.61 ID:I4catYuR.net]
あ、↑のは砂時計みたいな形にしたい

307 名前:蟻人間 mailto:sage [2019/10/04(金) 04:12:53.14 ID:NaWoGk/Z.net]
>>303
二重のループか仮想画面

308 名前:デフォルトの名無しさん mailto:sage [2019/10/04(金) 04:19:18.14 ID:I4catYuR.net]
>>305
申し訳ないが初心者ゆえ、数字の二重ループはできるけどそれを文字列にする仕方がわからず

309 名前:デフォルトの名無しさん mailto:sage [2019/10/04(金) 05:45:45.52 ID:jwb6jSs+.net]
goスレ行け

310 名前:デフォルトの名無しさん mailto:sage [2019/10/04(金) 08:20:48.47 ID:FzFdUbJu.net]
>>298
なぜか偶然ですが、このスレを見る前から昨日からその辺に関係するパーサーを
作っていて悩んでいたところなんですが、
多くの言語では、+,-,*,/,<,> などの演算子が混ざったいわゆる「数式」は文脈に依存せずに
上位のコンパイル作業に入る前に、いったん「数式ツリー」に直すことが出来ます。
ここで「文脈に依存せず」というのは、変数名、関数名、型名などの宣言情報を
調べなくても済むという(いわゆる意味解析の結果の情報を必要としないと言う
)ことです。
ところが、template機能が入った後のC++では、A<B と書いたとき、
< がテンプレートの記号なのか比較演算子なのかは A がテンプレート名であるか
どうかによって決まります。
Bが型名であることが明確な場合には文脈によらず < はテンプレート記号だと断定
できます。ところが、Bに 1, 456, 3.1415 のような数値や、"Hello" などの文字列
が来ている場合には、(その場では)判断が付きません。
文脈に依存せずに判断を付けたいなら、もっと先まで呼んで、< に対応する >
があるかどうかを調べるといける可能性があります。

1. "<"に対応する">"が存在するかどうか調べれば、これまでの宣言情報を使わなくても
 トークン・ツリーを作ることが出来る。トークン・ツリーと言ったのは、数式とは
 限らないからです。例えば、A<B> x[100]; などとすることがありますが、A<B>
 は型名であり、数式では有りません。ただし、他の多くの言語では数式ツリーは
 作ることが多いのですが、トークン・ツリーはまず作りません。
2. 1の方法を使わないなら、宣言情報を調べて、Aがtemplate名であるかどうかを調べる
 必要がある。ところが、Q::A<B> などのような場合があるので、そんなに
 単純な作業でく、Q::A が型名なのか、変数名なのかはちゃんと調べる必要がある。



311 名前:デフォルトの名無しさん mailto:sage [2019/10/04(金) 08:25:56.64 ID:FzFdUbJu.net]
>>308
補足
「Bが型名であることが明確な場合には文脈によらず < はテンプレート記号だと断定
できます。」
の部分ですが、B<CPerson(実引数列) などとした場合、CPersonは型名ですが、
CPerson(実引数列) 全体は、型名ではなくCPersonクラスの引数つき
コンストラクタを呼び出した結果の「一時オブジェクト」です。なので、
Bが変数名の場合は、< は比較演算子の可能性があります。

312 名前:デフォルトの名無しさん mailto:sage [2019/10/04(金) 08:33:37.62 ID:FzFdUbJu.net]
>>308
誤:なぜか偶然ですが、このスレを見る前から昨日からその辺に関係するパーサーを
正:なぜか偶然ですが、このスレを見る前の昨日からその辺に関係するパーサーを

誤:文脈に依存せずに判断を付けたいなら、もっと先まで呼んで、< に対応する >
正:文脈に依存せずに判断を付けたいなら、もっと先まで読んで、< に対応する >

誤:単純な作業でく、Q::A が型名なのか、変数名なのかはちゃんと調べる必要がある。
正:単純な作業ではなく、Q::A がtemplate名なのか、変数名なのかはちゃんと調べる必要がある。

313 名前:デフォルトの名無しさん mailto:sage [2019/10/04(金) 08:37:14.54 ID:P4b1n6up.net]
>>225
>>224=228や>>226=219みたいなどうみても初心者なヤツにプロが敬語使う必要ないと思うよ
C++スゲー=俺スゲーみたいな明らかにプログラミングに向いてない精神構造のクソバカが多く居るからねここ

314 名前:デフォルトの名無しさん mailto:sage [2019/10/04(金) 08:41:34.48 ID:FzFdUbJu.net]
>>306
一般論として、文字列の長さを len として、文字列型の変数を str としたとき、
for ( len 回のループ ) {
 str = str + "*"
}
で行けます。

315 名前:デフォルトの名無しさん mailto:sage [2019/10/04(金) 09:33:34.23 ID:8yIxxMU3.net]
>>311
ようクソバカ

316 名前:デフォルトの名無しさん mailto:sage [2019/10/04(金) 09:41:54.97 ID:P4b1n6up.net]
>>313
すまんな図星だったか?
邪魔だから出てけよ

317 名前:デフォルトの名無しさん mailto:sage [2019/10/04(金) 11:43:51.24 ID:FzFdUbJu.net]
>>308
C++言語をパースする方法として、結論的には、2.ではダメで、1.でなくてはならないようです。例として、A<実引数列>::B の場合を考えると、template は実体化する
際の実引数によって展開される内容は大幅に変わりますので、
A<int>::B とした場合には、B は template 名で、
A<string>::B とした場合には、B は変数名であることもありえます。すると、
A<int>::B<C> の場合の B<C> は template 実体化ですが、
A<string>::B < C の場合は、変数B と変数 Cに対しての比較演算となります。
なので、もし、>>308 の 2.のやり方でパース使用とすると、Aがtemplate名であると
分かっただけでは B が「何なのか」を結論付けるには不十分で、A<実引数列>の
実引数列をほとんど完全に調べ上げてから、その方名に応じた template A の
定義を探して template の overload 解決をしてから、A<実引数列> 部分(のclass)を
完全に「特定」する必要があります。ここまでやるとなると、コンパイラの層分けが
上手く出来ないことになります。

318 名前:デフォルトの名無しさん mailto:sage [2019/10/04(金) 12:03:58.19 ID:FzFdUbJu.net]
>>315
A::B くらいの場合なら、意味解析の情報だけを元に、Bが何なのかを特定をすることは
可能です。ところが、A<1+2,decltype(x*y)>::B の様な場合、x, y の意味論的な型
を調べた後、x*yに適応可能な operator*() 関数が定義されて言うかどうかも調べ、
定義されていれば、その戻り値の型を調べてx*y の型として、A<・・・> の部分が
結局何なのかを特定しなくてはなりません。今述べた x*y の部分の処理は、
トークン解析層(?)より上位のコンパイル層で行う処理です。なのでこのやり方
だと、コンパイラ内部の「層」の切り分けが難しくなります(技術的に不可能な
わけではありませんが。)。

319 名前:デフォルトの名無しさん mailto:sage [2019/10/04(金) 12:07:27.45 ID:FzFdUbJu.net]
>>315
誤:なので、もし、>>308 の 2.のやり方でパース使用とすると、Aがtemplate名であると
正:なので、もし、>>308 の 2.のやり方でパースしようとすると、Aがtemplate名であると

誤:実引数列をほとんど完全に調べ上げてから、その方名に応じた template A の
正:実引数列をほとんど完全に調べ上げてから、その型名に応じた template A の

>>316
誤:を調べた後、x*yに適応可能な operator*() 関数が定義されて言うかどうかも調べ、
正:を調べた後、x*yに適応可能な operator*() 関数が定義されているかどうかも調べ、

320 名前:デフォルトの名無しさん mailto:sage [2019/10/04(金) 12:36:35.66 ID:cK/f4a5x.net]
>>312
ありがとうございます!
やってみます



321 名前:デフォルトの名無しさん mailto:sage [2019/10/04(金) 12:41:17.15 ID:G1/ISgxb.net]
c++って文法に曖昧さがないことどうやって保証してんだろ
形式的なアプローチ無理だと思うんだが

322 名前:デフォルトの名無しさん mailto:sage [2019/10/04(金) 13:05:22.64 ID:MVQV/kgg.net]
いや、そんな保証は端っから諦めてるだろ
引数なしの関数宣言とデフォコン呼び出しの曖昧さなんか
長年放置してたのをC++11でようやく対応したし
関数ポインタにキャストするoperatorはtypedef使えとか
言語としての完全性なんか重視してない

323 名前:デフォルトの名無しさん mailto:sage [2019/10/04(金) 13:28:40.80 ID:FzFdUbJu.net]
>>319
曖昧さはあるといわれています。例えば、CPersonというクラスがあったとき、関数内で
CPerson person();
と書いた場合、person という名前で、戻り値の型が CPerson の関数のプロトタイプ宣言なのか、
CPerson クラスの person という変数名(オブジェクト名)の定義なのかの曖昧さがあります。


324 名前:メは、CPerson person("name", 25, MALE); などと同じ系統で、実引数が全く無い場合
に相当します。
また、template class の場合に、
A<B<・・・>>
と書くと、>> が右シフト演算子に解釈されてしまうので、回避するために空白を1つ入れて
A<B<・・・> >
としなければならなかった(過去形)時代も有ります。
しかし、パーサーを作る側からすれば、">>" を ">" 2個 だと解釈するのはかなり大変な
労力が必要でです。

また、x < y を比較演算のつもりで A< x < y > などと書くと、A<・・・>
の中に x という template class 名に対しての x<y> が入っていると解釈
されてしまい、> が足りないというエラーになるかもしれません。
回避するには、
A< (x < y) >
と書くと良いと思われます。
[]
[ここ壊れてます]

325 名前:デフォルトの名無しさん mailto:sage [2019/10/04(金) 14:48:30.02 ID:D8qarNFk.net]
C++というより3Dプログラミングの質問で申し訳ないのだけど、
行列ライブラリglmの以下のコードがbugってる気がするので詳しい人がいたら確認して欲しい。

template<typename T, qualifier Q>
GLM_FUNC_QUALIFIER qua<T, Q> rotate(qua<T, Q> const& q, T const& angle, vec<3, T, Q> const& v)
{
vec<3, T, Q> Tmp = v;

// Axis of rotation must be normalised
T len = glm::length(Tmp);
if(abs(len - static_cast<T>(1)) > static_cast<T>(0.001))
{
T oneOverLen = static_cast<T>(1) / len;
Tmp.x *= oneOverLen;
Tmp.y *= oneOverLen;
Tmp.z *= oneOverLen;
}

T const AngleRad(angle);
T const Sin = sin(AngleRad * static_cast<T>(0.5));

return q * qua<T, Q>(cos(AngleRad * static_cast<T>(0.5)), Tmp.x * Sin, Tmp.y * Sin, Tmp.z * Sin);
}

クオータニオンqをベクタ軸v周りにAngleRad回転させる関数のソースらしいんだが、
最後の行掛け算の順番が逆のような気がする。
qua<T,Q>(...) * qが正解だと思うんだ。

glmはファイル構成がバージョン間で結構派手に変更されてるんで、
最近のバージョンではext/quaternion_transform.inlに上のコードが含まれてる。
古いバージョンではgtx/quaternion.inlにあったような気がする。

326 名前:デフォルトの名無しさん mailto:sage [2019/10/04(金) 14:55:11.92 ID:FzFdUbJu.net]
>>322
あるライブラリでのq1 * q2 という書き方が、q2 * q1
がどういう意味に解釈されるかは、

327 名前:デフォルトの名無しさん mailto:sage [2019/10/04(金) 15:01:05.28 ID:FzFdUbJu.net]
>>322
(>>323 は誤投です。)
あるライブラリでの q1 * q2 という書き方が、別のライブラリでは
q2 * q1 と等価なことが有り得て、それはベクトルや行列計算全般に
言える記法の違いなのでこのソースだけではなんとも言えない。
ベクトルの場合、成分表示を1列の縦行列と考えるか1行の横行列
と考えるかによって、賭け全の左右が逆さまになる。
その結果、成分表示で書かない表記も、左右どちらかで書くかは
好みの問題となる。
特に Quaternion の場合も同様。

328 名前:デフォルトの名無しさん mailto:sage [2019/10/04(金) 15:02:02.33 ID:FzFdUbJu.net]
>>324
誤:と考えるかによって、賭け全の左右が逆さまになる。
正:と考えるかによって、掛け算の左右が逆さまになる。

329 名前:デフォルトの名無しさん mailto:sage [2019/10/04(金) 15:45:42.88 ID:P4b1n6up.net]
OpenGL系は縦ベクトルだね
D3Dを前提にしたライブラリとは逆になる(行列も転置

330 名前:デフォルトの名無しさん mailto:sage [2019/10/04(金) 15:58:00.91 ID:FzFdUbJu.net]
>>326
数学や物理学では縦ベクトルが多いが、D3Dはそれに従ってない。



331 名前:デフォルトの名無しさん [2019/10/04(金) 16:08:07.51 ID:JXWhYfPM.net]
テンプレが糞だと思う瞬間はいくつもあるが
その一つはネストしてるときの閉じ括弧
>> じゃだめで > > ってわざわざ分けないといかんうざい

332 名前:デフォルトの名無しさん mailto:sage [2019/10/04(金) 16:08:35.30 ID:P4b1n6up.net]
>数学や物理学では縦ベクトルが多いが、D3Dはそれに従ってない。
みたいだね
D3Dからそれ以外に移るとみんなここで引っかかるけど
実は行列周りは(大文字は行列として)
OpenGLに合わせるとA*B*C*xとなるのを
D3Dではx*C*B*Aと書けた方が、左からの計算が全部結果がベクトルなので計算量が減るというメリットはある
MSはC++での書きやすさと効率を考えたのかもしれない

333 名前:デフォルトの名無しさん [2019/10/04(金) 16:09:02.58 ID:JXWhYfPM.net]
>>326-327
縦横ってより右から掛けるか左から掛けるかだと思ってた
意味は一緒なんだろうけど

334 名前:デフォルトの名無しさん mailto:sage [2019/10/04(金) 16:11:58.82 ID:P4b1n6up.net]
>>328
C++11からは連続して書けるようになったで

335 名前:デフォルトの名無しさん mailto:sage [2019/10/04(金) 16:14:31.61 ID:MVQV/kgg.net]
C++03いやC++98?のまま更新止まってるやつ
俺が想像するより遙かに多いのかもしかして

もうC++11でさえ要注意な旧規格になってるんだが

336 名前:デフォルトの名無しさん [2019/10/04(金) 16:16:30.52 ID:JXWhYfPM.net]
>>329
メモリ上の順序も変わるぞ
SIMDとかで計算されるときの効率にも影響する
必ずしもD3D(横ベクトル方式)が高速化に都合が良いとは言えないんじゃないか

行列の各要素のメモリ上の並びって
glの行列AとD3Dの行列A'はいちいち転置しなくても結局同じになるんだっけ

337 名前:デフォルトの名無しさん mailto:sage [2019/10/04(金) 16:22:07.03 ID:P4b1n6up.net]
ああ確かにメモリの中身は同じだった
格納方式も違うから結果的に同じになるんだよね
そこが余計ややこしい

338 名前:デフォルトの名無しさん mailto:sage [2019/10/04(金) 16:29:39.34 ID:FzFdUbJu.net]
>>329
行列計算は、縦ベクトル方式、横ベクトル方式でも、(それぞれで)「結合則」があるので、
A*B*C*x = A*(B*(C*x))
でもあり、
A*B*C*x = ((A*B)*C)*x)
でもあり、どっちで計算しても結果は同じになる。

また、3D計算の場合、点の座標がいくつあっても、行列を一度計算しておくと、
使いまわしできるので、先に行列の方を計算しておいて、最後に座標の変換
を行うと、点が2個以上あるときには効率が高い。

339 名前:デフォルトの名無しさん mailto:sage [2019/10/04(金) 16:31:49.50 ID:FzFdUbJu.net]
>>332
C++98くらいから、実際問題上使いたくない機能ばかりが追加されるような
傾向があったのに、Upgrade 版は適用外になったりしたりして買う機を逃した。

340 名前:デフォルトの名無しさん mailto:sage [2019/10/04(金) 16:38:53.10 ID:FzFdUbJu.net]
>>329
>MSはC++での書きやすさと効率を考えたのかもしれない
>>335 に既に書いたけど、OpenGL 形式でも、右結合でも、
左結合でも、好きな方で計算は出来る。だから、行列部分を
先に計算しても良いし、座標部分から計算しても良い。
座標部分から計算していくと一見計算量が減るように思える
かも知れないが、点の個数が多くなると、一度だけ行列部分の
積を予め計算しておいて、その結果を全ての点の変換部分に
遣うと効率が劇的に向上するので、むしろ、効率が良いのは逆。



341 名前:デフォルトの名無しさん mailto:sage [2019/10/04(金) 16:40:53.55 ID:P4b1n6up.net]
>>335
確かに(OpenGLでも上で書いたような式が使えるライブラリ使うとして)括弧でくくったりして優先順位変えればいいし
言う通り行列はまとめればいいんだけど
どちらにもメリットデメリットあると言いたかった

342 名前:デフォルトの名無しさん mailto:sage [2019/10/04(金) 16:51:20.07 ID:FzFdUbJu.net]
>>338
実は、アメリカで有名な 3D Graphics の本が、横ベクトル方式を採用していた
事が関係しているかもしれない。要はその本が数学や物理の標準とは何故か
逆の記法を採用していたということ。

343 名前:デフォルトの名無しさん [2019/10/04(金) 17:00:49.77 ID:FW+Y/3wm.net]
>>337
GL
(A*B*C)*(x0(縦),x1(縦),x2(縦),x3(縦), ... , xN(縦))(横)
D3D
(x0(横),x1(横),x2(横),x3(横), ... , xN(横))(縦)*(C*B*A)
が最速やね

344 名前: mailto:sage [2019/10/04(金) 19:54:25.76 ID:5CiM54x6.net]
>>335
行列って結合則は約束されてましたっけ?

345 名前:デフォルトの名無しさん mailto:sage [2019/10/04(金) 20:17:27.71 ID:gZky9oRw.net]
当たり前だろ。
そんなレベルの知識しかないからフォントライブラリ書けないんだよ

346 名前: mailto:sage [2019/10/04(金) 20:27:59.81 ID:5CiM54x6.net]
>>342
では証明してください(キリッ)

347 名前:デフォルトの名無しさん mailto:sage [2019/10/04(金) 21:24:32.75 ID:FzFdUbJu.net]
>>343
ベクトル部分はおいておくとして、まず正方行列の部分だけに限定すれば
A(BC)=(AB)C  ・・・(1)
が証明できれば どんな場合でも結合側が成り立つことが数学的帰納法で
証明できます。なので、A,B,C が正方行列の時に(1)を証明すれば全体の証明が
ほぼ終わります。
【(1)の証明】
行列の積の定義により
 (AB)ij=Σ_{k=1}^n A_{ik} B_{kj}  ・・・(2)
です。なので、
{(AB)C}mn = Σ_l(AB)_{ml}C_{ln}
     = Σ_k Σ_l A_{mk} B_{kl} C_{ln} ・・・(3)
です。全く同様に、
{A(BC)}mn = Σ_k A_{mk} (BC)_{kn}
     = Σ_k A_{mk} Σ_l B_{kl} C_{ln}
     = Σ_k Σ_l A_{mk} B_{kl} C_{ln} ・・・(4)
となり、(3), (4) が一致することから、
 {A(BC)}mn = {(AB)C}mn
が言えます。これが (1) に他なりません。    (Q.E.D)

次に、このように3つの行列の場合ではなく、一般の個数の行列の場合、
最初に書いたように数学的帰納法を使います。それは、あなた自身で
お考えください。考える力の練習になります。

348 名前:デフォルトの名無しさん mailto:sage [2019/10/04(金) 22:10:52.87 ID:cDY60lSZ.net]
doubleの値を++aした時にaの値は+1と規定されてる?

349 名前:デフォルトの名無しさん mailto:sage [2019/10/04(金) 23:19:26.96 ID:FzFdUbJu.net]
>>345
boolen型以外では、++x は正確に x+=1 と等価です。
x+=1 は、正確に x = x + 1 と等価です。x がポインタ型の場合は、
BYTE 単位で見ると object size 単位で増加しますが、double/float/int/short/char
などの「算術型」の場合は、単純に 1 が足されるだけです。


https://en.cppreference.com/w/cpp/language/operator_incdec
For non-boolean operands, the expression ++x is exactly equivalent to x += 1, and the expression --x is exactly equivalent to x -= 1, that is, the prefix increment or decrement is an lvalue expression that identifies the modified operand.

350 名前:デフォルトの名無しさん [2019/10/04(金) 23:36:52.32 ID:NJj/Utu/.net]
>>346
ありがとうございます。
という事はキャストの時におかしくなっているのかな?

aの値は0.0〜100.0程度
for(double i = a; i < 1000.0; ++i){
std::cout << (int)i << "," << std::endl;
}
期待している結果: 1,2,3,4,5...と連番になる
たまに起こる結果: 1,2,3,5,6...と歯抜けになる



351 名前:デフォルトの名無しさん mailto:sage [2019/10/04(金) 23:42:33.92 ID:8yIxxMU3.net]
丸められただけでは

352 名前:デフォルトの名無しさん mailto:sage [2019/10/04(金) 23:55:23.10 ID:YWySipM2.net]
>>341-344
また5ch名物のしょーもない煽り煽られの流れかとおもったら
ちゃんと勉強になる流れでワロタ

353 名前:デフォルトの名無しさん mailto:sage [2019/10/05(土) 00:03:15.79 ID:bnoeYdBm.net]
行列の結合則なんて高校で習っただろ
線形代数わからないプログラマって生き残れないと思うわ

354 名前:デフォルトの名無しさん mailto:sage [2019/10/05(土) 00:05:26.41 ID:KADe2ROY.net]
>>347
・そのコードは、完全に上記の通りですか?

例えば、ループ回数が1000回より遥かに多くなると、
誤差の都合でそうなることがあるかもしれませんが、1000回くらい
だと、正しい処理系ではその現象は起きないはずです。

355 名前:デフォルトの名無しさん mailto:sage [2019/10/05(土) 01:17:38.13 ID:d5aP5JOP.net]
キャストする前にlround呼んだらええんちゃうん。

356 名前:デフォルトの名無しさん mailto:sage [2019/10/05(土) 01:44:04.24 ID:VkhEKreX.net]
(0.2+0.3)+0.4 == 0.2+(0.3+0.4)の結果がfalseになるのは正しいの?

357 名前:デフォルトの名無しさん mailto:sage [2019/10/05(土) 01:54:00.97 ID:Lbi5NeET.net]
浮動小数点を勉強しておいで

358 名前:デフォルトの名無しさん mailto:sage [2019/10/05(土) 02:07:17.64 ID:5hJZ4CgN.net]
有効数字1桁の計算で誤差は生じない

359 名前:デフォルトの名無しさん mailto:sage [2019/10/05(土) 07:04:22.03 ID:UfPJq4d2.net]
10進の0.1を2進表現すると循環小数定期

>>355
バカ乙

360 名前:デフォルトの名無しさん mailto:sage [2019/10/05(土) 08:03:13.32 ID:9T2eUTn8.net]
>>336
本当、人って色々だな
俺はC++98は未完成感があまりに強くて続きはまだかと待ちかねていた
具体的には例えば右辺値参照だ
一時オブジェクトにいちいちconstがつくのがイヤでイヤで待望のやつがやっと来た



361 名前:デフォルトの名無しさん mailto:sage [2019/10/05(土) 08:28:45.86 ID:iS4eZEWC.net]
>>337, >>340
ちょっと誤解招くのでやっぱ突っ込んでおくけど、
多数のベクトルを変換するのに行列をまとめておかないと無駄になるのはどっちの方式でも同じだよ
俺が言ったのは(少なくとも同一の行列が)一度限りしか出てこない場合の話
まぁそれを最適化する必要があるのか、またそういう処理を大量にループするなら最適化の方法は他にあるだろうけど
>>333
GL方式でも列優先だから結局d3dと同じ無駄はあるんやで
最近のは知らんけど

362 名前:デフォルトの名無しさん mailto:sage [2019/10/05(土) 08:49:33.11 ID:KADe2ROY.net]
>>353
計算誤差です。
(0.2+0.3)+0.4 == 0.2+(0.3+0.4) が偽になっても
(0.2+0.3)+0.4 == (0.2+0.3)+0.4 や
0.2+(0.3+0.4) == 0.2+(0.3+0.4)
は必ず真になることが保障されています。

363 名前:デフォルトの名無しさん mailto:sage [2019/10/05(土) 08:55:38.66 ID:KADe2ROY.net]
>>359
コンピュータにおける浮動小数点は、内部表現は10進数ではなく2進数
で表現されており、有効桁数は 10 進数で 8 桁や 15桁などではなく
2進数で xx BIT という風になっています。
0.2, 0.3, 0.4 は、10進数だと、有効桁数が1桁でも完全に区切れが
よく表現できていますが、2進数の表現だと厳密には無限小数になってしまい、
どんなに有効桁数を長くしても厳密には表現できません。そのため計算誤差
が生じるのです。0.5 や 0.25 や 0.125 は 2 進数でも区切れ良く表現できるため、
 (0.125+0.25)+0.5 == 0.125+(0.25+0.5)
は誤差が生じることがないため、必ず真になるはずです。

364 名前:デフォルトの名無しさん mailto:sage [2019/10/05(土) 10:06:32.18 ID:e1uvrqu3.net]
>>360
浮動小数の計算誤差を考慮して比較する時にstd::abs(a-b) < std::numeric_limit<double>::epsilon()というふうにするのはどう思う?

365 名前:デフォルトの名無しさん mailto:sage [2019/10/05(土) 11:34:20.93 ID:KADe2ROY.net]
>>361
誤差の量が計算の順序や書き方によって変わってくるので、
そのようなヘッダに書かれているような誤差定数を使うことは
余り意味がありません。

366 名前:デフォルトの名無しさん mailto:sage [2019/10/05(土) 11:37:49.72 ID:7pdQvekm.net]
実用数学

367 名前:デフォルトの名無しさん mailto:sage [2019/10/05(土) 11:43:08.23 ID:rY1OpV0v.net]
>>361
機械イプシロンはそういうふうに使うものじゃない

368 名前:デフォルトの名無しさん mailto:sage [2019/10/05(土) 12:09:22.39 ID:uol03Q2n.net]
cpprefjpが>>361と全く同じ間違いしてたわ馬鹿が湧くのはこいつのせいか
cppreference.comは正しかったからそっち見れ

369 名前:デフォルトの名無しさん mailto:sage [2019/10/05(土) 12:34:57.85 ID:dFaPF8AB.net]
>>365
x-yの元になっているxやyがどのような計算過程を経てきたかわからないのに
 std::abs(x-y) <= std::numeric_limits<T>::epsilon() * std::abs(x+y) * ulp
でxとyがalmost equalsと言い切ってよい根拠とは、

ちゅか常識的に考えて、x、yがそれぞれ±e、±gの誤差を有するなら
 std::abs(x-y) <= std::numeric_limits<T>::epsilon() * (std::abs(e) + std::abs(g))
あたりの判定に落ち着かねばおかしい(これで正解とは言っていない

なんでstd::abs(x+y)みたいな場合によっては莫大な値になりえる係数を掛けねばならないの?

370 名前:デフォルトの名無しさん mailto:sage [2019/10/05(土) 13:04:02.75 ID:rY1OpV0v.net]
イプシロンに誤差を掛けても意味ない。
つか、許容誤差の絶対値が与えられているならイプシロン使う必要もない。
cppreference.comのは許容誤差をULP単位で与える場合のやりかたで、
abs(x+y)はxとyの指数のうち大きい方を意味するものだったはず。



371 名前:デフォルトの名無しさん mailto:sage [2019/10/05(土) 13:12:59.71 ID:uol03Q2n.net]
>>366
なんか色々根本的に勘違いしてる
cppreference.comのalmost_equal関数の仕事はあくまで与えられたxとyがalmost equalかどうかの判定だよ
> x、yがそれぞれ±e、±gの誤差を有するなら
なにこれ?「誤差」って何に対する何の誤差?

372 名前:デフォルトの名無しさん mailto:sage [2019/10/05(土) 13:28:00.03 ID:dFaPF8AB.net]
>>367
>イプシロンに誤差を掛けても意味ない。
>つか、許容誤差の絶対値が与えられているならイプシロン使う必要もない。
左様ですなスマンカッタorz

>>368
>なにこれ?「誤差」って何に対する何の誤差?
真の値に対する誤差じゃわパオーン
真の値に対する誤差に依存しないalmost equal判定とか、使いどころはきわめて限定されるはず、

373 名前:デフォルトの名無しさん mailto:sage [2019/10/05(土) 14:05:34.77 ID:dFaPF8AB.net]
>abs(x+y)はxとyの指数のうち大きい方を意味するものだったはず。
xが (xの符号)×1.bbbb...×2^m
yが (yの符号)×1.cccc...×2^n
だとしたときに、m>nだとすると
 x + y =
 { (xの符号)×1.bbbb... + ((yの符号)×1.cccc...×2^-(m-n)) } ×2^m
として計算されるのでだいたい2^m(x≒yなら2^(m+1))という意味か左様か、

374 名前:デフォルトの名無しさん mailto:sage [2019/10/05(土) 14:08:05.45 ID:dFaPF8AB.net]
んまーulpをxとyの来歴に応じて調整すべき量とするなら
cppreference.comのalmost_equal関数は理解してやらないでもない

375 名前:デフォルトの名無しさん mailto:sage [2019/10/05(土) 16:03:17.50 ID:NXndjuW4.net]
だれか、俺に分数を教えてくれないか?
足し算と引き算がマジ解らなくなってるんだ。
https://ideone.com/IfCcGz

一番のネックはネガフラグの扱い。
マイナスとプラスの反転演算でどうかくとスマートだろうか。
だれか教えてプリーズ。

376 名前:デフォルトの名無しさん mailto:sage [2019/10/05(土) 16:21:25.21 ID:bnoeYdBm.net]
分子に符号もたせりゃいいだろ

377 名前:デフォルトの名無しさん mailto:sage [2019/10/05(土) 16:25:36.94 ID:NXndjuW4.net]
>>373
え、それでよかったっけ?

378 名前:デフォルトの名無しさん mailto:sage [2019/10/05(土) 16:34:31.54 ID:hwiNAqBO.net]
>>350
今習わないよ
俺の時でも選択

379 名前:デフォルトの名無しさん mailto:sage [2019/10/05(土) 17:18:56.47 ID:NXndjuW4.net]
一応以下のような感じになった。Thx!
coliru.stacked-crooked.com/

380 名前:デフォルトの名無しさん mailto:sage [2019/10/05(土) 17:19:54.63 ID:NXndjuW4.net]
coliru.stacked-crooked.com/a/5fa6ab838f9ff15a
こっちだった。Orz

んじゃ。



381 名前:デフォルトの名無しさん [2019/10/05(土) 17:28:26.58 ID:QHD8CUaF.net]
>>377
1. constexprにしてもいいんじゃない?
2. 出力関数作成しよう

template<typename Char>
std::basic_ostream<Char>& operator<<(std::basic_ostream<Char>& os, const Fraction& frac){
return os << frac.GetNumerator() <<'/'<<frac.GetDenominator();
}

382 名前:デフォルトの名無しさん mailto:sage [2019/10/05(土) 19:08:43.36 ID:NXndjuW4.net]
>>378
1.できなくはない。機械的に接頭語つけるだけでいいよね。
2.暇だから作るわ。

行ってきまーす。

383 名前:デフォルトの名無しさん mailto:sage [2019/10/05(土) 19:46:54.47 ID:NXndjuW4.net]
https://ideone.com/uzd7EF
ただいまー。イデオンで動かせるようにした。Gcdがバグってないといいなぁ。
あとvc2019では意味不明なエラーで動かない。

384 名前:デフォルトの名無しさん mailto:sage [2019/10/05(土) 19:58:28.51 ID:NXndjuW4.net]
フィードバックハブに投げておいた。

385 名前:デフォルトの名無しさん [2019/10/06(日) 10:28:58.03 ID:yc9LKsYB.net]
>>380
マルチ禁止

386 名前:デフォルトの名無しさん mailto:sage [2019/10/06(日) 13:42:53.69 ID:bPt7YQEe.net]
>>382
ソーリー。

387 名前:デフォルトの名無しさん mailto:sage [2019/10/07(月) 19:17:43.20 ID:PHxdOQnu.net]
C++ってなんでヘッダファイルいるんですか
最近マシン早いんだし
全部ソースに書いてインポートすればいいのに

388 名前:デフォルトの名無しさん mailto:sage [2019/10/07(月) 19:38:58.27 ID:Xs+XlBV4.net]
やれば?(クレヨンしんちゃん風に)

389 名前:デフォルトの名無しさん mailto:sage [2019/10/07(月) 19:52:54.51 ID:9pxPpXZa.net]
来年まで待ってね

390 名前:デフォルトの名無しさん mailto:sage [2019/10/07(月) 20:58:42.59 ID:A3KSW75p.net]
>>384
むしろソースがいらなくて全部ヘッダに書けばいい
inline変数とかもできるようになったことだし



391 名前:デフォルトの名無しさん mailto:sage [2019/10/07(月) 21:05:07.29 ID:8FnUNDHt.net]
>>387
たまに趣味で何でもかんでもtemplateでゴリゴリ実装してるとガチでそれになるww

392 名前:デフォルトの名無しさん mailto:sage [2019/10/07(月) 21:26:10.24 ID:YMM6HSZT.net]
>>385
ヤレばデキるは魔法の言葉

393 名前:デフォルトの名無しさん mailto:sage [2019/10/08(火) 09:06:39.07 ID:xr4jQIWZ.net]
プリコンパイルヘッダーって使ってます?

使っているプロジェクト見たことないですわ。

394 名前:デフォルトの名無しさん mailto:sage [2019/10/08(火) 20:03:58.69 ID:kGAGzuS0.net]
>>387
こういう馬鹿野郎が出てくるからメタプロとかテンプレ好き連中ってのは嫌いなんだよ。

395 名前:デフォルトの名無しさん mailto:sage [2019/10/08(火) 21:04:41.31 ID:OCfPMe68.net]
C++なんて趣味でやってるんだからテンプレ好きでもええやん

396 名前:デフォルトの名無しさん mailto:sage [2019/10/08(火) 21:16:41.69 ID:/kdim2Vo.net]
出てくることの何が嫌なんだろうか
はっきり言って病気だ

397 名前:デフォルトの名無しさん mailto:sage [2019/10/08(火) 21:42:59.95 ID:lGNioH0G.net]
headerオンリーってのは可搬性に優れた良いものだろ
特にテンプレート多用している奴は、一部関数だけソースファイル分離する意味が薄い

398 名前:デフォルトの名無しさん mailto:sage [2019/10/08(火) 21:43:38.32 ID:asJ1ctJB.net]
>>391
どんなものにだって馬鹿は出てくるだろうに

399 名前:デフォルトの名無しさん mailto:sage [2019/10/08(火) 21:54:07.26 ID:J87hrB1p.net]
「全部ヘッダ」と言われると、そのときの「ヘッダ」の定義がどういうものなのか気になる。

400 名前:デフォルトの名無しさん mailto:sage [2019/10/08(火) 21:57:19.52 ID:EwyBASw5.net]
趣味でやってる人は全部ヘッダでいいと思う



401 名前:デフォルトの名無しさん mailto:sage [2019/10/08(火) 22:09:52.63 ID:tSj7di+z.net]
>>390
VCのやつは使いまくり
依存するライブラリのヘッダファイルを標準のやつもソリューション内のやつも全部まとめて
stdafx.hの中でインクルードしたらことのほか便利
ただし同じプロジェクトのヘッダファイルを入れだしたら目的を見失って氏ぬ

402 名前:デフォルトの名無しさん mailto:sage [2019/10/08(火) 22:10:50.35 ID:hpLG4xMo.net]
テンプレート関数は便利だしconstexpr関数は市民の義務だし
結局ほとんどヘッダファイルに書くことになるでしょ

403 名前:デフォルトの名無しさん mailto:sage [2019/10/08(火) 22:30:34.35 ID:X4FGjRpd.net]
初心者ですが質問させてください

print(1, 3.14, "abc");とやると引数の中身を順番にスペース区切りで出力してくれるような関数は
可変引数テンプレートの再帰呼出しを使うと便利にできることを知りました。
そこで引数の型に応じて出力の見た目を少し変えたいのですが、
関数の特殊化をすればいいですか?
typeidだと動的な評価になってしまうんですよね?

404 名前:デフォルトの名無しさん mailto:sage [2019/10/08(火) 22:33:59.15 ID:kGAGzuS0.net]
予想通りの馬鹿回答で笑ってしまった。
やっぱいい判別になるわテンプレバカ。

405 名前:蟻人間 mailto:sage [2019/10/08(火) 22:37:33.87 ID:jfG+k1ni.net]
>>400
引数一つに対するテンプレート関数を作って特殊化してそれに少しずつ渡せばできるよ。

406 名前:デフォルトの名無しさん mailto:sage [2019/10/08(火) 22:42:38.66 ID:/kdim2Vo.net]
C++嫌いなのにいつまで居座るんだろうなこのガイジ

407 名前:デフォルトの名無しさん mailto:sage [2019/10/08(火) 22:57:34.25 ID:HxNAD6ah.net]
好き嫌いの問題じゃねーんだわ

408 名前:デフォルトの名無しさん mailto:sage [2019/10/08(火) 23:04:05.43 ID:/kdim2Vo.net]
こんな雑談スレ好きな奴以外に需要ないだろ
こんな辺境別に見なくて良いんだよ?

409 名前:デフォルトの名無しさん mailto:sage [2019/10/08(火) 23:08:13.69 ID:hpLG4xMo.net]
>>400
c++17以降ならif constexprとstd::is_same_vの使用を検討してみるのもいいかも

410 名前:デフォルトの名無しさん mailto:sage [2019/10/09(水) 04:08:22.18 ID:NmoqHfbB.net]
400です。頑張ってみましたがどうにもコンパイルエラーが出ます
難しいですねC++は...

void print() {}

template<class... Args>
void print(const char* c, Args... args) {
cout << "[" << c << "]" << endl;
print(args...);
}

template<class First, class... Args>
void print(First first, Args... args) {
cout << first << endl;
print(args...);
}

int main() {
print(1, 3.14, "abc");
return 0;
}



411 名前:デフォルトの名無しさん mailto:sage [2019/10/09(水) 04:17:51.46 ID:NmoqHfbB.net]
あ、こういうふうにするとコンパイルできました。引数2個の関数を特殊化したからエラーになった?
テンプレートの展開のされ方がよくわからないけど、とりあえず目的のことはできました
ありがとうございました

void print(const char* c) {
cout << "[" << c << "]" << endl;
}

template<class T>
void print(T t) {
cout << t << endl;
}

template<class First, class... Args>
void print(First first, Args... args) {
print(first);
print(args...);
}

412 名前:デフォルトの名無しさん mailto:sage [2019/10/09(水) 04:21:52.30 ID:NmoqHfbB.net]
>>406
いわゆる型特性というやつでしょうか?enable_ifを使うのかと思い試したもののうまくいかず、
ネットで調べるとenable_ifと可変引数テンプレートは相性が悪いという意見を見つけたり...

413 名前:デフォルトの名無しさん mailto:sage [2019/10/09(水) 07:02:07.47 ID:8qv563yz.net]
>>409
if constexprを使った例はこんな感じ
template<class First, class... Args>
void print(First first, Args... args) {
if constexpr(std::is_same_v<First, const char*>){
std::cout << "[" << first << "]" << std::endl;
} else {
std::cout << first << std::endl;
}
if constexpr(sizeof...(args)>0){
print(args...);
}
}

414 名前:デフォルトの名無しさん [2019/10/09(水) 10:59:59.89 ID:RbUf+g7C.net]
const char * 自体も class First や class Args と一致するんじゃね

415 名前:デフォルトの名無しさん mailto:sage [2019/10/09(水) 21:59:58.44 ID:8qv563yz.net]
First と Argsの二つがあるのがややこしい場合は畳み込み式でもできるぞ

template<class... Args>
void print(Args... args){
  ([](auto t){
    if constexpr(std::is_same_v<decltype(t), const char*>){
      std::cout << "[" << t << "]" << std::endl;
    } else {
      std::cout << t << std::endl;
    }
  }(args), ...);
}

416 名前:デフォルトの名無しさん mailto:sage [2019/10/09(水) 22:42:32.58 ID:J+0BhmRu.net]
win系のOSの画面に1.txt~5.txtがあります。1.txtと2.txtをドラッグして選択したとします。
この状態で3.txt~5.txtを選択したことにするにはどのようなコードを書けば良いですか?

417 名前:蟻人間 mailto:sage [2019/10/09(水) 22:52:59.82 ID:bPxMjWa1.net]
>>413
ListView_SetItemState

418 名前:デフォルトの名無しさん mailto:sage [2019/10/10(木) 00:29:05.87 ID:uUO69neG.net]
エクスプローラにdll注入とか?

419 名前:蟻人間 mailto:sage [2019/10/10(木) 01:32:41.34 ID:VnnXeZwz.net]
前にやったことがある。
https://github.com/katahiromz/SysNotifyHooker

420 名前:デフォルトの名無しさん mailto:sage [2019/10/11(金) 01:40:25.90 ID:n351RXRL.net]
std::shared_ptrを構築後に(カスタム)デリータを変更するのは無理?

既にどっかで作成済みのshared_ptrについて、破棄タイミングを後から見れないかなと



421 名前:デフォルトの名無しさん mailto:sage [2019/10/11(金) 02:44:16.61 ID:uKeO6WuZ.net]
別のstd::shared_ptrをカスタムデリータ付きで構築してswapすれば

422 名前:デフォルトの名無しさん mailto:sage [2019/10/11(金) 04:06:16.56 ID:RvdWaBLb.net]
shared_ptrとunique_ptrでdeleterの指定方法が違うってのが興味深いね。

423 名前:デフォルトの名無しさん mailto:sage [2019/10/11(金) 12:29:56.77 ID:w5dDNHMJ.net]
VCのlatestでchar8_tが入ってたわ
やっとC++erが文字コード問題から解放されるんだな

424 名前:デフォルトの名無しさん mailto:sage [2019/10/11(金) 14:00:32.34 ID:XWYiG0pn.net]
やったぜ。

425 名前:デフォルトの名無しさん mailto:sage [2019/10/11(金) 15:19:50.16 ID:iqVlf+4W.net]
>>418
デリータごとswapされたわ
stackoverflowにも似たような質問があったけど結論としては出来ないっぽい
たぶん

426 名前:デフォルトの名無しさん mailto:sage [2019/10/11(金) 23:12:48.13 ID:WXWRLB/C.net]
>>392
別にテンプレ好きでも構わんが、C++ユーザー全員が趣味だと思ってんの?

427 名前:デフォルトの名無しさん mailto:sage [2019/10/11(金) 23:15:04.89 ID:WXWRLB/C.net]
>>405
雑談以外に役に立つ書き込み出来なくてすみません、ってことか

428 名前: mailto:sage [2019/10/12(Sat) 08:08:31 ID:vgsPsMOm.net]
>>423
C++ユーザが全員趣味なんてどこにも書いてないし、あるプログラミング言語が趣味でしか使われてない状況なら、委員会なんていらないわwww

429 名前: mailto:sage [2019/10/12(Sat) 08:48:46 ID:fl5cgmi7.net]
衣食住の確保以外の仕事なんてみんな趣味みたいなもんだよ
なくたって構わんのだから

430 名前: mailto:sage [2019/10/12(Sat) 08:58:25 ID:rY+KRAa3.net]
農業以外は遊びってことか!



431 名前:デフォルトの名無しさん mailto:sage [2019/10/12(土) 09:03:04.22 ID:tzOo7sle.net]
原始人から見たら1次産業以外は遊びだしそうだろ

432 名前:デフォルトの名無しさん mailto:sage [2019/10/12(土) 09:06:03.19 ID:w6XAfbR5.net]
委員会なんて何の役にもたってねーだろ。
構文解析もまともに理解できてないバカが俺様仕様の理想に突っ走ってるだけのクソ組織で、
仕様の実装、デバッグの手間なんてこれっぽっちも考えてないのがよくわかる。

433 名前:デフォルトの名無しさん mailto:sage [2019/10/12(土) 09:14:16.17 ID:Fi90LVHu.net]
デバッグできねえのを人のせいにするクズがよく言うぜ

434 名前: mailto:sage [2019/10/12(Sat) 09:54:19 ID:DT43rpFP.net]
近年は新機能は三大コンパイラ(GCC,MSVC,Clang)での試験実装が入ってから仕様入りするのが普通になってるし
コンセプトなんてまさにデバッグの手間の軽減を第一目的に苦心して作られた機能なんだけど
どのへんを見てよくわかったのか教えて

435 名前: mailto:sage [2019/10/12(Sat) 10:00:51 ID:w6XAfbR5.net]
>>431
実装したことないやつは黙っててね。
で、そのコンセプトを実際のコードでコンパイルした時間がどれくらいになるかわかってる?
そういう有用なベンチマークもほとんど出さずに無理やり入れようとするから
信頼を無くしてるんだよ。

436 名前: mailto:sage [2019/10/12(Sat) 10:19:47 ID:Nq/Z/R6A.net]
経験したことは全て正しいっていう日本特有のアホ理論だろそれ
経験してないお前に発言権は無い、っていう
その理屈を持ち出すヤツは大抵はアホ

437 名前: mailto:sage [2019/10/12(Sat) 10:24:58 ID:69fBrMS4.net]
コンパイル時間は、コンパイラの出力する最適化されたバイナリの実行速度に比べたら問題ではないだろ

しかも構文解析にかかる時間なんて最適化時間に比べりゃ屁みたいなもの

438 名前: mailto:sage [2019/10/12(Sat) 10:26:15 ID:mYzO26Pi.net]
似たようなものを複数書いてもバグ修正時に一部見落としなんて馬鹿げたことになるわけで
マクロでもテンプレートでもまとめられるものはまとめたほうがいいわな

439 名前: mailto:sage [2019/10/12(Sat) 10:27:43 ID:69fBrMS4.net]
c++言語の場合、パースのコンテキスト依存が、識別子の種類でも変わるから、テンプレート時の記述でtypename やらtemplateやらで、識別子の種類自体を指定する羽目になっているのはあるよね

440 名前: mailto:sage [2019/10/12(Sat) 11:23:13 ID:zNYGVDyE.net]
>>434
テンプレートふんだんに使ったライブラリ実用してるとひどいことにはなる
アプリ自体は数万行なのにコンパイル10分以上とか



441 名前:デフォルトの名無しさん mailto:sage [2019/10/12(土) 11:27:59.19 ID:KmpqQhzT.net]
>>432
お前が信用しないのは勝手だが、みんなの総意みたいに言うなよ

442 名前: mailto:sage [2019/10/12(Sat) 12:09:52 ID:73DoxmjF.net]
数万行で10分が早いのか遅いのかよくわからない

443 名前:デフォルトの名無しさん mailto:sage [2019/10/12(土) 12:15:22.09 ID:69fBrMS4.net]
それは本当にパースの複雑さのせいなのかは疑問だな
templateだと、プログラマは簡単にコンパイラの仕事をあまり意図せず増やしてしまいがちだからね。

std visitで引数増やすとコンパイル時間は簡単に増やせるよ。
5つくらいでもうコンパイラが落ちたりする
やらせていることの面倒くささ、それを手書きすることを考えれば妥当なのだけど

444 名前: mailto:sage [2019/10/12(Sat) 12:41:57 ID:Tqr7IA/6.net]
最近C++触ってないけど数万程度で10分もかかるの?
10万行程度なら5分以内に終わってほしいところだけど…

445 名前: mailto:sage [2019/10/12(Sat) 13:13:02 ID:trzfpzAc.net]
>>439
かなり遅いです。
ヘッダファイル *.h とソース本体のファイル *.c では事情が違いますが、
OSのバージョンによりますが、Win32の標準ヘッダファイルの windows.h などだけでも
コメントを除外しても2万行弱くらいあります。
これのパースは、VC++で1秒〜数秒くらいです。
通常は、precompiled header を使うので、一つのプロジェクトで一度だけ
パースされることが多いです。
ただし、プロトタイプ宣言やマクロ定義、構造体定義、inline関数定義
などだけで、実際のコード生成は伴わないので、*.c の数万行とは
また事情が違います。*.c はコード生成を伴うので、同じ行数であれば*.hよりも
遅くなる傾向があります。
しかし、それでも、C++98 の場合、数万行だと3秒〜10秒以下でコンパイルできます。

446 名前:デフォルトの名無しさん mailto:sage [2019/10/12(土) 13:23:47.19 ID:UpKv7BB3.net]
↑こいつはVSスレで有名なキチガイなので放置で

447 名前:デフォルトの名無しさん mailto:sage [2019/10/12(土) 13:24:45.74 ID:69fBrMS4.net]
c++の文法のせいでパースが遅いってレベルの話じゃないような

448 名前:デフォルトの名無しさん mailto:sage [2019/10/12(土) 15:33:32.46 ID:UCFxfzGx.net]
ヘッダオンリーのライブラリがポータブルとか言われてもてはやされるのがc++だからね
生産性の意識が間違った方向に向いてる
コンセプトでどうなることやら

449 名前: mailto:sage [2019/10/12(Sat) 15:52:13 ID:K75UXpIa.net]
俺の10万行程度のアプリは1分以内にコンパイル終わるが・・・
10分てどこの世界だ

450 名前: mailto:sage [2019/10/12(Sat) 19:26:26 ID:8VsKOlOD.net]
「参照の配列」を作りたいときって現状 reference_wrapper を使う以外ないですか?



451 名前:デフォルトの名無しさん mailto:sage [2019/10/12(土) 20:29:07.16 ID:iehpkqJW.net]
ポインタやスマポじゃいかんのか

452 名前: mailto:sage [2019/10/12(Sat) 20:55:57 ID:cS98TRHZ.net]
>>437
プリコンパイルヘッダー使え…!

>>446
VC++2010の場合配列要素のアドレスの配列というのを
それぞれ1万行ぐらい書いてリリースビルドすると10分かかる

453 名前:デフォルトの名無しさん mailto:sage [2019/10/12(土) 23:18:34.83 ID:zNYGVDyE.net]
spiritで構文解析させてたコード(その上et使った自作ライブラリあり)だから

454 名前:痰ニして極端だったかもしれんけどね
プリコンパイルドヘッダは使ってたよ
効いてるときは数分かからなかったと思う
というか5年以上そのコード使ってないんで今のマシンならまだマシになるとは思う
[]
[ここ壊れてます]

455 名前:デフォルトの名無しさん mailto:sage [2019/10/13(日) 01:04:01.79 ID:2Ilco01g.net]
boostを多用した10数万行のソースでprecompileありでreleaseビルドしたら10分くらいかかってたけど、debugビルドでは1,2分くらいだった気がする。パースだけなら大したことないけど最適化がかなり遅いと思われる。

456 名前:デフォルトの名無しさん mailto:sage [2019/10/13(日) 01:06:42.02 ID:uORMYh+w.net]
翻訳単位が増えると単純に遅くなるし
リンク時最適化でもさらに遅くなる

457 名前: mailto:sage [2019/10/13(Sun) 01:16:58 ID:Fwjkj11x.net]
LTOは本当のリリース時や速度検証の時以外は外しても問題ないよね

458 名前:デフォルトの名無しさん mailto:sage [2019/10/13(日) 09:37:54.86 ID:kfwaB+Y7.net]
ここの話で出ている

>296
>>294
clangさんが教えてくれた
std::string hogehoge() { return A<_T3>::template get<std::string>();}

>436
c++言語の場合、パースのコンテキスト依存が、識別子の種類でも変わるから、
テンプレート時の記述でtypename やらtemplateやらで、
識別子の種類自体を指定する羽目になっているのはあるよね

<_T3>::templateやtypenameをどの様な場合に書かないといけないのか?
この辺を解説した初心者向けか入門者向けの解説サイトみたいな所が
何処かに有りませんか?
サイトが無さそうなら検索に向いている単語みたいなのでも有れば助かる
::templateとかで検索しても上手く引っ掛からないみたい(有るには有るけど少ない)

459 名前:デフォルトの名無しさん mailto:sage [2019/10/13(日) 10:06:17.74 ID:zTi0Tc1S.net]
コンパイラが出すメッセージで検索してみれば?

460 名前:デフォルトの名無しさん mailto:sage [2019/10/13(日) 11:14:46.72 ID:Fwjkj11x.net]
>>454
https://ja.cppreference.com/w/cpp/language/dependent_name



461 名前:デフォルトの名無しさん [2019/10/13(Sun) 17:23:21 ID:Y0ptPfKA.net]
他の言語で書かれたコードをスクリプトの要領で
C++から呼び出して実行したいのですが、
そういった事をするのに適した言語ってどういった物があるのでしょうか?

462 名前: mailto:sage [2019/10/13(Sun) 17:23:50 ID:Y5pFrXym.net]
>>457
パイソン

463 名前: mailto:sage [2019/10/13(Sun) 17:31:01 ID:9auzzyVZ.net]
言語間のABIの違いを透過的にしたいのならアセンブラの出番だね

464 名前: mailto:sage [2019/10/13(Sun) 17:36:26 ID:1+8oai62.net]
まさにそういう用途で作られたluaとか

465 名前:デフォルトの名無しさん mailto:sage [2019/10/13(日) 17:44:25.71 ID:j3fG3YC6.net]
>>457
今ならluaかjs(V8/ChakraCore/SpiderMonkey)だな。

【Lua】組み込み系言語総合 その7【Squirrel】 [無断転載禁止]©2ch.net
https://mevius.5ch.net/test/read.cgi/tech/1474536226/

pythonもできなくはないけど手軽とは言えない。
pythonを使いたい理由がなければやめておくのが吉。

466 名前: mailto:sage [2019/10/13(Sun) 18:10:48 ID:pJwii1Hg.net]
pythonは呼ぶ方で、呼ばれる方としてはほとんど想定されてないわな。

467 名前: mailto:sage [2019/10/13(Sun) 19:05:43 ID:m8H1BiEu.net]
lua以外無い

468 名前: mailto:sage [2019/10/13(Sun) 19:35:48 ID:rjz838Ki.net]
>>457
tcl

469 名前:デフォルトの名無しさん mailto:sage [2019/10/13(日) 20:24:22.36 ID:kfwaB+Y7.net]
>455,456さんどうもです

エラーが出たらそうしてみます

リンク先を読んで見ましたが
自分には難しいのでそのページを手がかりに検索して(依存名で探してみた)
漸く理解出来た気がします

前にstd::を付ける付けないって話を何処かでしてい
自分的にはどうしたものだろうか?
って感じだったんですけど
adlやtwophasenameとかの解説と合わせて書いて有るのを呼んでいて
std::を付けるのはかなり重要なんだと思えてきた
今までnamespaceって単なるグループ名を付けている
くらいの感覚だったんですけど
意外と重要なんですね

どうもでした

470 名前:デフォルトの名無しさん mailto:sage [2019/10/14(月) 15:05:53.73 ID:rfaLGQBa.net]
template<size_t N>
class Test{
public:
private:
int m[N];
};

上の様なクラスでコンストラクタでmを値を指定して初期化したいんだけどNの数は未定ではないですか。

こういう場合のコンストラクタの書き方ってどうすればいいのでしよう?
可変引数?



471 名前:デフォルトの名無しさん mailto:sage [2019/10/14(月) 15:12:05.32 ID:BPBGG2nS.net]
コンパイル時に決まってないならvectorかなんかにするしかない

472 名前:デフォルトの名無しさん mailto:sage [2019/10/14(月) 15:18:08.00 ID:P81x9Tjl.net]
templateパラメータの整数にはコンパイル時に決まらない数値は入れられない

473 名前:デフォルトの名無しさん mailto:sage [2019/10/14(月) 15:28:00.19 ID:qN7fFVrS.net]
>>466
そもそも、そのような生配列は、デフォルトでは0初期化もされないので、
メンバ初期化子リストを使わなくても効率は落ちないので、
コンストラクタ内部で普通に代入演算子を使って初期化すればいい。
すると、単に任意個数の引数をコンストラクタに渡す問題になる。
それには、昔ながらの va_list を使って渡す方法と、
関数テンプレートやテンプレートクラスを使って、自分自身を一つずつ引数を
減らしながら呼び出していく方法の二通りある。

474 名前:デフォルトの名無しさん mailto:sage [2019/10/14(月) 15:28:52.79 ID:Y7o3BEyU.net]
>>466
Test(std::initializer_list<int>&& arg)
{
std::copy_n(std::begin(arg), N, std::begin(m));
}

475 名前:デフォルトの名無しさん mailto:sage [2019/10/14(月) 15:30:45.59 ID:rfaLGQBa.net]
>>469

一度考えたのはテンプレートの可変引数なんですが

//Testのコンストラクタ
template<typename... T>
Test(T... args):m{args...}{
}

templateの可変引数の為にどんな型でも一致してしまい、そのくせにdoubleからintなどの変換をしてくれないのでinitializer_listを引数に出来たり、もしくはもっといい初期化方法があるのかなと思った次第です。

476 名前:デフォルトの名無しさん mailto:sage [2019/10/14(月) 16:18:31.70 ID:1VO4fG6M.net]
ideone.com/TPZu2J

477 名前: mailto:sage [2019/10/14(Mon) 16:48:34 ID:REdvl5Gt.net]
>>471
>そのくせにdoubleからintなどの変換をしてくれないので
この点に関しては、以下の拡張展開でいけるはず。
template<typename... T>
 Test(T... args):m{((int)args)...}{
}

478 名前: mailto:sage [2019/10/14(Mon) 16:55:25 ID:REdvl5Gt.net]
templateの「非型引数」を使えば、理論上は、
template<int...args>
Test(int...args):m{args...}{
}
と書ける可能性はあるかもしれないけど、試してみてないので分からない。

479 名前: mailto:sage [2019/10/14(Mon) 17:04:44 ID:REdvl5Gt.net]
C++11 から、template 仮引数(パラメーター)に非型パラメーターパックが使える。
分かっているとは思うけど、このパックとは可変長引数をまとめて入れる容器の様な意味。
実際にやってみてないのでわからない。

https://en.cppreference.com/w/cpp/language/template_parameters

【Non-type template parameter】
type ... name(optional) (3) (since C++11)
3) A non-type template parameter pack with an optional name.

480 名前: mailto:sage [2019/10/14(Mon) 17:48:47 ID:DdI7aqm2.net]
>>466
要素数がコンパイル時に決まってるなら std::array 使って Test<3> x{{1,2,3}} とすることは簡単にできそう。



481 名前:デフォルトの名無しさん [2019/10/14(Mon) 20:20:29 ID:ljIrzJ7B.net]
>>464 >>457
tcl + 1

482 名前:デフォルトの名無しさん [2019/10/16(Wed) 00:49:52 ID:4OT/K/L6.net]
>>473 Thank you!!

483 名前: mailto:sage [2019/10/18(Fri) 03:20:02 ID:kbBE7aSe.net]
他クラスのメンバ関数テンプレートを呼び出すときってtemplateキーワードを関数名の前に付けないと
operator<と間違われてエラーになりますですよね?具体的に例をあげてみますと

https://wandbox.org/permlink/F7zl1fDh3qc216hd

これの t.template func<T2>(); のところですが、実はこのtemplateキーワードを外しても
WindowsのVisualStudioだとコンパイルが通ってしまいます。
これってVisualStudioが規約違反しているという理解で合っていますか?

484 名前:デフォルトの名無しさん mailto:sage [2019/10/18(金) 03:32:35.18 ID:L8qU11hp.net]
vsのバージョンは?
2017の途中からtwo phaseに対応しだしてtemplate周りの怪しい挙動は大分改善された

485 名前: mailto:sage [2019/10/18(Fri) 11:35:03 ID:kGqx1xn0.net]
>>480
Express 2017 for Windows DesktopとProfessional 2019で確認しています
準拠モードを「はい」にしたら標準の規約に従うのかと思ったんですが変化なしでした

開発はWindowsでしつつもWindowsとLinuxどちらでもコンパイルできるようにしたいんですが
もしかしてそう簡単な話ではないんですかね

486 名前: mailto:sage [2019/10/18(Fri) 12:11:07 ID:8CoI4J3v.net]
>>481
visual studio cmakeプロジェクトでググる

487 名前:デフォルトの名無しさん mailto:sage [2019/10/18(金) 15:49:49.04 ID:/qIwU54Z.net]
effective modern c++のnoexceptの項読んで思ったんだが、
C++の関数内でCの関数(具体的にはOpenGLとか)を呼び出した時に
C++側でcatchできる例外って具体的にどんなものがあるの?

試したことないけどmalloc失敗でbad_allocは飛ばないよね?

488 名前:デフォルトの名無しさん mailto:sage [2019/10/18(金) 18:57:22.15 ID:eJANlQqR.net]
Windowsなら構造化例外とか

489 名前:デフォルトの名無しさん mailto:sage [2019/10/18(金) 19:16:01.68 ID:rTjJuJDg.net]
>>482
cmakeってビルドに関するものだったような?
ソース自体はWindowsとLinuxで完全同一にしたいんですが
あれなんか自分勘違いしてるかな

とりあえずcmakeくぐります、有難う

490 名前:デフォルトの名無しさん mailto:sage [2019/10/18(金) 19:19:00.58 ID:5559SrY6.net]
VCコンパイラがWindows専用だからcmakeだけでは解決しない
clangオプション使えばいけるんじゃね



491 名前:デフォルトの名無しさん mailto:sage [2019/10/18(金) 19:27:02.65 ID:BPo3Wxa0.net]
cmakeってなんとなくしか使ってないんですけど何なんですか
OpenCVのソースをビルドするときに使いましたけど、cmakeした後にまたVisual Studioでコンパイルする必要があるのはなぜですか

492 名前:デフォルトの名無しさん mailto:sage [2019/10/18(金) 21:38:24.25 ID:1VxWd/yq.net]
>>487
cmakeってmakeの代用じゃなくてmakefileとかxxx.slnとかを作るソフト
なのでcmake実行後に各々の環境にあったビルドを行う

493 名前:デフォルトの名無しさん mailto:sage [2019/10/18(金) 22:32:33.72 ID:HsDKWWc7.net]
>>487
ビルドするためのスクリプトを作るツール、みたいに考えるといいよ
linux環境ならLinux用のものを作ってくれる
makeだと基本はlinux専用だし、.slnや.vcxprojはwindows専用だから、両方を面倒見るのは大変でしょ

494 名前:デフォルトの名無しさん [2019/10/18(金) 22:48:18.41 ID:f2FG8XiO.net]
ビルドするためのスクリプトを作るためのスクリプトを作るためのスクリプトなんてよくある話だよ。

495 名前:デフォルトの名無しさん mailto:sage [2019/10/18(金) 22:49:57.04 ID:a3uRi/Ig.net]
秘伝のタレな

496 名前:デフォルトの名無しさん mailto:sage [2019/10/18(金) 23:06:23.18 ID:liCy40EB.net]
GNU autotoolsをまともにいじる輩は消え去ったという現実をcmakeも味わうことになる。
バカは同じ間違いをする。歴史も見ずに。

497 名前:デフォルトの名無しさん mailto:sage [2019/10/19(土) 00:19:02.04 ID:JKxr+RAJ.net]
CMakeってKitwareっていう大学発ベンチャーから出てきたやつだよな
もとはVTKとか可視化用ライブラリ開発してるしがないベンチャーだったのに
CMakeのおかげでやたら顔が知られるようになった

498 名前:デフォルトの名無しさん mailto:sage [2019/10/19(土) 00:40:35.72 ID:kiA3Djjo.net]
VTKとparaviewの方が有名じゃなかったのか

499 名前:デフォルトの名無しさん mailto:sage [2019/10/19(土) 00:44:42.31 ID:JKxr+RAJ.net]
ParaViewは最近になって有名になってるけど所詮はVTKのラッパーでしょ
CMakeのほうが影響度はでかいと思う
ベンチャーでここまでやれたなら大成功な事例だね

500 名前:デフォルトの名無しさん mailto:sage [2019/10/19(土) 00:58:43.11 ID:kiA3Djjo.net]
cmakeより前から有名じゃね?



501 名前:デフォルトの名無しさん mailto:sage [2019/10/19(土) 01:00:35.87 ID:4XSJxZBk.net]
cmake邪魔くさい
Makefile.am, configure.acからautoreconfしてconfigure作る方が楽。
windows用もmingwでクロスビルドしちゃえば楽だし。
WSLでwindowsからも見えるパスでビルドすると作ったwindows用binaryをすぐに起動できるしいうことなし

502 名前:デフォルトの名無しさん mailto:sage [2019/10/19(土) 01:28:27.26 ID:kDntEbbb.net]
mingw使わずに標準のwindowsの環境で使えるようになってから出直してきて

503 名前:デフォルトの名無しさん mailto:sage [2019/10/19(土) 01:36:12.28 ID:+xsHXYvs.net]
mesonいいぞー

504 名前:デフォルトの名無しさん mailto:sage [2019/10/19(土) 01:37:16.21 ID:JKxr+RAJ.net]
makeとかのビルドツールって超重要なはずなのにおざなりな状況になってるのは不思議だ
なんとかしてくれ

505 名前: mailto:sage [2019/10/19(Sat) 01:49:35 ID:kiA3Djjo.net]
クロスプラットフォームなソフト作るにしても、成果物が対象の環境で動けば良い訳で、ビルドをどの環境でも出来ることにそれほど意味はないからね
てかunix系でgccやclang使って開発しているものをVCに入れても謎の独自仕様でコンパイルできないとかザラだしね

506 名前:デフォルトの名無しさん mailto:sage [2019/10/19(土) 04:05:50.65 ID:kDntEbbb.net]
>>500
そう言って立ち上がった人は100億人くらいいたが誰一人として帰ってくる者はいなかった

507 名前:デフォルトの名無しさん mailto:sage [2019/10/19(土) 04:25:19.36 ID:Qviva8VV.net]
>>502
ほんとこれw

508 名前: mailto:sage [2019/10/19(Sat) 07:26:21 ID:4XSJxZBk.net]
>>498
wslでmingwクロス環境はマクソ提供だけど

509 名前: mailto:sage [2019/10/19(Sat) 09:24:58 ID:wYu0/eCZ.net]
あらゆるビルドツールは怪獣化して、怪獣を飼いならすためのラッパーが必要になり、そしてそのラッパーももれなく怪獣化する
歴史が証明しており例外はない

510 名前: mailto:sage [2019/10/19(Sat) 09:25:25 ID:WQwZNfDO.net]
会社でifstreamのファイルオープンがエラーになるのはなぜなのか不明。assert()で引っかかる。
Visual Studio 2008コマンドプロンプトでコンパイルしたプログラムで、コードは単純化
して示したものが下記のようなもの。
std::ifstream ifs1;
for (n = 0; n < 8; ++n) {
ifs1.open(s[n].c_str());
assert(ifs1); // もしくはassert(ifs1.is_open());
関数(ifs1);
ifs1.close();
ifs1.clear();
}
コーディング上に間違いがあるのかいな。ファイルが使用中のためにエラー
でもないようだし。
よくわからんからCのFILE *に変更して対処したけどコンパイラの欠陥か。
ifstreamを宣言した後に ifs1.clear(); が必要なのか。



511 名前:デフォルトの名無しさん mailto:sage [2019/10/19(土) 09:50:39.86 ID:wYu0/eCZ.net]
ifsreamってcloseの後に再使用できる保証あったっけ?
ifs1の宣言をfor文の中に入れて毎回オブジェクト作り直す方が無難に見える

512 名前:デフォルトの名無しさん mailto:sage [2019/10/19(土) 09:51:32.93 ID:wYu0/eCZ.net]
宣言じゃないや定義

513 名前:デフォルトの名無しさん mailto:sage [2019/10/19(土) 09:54:59.18 ID:Xn59Im0u.net]
makeが複雑なんじゃなくて
多様な環境すべてに対応するように書くことが複雑なわけで。
だったらdockerなり使って一つの環境だけでの提供を考える方が楽。

514 名前:デフォルトの名無しさん mailto:sage [2019/10/19(土) 11:50:11.90 ID:Xq/UOX2V.net]
>>506
まずファイル開く権限あるのかな
最近それで引っかかった

515 名前:デフォルトの名無しさん mailto:sage [2019/10/19(土) 12:33:25.60 ID:IyvFodwr.net]
>>484
あれ、Winの構造化例外ってそもそもtry..catchには引っかからなかったような……

516 名前:デフォルトの名無しさん mailto:sage [2019/10/19(土) 12:41:43.65 ID:IyvFodwr.net]
Rakefileを使っている俺は小数派。

>>506
古いVCの場合ifstreamのclear()後再使用はできなかった記憶がある。

517 名前:デフォルトの名無しさん [2019/10/19(土) 13:51:45.42 ID:2wK0PqU+.net]
C++でv8のjavascriptを使うために
インストールしようと色々やってるんだけどどうにもうまく行かない。

https://qiita.com/mofumonta/items/ef3d890e13a7c1701748
このサイトを参考にしながら進めてるんだけど
「depot-toolsインストール」の環境変数を通す項目で
C:\v8\depot_tools\win_tools-2_7_6_bin\python\bin
このパスがダウンロードしてきたdepot-toolsにはないんだけど、
どこにあるか誰か知りませんか?

スレチだったらごめんなさい。

518 名前:デフォルトの名無しさん [2019/10/19(土) 14:48:33.14 ID:g7gJ/kc1.net]
おま環
何をダウソしたかくらいは書け

519 名前:デフォルトの名無しさん [2019/10/19(土) 15:03:15.21 ID:g7gJ/kc1.net]
python2.7 が既に入ってるなら
その bin に path 通しとけば良いんかな

520 名前:デフォルトの名無しさん mailto:sage [2019/10/19(土) 15:14:23.88 ID:Q3nSZoDU.net]
>>483
C の関数が呼び出すコールバックを C++ で書いた場合、環境によってはコールバックからの例外が
C の関数を通過してくる。環境によっては通過できずに terminate() するけど。
厳密に「Cの関数」じゃなくなるけど qsort(), bsearch() については例外が通過できるものと規定されている。
あとは未定義動作となる場合の反応として例外が飛んでくることはあるかもしれない。



521 名前:デフォルトの名無しさん [2019/10/19(土) 15:22:29.09 ID:2wK0PqU+.net]
>>514
忘れてた。スマヌ。
Windows10 X64
Visual Studio Community 2019
Python 3.7.4(64-bit)
Git version 2.23.0.windows.1

ダウンロードしたのは
https://chromium.googlesource.com/chromium/tools/depot_tools.git
ここから「x64 Native Tools Command Prompt for VS 2019」
で「git clone」を使ってダウンロードしました。

>>515
python自体のbinフォルダは試してませんでした。
ちょっとやってみます。

522 名前:デフォルトの名無しさん [2019/10/19(土) 15:27:23.69 ID:g7gJ/kc1.net]
OS とかツールは全部違うけど
https://chromium.googlesource.com/chromium/tools/depot_tools.git
これ clone しても確かに win_tools-2_7_6_bin は無かった

523 名前:デフォルトの名無しさん mailto:sage [2019/10/19(土) 15:29:04.62 ID:ydKYIai+.net]
何故公式のインストール手順を読まないのか

524 名前:デフォルトの名無しさん mailto:sage [2019/10/19(土) 19:15:58.17 ID:fDUUZQql.net]
Node.js じゃ、ダメなのか?

525 名前:デフォルトの名無しさん mailto:sage [2019/10/19(土) 20:05:28.35 ID:+xsHXYvs.net]
>>511
なんか設定次第で引っかかるようにならなかったっけ・・・

526 名前:517です [2019/10/20(日) 17:45:24.74 ID:njFFTJVf.net]
>>519
インストール手順自体は試したんだけど、
あまりに訳わからんちんで途中で断念して
他のサイトを見ながら入れようとしています。

>>520
Node.jsってv8の上に乗っかったjavascriptというイメージなんだけど、
C++から呼び出せるのでしょうか?

527 名前: mailto:sage [2019/10/20(日) 20:19:16 ID:hyX4MvIl.net]
今、YappyCamという録画ソフトを作っています。以下のソースをご覧下さい。

https://github.com/katahiromz/YappyCam/blob/master/sound.hpp
https://github.com/katahiromz/YappyCam/blob/master/sound.hpp#L125
https://github.com/katahiromz/YappyCam/blob/master/sound.cpp#L154

このSoundが音声を扱うクラスになっております。
スレッド関数Sound::ThreadProcで録音処理を行っています。
std::vector<BYTE> m_wave_dataがサウンドバッファです。
Sound::FlushDataがバッファを吐き出す関数です。

現在、SSDが主流になりつつありますが、ハードディスクでもトラブルなく使えるようにしたいです。いくつか質問します。

1.m_wave_dataをstaticな固定バッファにすべきか。するとすればどれぐらいの容量か。
2.もっといいバッファリングの方法はないか。

お願いします。

528 名前:蟻人間 mailto:age [2019/10/20(日) 21:02:47.12 ID:hyX4MvIl.net]
スピード命です。フレーム落ちは絶対にダメだそうです。

529 名前:デフォルトの名無しさん mailto:sage [2019/10/20(日) 21:06:32.98 ID:I/H74RW7.net]
古臭いスタイルはさておき・・・
(別にそれでいいと思うよ)

なぜバッファリングしてる?
vectorにためずにwriteしたらいいじゃん
readとwriteの単位が合わないとか?
バッファリングするならreader/writerで別スレッドにした方がいいかもね

オーディオの処理なんだからおれなら動的メモリ確保の走るvectorは使わないね
最悪システムコールだから音が途切れる可能性が高まる
一瞬かもしれないが音は少しでも途切れるとノイズになる

最適なバッファ量はそのルーチンがどれぐらいのジッターで駆動してか計測して決めればいい
あとバッファリングすればそれだけ遅延が発生するから注意
本来ビデオ側と同期をとる必要あるけどPCだと適当だよな
CE機器だと完璧に合わせるけど

530 名前: mailto:sage [2019/10/20(日) 21:15:47 ID:PJrfugKB.net]
COBOLのWRITE命令みたいに非同期書き込み&バッファローテーションてか?
あの当時のアホOSならともかく今どきアプリでそんなことせにゃならんか?
ベアメタルなら面白そうだけど



531 名前: mailto:sage [2019/10/20(日) 21:16:42 ID:Vt7fKSBc.net]
遅延の原因は、vector::insert()でしょ。

532 名前: mailto:sage [2019/10/20(日) 21:24:56 ID:akKR2ina.net]
ズらすの?

533 名前: mailto:sage [2019/10/20(日) 21:27:13 ID:peAHiKUT.net]
誰がハゲやねん

534 名前: mailto:age [2019/10/20(日) 22:12:11 ID:2g822Cxo.net]
ああそうか。std::FILE/CreateFileそのものがバッファリングしてるんだ。ならば下手なバッファリングは必要ないと。

普通にI/Oすることにします。ありがとうございます。

535 名前: mailto:age [2019/10/20(日) 22:21:50 ID:2g822Cxo.net]
std::vectorのメモリー動的確保は音声処理では不味いと。

ハードディスク環境でジッターを測定して見ないと。わかりました。

536 名前: mailto:sage [2019/10/20(日) 22:32:55 ID:I/H74RW7.net]
>>530
ただそのスレッドでwriteするのが問題ないかはよく確認した方がいいよ
writeでブロックされることで音声のソース側の処理が滞る可能性がある
その場合はやっぱり別スレッドにすべきだね

537 名前: mailto:sage [2019/10/20(日) 22:59:16 ID:2g822Cxo.net]
プログラム高速化の禁術
https://qiita.com/kotauchisunsun/items/84e01c6fb621fcc1a647

538 名前: mailto:sage [2019/10/20(日) 23:12:22 ID:2g822Cxo.net]
setvbufって便利な関数を見つけた。これ使うか。

539 名前: mailto:sage [2019/10/20(日) 23:13:52 ID:fVQAzz8M.net]
音声のバッファリングには普通はリングバッファを使う

540 名前: mailto:sage [2019/10/20(日) 23:28:56 ID:2g822Cxo.net]
ここまでのまとめ。

リングバッファを使う。
十分大きなバッファサイズでsetvbufを使う。
リングバッファへの読み書きは別スレッドにする。
バッファが空のときはイベント待ちで休ませる。



541 名前:デフォルトの名無しさん [2019/10/20(日) 23:44:50 ID:Vt7fKSBc.net]
別スレッドにキューイングするのに適したC++標準クラスは何かな?

542 名前:デフォルトの名無しさん mailto:sage [2019/10/21(月) 06:50:33.92 ID:iwcvXj42.net]
ゴチャゴチャ言うならビルトイン配列使っとけ

543 名前:デフォルトの名無しさん [2019/10/21(月) 15:01:03 ID:c9dhXgWB.net]
C++から呼べるし
C++を呼べる

544 名前:デフォルトの名無しさん mailto:sage [2019/10/21(月) 15:43:44 ID:M4XH2/Bk.net]
>>537
Queue への読み書きは、1要素当たりは短時間で済むことが多いので、
Queueを読み書きする場所で、必ず Critical Section などで囲むと良い。
一度に沢山の要素をまとめて書き込みたい場合は、原則的には、
1要素を書き込む処理をこまめに、Critical Section で囲むようにする。
必ずしも1要素ずつ囲む必要は無いが、こまめに囲った方が、
別スレッドの待ち時間が減ることが期待できるが、その意味が有る場合と
無い場合とが有る。
Critical Section の代わりに、Mutex や Semaphore などを使うことも出来る。

545 名前:デフォルトの名無しさん mailto:sage [2019/10/21(月) 17: ]
[ここ壊れてます]

546 名前:20:19.00 ID:Yxovtd3S.net mailto: キャッシュに配列を置けばいいじゃねえか
かんたんだろ

APUの近くに配列でOK
複雑なデータ構造なんて考える必要ナシ
[]
[ここ壊れてます]

547 名前:デフォルトの名無しさん mailto:sage [2019/10/21(月) 18:19:39.76 ID:iwcvXj42.net]
タイミングで問題が出てるのにvectorにこだわるのはアホだよな

548 名前:デフォルトの名無しさん mailto:sage [2019/10/21(月) 18:33:52.73 ID:K8Ck/3Ch.net]
実行時のパラメータでバッファサイズ可変にするならvectorで始めにresizeしておくのが楽
size使える分配列のunique_ptrより取り回しも楽だし

549 名前:デフォルトの名無しさん mailto:sage [2019/10/21(月) 18:43:04.52 ID:Kc9FjQwr.net]
boostにリングバッファのクラスあるよ

550 名前:蟻人間 ◆T6xkBnTXz7B0 mailto:sage [2019/10/21(月) 18:50:23 ID:LVq8IpRv.net]
天才だから自分でリングバッファ作った。
https://github.com/katahiromz/YappyCam/blob/master/ring.hpp



551 名前:蟻人間 ◆T6xkBnTXz7B0 mailto:sage [2019/10/21(月) 19:22:51 ID:ICV7tWge.net]
バッファがいっぱいになったらどうしよう?

552 名前:537 [2019/10/21(月) 19:27:27 ID:iqf1snDW.net]
>>540
それらの同期機能って標準C++のクラスだけで実現できるもんなの?

553 名前:デフォルトの名無しさん mailto:sage [2019/10/21(月) 19:30:51 ID:Kc9FjQwr.net]
>>546
捨てるしかないだろ

554 名前:デフォルトの名無しさん mailto:sage [2019/10/21(月) 20:56:31 ID:NgTxqwl+.net]
>>547
どこまでを標準と言ってるのか知らんけどお前の考える標準でスレッドをサポートしてるならたいてい同期機構もあるはず

555 名前:蟻人間 ◆T6xkBnTXz7B0 mailto:sage [2019/10/21(月) 21:02:21 ID:LVq8IpRv.net]
>>547
WindowsではCriticalSection, CreateMutexなどがあったからC++11以前でも使えた。
C++11からstd::mutex, std::lock_guardなどが使えるぞ。

556 名前:デフォルトの名無しさん mailto:sage [2019/10/22(火) 00:25:01 ID:IM/z9Y8P.net]
ロックフリー的ななんか無かったっけ?

557 名前:蟻人間 mailto:sage [2019/10/22(火) 16:18:00.26 ID:QN5InCe0.net]
リングバッファの排他制御どうするか?

push/popごとにロックかけたら遅くなりそう。

558 名前:デフォルトの名無しさん mailto:sage [2019/10/22(火) 16:36:38.23 ID:LzjGZCpL.net]
>>545
stlライクにしてる割にコピーやムーブが内部の値ベースなのおかしくない?

559 名前:デフォルトの名無しさん mailto:sage [2019/10/22(火) 17:03:31.86 ID:mzkWHCb9.net]
用途的に
reader 1
wrtier 1
だと思うけどそれならwait freeな実装が可能
read pointer/writer pointerで制御するやつね
かつかつに最適化するならこれ

しかしその前にどれだけの頻度と長さで排他の衝突するか見た方がいい
リアルタイムのオーディオなら短くても5msec周期とかじゃないか
かつlock中に多少のメモリの読み書きやってるだけなら排他が必要な時間は短い
なら素朴にmutex1個でのロックで十分な可能性も高い
同期のミスはデバッグがつらいから不用意に難しいことしない方がいい

もしくはある程度のバッファリング(遅延)が許容できるとか、固定長の処理であるなら
ならバッファを複数用意してダブル、トリプルバッファ的な制御でもいいだろう
つまりwriter側でバッファに全部書き終わったらそのバッファをreader側のキューにいれる
reader側は全部読み終わったらwriter側のキューに戻す
っての

とにかく原則どおりまずシンプルにミスなく作って計測して最適化ね

560 名前:デフォルトの名無しさん mailto:sage [2019/10/22(火) 17:19:01.36 ID:mzkWHCb9.net]
ringのソース見たけど
おれはm_full なしでやるのが好みだな
つまりm_front_indexとm_back_indexが一致するのはemptyのときのみ
full時には実際は1個空きがある状態

これを推し進めればwait freeの実装に近づけるぞ
車輪の再発明だが勉強にはなる



561 名前:デフォルトの名無しさん mailto:sage [2019/10/22(火) 17:21:45.79 ID:2ZhQSHmS.net]
>>551
std::atomicとかあるね
原理的に競合が起きないやつ

562 名前:蟻人間 mailto:sage [2019/10/22(火) 17:29:01.30 ID:QN5InCe0.net]
まずは記憶媒体の性能を計測してみた。
https://github.com/katahiromz/YappyCam/blob/master/tests/diskrate/diskrate.cpp
https://twitter.com/katahiromz/status/1186558848393285633
これはSSDの場合だ。HDDでも同様に計測しないといけない。
(deleted an unsolicited ad)

563 名前:蟻人間 mailto:sage [2019/10/22(火) 17:43:23.84 ID:QN5InCe0.net]
static DWORD s_dwTick;
printf("write: %ld, %ld\n", cbToWrite, GetTickCount() - s_dwTick);
s_dwTick = GetTickCount();

// 最高の音質での出力。
write: 3900, 15
write: 3900, 0
write: 3900, 16
write: 3904, 16
write: 3900, 0

10msecごとに音声データがおよそ3900バイトあるようだ。

564 名前:デフォルトの名無しさん mailto:sage [2019/10/22(火) 18:28:33.04 ID:HSQTG8Jj.net]
>>558
Win32APIや音声仕様はC++じゃないのでよそでどうぞ。>蟻人間

565 名前:蟻人間 mailto:sage [2019/10/22(火) 19:41:50.02 ID:+0Lq2R8m.net]
>>553
具体的にどうやればいい?

566 名前:蟻人間 mailto:sage [2019/10/22(火) 20:08:29.90 ID:+0Lq2R8m.net]
【初心者歓迎】C/C++室 Ver.105【環境依存OK】
https://mevius.5ch.net/test/read.cgi/tech/1556142878/

こっちに移動します。回答者に感謝します。

567 名前:デフォルトの名無しさん mailto:sage [2019/10/22(火) 21:35:58.70 ID:SC+tqfVH.net]
Win32APIって何だよ
20年前からタイムスリップでもしてきたか?

568 名前: mailto:sage [2019/10/22(火) 21:43:35.88 ID:afWm6mlf.net]
>>562
win32api(64bit版)で書くのが正義、という価値観もまだまだ存在するようです

569 名前:デフォルトの名無しさん [2019/10/22(火) 23:33:30.81 ID:QUuuj0zF.net]
C++11からできた属性構文あるけどこの属性は宣言にだけつければOK?
定義にも同じ属性を記載するべき?

570 名前:デフォルトの名無しさん mailto:sage [2019/10/23(水) 00:34:15.61 ID:kAyiuXKe.net]
>>563
それはお前だけの価値観だろハゲ



571 名前:デフォルトの名無しさん mailto:sage [2019/10/23(水) 00:50:12.41 ID:/s0IRa9G.net]
>>563,565
Mozilla Firefoxなどサードパーティ大手は今もWin32APIをネイティブに使っており.NETを使ってない。

572 名前:はちみつ餃子 mailto:sage [2019/10/23(水) 01:51:47.45 ID:GER+FSVM.net]
>>562 は .NET より WinRT とかを想定している気がするが。

573 名前:デフォルトの名無しさん mailto:sage [2019/10/23(水) 02:03:48.66 ID:my1FePPi.net]
単に64bitのWindows APIもなぜかwin32と呼ばれ続けてること知らないんだろ

574 名前:デフォルトの名無しさん mailto:sage [2019/10/23(水) 06:28:47.24 ID:/lpUBik0.net]
それこそ20年前からタイムスリップしたのかって話だなw

575 名前:デフォルトの名無しさん mailto:sage [2019/10/23(水) 18:08:41.93 ID:bvZ5IXVl.net]
速度重視な場面ならWin32APIは今でも普通に使う

576 名前:デフォルトの名無しさん mailto:sage [2019/10/23(水) 20:43:18.87 ID:R0F6kh0V.net]
うわぁ・・・

577 名前:デフォルトの名無しさん [2019/10/23(水) 21:15:01.42 ID:kC3TvNwV.net]
正直なところWin32APIで速度でるの?

578 名前:デフォルトの名無しさん mailto:sage [2019/10/23(水) 21:30:55.10 ID:/s0IRa9G.net]
>>572
「Linuxシステムコールで速度でるの?」という質問と同じくらい矛盾に満ちた質問。
Win32APIも含めシステムコールはOSが提供するAPIなので、プログラマは他の手段で代替しようない。

579 名前:デフォルトの名無しさん mailto:sage [2019/10/23(水) 21:35:56.58 ID:H9cLmi0l.net]
Native APIがあるじゃろ

580 名前:デフォルトの名無しさん mailto:sage [2019/10/23(水) 22:12:26.70 ID:B7dtMHRy.net]
Visual C++ 2015なんですが、
goto文でERRORというラベルに飛ばそうとしたら、コンパイルエラーが出ました。
ERRにしたらコンパイルできるようになったんですが、
なぜERRORのラベルはダメなんでしょうか?



581 名前:蟻人間 mailto:sage [2019/10/23(水) 22:22:13.25 ID:bxABcYeD.net]
>>575
<wingdi.h>に#define ERROR 0がある。

582 名前:デフォルトの名無しさん mailto:sage [2019/10/23(水) 22:22:30.17 ID:R0F6kh0V.net]
#undef ERROR

583 名前:デフォルトの名無しさん mailto:sage [2019/10/23(水) 22:24:20.08 ID:H9cLmi0l.net]
単語1つのラベルなんか使うなってこった

584 名前:デフォルトの名無しさん mailto:sage [2019/10/23(水) 22:28:23.69 ID:R0F6kh0V.net]
いやC++ではマクロが悪だ

585 名前:575 mailto:sage [2019/10/23(水) 22:32:44.87 ID:B7dtMHRy.net]
ERRORのdefineがあるんですね・・・!
ありがとうございました!

586 名前:デフォルトの名無しさん mailto:sage [2019/10/24(木) 09:12:01.73 ID:m57JSwXI.net]
クソみたいなマクロにsmallもある
他にもwindows.hには地雷が入念に仕込まれてる

普通の神経の人間が爆死して厭らしい人間だけが生き残るように整えられている厭らしい環境がwindows.hだよ
マトモな人間にはまず耐えられない
頭のオカシイ厭らしい人間だけが残るように設計されているのがwindows.h
このヘッダは頭がおかしい

587 名前:デフォルトの名無しさん mailto:sage [2019/10/24(木) 13:45:08.38 ID:VURCQr2T.net]
>>581
お前の頭がおかしいだけだと思う

588 名前:デフォルトの名無しさん mailto:sage [2019/10/24(木) 13:57:45.03 ID:SfEmAS3k.net]
林檎だってcheckマクロでBoostに大迷惑かけてるしお互い様

589 名前:デフォルトの名無しさん mailto:sage [2019/10/24(木) 17:59:23.36 ID:0EVcBOG9.net]
>>582
そこは
ヘッダだけにな
と言ってやるところだろ

590 名前:デフォルトの名無しさん mailto:age [2019/10/24(木) 18:05:45.17 ID:pgieaG2c.net]
ヘッダ「嫌ならincludeするな」



591 名前:デフォルトの名無しさん mailto:sage [2019/10/24(木) 19:57:40.06 ID:WiWlXxwu.net]
このスレはみんなWindows嫌いなのかな

592 名前:デフォルトの名無しさん mailto:sage [2019/10/24(木) 20:17:56.94 ID:TRYJth0S.net]
んなわけない

593 名前:デフォルトの名無しさん mailto:sage [2019/10/24(木) 21:28:21.53 ID:hxYU3Lux.net]
たしかmaxとかもマクロ定義されてたよね
初心者のころはどハマリして殺意がわいたわ

594 名前:デフォルトの名無しさん mailto:sage [2019/10/24(木) 21:49:18.24 ID:omM/Gkq5.net]
いまはIDEが色変えてくれるからすぐわかるから別にいいけどね

595 名前:デフォルトの名無しさん mailto:sage [2019/10/24(木) 23:20:19.58 ID:M5uvwdA8.net]
マクロがあればなんでもできる

596 名前:デフォルトの名無しさん mailto:sage [2019/10/24(木) 23:40:29.47 ID:PIyGP0m1.net]
最近ちょいちょい思うことだが、ある言語のここがどうであーだこうだと議論する場合
テキストエディタでコーディング作業してる連中と IDE でコーディング作業してる連中では
わりと大きな認識の違いがあることが多い

597 名前:デフォルトの名無しさん mailto:sage [2019/10/24(木) 23:44:34.75 ID:8Fri6DgZ.net]
windows.hのマクロ回りでトラブル起こしているのは、殆んどvisual studio使用者だと思うのだが

598 名前:デフォルトの名無しさん mailto:sage [2019/10/25(金) 00:24:04.41 ID:AZBzSxe6.net]
認識の違いはコンパイラによるものであってコードエディタは関係ない。

599 名前:デフォルトの名無しさん mailto:sage [2019/10/25(金) 00:39:26.61 ID:ghRRxqDU.net]
モジュールでマクロとか気にしなくて良くなる(なるといいなぁ...)

600 名前:デフォルトの名無しさん mailto:sage [2019/10/25(金) 07:52:28.01 ID:51G3P59H.net]
コンパイラ変えてもマクロは変わらんでしょ
せいぜいエラーメッセージ変わるぐらいじゃ



601 名前:デフォルトの名無しさん mailto:sage [2019/10/25(金) 09:14:30.39 ID:AZBzSxe6.net]
>>595
何言ってるのか意味がわかりにくいエラーメッセージを吐くのはコンパイラでしょ。

602 名前:デフォルトの名無しさん mailto:sage [2019/10/25(金) 12:19:38.16 ID:51G3P59H.net]
マクロは影響範囲わからんからなんとも

vcでマクロがテンプレートに影響したらマジでわからん
clangはテンプレートのエラーメッセージわかりやすいとかみたな

603 名前:デフォルトの名無しさん mailto:sage [2019/10/25(金) 12:45:17.61 ID:yKAgzXLG.net]
>>593
お前はまず日本語を正しく認識できるようになれよ…
>>591は連中(=人間)の認識の話な

604 名前:デフォルトの名無しさん [2019/10/25(金) 17:33:51.00 ID:AZBzSxe6.net]
初心者であればあるほど親切なエラーメッセージが必要なのだけど、VCのエラーメッセージはgccに比べて不親切な印象がある。
STL関連のエラーメッセージは、わかりにくい代表格。かたやgccはprintf系の書式ミスを指摘してくれるなど初心者に優しい。

605 名前:デフォルトの名無しさん [2019/10/25(金) 18:03:22.82 ID:AZBzSxe6.net]
C#が使いやすいと思っている人は、Visual Studioの入力補完に救われていることに気づいていない。
Visual Studioがなければヘッダーファイル相当のgrep検索もままならない不便な言語であると感じるだろう。

606 名前:デフォルトの名無しさん mailto:sage [2019/10/25(金) 18:50:41.74 ID:StYWqeWG.net]
VS込みでいいじゃん
どうせC#なんて大半がWindows向けなんだしVS使える環境で開発してるでしょ

って変なこと言うと思ったらADSLか

607 名前:デフォルトの名無しさん mailto:sage [2019/10/25(金) 19:00:26.80 ID:r/2esNbS.net]
referencesource.microsoft.comみたいなありがたいものがあるのに

608 名前:デフォルトの名無しさん mailto:sage [2019/10/25(金) 19:58:41.60 ID:q2iK2L4t.net]
基本的には MSDN こそ C++ である。

609 名前:デフォルトの名無しさん mailto:sage [2019/10/26(土) 00:56:44.62 ID:7AoWPXY8.net]
class A{};

namespace N
{
class B{
friend class A;
int i;
};

class A{
A(){b.i = 0;}
B b;
};
};

これをコンパイルできるようにするにはどうすればいいですか?

・クラスAを名前空間Nの下に書く
・名前空間NのクラスAを別の名前にする
・最初のクラスAを別の名前にする

これ以外でできますか?

610 名前:デフォルトの名無しさん mailto:sage [2019/10/26(土) 00:59:53.57 ID:SyjizfQh.net]
全部消す



611 名前:デフォルトの名無しさん mailto:sage [2019/10/26(土) 01:35:09.91 ID:dcsgYCXg.net]
>>604
「コンパイルできるようにする」
というだけであれば、何も修正しない元のままでもコンパイルできるはずだし、
最初の class A {} の行をコメントアウトする、消す。
Nの中のAを消す、namespace N {・・・} の部分を全部消す、
などなどいくらでも有りえる。

612 名前:デフォルトの名無しさん mailto:sage [2019/10/26(土) 06:20:26 ID:3CUGZWDU.net]
BのfriendをN::AにしたいってことであればNとBの間にclass A;とAの宣言を入れる
これ以上のエスパーは無理

613 名前:デフォルトの名無しさん mailto:sage [2019/10/26(土) 08:16:08.08 ID:kGqH5EJJ.net]
>>604
g++だと、現状のままでok
vs2019は、friend宣言の対象が::AになっていてC2248
::Aをコメントアウトするとok

正しいのはg++
N4713 6.4.1. Unqualified name lookup (7.4)
Note: When looking for a prior declaration of a class or function
introduced by a friend declaration, scopes outside of the innermost
enclosing namespace scope are not considered; see 10.3.1.2.

614 名前:デフォルトの名無しさん mailto:sage [2019/10/26(土) 21:50:06.24 ID:JNlbd3QN.net]
投稿テスト

N3337 3.4.1 Unqualified name lookup
Note: When looking for a prior declaration of a class or function
introduced by a friend declaration, scopes outside of the innermost
enclosing namespace scope are not considered; see 7.3.1.2.

615 名前:デフォルトの名無しさん mailto:sage [2019/10/26(土) 22:03:59.61 ID:JNlbd3QN.net]
vs2019で::Aをコメントアウトするとokの意味がわからんorz

616 名前:デフォルトの名無しさん mailto:sage [2019/10/27(日) 08:17:56.25 ID:/F19lavA.net]
試してないが、理論上はこれでいけるはず :
namespace N
{
class A;
class B{
int i;
friend class A;
};

class A{
B b;
A(){b.i = 0;}
};
};

617 名前:デフォルトの名無しさん mailto:sage [2019/10/27(日) 08:27:09.91 ID:C3DsRDjK.net]
N::Aを前方宣言するなら、宣言を名前空間Nの中に入れるかN::Aで宣言する必要があるってのはC++の規約通りじゃないのか?
>>608が意味わからん

618 名前:デフォルトの名無しさん mailto:sage [2019/10/27(日) 09:08:16.09 ID:M7FyKfzv.net]
friend宣言は、当該宣言を含むクラスが属するスコープを対象とし
なおかつ、対象スコープに識別子を導入しない

class G
{
friend class A; //::A
};

namespace H
{
class I
{
friend class A; //H::A
};
}

619 名前:デフォルトの名無しさん mailto:sage [2019/10/27(日) 12:21:23.69 ID:C3DsRDjK.net]
>>604はfriend宣言ではなく前方宣言の問題なんだが?

620 名前:デフォルトの名無しさん mailto:sage [2019/10/27(日) 14:03:45.40 ID:M7FyKfzv.net]
いや前方宣言は関係ない
「もし」::Aがあったら、H::Aがあったら
と言っているだけのものだ



621 名前:デフォルトの名無しさん mailto:sage [2019/10/27(日) 14:25:39.88 ID:vcUKQgsd.net]
>>614
前方参照をfriendがどう解釈するかの問題だろ

622 名前:デフォルトの名無しさん mailto:sage [2019/10/27(日) 15:28:12.27 ID:itfBjV2c.net]
>>616なのは明白だが
>>604のコードのどこにコメントアウトすべき::Aがあるのかわからん…

ひょっとして、>>604が禁じていないのを良いことに、
最も外側のclass A{};を丸ごとコメントアウトしようとしている?

623 名前:デフォルトの名無しさん mailto:sage [2019/10/27(日) 15:53:16.22 ID:ho9vIROt.net]
>>617
???
>>608はVisual Studio 2019(2017でも同じだったが)の話だと言うことは理解できてるか?

624 名前:デフォルトの名無しさん mailto:sage [2019/10/27(日) 15:56:22.52 ID:M7FyKfzv.net]
>>617
そのとおりだが?

//class A{};

namespace N
{
class B{
friend class A;
int i;
};

class A{
A(){b.i = 0;}
B b;
};
};

friend宣言が識別子を導入したり
関係ないはずのグローバルに干渉するなど
vcはfriendにクセがある

625 名前:デフォルトの名無しさん mailto:sage [2019/10/27(日) 16:07:13.81 ID:6193c9It.net]
規格的にはどうなるのが正しいの?
むしろ、もとの話がどうしたいのかに依る気がしないでもない

626 名前:デフォルトの名無しさん mailto:sage [2019/10/27(日) 16:13:20.11 ID:rrcAfXPk.net]
>>620
規格の話は>>608じゃねーの?
コンパイルできるようにするにはg++にするかVisual Studioなら>>619みたいにするってことでしょ
それ以外なら環境を提示してねってことかと

627 名前:デフォルトの名無しさん mailto:sage [2019/10/27(日) 16:22:22.30 ID:itfBjV2c.net]
>Visual Studioなら>>619みたいにするってことでしょ
https://festy.jp/wp-content/uploads/festy/2015/12/25/06/51/40/917/1448191295053.jpg

>>604
>・最初のクラスAを別の名前にする
と何が違うんだそれ

628 名前:デフォルトの名無しさん mailto:sage [2019/10/27(日) 16:55:17.47 ID:rrcAfXPk.net]
>>622
一緒だよ
だからそれができないならg++(とか他のちゃんと規格準拠して処理系)にしろって書いてあるだ
まあVisual Studioが規格準拠するのを待つとかMSにねじ込むか金払って対応してもらうとかでもいいけどw

629 名前:デフォルトの名無しさん mailto:sage [2019/10/27(日) 20:50:09.77 ID:5FCyBaq0.net]
トンチンカンな質問かもしれませんが許して。

<Base>のコンテナを巡回しながら
Base派生の多態性を引数で実現、みたいなことがやりたいのです。
https://ideone.com/PA26HG

これのManager::update()が、このままだと当然
func(shared_ptr<Base>,shared_ptr<Base>)を呼ぼうとしてしまう訳ですが

宣言してあるfunc(A,A)とかfunc(A,B)とかfunc(B,B)とかが
呼ばれるようにするにはどうしたらいいですかね?
あるいは、ガラっとコード変わってもだいたい似たようなことを実現するとしたら
どう書きますか?

630 名前:デフォルトの名無しさん mailto:sage [2019/10/27(日) 20:52:12.38 ID:oi2VB0wA.net]
シェアポの配列を作って添え字で切り替え。



631 名前:デフォルトの名無しさん mailto:sage [2019/10/27(日) 20:54:15.22 ID:oi2VB0wA.net]
あ、すまん。誤読していた。
>>宣言してあるfunc(A,A)とかfunc(A,B)とかfunc(B,B)とか
多態やってる意味を潰しに来てないか?

632 名前:蟻人間 mailto:age [2019/10/27(日) 20:54:19.69 ID:irXhIBVc.net]
>>624
funcを仮想化すれば?

633 名前:蟻人間 mailto:age [2019/10/27(日) 20:59:49.33 ID:cNZwDfUU.net]
もしくはfuncでは仮想化された関数しか使わないとか。

634 名前:デフォルトの名無しさん mailto:sage [2019/10/27(日) 21:09:28.45 ID:aWGByvYb.net]
>>624
visitorパターン

635 名前:642 mailto:sage [2019/10/27(日) 21:09:54.33 ID:5FCyBaq0.net]
>>627
func(Base,Base)だけをvirtualってこと…ですよね?
え、こういうときにもvirtualて使えるの?と思って試したけどダメですね。

>>628
もうちょっと考えてみますけどたぶん難しいです

636 名前:624 mailto:sage [2019/10/27(日) 21:14:40.36 ID:5FCyBaq0.net]
名前欄間違えてた…

>>629
あー…それかも
なんとなく知ってるだけで
まだ実装したことはないですが

それ正解かもしれません
調べつつやってみます

637 名前:デフォルトの名無しさん mailto:sage [2019/10/27(日) 21:34:36.36 ID:4WtkkchW.net]
>>624
愚直に dynamic_cast で N*N 分岐からはじめたら?

638 名前:デフォルトの名無しさん mailto:sage [2019/10/27(日) 22:12:39.30 ID:5au4GxkL.net]
2引数ならdouble dispatchとか

639 名前:デフォルトの名無しさん mailto:sage [2019/10/27(日) 22:14:23.71 ID:SYtHJPpD.net]
派生クラスの種類が決まっているなら
variantに置き換えたらvisit使えるから簡単

640 名前:デフォルトの名無しさん mailto:sage [2019/10/28(月) 05:15:43.29 ID:VJWcm+Z+.net]
>>624
こうゆうことやのうて?
https://ideone.com/BoNrnP



641 名前:デフォルトの名無しさん [2019/10/29(火) 01:15:36.46 ID:Vnr+WSpj.net]
C++でCOM扱うの苦痛すぎる
何が正攻法なのかさっぱりわからん

642 名前:蟻人間 mailto:sage [2019/10/29(火) 01:32:18.86 ID:CdNgVa0z.net]
>>636
ATL
CComPtr

643 名前:デフォルトの名無しさん [2019/10/29(火) 01:41:40.05 ID:Vnr+WSpj.net]
別にCOMは作るんじゃないんだよ。
参照するだけなんだよ。
それでもATLなんーーーーーーーーー?

644 名前:デフォルトの名無しさん [2019/10/29(火) 01:43:16.61 ID:Vnr+WSpj.net]
そもそも文字コードどうなってるんやーーーー
コマンドプロンプトに出す時、どうするんやーー
現在のchcpの設定に従って変換線といかんのカーーーーーー

645 名前:蟻人間 mailto:sage [2019/10/29(火) 02:28:13.51 ID:OOQqvLIR.net]
変換なんてWideCharToMultiByte使って一つ変換関数作ってその関数を使い回せばいいやん。

646 名前:デフォルトの名無しさん mailto:sage [2019/10/29(火) 02:42:32.11 ID:/DWax9vx.net]
WriteConsoleW

647 名前:デフォルトの名無しさん [2019/10/29(火) 04:01:15.69 ID:ymnLB/52.net]
>>640
Unicode文字列(絵文字とか)が文字化けするんだよー!
フォントの問題でないことは確認済み

648 名前:デフォルトの名無しさん [2019/10/29(火) 04:07:41.50 ID:ymnLB/52.net]
例えばググって見つけた、こことか
www.t-net.ne.jp/~cyfis/win_api/sdk/WideCharToMultiByte.html

wchar_t を const wchar_t にするのはまあいいとして、
日本語はOKだけど絵文字とか化けるじゃねーか
わーけわかねなんdfっrね;jk

649 名前:デフォルトの名無しさん [2019/10/29(火) 04:13:15.89 ID:ymnLB/52.net]
ん?WideCharToMultiByteってShiftJISに戻すやつじゃねーのか?
俺はUnicode文字すべてを表示したいだけだぞ

650 名前:デフォルトの名無しさん mailto:sage [2019/10/29(火) 04:20:56.50 ID:xS90z6YC.net]
chcpくらい使えよ



651 名前:デフォルトの名無しさん mailto:sage [2019/10/29(火) 04:26:03.90 ID:/DWax9vx.net]
windowsのコマンドプロンプトはまだ絵文字とかに対応してないよ

652 名前:デフォルトの名無しさん mailto:sage [2019/10/29(火) 04:29:31.79 ID:YQKoC2Uo.net]
>>646
全てではないだろうけど対応してる。

↑文字化けしそうだけど、横向きのハートとか
❤ とか

653 名前:デフォルトの名無しさん mailto:sage [2019/10/29(火) 04:29:44.12 ID:YQKoC2Uo.net]
お、文字化けしなかったw

654 名前:デフォルトの名無しさん [2019/10/29(火) 04:30:10.10 ID:YQKoC2Uo.net]
?????
Jane経由だとだめだろうな

655 名前:デフォルトの名無しさん [2019/10/29(火) 04:31:42.98 ID:YQKoC2Uo.net]
>>645
chcp 65001にしてもムダだったぞ

656 名前:デフォルトの名無しさん mailto:sage [2019/10/29(火) 04:54:41.95 ID:pnjVF+Pb.net]
コマンドプロンプトよりJaneは早く絵文字に対応しろ

657 名前:デフォルトの名無しさん mailto:sage [2019/10/29(火) 05:06:04.44 ID:xS90z6YC.net]
>>650
それutf8じゃねーか

658 名前:デフォルトの名無しさん [2019/10/29(火) 05:14:54.35 ID:YQKoC2Uo.net]
>>652
ぐぐってからいえwww

659 名前:デフォルトの名無しさん [2019/10/29(火) 05:19:50.17 ID:YQKoC2Uo.net]
なんでコードページ932なのに、NSimSunにすると
日本語以外もちゃんと表示できるのかわからない

660 名前:デフォルトの名無しさん mailto:sage [2019/10/29(火) 05:26:40.69 ID:xS90z6YC.net]
wcharがutf8なのか?あほか?



661 名前:デフォルトの名無しさん [2019/10/29(火) 05:36:55.26 ID:YQKoC2Uo.net]
Visual StudioのソースコードのデフォルトはBOM付きUTF8なんだな

662 名前:デフォルトの名無しさん [2019/10/29(火) 06:38:53.94 ID:d5obkYRE.net]
Windows依存の話は、以下すれでどうぞ。

Win32API質問箱 Build125
https://mevius.5ch.net/test/read.cgi/tech/1551247748/

663 名前:デフォルトの名無しさん mailto:sage [2019/10/29(火) 12:08:17.89 ID:HlsBbRfa.net]
自分の理解と違ってたので教えてください。

class hoge{
hoge(){}
hoge(const hoge& h){}
~hoge(){}
}

hoge func(){
hoge h;
return h;
}

main(){

hoge h = func();

}


この時、引数なしコンストラクタとコピーコンストラクタ、デストラクタが2回呼ばれると理解してたんだけど、実際動かすとコンストラクタとデストラクタが1回づつしか呼ばれない。
理由ってなんですか?

ちなみにgccで、c++03、c++11でも同様の結果でした。

664 名前:はちみつ餃子 mailto:sage [2019/10/29(火) 12:09:55.91 ID:0JV7MfqT.net]
>>658

RVO でググって

665 名前:デフォルトの名無しさん mailto:sage [2019/10/29(火) 12:10:21.23 ID:gvGgQxyJ.net]
最適化で消された

666 名前:デフォルトの名無しさん mailto:sage [2019/10/29(火) 12:14:30.49 ID:HlsBbRfa.net]
>>659
まさにピンポイントでした。
ありがとうございます。

667 名前:デフォルトの名無しさん [2019/10/29(火) 13:58:53.43 ID:cpD/FVFn.net]
>>636
node.js

668 名前:はちみつ餃子 mailto:sage [2019/10/29(火) 13:59:57.20 ID:0JV7MfqT.net]
>>636
マイクロソフトのコンパイラならまあまあ補助があったりするでしょ。
それでも面倒くさいことにかわりないけど。

669 名前:デフォルトの名無しさん mailto:sage [2019/10/29(火) 15:55:18.54 ID:VnX4qZP9.net]
失礼します。テストです:
ハート:❤
横向きハート:❥

670 名前:はちみつ餃子 mailto:sage [2019/10/29(火) 16:08:16.15 ID:0JV7MfqT.net]
>>664
失礼な奴だな!



671 名前:デフォルトの名無しさん mailto:sage [2019/10/29(火) 18:43:54.18 ID:NclFvQSb.net]
>>663
補助なんてあったっけ?
まあ俺の知識はもう5年以上前の知識だから最近はちょっとはマシになったのかな

672 名前:デフォルトの名無しさん [2019/10/29(火) 21:55:11.67 ID:daQRKG1l.net]
typedef const struct {
int i;
int j;
} X;

X arr[2] = {
{1,3},
{2,4}
};

int main() {
X *ptr = arr;
printf("%d %d %d <- always zero", ptr->i, (ptr+1)->i, (ptr-1)->i);
return 0;
}

グローバル const struct の配列のアドレスを上に行ったら、常に0が入ってるんだけど、
これは、どのハードウェアでもこうなると仕様と決まってるの?

673 名前:デフォルトの名無しさん mailto:sage [2019/10/29(火) 22:07:48.92 ID:VnX4qZP9.net]
>>667
決まってない。
範囲外のアクセスなので、本来は絶対にやってはいけない。
読むだけでも不法例外が起きてしまう可能性もあるが、
書くのはもっとダメ。
たまたま、コンパイラシステムが何らかの目的で使っている
グローバル変数が arr 配列の直前にい配置されていて、
それが0になっているか、padding領域がたまたまそこにある
だけだと考えられる。

674 名前:デフォルトの名無しさん mailto:sage [2019/10/29(火) 23:33:23.00 ID:B0gwdLKJ.net]
.bssは0初期化されてる

675 名前:デフォルトの名無しさん mailto:sage [2019/10/30(水) 04:47:43 ID:oMdYt0Tq.net]
オブジェクトがスタックに作られてるかヒープに作られてるかってどうやって調べるの

具体的にはboostのmulti_arrayがどっちに作られてるか知りたい

676 名前:デフォルトの名無しさん [2019/10/30(水) 06:54:34.02 ID:2wpdugOW.net]
>>668
そりゃそうか。0で埋まってりゃコードが少し短くなって助かるんだが、まあやめとこう。

677 名前:デフォルトの名無しさん mailto:sage [2019/10/30(水) 07:31:59.85 ID:yREk150+.net]
>>670
アドレスでわかる
正しくはリンカからロケーションを取得だが
簡易的には自動変数のアドレスと上の方の桁が同じかどうかでも見当はつく

678 名前:デフォルトの名無しさん mailto:sage [2019/10/30(水) 09:19:14.69 ID:C/RG5q83.net]
>>670
アドレスでも分かるが、それはスタック領域のアドレス範囲をマップファイル
やEXEヘッダなどから読み解かないといけないので、boostのソースを読むのが
一番楽。

もう一つは、
1. auto local変数でint a; printf( "%08X", &a );としたもの
2. global 変数で、int g_b; printf( "%08X", &g_b );としたもの
3.ヒープの先頭アドレスを調べるため、int *p_c = new int[16];
 printf( "%08X", p_c );としたもの

で表示されたアドレスと boost の multi_arrayのアドレスとを比較して、
上位アドレスが近いかどうかで判別できる。1,2,3のそれぞれはまとまった
領域のアドレスを使っているので、推定ではなく断定できる。

679 名前:デフォルトの名無しさん mailto:sage [2019/10/30(水) 09:33:17.69 ID:scNMtFri.net]
どう考えてもヒープだろ

680 名前:デフォルトの名無しさん mailto:sage [2019/10/30(水) 09:45:24.54 ID:vMK+Q7lg.net]
>>670
ローカルスコープだけがスタック。
newしたものはヒープ。



681 名前:デフォルトの名無しさん mailto:sage [2019/10/30(水) 11:38:54.67 ID:M6J6raPE.net]
コンテナの場合はスタックに置いたつもりでも、コンテナがデータ部分を内部でnewするとかそういう話だろ

682 名前:はちみつ餃子 mailto:sage [2019/10/30(水) 12:07:14.45 ID:qu4eF7c5.net]
>>667-668
仕様上は配列の範囲外を指すポインタを作るのさえも未定義。
たとえアクセスしなくても。
なので、 ptr-1 という式の時点で未定義動作になる。

ただし、アクセスしないなら配列の最後の要素より一個うしろを指すポインタを作るのは許される。
つまりこの例で言えば ptr+2 や &ptr[2] は有りだけど ptr[2] は駄目。

&ptr[2] は ptr[2] に対して & を付けているので一見すると途中で ptr[2] を評価しているように見えるけど、
・ ptr[2] は (*(ptr+2)) の構文糖である
・ * の結果に & を適用している場合には * も & も評価されず、両方とも取り除いたのと同じことになる
というルールの合わせ技によって &ptr[2] は ptr+2 と同じ意味になる。

ちなみに、配列ではないオブジェクトは要素が一個の配列と同じレイアウトを持つことは保証される。

683 名前:デフォルトの名無しさん mailto:sage [2019/10/30(水) 12:14:10.66 ID:pPHw66rS.net]
>>677
&*p を p とみなす特別ルールは C の規格にあるけど C++ には無かったりする。
もう10年以上審議中。 https://wg21.cmeerw.net/cwg/issue232

684 名前:デフォルトの名無しさん mailto:sage [2019/10/30(水) 12:21:16.92 ID:C/RG5q83.net]
>>677
>ちなみに、配列ではないオブジェクトは要素が一個の配列と同じレイアウトを持つこと>は保証される。

しかも、TYPE arr[N] の場合、それぞれの要素間隔であるところの
&arr[k] と &arr[k + 1] の差は、厳密に sizeof(TYPE)に一致する。
struct TXxx { BYTE a[3] }; のように中途半端な内容を持っている場合、
標準的には、sizeof(TXxx)は最後のpaddingまで含めた4になる。

その結果、古くからCの仕様書に載っている通り、
 &arr[k] = (TYPE *)(((BYTE *)arr) + sizeof(TYPE) * k)
の式が常に厳密に成り立つことが保証される。

685 名前:デフォルトの名無しさん mailto:sage [2019/10/30(水) 12:25:41.94 ID:C/RG5q83.net]
>>678
operator&(), operator*() をユーザーが定義した場合には、それに従うが、
定義しなかった場合、&*pX == pX が どんなポインタ pX についても
成り立つことは保証されるはず。

686 名前:デフォルトの名無しさん mailto:sage [2019/10/30(水) 13:28:14.72 ID:JDSjHFuf.net]
>>670
一般的なPC環境なら、
適当に用意した別の関数を呼び出して(multi_arrayのインスタンスがまだ有効で、インスタンス生成したスレッドと同一スレッドからなら、どこから呼び出してもよい)、
その関数のローカル変数のアドレスよりも&multi_array[0]の値のほうが大きければ、multi_arrayのデータ領域はスタックに確保されたと判断できるのでは

687 名前:デフォルトの名無しさん mailto:sage [2019/10/30(水) 13:38:23.28 ID:C/RG5q83.net]
>>681
自分も最初、同じような勘違いをしていたが、
シングルスレッドの場合に限定すれば、
スタックの構造からすれば、最初に確保したローカル変数のアドレスが、
そのごろのローカル変数のアドレスよりも必ず大きい。
そして、ヒープから確保したオブジェクトのアドレスは、必ずそれらよりも大きい。
なので、後から別の関数を呼び出す必要はない。
main()関数の中で最初に定義したローカル変数のアドレスが分かればそれで十分。

688 名前:デフォルトの名無しさん mailto:sage [2019/10/30(水) 13:39:27.23 ID:C/RG5q83.net]
>>682
誤:そのごろのローカル変数のアドレスよりも必ず大きい。
正:その後のローカル変数のアドレスよりも必ず大きい。

早い話が、スタックは、上下逆になっていることが味噌。

689 名前:デフォルトの名無しさん [2019/10/30(水) 16:43:27.90 ID:iACLsVPd.net]
0 埋め勝手に期待してると
Debug build と Release build の変化ではまるんじゃね

690 名前:デフォルトの名無しさん mailto:sage [2019/10/30(水) 18:21:24.13 ID:sLIKMMS8.net]
未定義動作に頼って幸せになった人間はいない



691 名前:デフォルトの名無しさん mailto:sage [2019/10/30(水) 18:25:45.90 ID:PFJwOjFS.net]
問題は未定義動作が多すぎることだ

692 名前:デフォルトの名無しさん mailto:sage [2019/10/30(水) 19:14:52.52 ID:NnKRxbK9.net]
>>682
> そして、ヒープから確保したオブジェクトのアドレスは、必ずそれらよりも大きい。
スタックエリアとヒープエリアの前後関係なんて決まってたっけ?

693 名前:デフォルトの名無しさん mailto:sage [2019/10/30(水) 19:53:22.92 ID:/8g3afGg.net]
c++なら暗黙に0で初期化するところでcだと死ぬ

694 名前:はちみつ餃子 mailto:sage [2019/10/30(水) 20:10:37.29 ID:qu4eF7c5.net]
Boehm GC にスタック・ヒープの範囲を判定する部分があったはず。

695 名前:デフォルトの名無しさん mailto:sage [2019/10/30(水) 20:42:33.17 ID:MNbPntdA.net]
>>682
ヒープから確保したアドレスがスタックより大きいっていうのはかなり特殊な環境では?

696 名前:デフォルトの名無しさん mailto:sage [2019/10/30(水) 20:46:40.08 ID:7FaQcqiv.net]
>>682
スタックとヒープのアドレスに前後関係の縛りなんかねえよ
互いに全く別個のデータ構造で相互に依存関係はない

697 名前:デフォルトの名無しさん mailto:sage [2019/10/30(水) 21:02:17.94 ID:xN/ut28D.net]
お前ら甘いぞ
ヒープから確保したメモリをスタックにすることもできるんやで
逆にいうとスタックの情報もとれる
pthread_attr_getstackな

698 名前:デフォルトの名無しさん mailto:sage [2019/10/30(水) 21:28:56.04 ID:KWwo/1iW.net]
https://ideone.com/Q4ek9R
デストラクタを後から書き換えるってできなかったっけ?

699 名前:デフォルトの名無しさん mailto:sage [2019/10/30(水) 21:37:47.50 ID:scNMtFri.net]
なんで出来ると思ったのか

700 名前:デフォルトの名無しさん mailto:sage [2019/10/30(水) 21:41:50.59 ID:/8g3afGg.net]
おまえらはなんですぐ破壊的なメモリアクセスしようとするんだよ。



701 名前:デフォルトの名無しさん mailto:sage [2019/10/30(水) 21:44:55.49 ID:KWwo/1iW.net]
>>694
なんでだろ・・・。
できなそうだな。さんきゅー。

702 名前:デフォルトの名無しさん mailto:sage [2019/10/30(水) 21:47:25.90 ID:M6J6raPE.net]
変にトリッキーなことをせず普通に書けば平和なのに

703 名前:デフォルトの名無しさん mailto:sage [2019/10/30(水) 21:51:21.63 ID:Z1e8Gfkt.net]
平和を求めるならc++使わないことだな

704 名前:デフォルトの名無しさん mailto:sage [2019/10/30(水) 21:56:38.45 ID:Z1e8Gfkt.net]
>>696
virtualでないと子のデストラクタは呼ばれないってのとごっちゃになってるとか?

705 名前:デフォルトの名無しさん mailto:sage [2019/10/30(水) 21:57:32.16 ID:/8g3afGg.net]
>>698
平和は求めるが性能も求めるから仕方なく使うのがc++だよ、馬鹿。

706 名前:デフォルトの名無しさん mailto:sage [2019/10/30(水) 22:07:52.76 ID:KWwo/1iW.net]
>>699
多分それだ。もやもや取れたわ。ありがとう。

707 名前:デフォルトの名無しさん mailto:sage [2019/10/30(水) 22:15:48.21 ID:Z1e8Gfkt.net]
>>700
お前moveだからコピーコストゼロ!カロリーゼロとか言ってるだろ

708 名前:デフォルトの名無しさん mailto:sage [2019/10/30(水) 22:18:45.46 ID:T2yRPHdv.net]
>>693
正直何をしたいのかさっぱりわからん

709 名前:デフォルトの名無しさん mailto:sage [2019/10/31(Thu) 00:30:04 ID:Mfb82uAb.net]
>>687
なるほど、想定していたのは、Windows環境限定だった。

710 名前:デフォルトの名無しさん mailto:sage [2019/10/31(Thu) 01:11:19 ID:Z73hoFPo.net]
>>679
> &arr[k] と &arr[k + 1] の差は、厳密に sizeof(TYPE)に一致する。
いや、 &arr[k + 1] - &arr[k] は 1 でしょ。

> その結果、古くからCの仕様書に載っている通り、
>  &arr[k] = (TYPE *)(((BYTE *)arr) + sizeof(TYPE) * k)
> の式が常に厳密に成り立つことが保証される。
少なくとも C++ の規格にもそんな保証は載ってないよ。
逆に、 TYPE が BYTE と一致するような場合を除いて、動作は未定義になると明記されてる。
https://timsong-cpp.github.io/cppwp/n4659/expr.add#6

たぶん C の規格にも無かったと思うんだけど、「Cの仕様書」って何のこと言ってるの?

>>680 も、規格で保証されると言ってるなら誤り。
特定の実装(特に C もサポートしてる実装)では保証されているとか、
保証されてないと困るという話ならそうなんだろうとは思うけど。



711 名前:デフォルトの名無しさん mailto:sage [2019/10/31(Thu) 07:54:20 ID:CWgnmwch.net]
保証は知らんけどアドレス計算だから1じゃなくてsizeofの値じゃないのそれ
あとだめならベクタで&v[x]みたいのも未定義になっちゃうけども

712 名前:はちみつ餃子 mailto:sage [2019/10/31(木) 12:29:41.78 ID:/W+zTx1p.net]
>>705
俺も仕様としての保証はないと思う。
C の規格を見て関連しそうな項目として

- ポインタを型変換して変換後のアライン (処理系定義) が正しければそれを元の型に再変換したものは変換前と等しい
- ポインタを別のポインタに型変換した後のアラインが正しくなければ未定義
- ポインタを文字を指すポインタに型変換した場合、オブジェクトの最も低位のアドレスを指す
- 文字を指すポインタに変換されたポインタは元のオブジェクトの大きさまで連続して増分すると
  そのオブジェクトの残りのバイトへのポインタを順次生成できる

(注:ここで言うポインタには関数ポインタを含まない)

という保証は見つけられたので

(((BYTE *)arr) + sizeof(TYPE) * k)

までは妥当な式と言えると思うんだけど、 (TYPE *) というキャストが出来る根拠は見つけられなかった。

713 名前:デフォルトの名無しさん mailto:sage [2019/10/31(木) 13:00:56.65 ID:Mfb82uAb.net]
>>707
C言語の基礎として、TYPE *ptr に対し、
 ptr + k == (TYPE *)(((BYTE *)ptr) + sizeof(TYPE) * k)
は保証されているはず。

714 名前:デフォルトの名無しさん mailto:sage [2019/10/31(木) 13:06:36.29 ID:iFqs222y.net]
×基礎
○妄想の中の理想世界・ご都合ワールド

715 名前:デフォルトの名無しさん mailto:sage [2019/10/31(木) 13:21:36.49 ID:Mfb82uAb.net]
https://en.cppreference.com/w/c/language/sizeof
1. sizeof( type ) Returns the size, in bytes, of the object representation of type

2. When applied to an operand that has structure or union type,
the result is the total number of bytes in such an object, including
internal and trailing padding. The trailing padding is such that
if the object were an element of an array, the alignment requirement
of the next element of this array would be satisfied, in other words,
sizeof(T) returns the size of an element of a T[] array.

3. Number of elements in any array a including VLA (since C99) may be
determined with the expression sizeof a / sizeof a[0]. Note that
if a has pointer type (such as after array-to-pointer conversion of
function parameter type adjustment), this expression would simply
divide the number of bytes in a pointer type by the number of bytes
in the pointed type.

https://en.cppreference.com/w/c/language/operator_arithmetic
10. If the pointer P points at an element of an array with index I, then
11. P+N and N+P are pointers that point at an element of the same array with index I+N.
12. P-N is a pointer that points at an element of the same array with index {tt|I-N}}.
20. If the pointer P1 points at an element of an array with index I (or one past the end)
and P2 points at an element of the same array with index J (or one past the end), then
P1-P2 has the value equal to J-I and the type ptrdiff_t (which is a signed integer type,
typically half as large as the size of the largest object that can be declared)

716 名前:デフォルトの名無しさん mailto:sage [2019/10/31(木) 13:43:36.78 ID:hGg8JwcT.net]
C++のヘッダファイルのクラス定義って、
privateまで定義しないといかんのが嫌だな。

privateだから内部に隠蔽されて、外部からは知らなくていい情報なのに
内部で使ってる型をヘッダファイルに書かなければいけないから、
それをincludeしてる方も、その型の存在を知ってしまう。

どうにかならんのかな?

717 名前:デフォルトの名無しさん [2019/10/31(木) 13:54:48.05 ID:Nmr38VJU.net]
ヘッダに描くのをやめればいい

718 名前:デフォルトの名無しさん mailto:sage [2019/10/31(木) 14:01:21.28 ID:Mfb82uAb.net]
>>710
「1.」によれば、sizeof(x)は、xのバイトサイズである。
「2.] によれば、xが構造体の場合、sizeof(x)には、構造体のメンバの間や
最後のpaddingのサイズまで含まれている。
「3.」によれば、TYPE a[N]; の場合、sizeof(a)/sizeof(a[0]) == N
が保証されている。a[0] の型は TYPE なので、これは、
sizeof(a)/sizeof(TYPE) == N
であることを示す。sizeof(a)とは、配列型a全体のサイズであるので、
これはつまり、a[k] のアドレスが、(a[0] のアドレス) + sizeof(TYPE) * k
であることを意味している。
よって、>>708 は正しい。

719 名前:デフォルトの名無しさん mailto:sage [2019/10/31(木) 14:04:09.17 ID:/uM4xbrd.net]
>>711
pimpl

720 名前:デフォルトの名無しさん mailto:sage [2019/10/31(木) 14:46:45.02 ID:Mfb82uAb.net]
>>705
>> &arr[k] と &arr[k + 1] の差は、厳密に sizeof(TYPE)に一致する。
>いや、 &arr[k + 1] - &arr[k] は 1 でしょ。
この場合の「差」とは、減算演算子 x - y の結果のことではなく、
アドレスの差のことです。丁寧に書けば、
「&arr[k] のアドレス値と &arr[k + 1] のアドレス値の差は、厳密に sizeof(TYPE)
 に一致する。」または、
「arr[k] のアドレスと arr[k + 1] のアドレスの差は、厳密に sizeof(TYPE)
 に一致する。」
となります。



721 名前:デフォルトの名無しさん mailto:sage [2019/10/31(木) 14:50:36.73 ID:Mfb82uAb.net]
>>691
言語仕様的には決まっていませんが、Win32で実験する場合、
最初の質問者が、答えを見つける手段としては、正しいやり方なのです。
Win32で実験してヒープからの確保なのかどうか判明してしまえば、同じ
boostのソースを他の環境で動かしても、#ifdef などで動作が変えられていない
限りは、同じ結果となるからです。

722 名前:はちみつ餃子 mailto:sage [2019/10/31(木) 14:53:56.72 ID:/W+zTx1p.net]
>>713
アドレスがどうこうじゃなくてキャストが許されるかっていう話なんだけど。

723 名前:デフォルトの名無しさん mailto:sage [2019/10/31(木) 15:27:23.28 ID:CWgnmwch.net]
ポインタのキャストてポインタが指してるアドレスのデータの解釈だけの問題だから許されないキャストがそもそもないのでは
適切かどうかは知ったことではないが

というか配列のデータが連続していれば当然のごとく成り立つ話じゃん
それは保証されてるわけだし

724 名前:デフォルトの名無しさん mailto:sage [2019/10/31(木) 16:06:33.06 ID:hGg8JwcT.net]
>>714
サンクス。集約を使えば行けるんかいなーとか雑に思っていたが、
そういうイディオムがあるんだな!

725 名前:デフォルトの名無しさん mailto:sage [2019/10/31(木) 16:29:14.27 ID:Mfb82uAb.net]
>>718
構造体型へのポインタ同士については、単なる解釈し直しではなく、
アドレスの加減算を伴うことがあります。
しかし、BYTE型へのポインタから構造体型へのポインタへのキャストに
ついては、解釈のし直ししか、コンパイルのしようがなく、その場合に
ついては、ポインタの指すオブジェクトがマシン後レベルで同じアドレス
を持つことになります。ただし、厳密な仕様は知りません。

726 名前:はちみつ餃子 mailto:sage [2019/10/31(木) 16:32:02.98 ID:/W+zTx1p.net]
pimpl ってプライベートなメンバを隠したいだけのために導入するのは面倒くさ過ぎない?
手間かけてでもやりたいって場面もあるのかもしれんが、どうにも割に合う気がしない。

727 名前:デフォルトの名無しさん mailto:sage [2019/10/31(木) 17:07:47.69 ID:NdDnFbFX.net]
どうしても実装を隠さないと発狂する人が使う

728 名前:デフォルトの名無しさん mailto:sage [2019/10/31(木) 17:11:39.47 ID:M7zdaumA.net]
unique_ptrで作ればそれだけで勝手にmovableなクラスになって便利だよpimpl

729 名前:デフォルトの名無しさん mailto:sage [2019/10/31(木) 17:17:39.90 ID:hGg8JwcT.net]
>>721
プライベートなメンバを隠すと言うよりも
依存関係を断ち切らせたかった。

hoge.h と hoge.cpp があって、
hoge.cpp から #include<hoge.h> してる

main.cpp があってHogeクラスを使うから、#include<hoge.h> してる。
この時、mainは、Hogeクラスだけを使ってることにしたい。

でも、hoge.cpp は private で Hage func(); メソッドを定義してる。
つまり hoge.cpp は #include<hage.h> をしている。

そうすると,mainは、Hogeクラスだけ使うつもりなのに
間接的に hage.h もインクルードしてしまって、Hageクラスのこと知ってることになる。


Hogeを知るとHageも知ってしまう
Hageを隠したかったんだよ!


言いたかったことはこれ

730 名前:デフォルトの名無しさん mailto:sage [2019/10/31(木) 17:29:24.06 ID:Mfb82uAb.net]
>>724
また髪の毛の話してる、などというと荒れそうなので決して言いません。



731 名前:はちみつ餃子 mailto:sage [2019/10/31(木) 17:52:49.82 ID:/W+zTx1p.net]
C++20 でモジュールの機能が入るとかいう話になってるから
それが成れば pimpl なんていらんようになると思うんだが、
実際のところモジュールの様子ってどうなの?ちゃんと入りそう?

732 名前:デフォルトの名無しさん mailto:sage [2019/10/31(木) 18:23:02.02 ID:ZttcTVl1.net]
無理。
テンプレートとの両立、オーバーヘッドの問題
どの視点でみてもくそなものしかできないことは明白。

こういうのに引っかかるバカが増えたよね。

733 名前:デフォルトの名無しさん mailto:sage [2019/10/31(木) 18:32:01.00 ID:gpc+5FVL.net]
>>721
そう思うのは複数人で規模のでかいもの作ってないから

734 名前:デフォルトの名無しさん mailto:sage [2019/10/31(木) 19:37:56.00 ID:/uM4xbrd.net]
pimplは開発規模は関係なくて、ライブラリの公開するヘッダでユーザーに関係ないものを隠すために使わないか?

735 名前:はちみつ餃子 mailto:sage [2019/10/31(木) 20:03:49.64 ID:/W+zTx1p.net]
>>729
それも pimpl の目的としてはあるんだけど、 >>724 が書いているように C++ だとファイルの依存関係が必要以上になることもある。
それをどうにかしたら make で差分ビルドしたときに走るタスクが少なくなるので
規模が大きいプログラムで pimpl を使うとビルドがだいぶん速くなるということはありうる。
規模が小さいと体感するほどの差が出ない。 割に合わない。
そういう意味では規模は関係ある。

736 名前:デフォルトの名無しさん mailto:sage [2019/10/31(木) 20:09:29.87 ID:jES25g+p.net]
個人的には、自分ひとりで作ってるプログラムは、高頻度で全ビルドに
かける癖が付いてしまってる。
こうしておくと、OSをSleepモードにしていて、誤って電源を切ってしまったような
時にIDEが管理しているプロジェクトのデータファイルの何かが壊れていても
気付なかった時や、プロジェクトのバックアップ処理の時のコピー操作の何らか
の間違いで何かがおかしくなってしまったようなときに変な不具合に悩まされなく
て済む。

737 名前:デフォルトの名無しさん mailto:sage [2019/10/31(木) 22:29:01.40 ID:GkSnEle2.net]
C++とオブジェクト指向をきちんと身につけてる人ばかりの環境ならいいんだけどね、pimpl
経験不足な人だと理解出来なさそう

738 名前:デフォルトの名無しさん mailto:sage [2019/10/31(木) 22:54:10.87 ID:/p/NkBNt.net]
使ってるうちにインターフェースを使った典型的な奴とそう変わらない事に気付く

739 名前:デフォルトの名無しさん mailto:sage [2019/10/31(木) 22:58:21.62 ID:KjvgkRuG.net]
継承使いたくないからpimplの方が好き

740 名前:デフォルトの名無しさん mailto:sage [2019/10/31(木) 23:14:49.56 ID:FGj4X+XO.net]
cpprefjpのサンプルの赤字の部分使い方合ってる?

https://cpprefjp.github.io/reference/memory/allocator_traits/select_on_container_copy_construction.html



741 名前:デフォルトの名無しさん mailto:sage [2019/10/31(木) 23:43:47.06 ID:/p/NkBNt.net]
確かに、select_on_container_copy_construction(other.alloc_)が正しいような気はする

742 名前:デフォルトの名無しさん [2019/11/01(金) 00:03:47.15 ID:8rUFWNXZ.net]
テンプレート活用のための最適化が全盛期の今 pimpl は時代遅れ。

743 名前:デフォルトの名無しさん mailto:sage [2019/11/01(金) 00:09:16.78 ID:rKg4WNgJ.net]
はいはい

744 名前:デフォルトの名無しさん mailto:sage [2019/11/01(金) 00:19:47.84 ID:TUcr0tQH.net]
pimplが時代遅れというのなら、それに代わる
依存する必要がない所を断ち切る方法を提示してくれ

745 名前:デフォルトの名無しさん [2019/11/01(金) 00:24:57.04 ID:8rUFWNXZ.net]
>>739
クラスの前方宣言。
テンプレートによるコンパイルエラー回避。

746 名前:デフォルトの名無しさん mailto:sage [2019/11/01(金) 01:06:00.24 ID:pNQbmHLO.net]
>>739
インターフェースと継承

747 名前:デフォルトの名無しさん mailto:sage [2019/11/01(金) 03:35:55 ID:TUcr0tQH.net]
>>740-741
どちらも型を書くので依存を断ち切れてない

748 名前:デフォルトの名無しさん mailto:sage [2019/11/01(金) 05:46:43 ID:xzGeRMKo.net]
pimplでも型を書くのに、何を言っているんだか
そんなに型を書くのが嫌なら、Cの不透明型でも使ってろ

749 名前:デフォルトの名無しさん mailto:sage [2019/11/01(金) 06:27:26.52 ID:62eq0k7o.net]
pimplの目的も方法も全く理解してないって白状したぞこいつ

750 名前:デフォルトの名無しさん mailto:sage [2019/11/01(金) 06:54:21 ID:vkO9vKkI.net]
>>739
目の前のパソコンを窓から投げ捨てます



751 名前:デフォルトの名無しさん mailto:sage [2019/11/01(金) 07:17:25.47 ID:luUnrp0t.net]
privateをどうしても隠蔽したいならpimpl使うのもやむを得ないのかも知らんけど、そんな事態になったこと無いからよくわからんな

752 名前:デフォルトの名無しさん mailto:sage [2019/11/01(金) 07:43:37.38 ID:62eq0k7o.net]
ライブラリ作る時にstd::unordered_mapとかメンバに使いたいと思わないもんなのか、よくわからんな
pimplで.cppに閉じ込めないとコンパイラやSTLのバージョン違いで壊れるんだけど

753 名前:デフォルトの名無しさん mailto:sage [2019/11/01(金) 07:44:21.36 ID:nMXewbQV.net]
>>739
自部屋に引き籠もって外界との依存を断ち切ります。

754 名前:デフォルトの名無しさん mailto:sage [2019/11/01(金) 07:58:26 ID:OvwU0XDV.net]
ライセンスに書いとけば良い
・プライベートは見ないで下さい。お触り禁止。

755 名前:デフォルトの名無しさん mailto:sage [2019/11/01(金) 08:11:36 ID:s5avmMq4.net]
ただ単に仕様と実装をすっきり分離できるというだけでも充分な動機になる

756 名前:デフォルトの名無しさん mailto:sage [2019/11/01(金) 08:20:42 ID:luUnrp0t.net]
>>747
> pimplで.cppに閉じ込めないとコンパイラやSTLのバージョン違いで壊れるんだけど
ん?どう言うこと?
なんかやり方間違えてね?

757 名前:デフォルトの名無しさん mailto:sage [2019/11/01(金) 08:22:07 ID:luUnrp0t.net]
>>750
private部分を見なきゃいいだけだろw
そもそも実装は.cppに書くんだし

758 名前:デフォルトの名無しさん mailto:sage [2019/11/01(金) 08:25:35 ID:StFJ+6Yp.net]
エディタが貧弱だったころの名残を未だに引き摺っている
仕様と実装を分離したらそれだけでファイルが倍に増えて管理が面倒になる
仕様はソースコードから逐次自動生成すればいい
なので昨今の言語はIDEに迎合していて、暗黙の大前提でIDEでの運用が見込まれている
それ単体で成り立つものでは無くなっている

759 名前:デフォルトの名無しさん mailto:sage [2019/11/01(金) 09:01:23 ID:DyENPU43.net]
因果関係を理解できない人ってプログラマ向いてない

760 名前:デフォルトの名無しさん mailto:sage [2019/11/01(金) 09:41:29 ID:Oq+eTBHB.net]
class Util() {
public:
  int aaa();
  std::string bbb();
private:
  MinorClass mc;
  MinorClass mc zzz();
}


こういうユーティリティクラスがあって便利だなーって思ったときに、
便利だと思うのはaaaメソッドとかbbbメソッドであって
内部で使ってるMinorClassとかどうでもいいねん

Utilクラスのインクルードファイルはインクルードしたいけど
MinorClassのインクルードファイルはインクルードしたくないねん
そんなもんインクルードしたらMinorClassが変更になっただけで
Utilクラス使ってるところも変更になるやろ?



761 名前:はちみつ餃子 mailto:sage [2019/11/01(金) 10:06:12.42 ID:ichmHmwx.net]
>>755
そこをわからんって言ってるやついないんだよ。
わかった上で変更になったらどんくらい問題なんや? 別にええやろ。 と言う場面の方が多いという話なんだよ。
pimpl が有用な場面があるっていう主張もわかるよ。 わかるけど、そういう場面に遭遇したことないなぁという話なんだよ。

762 名前:デフォルトの名無しさん mailto:sage [2019/11/01(金) 10:29:23.31 ID:9RAuu3bH.net]
>>755
それだけならMinorClassを前方宣言するだけでincludeいらない

763 名前:デフォルトの名無しさん mailto:sage [2019/11/01(金) 10:32:58.37 ID:XsK+HhVl.net]
>>757
MinorClassの実体をメンバにするなら前方宣言じゃだめ
ポインタなら前方宣言にできる

764 名前:デフォルトの名無しさん mailto:sage [2019/11/01(金) 10:33:41.18 ID:o99mOnqi.net]
Utilはあるライブラリの公開クラスです
MinorClassは標準ライブラリのテンプレートクラス(例えばstd::unordered_map<Hoge>)です
Aさんはとあるコンパイラver1.0でコンパイルしたライブラリのバイナリとヘッダーを配布しました(ソースは配ってない)
10年後にBさんがこのライブラリのバイナリを入手して使おうと思いました
その間にコンパイラの標準ライブラリも劇的な進化を遂げ、コンテナの内部構造に大幅な改良を加えて超高速化したと宣伝していました
Bさんはヘッダーをincludeしてコンパイラver8.0でビルドしました

さーて何が起こる?Utilがpimplだとどうなる?よくよく考えよう

765 名前:デフォルトの名無しさん mailto:sage [2019/11/01(金) 10:43:47.44 ID:9RAuu3bH.net]
>>758
そんなんかすまん
勘違いしてた

766 名前:デフォルトの名無しさん mailto:sage [2019/11/01(金) 11:01:10.12 ID:XsK+HhVl.net]
privateメンバをポインタ型にする手間や不都合とpImplの手間や管理コストのどっちを取るかだろうな
基本的には継承するクラス以外のincludeは排除できる
ヘッダ内部での外部ライブラリのincludeは可能な限り避けるべき

767 名前:はちみつ餃子 mailto:sage [2019/11/01(金) 11:10:39.87 ID:ichmHmwx.net]
>>760
オブジェクトを生成するには「大きさの情報」が必要だと覚えておくとわかりやすいと思う。
クラスの内容がわからないと大きさが確定しないから生成できないけど、ポインタの大きさはわかる。

768 名前:はちみつ餃子 mailto:sage [2019/11/01(金) 11:11:24.16 ID:ichmHmwx.net]
>>759
そういう状況があることはわかるよ。
でもそんなことしねーよって話なんだってば。

769 名前:デフォルトの名無しさん mailto:sage [2019/11/01(金) 13:00:57.84 ID:aQLx28Zt.net]
>>763
それお前個人がしたことないって言う経験談?
それとも他の代替手段を取るってこと?
先に言っておくと前者ならすっこんでろ

770 名前:はちみつ餃子 mailto:sage [2019/11/01(金) 13:23:21.41 ID:ichmHmwx.net]
>>764
俺がしたことないという経験談だが、
ここで pimpl が割に合わないと出ている意見は
そういう状況があんまりないという内容だということの説明でもある。

そういう状況で必要だってのはわかってるし、
そういう状況にあるなら使えばいいよ。
それはわかってるんだよ。
だからしつこく説明しないいよっていう話。



771 名前:はちみつ餃子 mailto:sage [2019/11/01(金) 13:29:29.85 ID:ichmHmwx.net]
要するに >>759 はまるで見当はずれのこと言ってんなぁという感想。

772 名前:デフォルトの名無しさん mailto:sage [2019/11/01(金) 14:32:22.73 ID:o99mOnqi.net]
単機能ライブラリ作って渡す仕事してる人にとっては日常なんで、検討外れとか抜かされても勝手なこと言ってんなあとしか
まあ、OSSしかやらないとか、最終の実行バイナリしか作らないとか、そもそも個人プレーで人にプログラム成果物渡したりしないとかなら、
pimplの価値わからんという気持ちになるのはしょうがないし、それが世界の全てだと思っちゃうのかもな

773 名前:はちみつ餃子 mailto:sage [2019/11/01(金) 14:59:10.92 ID:ichmHmwx.net]
>>767
それが全てといってるわけじゃなくて、
pimpl がどうしても必要! と言ってる人こそライブラリ販売の世界しか見てないという話をしてんの。

774 名前:はちみつ餃子 mailto:sage [2019/11/01(金) 15:01:01.21 ID:ichmHmwx.net]
いる場所ではいるし、いらない場所ではいらないという当たり前のことしか言ってないつもりなんだけど。

775 名前:デフォルトの名無しさん mailto:sage [2019/11/01(金) 15:04:22.58 ID:E92xj2lK.net]
全員知らないことの方が多いのに相手が自分の分野のことを知らないと無知扱いするのは草生える

776 名前:デフォルトの名無しさん mailto:sage [2019/11/01(金) 16:16:45.44 ID:luUnrp0t.net]
>>759
そもそもVer. 1.0でコンパイルしたクラスライブラリをVer. 8.0でコンパイルしたオブジェクトとリンクできるの?
10年間互換性保ってるC++コンパイラの名前教えてくれるかなw

777 名前:デフォルトの名無しさん mailto:sage [2019/11/01(金) 18:28:24.75 ID:5daK08GN.net]
動的リンクなら古いコンパイラでコンパイルしたライブラリが使えるかどうかはOSの互換性次第だろ

778 名前:デフォルトの名無しさん mailto:sage [2019/11/01(金) 18:36:37.94 ID:VMz8o48U.net]
>>766
一般的な現象よ
周回遅れのやつに絡まれたらキョトンとしちゃうやろ
今の餃子ちゃんがまさにそれよ
幼稚園児に絡まれたお兄さんみたいになっとる

779 名前:デフォルトの名無しさん mailto:sage [2019/11/01(金) 18:38:39.54 ID:OIX3BcSW.net]
あぁ、メモリーレイアウトでずっこけるやつか。

780 名前:デフォルトの名無しさん mailto:sage [2019/11/01(金) 19:03:19.99 ID:luUnrp0t.net]
>>772
マングリングって知ってるか?
そもそもC++のクラスライブラリを簡単に動的リンクできるOSってあるのか?w



781 名前:デフォルトの名無しさん [2019/11/01(金) 19:25:46.93 ID:4VV6x0Mu.net]
まんぐりがえし

782 名前:デフォルトの名無しさん mailto:sage [2019/11/01(金) 19:41:21.97 ID:N2gtvXpa.net]
comはクラスライブラリになるのかな
いろいろ面倒だけど

783 名前:デフォルトの名無しさん mailto:sage [2019/11/01(金) 19:44:45.43 ID:8Rp12Rb3.net]
念のため確認だけど、pimplの代替手段については把握されてる前提でOK?
site.oukasei.com/?p=148

784 名前:デフォルトの名無しさん mailto:sage [2019/11/01(金) 19:56:12.78 ID:o5qRV/vr.net]
リンク問題はABIの話だよな?
それはリンカのオプション次第じゃないのん?

785 名前:デフォルトの名無しさん mailto:sage [2019/11/01(金) 20:26:50.93 ID:luUnrp0t.net]
>>779
広い意味だとABI
リンカのオプションで前のバージョンに対応してるとかの例もあるけど10年前まで対応してる例とかあるのかな?

786 名前:デフォルトの名無しさん mailto:sage [2019/11/01(金) 20:51:10.72 ID:62eq0k7o.net]
>>778
結局、pimplのI/F用外側クラスを基底クラスに、implを派生クラスにするってだけでやってることはpimplと同じ
むしろ以下の点でより悪い
・I/F用のクラスと実装用のクラスに不必要な継承関係が導入されていらない複雑度が増える
・↑と同じことだが、実装用クラスがI/F用クラスと同じメンバ関数を実装することが強制される
・コンストラクタが使えず、独自のファクトリ関数の使い方を利用者に覚えさせる必要がある
・利用者に生ポが露出する。生ポを避けたい利用者は自分でunique_ptrなどで包まなければならない
・I/F用クラスを利用者が勝手実装して混入させることを許す

上に挙げたのはポリモさせたい場合はメリットでもあるんだが、ポリモを意図しない単独クラスに継承構造なんか入れるべきではない

787 名前:デフォルトの名無しさん mailto:sage [2019/11/01(金) 21:03:35.70 ID:gYA8Bkai.net]
いっそのことヘッダオンリーライブラリにしようぜ

788 名前:デフォルトの名無しさん mailto:sage [2019/11/01(金) 21:04:43.68 ID:tPmTFLHa.net]
>>766
検討はずれかどうかは意見が分かれるかもしれないけど、pimplには速度的な
オーバーヘッドが少しはあるのと、記述が分かりにくいような気がするので、
個人的にはまずは使うのを躊躇する。

ポインタのワンクッションを置いても速度的なオーバーヘッドが問題ない場合には、
単純なクラスへのポインタを使ってそのクラスの実装に依存しないようなコードを書く
ことはある。しかし、pimpleと言われているものよりずっと単純なもの。
pimplの定義もよく分からないので、それが全く同じものかどうかは分からない。

789 名前:デフォルトの名無しさん mailto:sage [2019/11/01(金) 21:10:39.48 ID:gbx33EDY.net]
>>752
目指す理想が違いすぎるやつとは話にならん

790 名前:デフォルトの名無しさん mailto:sage [2019/11/01(金) 21:13:24.24 ID:tPmTFLHa.net]
>>778
そういう風に、C++の抽象クラス(Javaではinterfaceと呼ばれるものと等価
だったはず)を使うと分かり易いですね。



791 名前:デフォルトの名無しさん mailto:sage [2019/11/01(金) 21:15:27.37 ID:N2gtvXpa.net]
実装方法もいろいろでメリットデメリットもいろいろやから好きなの使えばええねん

792 名前:デフォルトの名無しさん mailto:sage [2019/11/01(金) 21:18:26.92 ID:tPmTFLHa.net]
interface を使って、データメンバを隠したい場合は、new CXxxx にあたる部分を
どうやって実装するかの問題になるんですね。グローバル関数にしてしまう
方法もありますが、確か、デザインパターンの「Factoryパターン」というものが
それに該当したかもしれません。

793 名前:デフォルトの名無しさん mailto:sage [2019/11/01(金) 21:34:43.52 ID:aQLx28Zt.net]
>>768
依存切りたいならpimplと言ってるところに
依存気にしてないからpimpl不要っていってるのがお前
不要ならすっこんでろって

794 名前:デフォルトの名無しさん mailto:sage [2019/11/01(金) 22:03:59.28 ID:p6e3QfJv.net]
COM最強やな

795 名前:デフォルトの名無しさん mailto:sage [2019/11/01(金) 22:07:08.70 ID:tPmTFLHa.net]
>>789
めちゃくちゃ使いにくい。

796 名前:デフォルトの名無しさん mailto:sage [2019/11/01(金) 22:10:22.26 ID:U/a7Wx11.net]
>>784
目指す理想がpimpl?
確かに話にならんなw

797 名前:デフォルトの名無しさん mailto:sage [2019/11/01(金) 22:13:09.54 ID:U/a7Wx11.net]
>>790
ただ20年間I/F変えないようにするにはあの程度の手間は必要なわけで
まあもうちょいスマートにできるんじゃないかなって思うところは多々あるけど

798 名前:デフォルトの名無しさん mailto:sage [2019/11/01(金) 23:37:29.12 ID:NpcjLENm.net]
>>789-790

COMが使いづらいと言うか、C++とstdとSTLとWindows APIとCOMの流儀が
ごちゃまぜで、メモリの確保の仕方と文字列の扱いが混沌を極めてるw

799 名前:デフォルトの名無しさん mailto:sage [2019/11/01(金) 23:41:19.87 ID:NpcjLENm.net]
.NETは(特に起動の)遅ささえなければ、ずっと簡単だよな。
C#でもなんでもさ

0.5〜1秒クラスの起動速度の差が気になることやってるんで、
久々にC++使ってるけど大変すぎ

でもまあ20年ぐらい前に比べれば随分と楽になってるけど

800 名前:デフォルトの名無しさん mailto:sage [2019/11/02(土) 03:47:26.33 ID:dYVngRw/.net]
>>791
> 目指す理想がpimpl?

違うけど、おまえなんかに説明してもチンパンジーに因数分解を教えるようなものだ



801 名前:デフォルトの名無しさん mailto:sage [2019/11/02(土) 06:10:30.99 ID:QFHeQDAU.net]
std::filesystem はいいな。やっとまともに使えるものができたって感じ
C++17からって遅すぎだと思うが

802 名前:デフォルトの名無しさん mailto:sage [2019/11/02(土) 07:36:04.48 ID:esIitHWU.net]
>>795
単に馬鹿にされてることに気づけよw

803 名前:デフォルトの名無しさん mailto:sage [2019/11/02(土) 08:38:38.13 ID:dYVngRw/.net]
>>797
おまえがな

804 名前:デフォルトの名無しさん [2019/11/02(土) 08:48:08.81 ID:E6JKa4Vv.net]
文字コード周りの混沌ぶりに比べれば、文字列クラス乱立なぞ微々たるものよ。

805 名前:デフォルトの名無しさん mailto:sage [2019/11/02(土) 09:26:25.84 ID:esIitHWU.net]
>>798
まさかまだ気づいてないとか?w

806 名前:デフォルトの名無しさん [2019/11/02(土) 09:27:02.38 ID:s0WXD89V.net]
>>776
それだ!

807 名前:デフォルトの名無しさん mailto:sage [2019/11/02(土) 09:49:41.56 ID:smHgTNTv.net]
>>759
ver1.0とver8.0がライブラリの呼び出し規約レベルで違うならpimplでも静的にはリンクできないし、
ver1.0とver8.0がCRTレベルで違うならやっぱ静的にはリンクできないし、
ver1.0とver8.0がライブラリの呼び出し規約レベルで同じかつCRTレベルでも同じならpimplでなくとも静的にリンクできるし、

pimpl関係無くね?

808 名前:デフォルトの名無しさん mailto:sage [2019/11/02(土) 09:57:16.61 ID:l25LSbph.net]
ライブラリだとpimplというかvoid*にして、各種操作をc関数として公開
c++ではラップしたinterfaceクラスを提供って形だろ
実装側はc++の実装クラスにstatic_castして後はc++の世界で書く

pimplは中途半端だから使わない

809 名前:デフォルトの名無しさん mailto:sage [2019/11/02(土) 10:06:07.78 ID:egbBWGD9.net]
windowsのハンドルがそんなだね
中身どんぐらい変わってるんだろうか

810 名前:デフォルトの名無しさん mailto:sage [2019/11/02(土) 10:06:09.13 ID:smHgTNTv.net]
void*からC++クラスのポインタ型にstatic_castってできたっけ、



811 名前:デフォルトの名無しさん mailto:sage [2019/11/02(土) 10:12:48.91 ID:l25LSbph.net]
出来るよ
多態使いたかったらbase ptrとvoid*の相互変換をする

派生ptrからvoid*に直接変換すると危険

812 名前:デフォルトの名無しさん mailto:sage [2019/11/02(土) 10:18:39.64 ID:smHgTNTv.net]
>>806
安全性と危険性が反対くね?
void*が指すアドレスは構造体やクラスの境界に整列している保証が無いのでは…

>>804
WIN32の内部において、ハンドルが単なるindexでなくポインタとして使われているという根拠は?
確かに正体がvoid*だったりするが、ポインタだとしたらOS視点では
INVALID_HANDLE_VALUE判定が
難しくなるのであった、(一般論として

813 名前:デフォルトの名無しさん mailto:sage [2019/11/02(土) 10:20:03.47 ID:dYVngRw/.net]
>>800
だからおまえがな

814 名前:デフォルトの名無しさん mailto:sage [2019/11/02(土) 10:21:28.65 ID:dYVngRw/.net]
static_cast<void*>は最派生クラスにダウンキャストだね

815 名前:デフォルトの名無しさん mailto:sage [2019/11/02(土) 10:27:48.65 ID:egbBWGD9.net]
>>807
外見維持してることが重要なんであって中身でなにをどうしてようがはどうでもいいがな

816 名前:デフォルトの名無しさん mailto:sage [2019/11/02(土) 10:28:34.71 ID:smHgTNTv.net]
やべービルド通るわこれ
うちのコンパイラは壊れてるな…
int g_nSomeValue;
int main()
{
int* p = &g_nSomeValue;
int* q = static_cast<int*>(p);
printf("p=0x%p\n", q);

return 0;
}

817 名前:デフォルトの名無しさん mailto:sage [2019/11/02(土) 10:30:01.86 ID:smHgTNTv.net]


818 名前:りまつがえた、
誤: int* p = &g_nSomeValue;
正: void* p = &g_nSomeValue;
[]
[ここ壊れてます]

819 名前:デフォルトの名無しさん mailto:sage [2019/11/02(土) 10:39:33.14 ID:l25LSbph.net]
void*は型情報が完全に消えるから、
型が完全に一つだとわかっているならそのままstatic_castすればいい

多態だと派生型からvoid*に直接変換してしまうと、void*から戻す場合に基底ポインタには戻せる保証がない

820 名前:デフォルトの名無しさん mailto:sage [2019/11/02(土) 10:39:40.95 ID:RcR6NuMm.net]
>>802
依存している構造体のサイズやレイアウト変わったらアウトだろ



821 名前:デフォルトの名無しさん mailto:sage [2019/11/02(土) 10:45:21.22 ID:RcR6NuMm.net]
>>803
C++でラップしてる時点で中途半端なのはかわらない
むしろ手間増えてる

822 名前:デフォルトの名無しさん mailto:sage [2019/11/02(土) 10:46:18.05 ID:pWYzNK5/.net]
過去の遺産のCOMなんて使いにくいて横で話ししてるやろ
10年後の環境のことまで気にする必要ないんだよ
ばっさり捨ててその時代にあったものを作るべき
無理に資産転用とか互換性とか気にするからクソが生まれる

823 名前:デフォルトの名無しさん mailto:sage [2019/11/02(土) 10:47:10.74 ID:l25LSbph.net]
pimplで実装隠したところで、
引数に例えばstd::string使うだけでコンパイラバージョン変えたときの保証は無くなるしなぁ

824 名前:デフォルトの名無しさん mailto:sage [2019/11/02(土) 10:56:15.43 ID:vl/bFsjF.net]
要するに>>759は知ったかが無理矢理考えたアホストーリーと言うことでいいかな?w

825 名前:デフォルトの名無しさん mailto:sage [2019/11/02(土) 10:57:17.10 ID:vl/bFsjF.net]
>>808
ああ、もうそういう返ししかできないのか…
高い理想とか笑えるわw

826 名前:デフォルトの名無しさん mailto:sage [2019/11/02(土) 11:06:42.79 ID:smHgTNTv.net]
>>814
pimplだと構造体の実装はライブラリ側に完全隠蔽なのでその観点はおかしい
つかjコンパイラのバージョンも関係無い

827 名前:デフォルトの名無しさん mailto:sage [2019/11/02(土) 11:16:21.46 ID:smHgTNTv.net]
>pimplだと構造体の実装はライブラリ側に完全隠蔽なのでその観点はおかしい
何が言いたいのかというとライブラリ使用側がライブラリが依存する構造体メンバに直アクセスする前提なら
そんなライブラリはpimplにできんだろとゆーこと
つまりpimpl対非pimplの比較の想定が変
非pimpl条件のライブラリのインターフェース仕様だけ抽象度を下げて議論しても仕方が無い

828 名前:デフォルトの名無しさん mailto:sage [2019/11/02(土) 11:16:32.42 ID:EX+sUHBj.net]
>>816
そんなライブラリ誰が使いたがるんだよ

829 名前:デフォルトの名無しさん mailto:sage [2019/11/02(土) 11:23:46.22 ID:l25LSbph.net]
オープンソースやクローズドでも社内での話だったらソースごと提供すれば終わる話だし
社外提供なら多言語で使えるようにcのAPIを出すのが普通じゃないのか
その上で各言語用のラッパーも提供されるってのがありがちなパターン

830 名前:デフォルトの名無しさん mailto:sage [2019/11/02(土) 11:37:12.15 ID:pWYzNK5/.net]
>>822
現時点で有用なら使うでしょ
逆に10年前からメンテされてなくて現時点でも使われてるライブラリなんてある?
メンテされてるかよりその時代に即したものに乗り換えてくでしょ



831 名前:デフォルトの名無しさん mailto:sage [2019/11/02(土) 11:50:05.18 ID:EX+sUHBj.net]
いやメンテなり機能追加はしろよ
仕様がらっと変わるのわかってるもんなんて使いたくないわ
作り手も使う側めんどいだろ

832 名前:デフォルトの名無しさん [2019/11/02(土) 12:26:20.48 ID:DuRHh2CY.net]
D なぜ流行らなかったし
Go 突き抜けてる
Rust ちょっと意識高い系
Nim 有望
JULIA 話にならない

833 名前:デフォルトの名無しさん mailto:sage [2019/11/02(土) 12:50:14.99 ID:esIitHWU.net]
>>824
ライブラリじゃないけど例えばExcel2003とかまだCOM経由なら動かせるでしょ
COMの泥臭いインターフェースだから面倒だけどね

834 名前:デフォルトの名無しさん mailto:sage [2019/11/02(土) 12:54:19.41 ID:pWYzNK5/.net]
>>827
動かせるけどクソだよね?
だから新しいのつかうじゃん?
つうかoffice系は延々と互換性意識してメンテされ続けてるじゃん

835 名前:デフォルトの名無しさん mailto:sage [2019/11/02(土) 13:22:43.30 ID:esIitHWU.net]
>>828
俺が言ってるのはCOMの話な
Excelの話はケースバイケースだからなんとも言えんし俺には関係ないからどうでもいい

836 名前:デフォルトの名無しさん mailto:sage [2019/11/02(土) 13:28:52.76 ID:pWYzNK5/.net]
>>829
COMの中身詳しくないんだけど一切メンテされてないの?
今までwinは山ほど脆弱性をupdateしてるけど、そういう中にCOM周りの修正とかなかったの?
間違いなくあったと思うんだよね。
COMに限らず現状使えるMS産のもので10年間内部が未修正のものなんて多分存在しないんじゃない?
だから10年後のことだけなんて考慮する必要なくて将来に渡り有益ならどうせメンテされるし一時的なもので将来無益になるなら消え去るんだよ

837 名前:デフォルトの名無しさん mailto:sage [2019/11/02(土) 13:32:28.90 ID:pWYzNK5/.net]
>>829
なんか前後で俺の主張がずれてる感じで申し訳ない

838 名前:デフォルトの名無しさん mailto:sage [2019/11/02(土) 13:52:05.38 ID:esIitHWU.net]
>>830-831
インターフェースの話とインターフェースの先にあるライブラリとかCOMサーバーの話をごっちゃにしてないか?

839 名前:デフォルトの名無しさん mailto:sage [2019/11/02(土) 14:07:55.01 ID:RcR6NuMm.net]
>>821
勘違い甚だしい
ライブラリ使用者に無関係で見せたくないからpimplで隠すという話をしてる隠さなかったら無用にincludeが増えるし、最悪そのinclude先の仕様変更で互換がくずれる場合もあると

840 名前:デフォルトの名無しさん mailto:sage [2019/11/02(土) 14:12:10.51 ID:RcR6NuMm.net]
>>823
そう、それが結局いまだによくも悪くもベストプラクティス
わかってないやつ多いんだよ
いきってc++で自称モダンな設計で作り上げてあとで泣きながらcのインタフェース作るはめになる
たいてい機械的なラッパーではすまないからな



841 名前:デフォルトの名無しさん mailto:sage [2019/11/02(土) 14:34:01.62 ID:SXOl8GCi.net]
void*的な「ハンドル」を経由して操作するやーつ
C由来のインターフェースは強いな

842 名前:デフォルトの名無しさん mailto:sage [2019/11/02(土) 14:53:41.66 ID:QFHeQDAU.net]
>>827
> ライブラリじゃないけど例えばExcel2003とかまだCOM経由なら動かせるでしょ

Excelとか以前に、DirectXやシェル(エクスプローラー)そのものがCOMだから

843 名前:デフォルトの名無しさん mailto:sage [2019/11/02(土) 14:55:12.97 ID:QFHeQDAU.net]
>>832
そうそう。脆弱性の話はCOMじゃなくてDCOM。

もちろんCOMも脆弱性とは無関係ではないんだけど、
それはC++がバッファーオーバーフローと無関係ではないのと
同じようにCOMの設計自体の問題じゃない

844 名前:デフォルトの名無しさん mailto:sage [2019/11/02(土) 15:00:15.19 ID:4213U75y.net]
ComPtr使ってる?

845 名前:デフォルトの名無しさん mailto:sage [2019/11/02(土) 15:04:46.15 ID:i1zx37WV.net]
Essential COMの第1章で、C++からいかにしてCOMに至るか書いてあるけど、あの流れすごい好き

846 名前:デフォルトの名無しさん mailto:sage [2019/11/02(土) 15:07:11.40 ID:QFHeQDAU.net]
std::filesystem はようやくできたかって感じだが、環境変数でまたorz

なんでこう、使う道具がまともに作られてないんだろうな
C++はメモリ管理ばっかり気にしてる気がする。

847 名前:デフォルトの名無しさん mailto:sage [2019/11/02(土) 15:09:57.95 ID:esIitHWU.net]
>>836-837
> Excelとか以前に、DirectXやシェル(エクスプローラー)そのものがCOMだから
だからCOMとその先を区別してくれよ
COM自体は単なるインターフェース規約で実装は別
脆弱性とかは実装の不具合だから見つかり次第修正されてる
インターフェース規約も仕様バグとかありうるけどCOM自体の仕様バクは聞いたことない

848 名前:蟻人間 mailto:sage [2019/11/02(土) 15:13:34.66 ID:OyXmLdGY.net]
                   _
            .:⌒: 、  __ >: : : : : : :.   <
         |: : : :/´ : : : : : : : : : : : : :.     `゙  、 
       ‐.、/: : : : : : : : : : : : : : : : : : : i      
      У: : : : : : : : : : : : : : : : : : : : :/             \
     /: : : : : : : : : : : : ', : { : : : : : : :}         __   \  
.      j: : ;彡': : : : : : : : : ' : ', : : : : : リ       / : : : : : : . . \
     : : : : : : : : : : : : : : : }: :ト : : : : ′     /: : : : : : : : : : : ヽ '.
    : : : : : : : : : : : : : : :ノ :∧: : : : {       / : : : : : : : : : : : : : : v
.     i: : : : : : : : : : , ‐< >: :∧: : : :',  >‐:'―: : : : : : : : : : : : : : :.
.     | : : /⌒y:/   /: : : : : _ヽ: : /: ヽ: : : : : : : : : : : : : : : : : : :|
   八: : {   ^      {: : : Y´   ∨: : : x ― - . . __: : : : :__, : : : : }
      ー′        У: : j    {: : : ノ /: : : : : : : ̄: : : : : : イ
                 〈: : :/^     ー^ / : : : : : : : : : : : : : <
                ^彡        /: : :ヽ -‐=    ̄ ̄
                          {: : :ノ
                        ゞ´

849 名前:デフォルトの名無しさん mailto:sage [2019/11/02(土) 15:31:17.24 ID:QFHeQDAU.net]
>>841
俺に言うなよ。俺はCOMは使われてるとしか言ってない。
シェル(エクスプローラー)をCOMで操作できるという
基本的な機能の互換性をなくすとか考えられん。

850 名前:デフォルトの名無しさん mailto:sage [2019/11/02(土) 15:36:48.55 ID:16zH/LAn.net]
>>840
環境変数は昔から標準化されてるだろ。設定は微妙だけどデファクト標準関数があるし。



851 名前:デフォルトの名無しさん mailto:sage [2019/11/02(土) 15:56:49.53 ID:QFHeQDAU.net]
>>844
std::cout << なんとか("PATH");
のように一行でやる方法教えて
もちろん脆弱性などで非推奨と言われるようなやり方は禁止

俺はここまでできて「使える道具」だと思ってるよ

852 名前:デフォルトの名無しさん mailto:sage [2019/11/02(土) 16:32:02.24 ID:neC/7x9U.net]
>>843
だからCOMの話にその先であるエクスプローラの話を混ぜるなよ…
ところでExplorerってCOMで操作できたっけ?
Internet Explorerの話じゃないよね?

853 名前:デフォルトの名無しさん mailto:sage [2019/11/02(土) 16:32:29.90 ID:neC/7x9U.net]
>>845
なぜに一行縛りなの?

854 名前:デフォルトの名無しさん mailto:sage [2019/11/02(土) 16:50:16.72 ID:TAka4wsD.net]
OpenStack, Terraform でも、クレデンシャルなどの環境変数は、1つのファイルにまとめる

それでプログラム内で、os.environ[ 'OS_PASSWORD' ]
みたいに取得する

直接、設定ファイルに書いて、git に保存するのは禁止!

855 名前:デフォルトの名無しさん [2019/11/02(土) 17:09:24.74 ID:orbX83iK.net]
>>845
curl
env()

856 名前:デフォルトの名無しさん mailto:sage [2019/11/02(土) 18:41:30.33 ID:QFHeQDAU.net]
>>847
実現可能な最小の行数

(一行でできるようにすることは他の言語で実現されてることからも明らか)

857 名前:デフォルトの名無しさん mailto:sage [2019/11/02(土) 18:44:29.21 ID:QFHeQDAU.net]
ちなみにさっきオレオレで20行ぐらいの関数を書いて
一行で環境変数を取得できるようにしたよ。
でもこういうのは標準ライブラリで用意してあるべきもの

858 名前:デフォルトの名無しさん mailto:sage [2019/11/02(土) 18:44:52.66 ID:RcR6NuMm.net]
こいつアホだろ

859 名前:デフォルトの名無しさん mailto:sage [2019/11/02(土) 18:46:14.06 ID:neC/7x9U.net]
>>850
短ければ偉いとか思ってる?w

860 名前:デフォルトの名無しさん mailto:sage [2019/11/02(土) 18:48:21.60 ID:QFHeQDAU.net]
>>853
俺が思ってるかどうかじゃなくて、
お前が、こういう理由で短いのがいい or だめと
"お前の意見" を書け



861 名前:デフォルトの名無しさん mailto:sage [2019/11/02(土) 19:23:54.18 ID:neC/7x9U.net]
いや、お前がそう思ってるならいいんじゃね?w

862 名前:デフォルトの名無しさん mailto:sage [2019/11/02(土) 20:10:41.91 ID:QFHeQDAU.net]
ん?反対意見があるんじゃないのか?
ないんだね。

お前がなにか思ってるだけかよw

863 名前:デフォルトの名無しさん mailto:sage [2019/11/02(土) 20:16:14.52 ID:FTVoAoH0.net]
この手のバカでもたった20行で作れるんだろ
やっぱりC++は偉大じゃないか

864 名前:デフォルトの名無しさん mailto:sage [2019/11/02(土) 20:17:34.65 ID:QFHeQDAU.net]
車輪の再発明。ってか他の言語使ったほうがいいよ。

865 名前:デフォルトの名無しさん mailto:sage [2019/11/02(土) 20:28:57.58 ID:16zH/LAn.net]
>>845
だったらはじめから「僕はこうじゃなきゃヤなんだー」って言ってくれないと何も伝わらないぞ

866 名前:デフォルトの名無しさん mailto:sage [2019/11/02(土) 20:32:42.04 ID:QFHeQDAU.net]
はじめから言ってる

> std::cout << なんとか("PATH");
> のように一行でやる方法教えて

867 名前:デフォルトの名無しさん mailto:sage [2019/11/02(土) 20:36:29.98 ID:dYVngRw/.net]
> 車輪の再発明

典型的なアイディアキラー! マジ死ねよ

ガタガタくだらねえこと言ってねえで
本能のままにやってみたいことに暴走しなきゃ
何もできちゃ来ねえんだよ

そういう生産物の上にあぐらかいて怠けているゴミ共にわかるわけねえ!

868 名前:デフォルトの名無しさん mailto:sage [2019/11/02(土) 20:42:10.52 ID:QFHeQDAU.net]
std::filesystemができたように、
std:envも作れってだけの話なのにね
何がそんなに気に触ったんだろう?

869 名前:デフォルトの名無しさん mailto:sage [2019/11/02(土) 20:49:43.64 ID:16zH/LAn.net]
>>860
はあ?845が初出じゃん

getenvでいいだろ。
未定義時のエラー処理まで自動でやってほしいのか?

870 名前:デフォルトの名無しさん mailto:sage [2019/11/02(土) 20:58:09.22 ID:wdMk8lAB.net]
一行じゃないとヤダとか条件を後出ししたからじゃね



871 名前:デフォルトの名無しさん mailto:sage [2019/11/02(土) 21:01:20.92 ID:dYVngRw/.net]
> 何がそんなに気に触ったんだろう?

とぼけてんなよ、はっきり書いてんだろ
車輪の再発明と貴様はほざいた
撤回も修正も今さらいらねえ

872 名前:デフォルトの名無しさん mailto:sage [2019/11/02(土) 21:08:11.55 ID:QFHeQDAU.net]
>>864
そんな下らないことで(笑)

一行とかそんなの重要なところじゃなく、
stdの名の元でまともなライブラリを作ってくれって話だよ
仮にも「標準」ライブラリなんだからさ

昔ながらのgetenvやその安全版はstd:stringが使われてないし、
std::getenvも、なぜかstd::stringではなくchar*が使われていて
使うとエラーとされるレベルの非推奨関数だし、当然ワイド文字版もないし
使おうと思った人なら、まともじゃないの意味ぐらいわかるはず

あ、使ったことない人が噛み付いてきたのかw


あと環境変数の未定義は正常な状態としてありえるのでエラーではない
細かくてすまんなw 適当な発言は気になるんだよ。

873 名前:デフォルトの名無しさん mailto:sage [2019/11/02(土) 21:09:21.56 ID:QFHeQDAU.net]
>>865
噛み付いてばかりじゃなくて、"自分の意見"を言うだけの
知識はあるのかい?

874 名前:デフォルトの名無しさん mailto:sage [2019/11/02(土) 21:11:47.48 ID:RcR6NuMm.net]
c++の標準ライブラリにプラットフォーム抽象の機能求めるってのは筋が悪いんだよ
filesystemだって結局はposixをテンプレートの味付けで焼き直した程度でファイルの監視もできないだろ
envとか別に標準で提供されなくても何も困ってない
1行かどうかなんてさらにどうでもいい
あと標準ライブラリが提供する範囲の機能で足りてるアプリ作ってるやつは
c++以外の言語使うことを考えた方がいい

875 名前:デフォルトの名無しさん mailto:sage [2019/11/02(土) 21:29:52.49 ID:neC/7x9U.net]
>>856
> お前がなにか思ってるだけかよw
うん、バカな縛りだなと思ってるw

876 名前:デフォルトの名無しさん mailto:sage [2019/11/02(土) 21:36:05.57 ID:lCdDFN2K.net]
組み込み系なんてenvどころかfilesystemとかそもそもねぇの普通な環境も多いしね

877 名前:デフォルトの名無しさん mailto:sage [2019/11/02(土) 21:56:35.34 ID:dYVngRw/.net]
>>867
本能の枯れた人生の搾りかすめ

878 名前:デフォルトの名無しさん mailto:sage [2019/11/02(土) 22:00:29.09 ID:jnnO2x8F.net]
ここは毎回しょうもないことで荒れるな
これだからC++界隈って嫌い

879 名前:デフォルトの名無しさん mailto:sage [2019/11/02(土) 22:07:02.10 ID:lY37zOLC.net]
まあもともと広いレンジで使われることを目的とした言語だし
いろんな輩が入ってくるのはしゃーない。
しかしc++11以降は明らかに開発してないクソガキが増えたなという印象はある。

880 名前:デフォルトの名無しさん mailto:sage [2019/11/02(土) 22:52:35.22 ID:egbBWGD9.net]
ないなら作りゃいいのに
なんのためプログラミングなんだろか



881 名前:デフォルトの名無しさん mailto:sage [2019/11/02(土) 22:57:03.69 ID:l25LSbph.net]
せっかくhas_includeみたいなのも出来たのだから、環境ごとに存在しない場合機能提供されないようなものも標準化進めていったらいいんだよね

882 名前:デフォルトの名無しさん mailto:sage [2019/11/02(土) 22:57:09.83 ID:oLFNuF1W.net]
2chのゴミスレ=C++界隈

883 名前:デフォルトの名無しさん mailto:sage [2019/11/02(土) 23:15:11.30 ID:FTVoAoH0.net]
>>876
そこに涌く小バエ

884 名前:デフォルトの名無しさん mailto:sage [2019/11/02(土) 23:38:30.50 ID:dJ3V2vrm.net]
>>876 >>877
場所そのものを馬鹿にするのはよくない。
それは差別や権威主義を生み易い。

885 名前:デフォルトの名無しさん mailto:sage [2019/11/03(日) 00:27:38.19 ID:wm/wPyZM.net]
>>875
一応フリースタンディング処理系っていう分類があるのでそれはもうされてる

886 名前: mailto:sage [2019/11/03(日) 21:55:47.13 ID:A1whpPq+.net]
>>732
一つ教えてください、pimpl とか何べん読み返しても「利益の源泉」がわからないのですが、一つ一言で言い切っていただけませんか?

887 名前: mailto:sage [2019/11/03(日) 21:58:20.86 ID:A1whpPq+.net]
>>775
>マングリングって知ってるか?
>そもそもC++のクラスライブラリを簡単にリンク

私は Java も ruby も触っていますが、お手軽に java のライブラリを c++ から使いたいと、ふつふつ、と、思っているのです…

888 名前:デフォルトの名無しさん mailto:sage [2019/11/04(月) 00:16:08.68 ID:J7PIJnTc.net]
>>880 (732じゃないけど)
クラス実装の変更に対する再コンパイルの必要性の削減。


これが利益とならない環境では用はない。これが利益となる環境はある。

個人的には同じ目的ならインターフェースクラス+生成関数のほうが手間が少なくて好み。
公開済みのクラス(具象クラス)に後付けでも適用できるのが pimpl の強みじゃないかな。

889 名前:デフォルトの名無しさん mailto:sage [2019/11/04(月) 00:45:00.04 ID:sHXph+lc.net]
>>833
>>821は、>>802からの流れなのでヨロ

そうした上で、
>ライブラリ使用者に無関係で見せたくないからpimplで隠す
それがpimpl固有の特質である根拠とは…
構造体の詳細を見せる必要が無いなら
別にハンドルでも良いじゃん?Cだと昔からそうしてきたわけやし…

>>834
構造体の詳細を見せる必要が無いなら
別にハンドルでも良いじゃん?Cだと昔からそうしてきたわけやし…

pimplとかC++で実装する側がソースコードを整理したい目的で使うものであって、
ライブラリの公開インターフェースがpimplであるべきという論こそ勘違い甚だしい

890 名前:デフォルトの名無しさん mailto:sage [2019/11/04(月) 00:50:27.63 ID:HxncxYCK.net]
>>881
お前の老害頭では無理だと思う



891 名前:デフォルトの名無しさん mailto:sage [2019/11/04(月) 01:01:50.05 ID:qdasM095.net]
コンパイル時にリフレクションできたらC++にはもう何も望まないんだけどな

892 名前:デフォルトの名無しさん mailto:sage [2019/11/04(月) 01:16:04 ID:bOoSbled.net]
リフレクションしたいとか実行時にあれだとかこれだとかしたいとか
もっと安全性を高めたいとかいう人はC#にいったらいいとおもうんだが
なぜいかないのか

893 名前:デフォルトの名無しさん mailto:sage [2019/11/04(月) 04:20:27.81 ID:6RBgtjpd.net]
マングリングとかも規格で決めてほしいよね
そうすればクラスのエクスポートなんかも簡単になるのに

894 名前:デフォルトの名無しさん mailto:sage [2019/11/04(月) 06:09:25.96 ID:26dKwYrd.net]
動的はともかく静的リフレクションはあって困る場面は無いだろ

冗長な記述や変なマクロを使わずに、enumを文字列化したりしたいだろ

895 名前:デフォルトの名無しさん mailto:sage [2019/11/04(月) 06:17:29.31 ID:ktSXuT3K.net]
名前マングリングの方法がコンパイラ毎に違うおかげで
互換性のないオブジェクトファイル同士がリンクされる事故を防げる、って
『More Effective C++』に出てたな。

便利さも欲しいが安全性も保ちたい、という要求のせめぎあいだな。

896 名前:デフォルトの名無しさん mailto:sage [2019/11/04(月) 06:59:32.99 ID:1EaGoi2+.net]
今生き残ってるC++のコンパイラってどのくらい種類あんの
特定ハード向けのもgccの派生なんでしょ?

897 名前:デフォルトの名無しさん mailto:sage [2019/11/04(月) 09:40:11.27 ID:sHXph+lc.net]
>>833
>>883とオモタがちょっち訂正しておき鯛、
publicなメンバ関数だけでprivateを一切含まずに事を済ますクラス定義を広義のpimplとみなすなら
ライブラリの公開インターフェースとしてpimpl最高じゃな

ハンドルだけだとユーザーが間違った呼び出しをしかねない
これをpimpl式にクラスでwrapするのはスゲー有効

898 名前:デフォルトの名無しさん mailto:sage [2019/11/04(月) 10:05:11.25 ID:7p81GTJD.net]
つーかハンドルで渡して使う時にキャストするって面倒だからさ
privateだからいいでしょとかいう問題じゃない

899 名前:デフォルトの名無しさん mailto:sage [2019/11/04(月) 12:16:24.53 ID:pwba8h1Q.net]
記述の煩雑さはもう諦めるけどインラインPimplでゼロオーバーヘッドにしてほしい

900 名前:デフォルトの名無しさん mailto:sage [2019/11/04(月) 12:22:24.34 ID:TNJ/Yj6e.net]
煩雑さを許容できるならやれるでしょ
pointerでなくバイト配列にしておいて中でcastするやつ
気を付けないところいろいろあるけど



901 名前:デフォルトの名無しさん mailto:sage [2019/11/04(月) 12:35:35.98 ID:jCRIC3rQ.net]
オーバーヘッドを気にしている人の大半は、気にする必要のあるものを作っていない

902 名前:デフォルトの名無しさん mailto:sage [2019/11/04(月) 12:35:45.49 ID:DlV1X8tk.net]
実装をpimplに押し込めて公開インターフェース上の変数メンバの増減を無くすのが肝なんだから
pimplのデリファレンスのオーバーヘッドは避けようがないだろう。

903 名前:デフォルトの名無しさん mailto:sage [2019/11/04(月) 12:41:44.84 ID:7p81GTJD.net]
そもそもprivateな関数宣言をpublicなヘッダに
書かないといけないというC++言語仕様の欠陥

publicヘッダとprivateヘッダの二つに分けて
クラス宣言できればよかった

ちなみにC#ではpartialクラスといって
複数のファイルにまたがってクラスの定義ができる

904 名前:デフォルトの名無しさん mailto:sage [2019/11/04(月) 13:33:20.96 ID:TNJ/Yj6e.net]
>>896
こういうの
https://ideone.com/EB36N2
pointerじゃないからpimplではない

905 名前:デフォルトの名無しさん mailto:sage [2019/11/04(月) 13:45:03.05 ID:7wrIz40y.net]
まあ欠陥って言われてもprivateメンバー変数変更されたらインスタンスのサイズ変わったりするから
1) 参照してるソースも含めてリコンパイルする
2) ポインタで持つ(pimpl)
しかないからねぇ
C++的には現状の言語仕様でIDEでprivateは見せないようにもできるとかでいいと思う

906 名前:デフォルトの名無しさん mailto:sage [2019/11/04(月) 13:47:25.16 ID:ncwvkXHO.net]
>>898
パズルとしてはいいけど真顔で書いてたらちょっと引くわw

907 名前:デフォルトの名無しさん mailto:sage [2019/11/04(月) 13:59:48.02 ID:DlV1X8tk.net]
>>898
その場合でも任意の変数メンバの拡張性は結局 Hide::a の存在で保証されているわけだろう。
impl[32] と予約された範囲まで拡張できるというのもあるのかもしれんが。

908 名前:デフォルトの名無しさん mailto:sage [2019/11/04(月) 14:00:47.43 ID:7P/NsyXI.net]
結局低レイヤーを考慮しないでバカが文句言ってるだけで
そんなことに付き合う必要はないんだよ。

909 名前:デフォルトの名無しさん mailto:sage [2019/11/04(月) 14:16:11.73 ID:TNJ/Yj6e.net]
>>901
バイナリ境界にしたときの拡張性のこと言ってる?
それはまさに配列のサイズでリザーブだね
溢れたら終わり

目的がヘッダー依存を切ることなら必要に応じて配列サイズ増やせばいいだけ
めんどいけどassertかけてあるからミスることはない
あとpimplは中でnewされるのがいやな場合あるからそれを避けられるってのも大きいね

910 名前:デフォルトの名無しさん mailto:sage [2019/11/04(月) 14:34:36.07 ID:mRc+a4F8.net]
>>897
(使う側が)、CPerson person[10]; や、new CPerson[10] のように書いたと
すると、C++は高速化のため、CPersonのバイトサイズを定数値として
静的にコンパイルして、スタックや Heapからそれらのオブジェクトの領域を
確保する。
なので、たとえC++でCPersonのprivateメンバがC#のpartialの様に分けて宣言できた
としても、それらを全て合わせた全体のバイトサイズが分からないと静的に処理できない。
故に結局、partialの一部であっても全体のサイズに影響のあるような変更が行われた
場合には、上記の様な形でCPersonを使うプログラムは再コンパイルが必要となる。



911 名前:デフォルトの名無しさん mailto:sage [2019/11/04(月) 14:57:14.11 ID:VEKGTWb6.net]
プリコンパイルドヘッダが標準化されればなんとかなるかも

912 名前: mailto:sage [2019/11/04(月) 16:01:14.23 ID:fwURXfb5.net]
>>905
そういうのはやめてほしいです…

913 名前:デフォルトの名無しさん mailto:sage [2019/11/04(月) 16:31:03.20 ID:q2OPdcJi.net]
>>906
良いか悪いかは仕様次第なんじゃないの?
コンパイルされてたら無条件でアウト?

914 名前:デフォルトの名無しさん mailto:sage [2019/11/04(月) 16:35:25.90 ID:q2OPdcJi.net]
差分とりづらいってのはあるか

915 名前:デフォルトの名無しさん mailto:sage [2019/11/04(月) 20:26:00.54 ID:sHXph+lc.net]
>>897
構造体データメンバのメモリ配置を正確に定義したいという目的を捨てない限り
privateなデータメンバをprivateヘッダに分けて定義できるようにしたところで
pimplが目指すような解決にはならない
ほとんど意味が無い

916 名前:デフォルトの名無しさん mailto:sage [2019/11/04(月) 20:31:52.81 ID:sHXph+lc.net]
pimplが目指すような解決というのは筆が滑ったorz

とにかくprivateなデータメンバをprivateヘッダに分けて定義できるようにしたところで
実装の隠蔽にはやっぱハンドル経由とかポインタ経由(pimpl)な間接参照が必要なままである
構造体データメンバの追加や削除や順序変更が
publicなヘッダに定義されたインターフェース仕様に影響しなくなりはしない

917 名前:デフォルトの名無しさん mailto:sage [2019/11/04(月) 21:34:38.56 ID:TNJ/Yj6e.net]
>>900
言うてもplacement newしたオブジェクトに移譲してるだけだからたいしたことやってない
まぁこれが規格的にセーフかどうかは知らんけどな

918 名前:デフォルトの名無しさん mailto:sage [2019/11/04(月) 21:53:48.72 ID:7wrIz40y.net]
>>911
> uint8_t impl[32];
固定サイズで確保してる時点であり得んわ

919 名前:デフォルトの名無しさん mailto:sage [2019/11/04(月) 22:09:21.71 ID:TNJ/Yj6e.net]
そこはどうにもならんな
他にいい方法あるなら知りたい
上で触れてるけど、逆にバイナリ互換とるときはそういうリザーブが役立つこともある

920 名前:デフォルトの名無しさん mailto:sage [2019/11/04(月) 22:38:30.89 ID:7wrIz40y.net]
>>913
> 他にいい方法あるなら知りたい
ないからpimplとかなんだろ
だからと言ってテキトーに領域定義とかあり得んだろ



921 名前:デフォルトの名無しさん mailto:sage [2019/11/04(月) 22:40:59.70 ID:jCRIC3rQ.net]
そもそもポインタ参照ごときのオーバーヘッドをも許さないほどリアルタイム性を要求するもの作ってんの?

922 名前:デフォルトの名無しさん mailto:sage [2019/11/04(月) 22:51:45.72 ID:TNJ/Yj6e.net]
>>914
適当がいやなら同じサイズにすりゃいいじゃん
static_asserの条件を==にすればいい
手間はかかるが、それが許容できる前提の案ね

923 名前:デフォルトの名無しさん mailto:sage [2019/11/04(月) 22:58:08.77 ID:7wrIz40y.net]
>>916
バカなの?
ちょっとサイズ変更されたら使えない
かと言ってどんだけ余裕持てばいいかは未来予知能力でもないと無理
要するに常人には使いどころがないってことな

924 名前:デフォルトの名無しさん mailto:sage [2019/11/04(月) 23:05:23.77 ID:J+RS26ji.net]
>>915
C++の用途として可能な限りオーバーヘッドをゼロとすることが要求されるケースがあるのは当然の話であるが、別に議論に参加するものがそういう物を作っている必要性はないだろうに、何でこだわってるんだ?

925 名前:デフォルトの名無しさん mailto:sage [2019/11/04(月) 23:12:26.97 ID:TNJ/Yj6e.net]
>>917
だから手間がかかると言ってるわけ
やる気になれば自動化できるスクリプトは作れるだろうけどね
バカと思うかもしれないけどreserveフィールドでバイナリ互換を保つってのは実際やるんだよ
未来を予測できないのはそのとおり
適当に決める
まぁお前の知らない世界の話だから気にするな

926 名前:デフォルトの名無しさん mailto:sage [2019/11/04(月) 23:25:59.73 ID:DlV1X8tk.net]
外部からはデストラクタもコピーコンストラクタも動かせないのにあえてインラインにする
理由がよくわからないな。
よっぽど特殊でピンポイントな要件なのかもしれないが。

927 名前:デフォルトの名無しさん mailto:sage [2019/11/05(火) 01:47:52.32 ID:8w7ODMFL.net]
placement new を使った
char* ptr = (char *)malloc(sizeof(CPerson));
CPerson *pPerson = new(ptr) CPerson;
という書き方、実は、「コンストラクタの明示的呼び出し」なるものを使って、
CPerson *pPerson = (CPerson *)malloc(sizeof(CPerson));
pPerson->CPerson::CPerson();  // コンストラクタの明示的呼び出し
と書くことも出来るらしいことを最近知った。

928 名前:デフォルトの名無しさん mailto:sage [2019/11/05(火) 06:17:56.31 ID:cY6SY5gz.net]
ああそうそれは良かったね〜

929 名前:デフォルトの名無しさん mailto:sage [2019/11/05(火) 07:19:41 ID:UkGDCuYx.net]
>>919
手間の問題じゃないよ
せっかく変更に強くするためにやってるのに
> 適当がいやなら同じサイズにすりゃいいじゃん
なんてやったら本末転倒だろ

> やる気になれば自動化できるスクリプトは作れるだろうけどね
未来予知機能付きのスクリプトができたらいいねw

> バカと思うかもしれないけどreserveフィールドでバイナリ互換を保つってのは実際やるんだよ
ああ、昔のコボラー爺の発想ねw
ファイルとか通信とかで外部とやり取りするようなものだと今でも普通にあるけどメモリーレイアウトでやるのは流石に悪手でしかない

> まぁお前の知らない世界の話だから気にするな
時代遅れのお前の妄想に閉じ込めといてくれw

930 名前:デフォルトの名無しさん mailto:sage [2019/11/05(火) 07:51:55.68 ID:rlbxGVpf.net]
>>780
cygwinで配布してるwxwidgitはgcc3時代のabiでバイナリ作られてるが当然gcc8でもabiオプションで変えてリンクできる



931 名前:デフォルトの名無しさん mailto:sage [2019/11/05(火) 07:55:46.59 ID:Cze7w/ei.net]
>>921 何を見て「出来るらしい」と言ってるのかな?

932 名前:デフォルトの名無しさん mailto:sage [2019/11/05(火) 08:36:03.93 ID:g61EG+/r.net]
解放も自前でやるんなら別にいんじゃね?

933 名前:デフォルトの名無しさん mailto:sage [2019/11/05(火) 08:47:49.22 ID:wVD+ILW8.net]
>>819
pimplが理想だなんて頓珍漢なレスで
ひっ絡んで来たのそっちだろうが
何がそういう返しだ
冗談は顔だけにしろ奇形チンパンジーめ

934 名前:デフォルトの名無しさん mailto:sage [2019/11/05(火) 12:36:38.02 ID:UkGDCuYx.net]
>>927
まさかと思うが
> 目指す理想がpimpl?
って理想がpimplって言ってるとでも思ったのか?
デザインパターンの前に日本語の勉強しろよw

935 名前:デフォルトの名無しさん mailto:sage [2019/11/05(火) 12:48:20.10 ID:XPYDDbPn.net]
日本人じゃないんじゃない?

936 名前:デフォルトの名無しさん mailto:sage [2019/11/05(火) 16:03:35.45 ID:wVD+ILW8.net]
>>928
安心しろ
あからさまにラリッてる廃人の戯言など
どうとも取ってねえよ
そんな価値があるとでも思っているなら
とんだナルシストだw

937 名前:デフォルトの名無しさん mailto:sage [2019/11/05(火) 17:28:48.96 ID:X2+zjlng.net]
>>923
pimplの目的が変更に強いことってはお前の見方にすぎない
コンパイル時に検知できるんだから特別手間ではないし、
呼び出しコストを下げる目的は達している
技術的な話したいなら物事をフェアに見ような

938 名前:デフォルトの名無しさん mailto:sage [2019/11/05(火) 18:57:55.00 ID:lmPmis8+.net]
手間はあるけど(俺は)手間だと感じないだから、変更に強いとは思わない

って言ってるの?

939 名前:デフォルトの名無しさん mailto:sage [2019/11/05(火) 19:21:00.26 ID:X2+zjlng.net]
>>894

940 名前:デフォルトの名無しさん mailto:sage [2019/11/05(火) 19:48:59.34 ID:C6JaWlq+.net]
実装側のサイズが想定をオーバーしたら互換性無くなって再コンパイルになるんでしょ
それが許容される環境ならインターフェース切る意味が薄れるんじゃないの?

まぁ実際はオーバーしないようにするんだろうけど



941 名前:デフォルトの名無しさん mailto:sage [2019/11/05(火) 19:52:57.91 ID:UkGDCuYx.net]
>>930
どうとも取ってないのに顔真っ赤にしてレスするとか珍しいなw

942 名前:デフォルトの名無しさん mailto:sage [2019/11/05(火) 19:54:47.54 ID:UkGDCuYx.net]
>>931
ごめん、お前なんのために>>898みたいなことやるの?
説明できる?w

943 名前:デフォルトの名無しさん mailto:sage [2019/11/05(火) 20:04:16.17 ID:Rmlz0hln.net]
>>936
pimplの説明ならこのスレで何度も出てると思うが?
それにしたいして、お前の反論は「俺はそうは思わない」という感想でしょ?

技術的な話したいなら物事をフェアに見ような

944 名前:デフォルトの名無しさん mailto:sage [2019/11/05(火) 20:18:38.99 ID:GaJDeol8.net]
>>893 というお題な対して出した案が >>898
privateは隠蔽できて、かつ呼び出しコストは低い
配列サイズ増やしたらバイナリ互換がとれないのは承知してる
しかしそれはI/Fにする構造体一般の話であってこの件に限ったことではない

もう十分説明したつもり

945 名前:デフォルトの名無しさん mailto:sage [2019/11/05(火) 20:37:36.25 ID:UkGDCuYx.net]
>>937
>>898がpimplに見えるならちょっと黙っててもらっていいかな?
邪魔なだけだし

>>938
なるほどね
とにかくprivateは見せたくないって事ならそれでいいんじゃね?
俺はやりたくないけどw

946 名前:デフォルトの名無しさん mailto:sage [2019/11/05(火) 20:51:01.63 ID:mHpC8FDb.net]
>>935
とID真っ赤にしてレスするやつ
別に珍しくもねえ どこにでもいる虫けらめ

947 名前:デフォルトの名無しさん mailto:sage [2019/11/05(火) 21:09:19.41 ID:uxZ9xTP ]
[ここ壊れてます]

948 名前:+.net mailto: 可愛そうなやつ… []
[ここ壊れてます]

949 名前:デフォルトの名無しさん mailto:sage [2019/11/05(火) 21:15:13.47 ID:ZKJgPI6j.net]
事務職だけど、C++使ってる 
こんな便利なプログラミング言語があるとは

950 名前:蟻人間 mailto:sage [2019/11/05(火) 21:19:49.70 ID:36DcdPPB.net]
pimplesが顔に出たのは中学・高校時代だったか。



951 名前:蟻人間 mailto:sage [2019/11/05(火) 21:23:07.90 ID:36DcdPPB.net]
pointer to implementation

952 名前:デフォルトの名無しさん mailto:sage [2019/11/05(火) 22:48:13.18 ID:5N1tjWFS.net]
結局のところ、>>893の言う「インラインPimpl」なるものの解釈なんだよな。

「そんなものありえない」>>896
「こうすればできるよ」>>898

俺は「ありえない」派だが。

953 名前:デフォルトの名無しさん mailto:sage [2019/11/05(火) 22:54:52.19 ID:JFmkzqZr.net]
ピンプルはシンプルじゃないとダメでしょ

954 名前:デフォルトの名無しさん mailto:sage [2019/11/05(火) 23:19:34.53 ID:+/SJ/H3y.net]
他の言語ではprivateを隠すための努力なんてしなくていいよね
あくまでc++特有のパターンとしてpimplがある
pimplの肝は、ポインタだけなら前方宣言すればincludeしなくてOKっていう
抜け穴的なところからきていてポインタであることは妥協の産物
implクラスを変更しても互換性が保たれるというのはあくまで副次的
ゼロコストじゃないわけでc++の思想からも外れている

955 名前:デフォルトの名無しさん mailto:sage [2019/11/05(火) 23:26:17.64 ID:+K1+YrIp.net]
何をもって思想から外れていると?
C++の設計思想は最速を目指すことじゃないからな

956 名前:デフォルトの名無しさん mailto:sage [2019/11/05(火) 23:41:22.87 ID:+/SJ/H3y.net]
Bjarne Stroustrupがそう言ってる

957 名前:デフォルトの名無しさん mailto:sage [2019/11/05(火) 23:55:16.05 ID:+K1+YrIp.net]
始まりはそうだったかも知れんが、現在の規格の設計思想は明らかに違う

958 名前:デフォルトの名無しさん mailto:sage [2019/11/05(火) 23:58:36.99 ID:UFe3q3jM.net]
最速を目指すって言うと少し外れてるけど、速度を重視するという所は変わってない

959 名前:デフォルトの名無しさん mailto:sage [2019/11/06(水) 00:01:20.76 ID:x6qzxIK7.net]
それ以上に集団での開発効率を重視したもの
>>898のような奇怪なものよりpImplの方がモダンC++の設計思想に合っているのは間違いない

960 名前:デフォルトの名無しさん mailto:sage [2019/11/06(水) 00:04:55.89 ID:pco2p4E4.net]
別に抜け穴でも何でもないだろ
なきゃこまるじゃん



961 名前:デフォルトの名無しさん mailto:sage [2019/11/06(水) 00:12:17.42 ID:L0p3vvTY.net]
>>950
明らかに〜
説明できないときにつかう常套句だよね
少なくともc++17まではその設計ポリシーが挙げられてるよ

962 名前:デフォルトの名無しさん mailto:sage [2019/11/06(水) 00:18:49.38 ID:L0p3vvTY.net]
>>952
はぁ?
pimplのどこがモダンなの?
最低限delegateを手で書かなくてもいいようにしてから言ってくれよ
スマートポインタ以下だから

963 名前:デフォルトの名無しさん mailto:sage [2019/11/06(水) 00:32:45.47 ID:EoKh/jsd.net]
設計の方針は曖昧なものではなく明文化されてるから調べてきてね

964 名前:デフォルトの名無しさん mailto:sage [2019/11/06(水) 01:17:04.07 ID:mNM1KOm6.net]
ピンプルってピンポンみたいだね

965 名前:デフォルトの名無しさん [2019/11/06(水) 01:37:31 ID:clVAOuCS.net]
ハリソン・フォード主演映画「逃亡者」(1993年)の主人公の名前は、キンブルだったね。
この映画はサントラが良い。ジェームズ・ニュートン・ハワードが音楽担当。
このサントラの「Helicopter Chase」という曲は、「タクティクスオウガ」(1995年)というテレビゲームの「VENDETTA!」という曲によく似ている。

966 名前:デフォルトの名無しさん mailto:sage [2019/11/06(水) 05:47:10 ID:iGLzVPkM.net]
pimpl使ったことないからスルーしてたけど
>>947=>>949
ゼロオーバーヘッドの原則は言語が掲げるもので言語利用者を縛るものじゃねーよ

実際それが便利でコストが問題にならない使い方ならどう使ってもいいだろ

967 名前:デフォルトの名無しさん mailto:sage [2019/11/06(水) 05:56:01 ID:iGLzVPkM.net]
>>954
君もなんか勘違いしてない?
最速を目指すなんて厨二病みたいなことを挙げていたというソースは?

968 名前:デフォルトの名無しさん mailto:sage [2019/11/06(水) 06:54:13.33 ID:cnDla3Ge.net]
>>959
> ゼロオーバーヘッドの原則は言語が掲げるもので言語利用者を縛るものじゃねーよ
そうだよ、だからこの手の機能は言語仕様には含まれないってことな

> 実際それが便利でコストが問題にならない使い方ならどう使ってもいいだろ
誰もお前に使うななんて言ってないから使いたいなら勝手に使ってろよw

969 名前:デフォルトの名無しさん mailto:sage [2019/11/06(水) 07:21:04.31 ID:GB7Qlzkj.net]
>>947
その主張にincludeは関係ないぞ

970 名前:デフォルトの名無しさん [2019/11/06(水) 07:24:02.54 ID:hwyI/gg2.net]
質問です。
サンプルプログラムで割り込み処理の一文で

ISR(TIMER1_CAPT_vect) {}でサブルーチンを呼び出してたんだけど、()内の意味わかりますか?



971 名前:デフォルトの名無しさん mailto:sage [2019/11/06(水) 07:41:29.30 ID:iGLzVPkM.net]
>>961
>そうだよ、だからこの手の機能は言語仕様には含まれないってことな
誰か言語仕様に含めろなんて言ってたか?
さすがに隠したいメンバをポインタ経由で隠して無駄にコストかかる言語なら俺もお断りだが
ちな俺はplmpl使いたいなどと書いてない、人の主張を勝手に捏造するな

972 名前:デフォルトの名無しさん mailto:sage [2019/11/06(水) 08:14:41.32 ID:N/klFKt1.net]
あと>>961=947と想定してもう一つ言っておくと
ポインタ変数の宣言に型(クラス)の実際の定義が必要ないのは抜け穴じゃない
必要ないから要求されないだけだ
どうもC++に対する認識がおかしい気がする
D&Eでも読んでこい

973 名前:デフォルトの名無しさん mailto:sage [2019/11/06(水) 08:16:11.65 ID:cnDla3Ge.net]
>>964
> 誰か言語仕様に含めろなんて言ってたか?
誰もお前が言語仕様に含めろと言ってるなんて言ってないぞ
自意識過剰すぎだろ

> ちな俺はplmpl使いたいなどと書いてない、人の主張を勝手に捏造するな
使いたい「なら」な
C++の前に日本語やり直してこいw

974 名前:デフォルトの名無しさん mailto:sage [2019/11/06(水) 08:17:38.83 ID:cnDla3Ge.net]
>>965
> あと>>961=947と想定して
バカほどこういう想定をしたがるw

975 名前:デフォルトの名無しさん mailto:sage [2019/11/06(水) 08:21:27.02 ID:N/klFKt1.net]
ただの荒らしなら出てけ

976 名前:デフォルトの名無しさん mailto:sage [2019/11/06(水) 08:31:26.58 ID:zr2SzfAm.net]
>>963
コンパイラが分からんけど、割り込みベクタテープルのシンボルだと思う。
タイマ1キャプチャ割り込みのハンドラを今から定義しますよ、みたいな。

977 名前:デフォルトの名無しさん mailto:sage [2019/11/06(水) 09:33:53.63 ID:GEOrtix2.net]
サイズの違うコンテナ同士で代入を試みたらセグメンテーション違反になったんだが、リサイズしつつ代入って簡単にできないの?

978 名前:デフォルトの名無しさん mailto:sage [2019/11/06(水) 09:54:01.45 ID:B/9oP97H.net]
>>970 できるよ。
#include <vector>
#include <cassert>
int main()
{
std::vector v1{1}, v2{1,2};
v1 = v2;
assert(v1 == v2);
}

979 名前:デフォルトの名無しさん mailto:sage [2019/11/06(水) 10:35:41.19 ID:GEOrtix2.net]
>>971
普通できるのか
boostの「STLコンテナらしく振る舞う」というある多次元配列コンテナでできなかったから一般的にできないんだと思っちゃった
スマン

980 名前:デフォルトの名無しさん mailto:sage [2019/11/06(水) 10:42:41.76 ID:rSUWYkcI.net]
そのためのstd::vectorのメンバ関数operator=だしな



981 名前:デフォルトの名無しさん mailto:sage [2019/11/06(水) 12:22:15.65 ID:2MfY+5W5.net]
>>968
頓珍漢な想定でくだらんことしか言えないお前が出て行けよw

982 名前:デフォルトの名無しさん mailto:sage [2019/11/06(水) 15:11:24.10 ID:BVN8Da8w.net]
今事務職であいてる時間C++やってるんだけど、事務職に特化したライブラリとかってない?

983 名前:デフォルトの名無しさん mailto:sage [2019/11/06(水) 15:24:12.57 ID:EoKh/jsd.net]
>>975
awk,sed

984 名前:デフォルトの名無しさん mailto:sage [2019/11/06(水) 17:52:40.67 ID:lpQz5w/v.net]
>>975
Excelのアドオン

985 名前:デフォルトの名無しさん mailto:sage [2019/11/06(水) 18:44:11.86 ID:XJugYxC8.net]
char str[ ];
と宣言した場合、str[0] = '\0';というNULL終端をしなければなりませんが
string str[ ];
と宣言した場合は、特にNULL終端の必要性っていうのはないのでしょうか?

986 名前:デフォルトの名無しさん mailto:sage [2019/11/06(水) 19:20:03.22 ID:x6qzxIK7.net]


987 名前:蟻人間 mailto:sage [2019/11/06(水) 19:23:25.64 ID:Z1hQUtYe.net]
std::stringはstd::string::c_strメソッドを使ってアクセスするとヌル終端になることが保証されている。

988 名前:デフォルトの名無しさん [2019/11/06(水) 19:45:32.35 ID:o3tEvZiY.net]
char hoge[] は char の配列
別に文字列として扱う気がなければ 0 終端は必須ではない

string hoge[] は(突っ込まれるかもしれんが敢えて言うと) char[] の配列
上の char hoge[] とは別物

989 名前:デフォルトの名無しさん [2019/11/06(水) 19:48:44.64 ID:o3tEvZiY.net]
あと片山の答えは >>978 の回答になっていない無関係な話 (いつものことだが)

990 名前:デフォルトの名無しさん mailto:sage [2019/11/06(水) 19:59:36.42 ID:JQYyTTQU.net]
今やc_strでなくてもnull終端は保証されてるしな



991 名前:デフォルトの名無しさん mailto:sage [2019/11/06(水) 20:14:12.93 ID:KdcLkZY9.net]
char str="";で多分null終端される。
stringは多分std::stringなのでそもそも文字列ではなくアドレスを扱う。

た・・・ぶ・・・ん・・・。うぼぁあああああああ。

992 名前:デフォルトの名無しさん mailto:sage [2019/11/06(水) 20:14:31.39 ID:XJugYxC8.net]
>>978です
すみません 文字列として扱い、いきなりその変数を文字列と文字列の連携で使う場合の話です
つまり、その場合でも std::stringで宣言する場合は、"\0"で初期化する必要は無しということですね?

993 名前:デフォルトの名無しさん mailto:sage [2019/11/06(水) 20:16:22.14 ID:KdcLkZY9.net]
すまん書き直し。

char str[]="";で多分初期化時にnull終端される。

「string str[];」は多分std::stringの配列なのでそもそも文字列ではなくアドレスを扱う。

994 名前:デフォルトの名無しさん mailto:sage [2019/11/06(水) 20:52:15.48 ID:vhzIqEHb.net]
>>985
説明が上手くないからもうコードで書きなよ

995 名前:デフォルトの名無しさん mailto:sage [2019/11/06(水) 20:56:59.66 ID:y5v/16J4.net]
ひょっとするとstd::string str[]じゃなくてstd::string strの間違いじゃないの?

996 名前:デフォルトの名無しさん mailto:sage [2019/11/06(水) 21:29:23.43 ID:3LXwRiA7.net]
日本語の説明よりコード片の方が多少間違っていても意図を理解できるという

997 名前:デフォルトの名無しさん mailto:sage [2019/11/06(水) 23:14:40.66 ID:7z10T+eB.net]
char[]は文字の配列=一つの文字列でstring[]は文字列の配列だからそもそも比較するのが間違ってる

998 名前:デフォルトの名無しさん mailto:sage [2019/11/07(Thu) 06:10:28 ID:+Fv/+mh5.net]
>>978 の char str[ ]; string str[ ]; は、どっちも
要素数不明の配列の定義でコンパイルエラーになるんと違うか?
宣言ってことは extern のつもりなんじゃろか。

>>988 の言う通り string str[ ]; は string str; かも知れんけど、
いずにせよ「質問が曖昧で答えようがない」の類かと。

999 名前:デフォルトの名無しさん mailto:sage [2019/11/07(木) 08:06:36.36 ID:N9TqrKuA.net]
アスペ多すぎ
まともな頭していればstring str;の書き間違いだってわかる

1000 名前:デフォルトの名無しさん mailto:sage [2019/11/07(木) 08:28:39.90 ID:pA1g5yhx.net]
コンパイラが空気読むわけないだろ(笑)



1001 名前:デフォルトの名無しさん mailto:sage [2019/11/07(木) 08:37:03.72 ID:S+DlaQTT.net]
・・・からけ?

1002 名前:デフォルトの名無しさん mailto:sage [2019/11/07(木) 08:39:29.18 ID:t3M9+vGM.net]
>>992
本気でstring str[];だと思ってる可能性を否定しきれない
現実にその手の奴はいるし

1003 名前:デフォルトの名無しさん mailto:sage [2019/11/07(木) 08:44:57.00 ID:C1GJGInU.net]
>>978です
明らかに自分が悪いです

char str[ ];
と宣言した場合、str[0] = '\0';というNULL終端をしなければなりませんが
std::string str;
と宣言した場合は、特にNULL終端の必要性っていうのはないのでしょうか?

に修正です

1004 名前:デフォルトの名無しさん mailto:sage [2019/11/07(木) 09:42:08.88 ID:GEuBrdxx.net]
無い
というか元々stringはC言語由来のゼロ終端とは違い、
「サイズ持ってんだから最後を示すデータは不要」という考え方だった
C++11からは利便性のためにゼロ終端が保証されてるけどユーザーが何かする必要はない

1005 名前:デフォルトの名無しさん mailto:sage [2019/11/07(木) 09:51:34.14 ID:GEuBrdxx.net]
初心者ぽいから説明が悪かったかもしれん
クラスが内部でやってくれることなので特に何かする必要はない
けど、内部データを直接書き換えたりするとおかしなことになるので注意

1006 名前:デフォルトの名無しさん mailto:sage [2019/11/07(木) 10:35:04.78 ID:Q8xac2sp.net]
stringに対するstring_viewみたいにint配列等にたいするviewはありますか?

1007 名前:デフォルトの名無しさん [2019/11/07(木) 10:38:43.53 ID:dB1QBGXo.net]
'\0' と 0 とどっち使うのが良い?
NULL は論外だよな

1008 名前:1001 [Over 1000 Thread.net]
このスレッドは1000を超えました。
新しいスレッドを立ててください。
life time: 54日 17時間 25分 19秒

1009 名前:1002 [Over 1000 Thread.net]
5ちゃんねるの運営はプレミアム会員の皆さまに支えられています。
運営にご協力お願いいたします。


───────────────────
《プレミアム会員の主な特典》
★ 5ちゃんねる専用ブラウザからの広告除去
★ 5ちゃんねるの過去ログを取得
★ 書き込み規制の緩和
───────────────────

会員登録には個人情報は一切必要ありません。
月300円から匿名でご購入いただけます。

▼ プレミアム会員登録はこちら ▼
https://premium.5ch.net/

▼ 浪人ログインはこちら ▼
https://login.5ch.net/login.php

1010 名前:過去ログ ★ [[過去ログ]]
■ このスレッドは過去ログ倉庫に格納されています








[ 新着レスの取得/表示 (agate) ] / [ 携帯版 ]

前100 次100 最新50 [ このスレをブックマーク! 携帯に送る ] 2chのread.cgiへ
[+板 最近立ったスレ&熱いスレ一覧 : +板 最近立ったスレ/記者別一覧]( ´∀`)<268KB

read.cgi ver5.27 [feat.BBS2 +1.6] / e.0.2 (02/09/03) / eucaly.net products.
担当:undef