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 名前:過去ログ ★ [[過去ログ]] ■ このスレッドは過去ログ倉庫に格納されています