◎正当な理由による書き込みの削除について:      生島英之とみられる方へ:

C++相談室 part145 ->画像>2枚


動画、画像抽出 || この掲示板へ 類似スレ 掲示板一覧 人気スレ 動画人気順

このスレへの固定リンク: http://5chb.net/r/tech/1568362404/
ヒント:5chスレのurlに http://xxxx.5chb.net/xxxx のようにbを入れるだけでここでスレ保存、閲覧できます。

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

前スレ
C++相談室 part144
http://2chb.net/r/tech/1563769115/

このスレもよろしくね。
【初心者歓迎】C/C++室 Ver.105【環境依存OK】
http://2chb.net/r/tech/1556142878/

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

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

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

dynamic_castはたいていダウンキャストに使うし、逆にvtableとdynamic_castは関係ないだろ。
3デフォルトの名無しさん
2019/09/13(金) 21:40:45.55ID:/ygW08Jq
> vtableとdynamic_castは関係ないだろ。

おまえさん、そもそもdynamic_castとは何か理解しているか?
4デフォルトの名無しさん
2019/09/13(金) 21:41:31.76ID:/ygW08Jq
あ、ID出るんだったな
「スレ主」としての発言ではないんで気にしないでくれ
5デフォルトの名無しさん
2019/09/13(金) 22:48:38.62ID:ZW8mwhnp
整理すると
安全にダウンキャストするにはdynamic_castを使うし
その際vtableが必要
そんだけ
6デフォルトの名無しさん
2019/09/13(金) 22:49:53.22ID:ZW8mwhnp
ちなみにdynamic_castでアップキャストする場合はvtable要らね
どうでもいいが
7デフォルトの名無しさん
2019/09/14(土) 01:51:42.11ID:2JV3tdJj
このvtable言いたいだけ感
8デフォルトの名無しさん
2019/09/14(土) 02:09:30.09ID:SgsUVSB1
vtable言いたいだけちゃうんかと
9デフォルトの名無しさん
2019/09/14(土) 02:29:08.06ID:plkfGFM5
vtable iitai dake.
10デフォルトの名無しさん
2019/09/14(土) 07:29:57.19ID:keXkMGsc
dynamic castでアップキャストする事あるの?
11デフォルトの名無しさん
2019/09/14(土) 09:31:35.63ID:MJsGg5EL
ない
12デフォルトの名無しさん
2019/09/14(土) 11:41:42.14ID:Hd+E1riT
そもそもアップキャストはリスコフの置換原則が成り立つクラスになってんなら何もしなくも勝手にできる
13デフォルトの名無しさん
2019/09/14(土) 11:56:51.87ID:JExEJ5Ds
SOLIDなんて馬鹿が意識してるわけねーだろw
14デフォルトの名無しさん
2019/09/14(土) 14:12:14.01ID:2JV3tdJj
今まで仕事でRTTI有効だったプロジェクトはひとつもないわ
15デフォルトの名無しさん
2019/09/14(土) 16:26:48.85ID:Hd+E1riT
そりゃあサイズ削減しなきゃいけないからじゃね?
16デフォルトの名無しさん
2019/09/14(土) 17:28:56.46ID:KFCQQ8F2
サイズ以前の問題じゃないの
17デフォルトの名無しさん
2019/09/14(土) 17:57:41.80ID:JExEJ5Ds
バッチ処理系統の仕事ならポリモルフィズムなんて糞の役にも立たんどころか
かえって有害だわ。
18デフォルトの名無しさん
2019/09/14(土) 18:14:18.81ID:MJsGg5EL
COBOLでもEVALUATE文なんて普通に出てくるだろ
力技でダッセーけどあれもポリモだぞ
19デフォルトの名無しさん
2019/09/14(土) 18:26:33.88ID:JExEJ5Ds
そういうカスなことやってるからメンテ不能になるんだよ。。
20デフォルトの名無しさん
2019/09/14(土) 19:17:35.55ID:qjGOgUak
rttiに使う必要がでた時点でc++はミスチョイス
もちろん趣味ならご自由に
21デフォルトの名無しさん
2019/09/14(土) 19:52:02.94ID:iEVwPiY+
RTTI嫌ってるけど実際どの程度パフォーマンスに影響するの
22デフォルトの名無しさん
2019/09/14(土) 20:10:10.91ID:MJsGg5EL
正直、初めてポリモの話を聞いたときは
混ぜちまってから後で選別なんてアホだろって思った
23デフォルトの名無しさん
2019/09/14(土) 20:36:36.84ID:BTqGkHHG
まあ結局コールバックだからな
24デフォルトの名無しさん
2019/09/14(土) 20:39:19.28ID:SgsUVSB1
ポリホーモきっしょ
25デフォルトの名無しさん
2019/09/15(日) 01:12:05.95ID:+QluEOXC
C++は型の実行時識別をvtblのアドレスでやるからdynamic_castする以上はアップだろうがダウンだろうが対象クラスに仮想関数が一つは含まれないといけない
さもないとゼロコストの原則からクラスにvtblが作られない
ただし、仮想関数であれば良く、必ずしも仮想デストラクタである必要は無い、、、ハズ、、、
26デフォルトの名無しさん
2019/09/15(日) 01:37:29.11ID:0kzqJJdX
vtableおじさんまたきたよ
27デフォルトの名無しさん
2019/09/15(日) 01:44:54.25ID:+QluEOXC
>>22
ポリモとダウンキャスト(RTTIを使うか否かを問わず)を混同するとは情け
ナサス、
28デフォルトの名無しさん
2019/09/15(日) 01:47:31.12ID:+QluEOXC
コールバック関数ならいちいちポリモとかしなくとも無名関数とかで良いやんジャバじゃあるまいし、
29デフォルトの名無しさん
2019/09/15(日) 01:59:40.68ID:LMFjfaUx
vtableとvtblでNGしたった(´・ω・`)
30デフォルトの名無しさん
2019/09/15(日) 03:24:46.48ID:2F/PGB+Q
>>28
ラムダをどっこかに登録してコールバックしてもらうとき
自分が死ぬとき登録を解除するのが面倒じゃね?
結局thisとpairで登録する羽目に
だったら初めから仮想関数で良くね?
31デフォルトの名無しさん
2019/09/15(日) 04:39:33.80ID:+QluEOXC
コールバック関数を渡す側がコールバックされるより先に死ぬ可能性があるとか
一体何がしたいのかっていうか、
32デフォルトの名無しさん
2019/09/15(日) 04:41:18.12ID:+QluEOXC
仮にそうであるとしても死ぬ際に空のコールバック関数に登録し直せば良い
なお関数オブジェクト自体の破棄は関数オブジェクトをコピー渡しなりすれば何の問題も無い
33デフォルトの名無しさん
2019/09/15(日) 07:15:57.55ID:o13gcpb2
>>25
ゼロコスト? ああゼロオーバーヘッドのことかw
34デフォルトの名無しさん
2019/09/15(日) 09:03:14.13ID:XPArYK5v
C言語がなんとか使えるようになりました。
今度は、生産性の向上とstringとか面白そうなので、
C++を学習しようと思っています。

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

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

それとも、こういう書き込みはだめですか。
35デフォルトの名無しさん
2019/09/15(日) 09:10:08.07ID:XPArYK5v
34です。

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

ほかにもあれば教えてください。
36デフォルトの名無しさん
2019/09/15(日) 09:16:38.35ID:8KX++KfV
cpprefjp
37デフォルトの名無しさん
2019/09/15(日) 09:45:21.89ID:oPlgEsHO
EzoeRyoのgithubに公開しているcppbook
cpprefjp
38デフォルトの名無しさん
2019/09/15(日) 09:47:48.80ID:uSEm3H+m
ただで読めるし「江添亮のC++入門」とかでいいんじゃない?
どうしても書籍が良ければ9/20発売みたいだし
39デフォルトの名無しさん
2019/09/15(日) 10:08:14.78ID:j54Ms8Tr
どいつもこいつも嵌める気しかねーのか。。
せめてロベールとかビャーネのやつを紹介しろよ。
40デフォルトの名無しさん
2019/09/15(日) 10:14:24.35ID:uK9KHo8O
>>34
もちろんこういう書き込みは駄目だね
まず言語を学ぶ時点で実用性がない
学ぶならフレームワークだね
それにどうせ金にならないんだから、実用性なんて最初ならない
41デフォルトの名無しさん
2019/09/15(日) 10:29:15.30ID:Fzt4Iz1L
ビャーネはまだしもロベール古くない?
42デフォルトの名無しさん
2019/09/15(日) 10:30:20.14ID:+TjQqAK6
いまさら03以前の本を勧めるのはちょっと…
43デフォルトの名無しさん
2019/09/15(日) 10:35:30.95ID:Pt8t6mL1
C++で生産性は向上しない
学習動機の根本が間違ってる
44◆QZaw55cn4c
2019/09/15(日) 10:37:36.53ID:gb0f216/
>>35
>書籍は11月、電子ならすぐに手に入るようです。
電子キンドル版もやはり11月まで入手できないとのことでした
45デフォルトの名無しさん
2019/09/15(日) 10:47:37.02ID:j54Ms8Tr
cやったばっかの人に江添とか薦めるくらいならc++03のとこから地道に教える方を選択するわ。
あんな糞本でc++なんかいじられると目も当てられん結果になる。
46デフォルトの名無しさん
2019/09/15(日) 10:49:41.53ID:Fzt4Iz1L
もちろんC++11,14,17,20と教えていくんだろうな?
今時C++03なんて使ってられんぞ
47デフォルトの名無しさん
2019/09/15(日) 10:56:43.80ID:+TjQqAK6
今となっては「auto_ptrはコンテナに入れるな」だの「vectorのメモリ領域が連続してると仮定するな」だのを
初心者に教える方が有害だと思う
48デフォルトの名無しさん
2019/09/15(日) 10:57:27.95ID:I9cvwq9U
基礎が全く出来てない単発だらけのこんなとこで聞くのが間違い
49デフォルトの名無しさん
2019/09/15(日) 12:29:28.22ID:qCqOeXfn
ビャーネを勧めるとかw

否定が多いスレ

猫とかやさしいでも、まずは読んどけ。
50デフォルトの名無しさん
2019/09/15(日) 13:03:00.40ID:o13gcpb2
>>34
最も大事なのは本人のやる気だ
モノになるか否かを本のせいにするようではそれがない

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

必要な情報は客観的事実でどっかの馬の骨の主張じゃない
解らんところをどう攻めるかも自分の頭で考えるのが大事だ
51デフォルトの名無しさん
2019/09/15(日) 13:17:14.19ID:d26DY9ov
>>34
stringとかをライトに使いたいのならサンプルコード探して真似るだけでもいいかと
ただ、stringやvectorがどういう仕組みで出来ているのかはいずれ理解する必要出てくるから
独習みたいな本を手元に置いといた方がいい(>>47みたいに古い本だと一部仕様が違ってたりするけど
52デフォルトの名無しさん
2019/09/15(日) 15:21:24.21ID:2F/PGB+Q
言っちゃなんだが、実際使ってみるっつーか
何かソフト書いて覚えるしかないと思うよ
参考書はネットに転がってる文献で十分でしょ
53デフォルトの名無しさん
2019/09/15(日) 15:29:29.02ID:WnktybSj
プログラミング勉強する前にコンピュータアーキテクチャ勉強しろ
54デフォルトの名無しさん
2019/09/15(日) 15:30:29.64ID:w00J0OPy
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デフォルトの名無しさん
2019/09/15(日) 15:53:13.28ID:58rKn0L9
using directiveにはnamespace以外にも用途があるからと思われ
5654
2019/09/15(日) 15:59:33.27ID:w00J0OPy
>>54
さっき、名前探索の「優先順位」に違いが出てくるからかもしれないと気付きました。
using-directive を書いた namespace よりも、その親や先祖となっている
namespace で名前が宣言されているかのよに振舞うということは、
その分、名前探索では優先順位が少し低くなります。このことによって
同名の名前が内側に宣言されていた場合、振る舞いが変わってきそうです。
57デフォルトの名無しさん
2019/09/15(日) 16:52:00.99ID:LMFjfaUx
>>39
ロヴェールはウンコ
58デフォルトの名無しさん
2019/09/15(日) 18:52:44.08ID:XPArYK5v
34です。
みなさん、ありがとうございました。
詳しい人多いですね。

stringとかを使えば、pythonやC#みたいに
使えるかなと思ったものです。
59デフォルトの名無しさん
2019/09/15(日) 21:18:39.85ID:zWVpxi69
C覚えたんならC++やらずに他の言語やってもいいんじゃね。と思った。
60デフォルトの名無しさん
2019/09/15(日) 22:33:44.86ID:2F/PGB+Q
他の言語なんかやめとけ
C++かそれが嫌ならRustにしとけ
ただRustは難しいからC++でいいだろう
61デフォルトの名無しさん
2019/09/16(月) 11:16:31.34ID:ViJ7kb/C
>>57
残念ながらc++に関してはそのうんこを超える入門書がないだわ。
62デフォルトの名無しさん
2019/09/16(月) 18:51:38.35ID:JVpNk5dm
今時本で勉強しているやつは時代遅れ。
情報が更新されるcpprefjp,cppreference等にかなうものはないのだ。
63デフォルトの名無しさん
2019/09/16(月) 19:14:58.26ID:GDraKDQQ
辞書と教科書は違う
64デフォルトの名無しさん
2019/09/16(月) 19:35:00.11ID:GUsgf22q
辞書がメインだよ
どっかの馬の骨はこう見ているというのは
あまり1つに囚われずに数多く見聞きして
誰もが口を揃えるのは何かを参考にする程度だ
65デフォルトの名無しさん
2019/09/16(月) 19:49:19.85ID:Bd17ulHe
やっぱ言語を作った人が書いた「プログラミング言語(言語名)」を読むのがとっかかりとしては一番良い
言語の設計思想が一番間違いのない形で書かれている(何しろ本人が書いたのだから
最新規格は差分で追えば宜しい

次点はオライリーのやつ「プログラミング(言語名)」
66デフォルトの名無しさん
2019/09/16(月) 20:12:19.52ID:ViJ7kb/C
>今時本で勉強しているやつは時代遅れ。
>情報が更新されるcpprefjp,cppreference等にかなうものはないのだ。
なるほど、こういう浅はかな輩がいることを考えるとまだまだ本の価値は下がらんな。
67デフォルトの名無しさん
2019/09/16(月) 20:17:58.22ID:Hp9aP4N/
でも今、本の値段が上がってるない?
昔はよく買ってたのに、9,800円ではちょっと躊躇してしまう。
68デフォルトの名無しさん
2019/09/16(月) 20:29:19.55ID:Xl3jboOR
間違いがあっても更新出来ないのは本の欠点やと思う
69デフォルトの名無しさん
2019/09/16(月) 21:59:17.57ID:sIsNtkL6
てか導入なら本がいいかもだけど、一度覚えれば更新はネットのコンテンツの方が良いからなぁ

最近仕様更新の頻度が高いから、
最新仕様に追従できている入門書でしかも実績のある奴なんてあるのかね?
70デフォルトの名無しさん
2019/09/16(月) 22:01:20.50ID:iDbWACrZ
やっぱgoogleで検索が最強だからな
71デフォルトの名無しさん
2019/09/16(月) 23:01:30.54ID:MvRcz04q
でもネットだと最新のものが上位に来やすく、しかも、そのサイトを書いている人は
新しいものを推奨しがちだが、本を読んでみると新しく入ったやり方より
古いやり方のほうが多くの場合には推奨される、ということが理由とともに
丁寧に説明されている場合もある。本を書いている人は経験豊富で、能力も
高い場合が多いのに対し、ネットで書いている人は必ずしもそうではないので
仮に結果は正しいことを書いていても、「理由」は間違っている場合などもある。
だから正しい見解を学びたいなら本の方がよいと思う。
例えばの話、本だと学歴や経歴なども分かって、それと本文の内容を
照らし合わせると「立場」「立ち位置」が分かって言外の内容が読み取れることもある。
72デフォルトの名無しさん
2019/09/16(月) 23:10:11.04ID:iDbWACrZ
本だと一人の人の考え方に偏りがち
73デフォルトの名無しさん
2019/09/16(月) 23:19:15.84ID:XEOx1c9f
本も読んでネットも見て自分で判断するんだよ
一つのソースに依存して信じ込むのはプログラミングの勉強に限らずなんでもダメ
74デフォルトの名無しさん
2019/09/16(月) 23:41:43.90ID:FH41VMpz
>>54
>の部分の正確な意味が分かりません。
訳「ボクは馬鹿です」

>全体が、
>「using-directive」であるという理解なのですが。
まあそのページの下の方にもそう書いてあるな
75デフォルトの名無しさん
2019/09/17(火) 00:06:57.73ID:e0hwvXZA
何の助けにもならず何の意味もない全く必要のないレス
76デフォルトの名無しさん
2019/09/17(火) 06:05:19.69ID:mC1Fem4G
cout << sizeof "abc";
これで4と表示されるから
文字列リテラルはポインタだなんて書いてるサイトもあるしな
77デフォルトの名無しさん
2019/09/17(火) 08:44:15.33ID:TMSCi5y8
そんなサイト、あるの?
78デフォルトの名無しさん
2019/09/17(火) 09:03:18.20ID:kyKgfAv0
sejukuの侍エンジニア塾ブログじゃねえの?

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

読んじゃいけないサイトのトップにランクインしてる
さっさと検索結果から消えてほしい
79デフォルトの名無しさん
2019/09/17(火) 11:47:19.71ID:hai8m3HY
いい加減だよな
うちは64bitだから8だぞ
cout << sizeof "Hello!!"
80デフォルトの名無しさん
2019/09/17(火) 12:04:06.87ID:MolJflMP
色々ツッコミどころがあるんだよねあれ

・C言語初心者はスクールがオフィシャルで出す解説を書くべきではない
・掲載前にはレビューするべき
・サイレント修正ではなく、お詫びと訂正を実施すべき
81デフォルトの名無しさん
2019/09/17(火) 17:38:47.21ID:IoM9hprN
>>65
82デフォルトの名無しさん
2019/09/17(火) 19:24:38.79ID:vP5fcRYP
実際糞記事読むくらいなら
ビャーネの本とかeffective modern c++読んだ方がよっぽど良い。
83デフォルトの名無しさん
2019/09/17(火) 19:31:26.02ID:u1m7mz7R
effectiveは古い
84デフォルトの名無しさん
2019/09/17(火) 19:34:51.97ID:u1m7mz7R
初心者には難しいし使ってる人には知ってることしか書いてない
85デフォルトの名無しさん
2019/09/17(火) 20:08:04.08ID:g1BlUkdv
>>84
極端だな。初心者が次のステップに進むにはちょうどいいだろう。
86デフォルトの名無しさん
2019/09/17(火) 20:26:03.45ID:vP5fcRYP
そうか?ここの連中なんてほとんど理解してるように思えんが。。
87デフォルトの名無しさん
2019/09/17(火) 22:10:10.83ID:txYKQrA6
あるグローバル変数を変更しているpublicメソッドA、Bがあります。
このグローバル変数の排他制御をするために

CCriticalSection cs;

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

void B()
{
CSingleLock lock( &cs, TRUE ) ;
...
}
このようにしようと思ったのですが、Aの中からBを呼び出しています。
どうしたらよいでしょうか?
88蟻人間 ◆T6xkBnTXz7B0
2019/09/17(火) 22:12:04.47ID:vrvr50SL
>>87
ロックカウンター変数
89デフォルトの名無しさん
2019/09/17(火) 22:15:18.09ID:D0xFlgCf
C++に限らないが仕様が膨大だから一冊の本にするのは無理があるのに
色々網羅して中途半端な本多いよな。特には和書は。
90蟻人間 ◆T6xkBnTXz7B0
2019/09/17(火) 22:21:08.25ID:vrvr50SL
カウント変数を追加し、ゼロで初期化。ロックがかかるときにカウントを1増やす。増やす直前にゼロだったら実際にロックする。ロックを解除するときにカウントを1減らす。ゼロになったら、実際にロックを解除する。
91デフォルトの名無しさん
2019/09/17(火) 22:23:33.48ID:cgXPZZnO
MZうyちゃーーーん♪こんなとこにいたのかw
92デフォルトの名無しさん
2019/09/17(火) 22:51:59.37ID:/ZgM52F4
>>87
同じスレッドでAの中からBが呼び出せるのは正常な動作です
逆に同じスレッドでAの中からBを呼び出したとき、Bでロックしてしまったら
誰がロックを解除するんですか?
93デフォルトの名無しさん
2019/09/17(火) 22:55:25.93ID:cgXPZZnO
ルンルン腹話術のお時間です(^ワ^)ワハハ!!
94デフォルトの名無しさん
2019/09/17(火) 23:02:25.13ID:iJB0hxCG
>>88
安易にそれ勧めない
まず再帰ロック不要な設計にするのが基本
95デフォルトの名無しさん
2019/09/17(火) 23:05:20.26ID:cgXPZZnO
問題集回しコピペワロタw
96デフォルトの名無しさん
2019/09/17(火) 23:06:00.71ID:TcK6H4+J
マイクロソフトがgithubにSTLの実装を公開してる。
どんどんオープンにしていくのな・・・

https://github.com/microsoft/STL
97デフォルトの名無しさん
2019/09/17(火) 23:08:28.20ID:cgXPZZnO
ガーガーバカw
98デフォルトの名無しさん
2019/09/17(火) 23:15:14.52ID:aYbHZN9j
>>92
それはwindowsのCRITICAL_SECTIONが再帰的ロック取得を認めているというだけで、
普遍的に通用する話じゃない。例えばstd::mutexを使った場合とかな。
>>87みたいなケースでは高階インターフェースのB()とinner_B()を分離するとかが常套手段だな。
99デフォルトの名無しさん
2019/09/17(火) 23:17:56.03ID:f5N3Fp86
サウンド鳴るようになったのか!
100デフォルトの名無しさん
2019/09/17(火) 23:22:32.62ID:/ZgM52F4
>>98
CCriticalSection
って書いてあるからCRITICAL_SECTIONの話では?
101デフォルトの名無しさん
2019/09/17(火) 23:23:20.44ID:f5N3Fp86
はい今日も完成品なしw
102デフォルトの名無しさん
2019/09/17(火) 23:35:00.33ID:aYbHZN9j
>>100
だからwindowsのCRITICAL_SECTIONなら通用する話だけど一般に通用する話じゃないってことだよ。
そういう環境だと

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

誰が解除するか心配する以前にBでロックを試みた時点で例外が飛んだりする。
103デフォルトの名無しさん
2019/09/17(火) 23:35:10.09ID:5UuHJcwd
recursive lock
104デフォルトの名無しさん
2019/09/17(火) 23:40:43.31ID:ZBXs33c7
>>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デフォルトの名無しさん
2019/09/17(火) 23:46:17.48ID:/ZgM52F4
>>102
それはWindowsのCRITICAL_SECTIONでは再ロック可能にしてある理由の説明なんですが
106デフォルトの名無しさん
2019/09/17(火) 23:47:40.49ID:ZBXs33c7
ジャヴァのsynchronizeとか再帰ロックオールOK
なんでかわ知らん
ていうかwait()をsynchronizeでかこわなけっればならないという
謎仕様
意味わからん…
107デフォルトの名無しさん
2019/09/18(水) 00:06:04.33ID:ccSwOulV
まあこんなクロージャとの組み合わせのときにちょっと意味があるのかもしれんが…
// 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デフォルトの名無しさん
2019/09/18(水) 00:06:06.17ID:WgADinsd
謎じゃない
condをどうやって実装するか調べてみ
109デフォルトの名無しさん
2019/09/18(水) 11:06:38.20ID:FwmyHFG9
BASIC未満のゴミw
110デフォルトの名無しさん
2019/09/18(水) 12:20:05.69ID:gxRTPgch
主語が足りてないぞチミ。
111デフォルトの名無しさん
2019/09/18(水) 12:54:00.14ID:1Vhu13ZT
algorithmだけで5000行あんのか
https://github.com/microsoft/STL/blob/master/stl/inc/algorithm
有り難くて目が潰れる
112デフォルトの名無しさん
2019/09/18(水) 15:09:43.97ID:cX0n8f6q
ファイルにテキストを書き込みする際に、
ファイルにどれだけ書き込んだかを取得してプログレスバー的な処理をしたいのですが、
どのようにして書き込んだ量を取得すればいいのでしょうか?
113蟻人間 ◆T6xkBnTXz7B0
2019/09/18(水) 15:14:37.40ID:d3y9L0GY
書き込んだバイト数の合計を数えるしかない。fprintfなら戻り値。文字列ならstrlen。
114蟻人間 ◆T6xkBnTXz7B0
2019/09/18(水) 15:19:25.37ID:d3y9L0GY
合計バイト数がわからない場合は最初に全部数えるか、バイト数の代わりに行数などを使う手もある。
115デフォルトの名無しさん
2019/09/18(水) 23:17:12.89ID:UKnFRk4i
頑張ってプログレスバーを実装したはいいがいざ実行すると
一瞬で表示が終り実装した意味あったのか・・と嘆く >>112 の未来の姿がみえる・・
116デフォルトの名無しさん
2019/09/19(木) 00:44:38.80ID:zP6ZrAr3
書き込んだ量を取得することより、書き込み総量を計算するほうが難しい
ですよね。特にプログレスバーが必要になるほどトータル時間の掛かる処理の場合
に正確な総量を計算するとなれば莫大な時間が掛かってしまう可能性が高くて。
だから推定量を何らかの方法で求めるしかない事が多いでしょう。
117デフォルトの名無しさん
2019/09/19(木) 01:08:08.89ID:pXxp02XD
いや足していくだけだけど
118デフォルトの名無しさん
2019/09/19(木) 01:11:02.88ID:b8NtymRi
つーかテキストだろ?ギガ単位のサイズじゃないんなら
一回メモリにバコバコ貯めといて一気にブワァーッと書くほうが早いよいろいろと
119デフォルトの名無しさん
2019/09/19(木) 01:23:42.33ID:wlX+Ifsh
だな
今のコンピュータなら数十MBくらいガバっと読み込んでいいのに、いまだに少しずつみたいな解説してる本やウェブサイト大杉
120デフォルトの名無しさん
2019/09/19(木) 06:29:12.29ID:TNTldw8V
プログレスバーとかユーザーの気を静めるためのインテリアみたいなもんなので
過度に精度に凝っても仕方が無い
例えばウィンドーズのファイルシステムで1フォルダに10万個ぐらいファイルがあって
それをリモートのウィンドーズのファイルシステムにコピーするとかな場合は
ファイルのトータル容量とか気にせずに
 進捗率(%) = 100 * コピーしたファイル数/10万個ぐらい
でも役に立つ
121デフォルトの名無しさん
2019/09/19(木) 06:32:56.13ID:1k0/HGmS
いやプログレスバーは「きちんと」「しっかり」作らないと
ユーザーのイライラゲージを却って煽ることになるぞ
122デフォルトの名無しさん
2019/09/19(木) 06:34:12.46ID:TNTldw8V
長らくぴくりとも動かなかったプログレスバーが一気に進んだとき
ユーザーに爽快感を与えることができうる
123デフォルトの名無しさん
2019/09/19(木) 07:48:55.38ID:FVuvug5W
>>122
自分でそれを見たらイライラするタイプだろう
124デフォルトの名無しさん
2019/09/19(木) 08:27:53.76ID:UG8ew1B1
99%で止まるやつはイライラするな。
進捗率よりも、書き込んだバイト数とか表示してくれると動いてるのがわかるから好きだな。
125デフォルトの名無しさん
2019/09/19(木) 08:40:01.59ID:X+5OT7FX
>>121
windows update
126デフォルトの名無しさん
2019/09/19(木) 23:28:31.87ID:TdUlR93V
progress_displayたん…どうして死んじゃったの…
127デフォルトの名無しさん
2019/09/20(金) 08:56:12.04ID:Qo6+tgpY
全支店のファイルを集計するツール作った時
九州支店とか遠方の支店に入ると突然90%とかから進まなくなって
イライラおじさんに「なら最初から期待させるな」みたいなお説教された思い出

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

きちんとやるなら面倒だけどやるしかないよな
それとも運用方法の変更なりで逃げるか
プログレスバーの工数見積り怖い・・・
128デフォルトの名無しさん
2019/09/20(金) 09:04:34.21ID:Qo6+tgpY
処理中のファイル名をリアルタイム表示して
進捗率の方はあくまで参考値という体にする手もあるか
あとは費用対効果を説明してこれで我慢してもらう交渉でって感じで
キャンセルボタンも付けるべきだよな上司はイランて言ってたけど
129デフォルトの名無しさん
2019/09/20(金) 09:12:44.78ID:hmm5+Tdj
プログレスバーの下に店名と店長の名前表示すりゃいいじゃん
130デフォルトの名無しさん
2019/09/20(金) 09:29:35.36ID:JFYTR1x6
その支店に接続するのにかかった時間を計測しておいて
それをベースに表示してみたら
131デフォルトの名無しさん
2019/09/20(金) 10:44:26.44ID:BhKigXRx
接続先と毎秒の処理したバイト数でも表示すればいいんでね。
132デフォルトの名無しさん
2019/09/20(金) 11:11:25.39ID:Qo6+tgpY
>>129
店長の名前は関係ないだろ
うっかり考え込んでしまったわ
133デフォルトの名無しさん
2019/09/20(金) 11:36:45.41ID:hmm5+Tdj
クレーム先だよ
なんなら電話番号も出せばいい
134デフォルトの名無しさん
2019/09/20(金) 12:02:27.62ID:l/kiVjID
ロード中にテトリスで遊べるようにしておけばいいよ
135デフォルトの名無しさん
2019/09/20(金) 14:12:27.16ID:RTklMOF0
>>134
それたしかナムコが特許もってたような
136デフォルトの名無しさん
2019/09/20(金) 14:57:59.95ID:
とっくに消滅してる
137デフォルトの名無しさん
2019/09/20(金) 18:37:33.58ID:xrPkbjYn
あるクラスのインスタンスを生成するときに、必ずあるメンバを初期化してほしいとします。
このとき、コンストラクタで初期化することにしたのですが、初期化は必ずやってほしいためデフォルトコンストラクタは禁止したいです。

デフォルトコンストラクタを禁止するのはどうやりますか。
138デフォルトの名無しさん
2019/09/20(金) 18:43:14.50ID:MFrl2Bhu
deleteすりゃいいじゃん。これ以上は言わぬ
139さまよえる蟻人間 ◆T6xkBnTXz7B0
2019/09/20(金) 19:02:34.17ID:sJdfK6qv
>>137
モダンなやり方は = delete;だろう。

古臭いやり方はprivateにして定義を書かないようにすれば、アクセスできないようになる。
140デフォルトの名無しさん
2019/09/20(金) 19:30:48.34ID:HuG+DEnO
5年ぐらい前に失効してたのか・・時の流れるのは早いのう
https://automaton-media.com/articles/newsjp/loading-screen-mini-games-patent-will-be-expired-at-united-states/
141デフォルトの名無しさん
2019/09/20(金) 19:32:15.62ID:mfXfj+Qu
どうでもいいがC++界隈はハチミツギョーザとか蟻人間とか
なかなかユニークなコテが多い印象
142デフォルトの名無しさん
2019/09/20(金) 19:58:49.42ID:xrPkbjYn
>>138-139
ありがとうございます。
やりたいことそのものです。
143デフォルトの名無しさん
2019/09/20(金) 21:54:40.66ID:Q9EEZSVd
キャンセルボタンなしの進捗ダイアログ表示して安心してたらESCキーで閉じられて不正動作
144◆QZaw55cn4c
2019/09/21(土) 12:33:44.52ID:HPdvwX1r
>>141
「蟻人間」のコテは最近それに改名されたものですよ…
145デフォルトの名無しさん
2019/09/21(土) 17:28:53.63ID:hvfc00gO
Visual Studio 2019 C++ community editionを使用して
PythonをC++で使いたいのですが、

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

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

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

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

重ねての質問になるのですが、
#pragma 等で相対パスを使用する際に、
相対パスが連結している場合はどう対処すればいいのでしょうか?
148デフォルトの名無しさん
2019/09/21(土) 18:54:54.04ID:B7P1QhOW
ライブラリをソリューション相対指定可能なフォルダに置いて
Visual Studioの定義済みマクロ($(SolutionDir)なり$(ProjectDir)なり)を正しく使えば良いだけの話なのでは…

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

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

いじょ 耕運を祈る、
149デフォルトの名無しさん
2019/09/22(日) 06:52:19.04ID:wJwJ26l5
std::variantってテンプレートによる静的ポリモーフィズムを実現しつつ一つのコンテナで管理したいという要求から生まれたんでしょうか
であるとしたら今後継承による動的ポリモーフィズムは下火になっていくのでしょうか
150デフォルトの名無しさん
2019/09/22(日) 10:30:22.84ID:dVD4vVZj
variantは共用体の代わり
151デフォルトの名無しさん
2019/09/22(日) 22:04:08.49ID:P121omqV
> std::variantってテンプレートによる静的ポリモーフィズムを実現
継承もstd::variantも実際に格納されている型が実行時まで分からないのだから、
静的(コンパイル時)ポリモーフィズムにはならないのでは?
152デフォルトの名無しさん
2019/09/23(月) 00:26:21.21ID:7kwjfJuy
gcc, clang, VC++, その他
仕事で使われるのはどれ?
153デフォルトの名無しさん
2019/09/23(月) 00:50:57.87ID:QJYuDw18
>>152
gcc, clang, VC++
154デフォルトの名無しさん
2019/09/23(月) 01:06:32.53ID:4WIp5ctr
intelも使われるし、C++ Builderも使われてる
155デフォルトの名無しさん
2019/09/23(月) 01:21:58.30ID:7kwjfJuy
仕事でC++14より上使っている?
156デフォルトの名無しさん
2019/09/23(月) 03:12:30.92ID:aMvJGSmY
iccって高いだけで性能もgccとほぼ変わらないなら値段に見合う利点あるのか?
157デフォルトの名無しさん
2019/09/23(月) 09:16:12.73ID:QJYuDw18
メニーコアなCPUとSIMDを使ったときのプロファイラが優秀
おそらく
158デフォルトの名無しさん
2019/09/23(月) 11:42:56.67ID:rVs/BJT1
普通に17使うだろ
filesystemやvariant,optional使わんの?
159デフォルトの名無しさん
2019/09/23(月) 11:57:29.62ID:f1jovMGd
だよな
160デフォルトの名無しさん
2019/09/23(月) 12:02:46.51ID:P5eYiou7
お仕事だとそうぽんぽんバージョンあげられないし
使っていい標準ライブラリのしばりもあったりするんですよ
特にプラットフォーム抽象する系はあんまり使わない
そんなのにべったり頼るぐらいならc++でなくてよくね?ってなる
161デフォルトの名無しさん
2019/09/23(月) 12:08:09.26ID:rVs/BJT1
最近はmsvcがバイナリ互換保ち続けているから安心してあげられる。
gccやclangはもともと対応早いから安心だったし。
162デフォルトの名無しさん
2019/09/23(月) 12:19:16.90ID:f1jovMGd
>>160
filesystem使って見た?
まだ荒削りで所々変なところがあるけど
方向性としてはいい線ついてると思うぜ
163デフォルトの名無しさん
2019/09/23(月) 12:24:31.61ID:EI75oq0E
あ、こいつバギーなライブラリ入れて現場荒らすタイプだわw
164デフォルトの名無しさん
2019/09/23(月) 12:31:48.66ID:rVs/BJT1
勝手にライブラリ追加できる時点で糞みたいな職場じゃね
165デフォルトの名無しさん
2019/09/23(月) 12:47:46.83ID:f1jovMGd
難癖つけるのは構わんが
脇が甘いぞおまえら
166デフォルトの名無しさん
2019/09/23(月) 13:15:30.01ID:WS0TgAIm
まあケースバイケースだろ
ポンポンバージョン上げられないって言うだけで古い環境使い続ける職場もどうかと思うし
167デフォルトの名無しさん
2019/09/23(月) 13:21:49.79ID:P5eYiou7
>>162
ファイルシステムまわりはこてこてにネイティブ依存の内製のものがあるので出番はないでしょうね
パフォーマンス第一の仕事なもので
あと標準ライブラリはデバッガやプロファイラのことがスコープ外なのでそのあたり自分達で整備しないと採用できないってのもある
168デフォルトの名無しさん
2019/09/23(月) 13:33:54.17ID:f1jovMGd
なるほどね
パフォーマンス第一か
どっちかつーと標準なんぞ糞くらえつーか
標準の意味が違ったりするわけか
169デフォルトの名無しさん
2019/09/23(月) 14:04:13.62ID:JqkYM16h
同じじゃん標準ライブラリは一般性重視故に特定の問題領域において必ずしも最高の性能は発揮しない(最高の性能となる保証がない)ことは確定的に明らかよって80-20の法則の80部分からパフォチューしていく
170デフォルトの名無しさん
2019/09/23(月) 14:07:39.82ID:QJYuDw18
頭悪い書き込みしか無くて草
171デフォルトの名無しさん
2019/09/23(月) 14:31:50.86ID:JqkYM16h
天 才 現 る
172デフォルトの名無しさん
2019/09/23(月) 22:59:04.40ID:EI75oq0E
てかc++でやることじゃねーだろどう考えても。
糞の役にも立たんわ。
173デフォルトの名無しさん
2019/09/24(火) 00:22:06.58ID:iXMkuGmM
C++でやる事って何よ?
174デフォルトの名無しさん
2019/09/24(火) 01:05:00.80ID:blreVUO1
templateで遊ぶくらいしかやることないね。
175デフォルトの名無しさん
2019/09/24(火) 06:38:35.03ID:3E9gAKbz
仕事がないって話はマ板でやんな
176デフォルトの名無しさん
2019/09/24(火) 18:32:13.78ID:9F3bEWFD
汎用性・可搬性を重視するかパフォーマンスを重視するかのスタンスの違いだけでしょ
177デフォルトの名無しさん
2019/09/24(火) 19:39:45.71ID:bRBDEgqh
>>173
filesystemみたいなライブラリの実装。
178デフォルトの名無しさん
2019/09/24(火) 20:52:11.47ID:ZtSwhx8Z
visual studio 2019 16.3でついにconceptが使えるように(赤線でるけど。。。
179デフォルトの名無しさん
2019/09/25(水) 00:19:35.27ID:T/Q1Hzp4
conceptはいい
人類は真の抽象化を手にする
180デフォルトの名無しさん
2019/09/25(水) 00:39:03.31ID:0gY/IvgH
C++98の俺には1ミリも関係ない話だな。
181デフォルトの名無しさん
2019/09/25(水) 00:43:58.99ID:ROl8Z6BD
じゃあ出て行け
182デフォルトの名無しさん
2019/09/25(水) 01:15:27.21ID:zpsuJSx5
98とかVB6と同レベルの化石
183デフォルトの名無しさん
2019/09/25(水) 16:32:45.50ID:5aP+8CuP
>>181
お前が出て行け
184デフォルトの名無しさん
2019/09/25(水) 21:10:30.42ID:065+eRsw
じゃあ俺が
185デフォルトの名無しさん
2019/09/25(水) 21:20:37.77ID:SmUxqnJ3
いやおれが
186デフォルトの名無しさん
2019/09/28(土) 01:40:31.76ID:cIYNjYIc
重複スレの方が謎の盛り上がり
187デフォルトの名無しさん
2019/09/28(土) 02:11:00.78ID:intFUv+k
void君はあのスレから出られないからな
188デフォルトの名無しさん
2019/09/28(土) 14:48:43.27ID:nKwEArCO
このスレはwinapiを扱ってますか?
sendmessageとか。
189デフォルトの名無しさん
2019/09/28(土) 16:09:42.06ID:EwMBvois
>>188
Win32API質問箱 Build125 :
http://2chb.net/r/tech/1551247748/l50
190◆QZaw55cn4c
2019/09/28(土) 16:12:26.72ID:QJtrgyVU
>>188
win32api ならやってる人は少なからず居ると思います
191デフォルトの名無しさん
2019/09/28(土) 16:37:07.73ID:nKwEArCO
>>190
サンクス!
192デフォルトの名無しさん
2019/09/29(日) 07:24:31.34ID:wVCOjSn/
文法とか開発思想の初歩的な質問なんだが、例えば最大流問題を解くプログラムと最小費用流問題を解くプログラムで「Edge」という構造体や「dfs」という関数の意味を変えたいときに使うのが名前空間だという理解でOK?
(関数の意味を変えたいだけなら名前空間じゃなくて別のクラスを用意すれば良いだけかな?)


あと、名前空間の中でグローバル変数を使うのは通常のグローバル変数と同じで慎重にやった方が良い(と言われてる)?
例えば最小費用流問題を解くときに経路の情報を記録したりするんだが、この経路を mincostflowという名前空間におけるグローバル変数にするとか
193デフォルトの名無しさん
2019/09/29(日) 09:01:23.18ID:thkZayt3
名前空間は名前をまとめるだけであって隠蔽したり上書きしたりする機能はない
素直にクラス使え
194デフォルトの名無しさん
2019/09/29(日) 10:02:14.52ID:sih8o/+S
>>192
そのくらいのプログラムでは名前空間は使わない方がいい。
使うべきなのはクラス。
195デフォルトの名無しさん
2019/09/29(日) 10:24:44.95ID:MP9GBJ11
いや同じ識別子を違う意味で使いたいのなら名前空間だ
名前をどうかしたいというだけでクラス化するといらん制限がかかって邪魔なだけ
196デフォルトの名無しさん
2019/09/29(日) 10:27:55.39ID:lvoGL429
>>192
その例では明らかにグローバル変数を使う必要はない。
「最小費用流を解くクラス」のメンバに押し込めるのが普通だと思われる。
197デフォルトの名無しさん
2019/09/29(日) 12:21:02.27ID:xopwPRlT
名前空間は一連の処理や機能をライブラリとしてまとめるときに他のライブラリと名前衝突しないようにするためのものだ
minとmaxの違いだけなら名前空間分けずに変数名や関数名に直接反映させればいいのでは
198デフォルトの名無しさん
2019/09/29(日) 15:27:39.30ID:sih8o/+S
>>197
個人的には自分もそう理解しています。
自分が作るプログラムでは namespace は基本的に使う必要はほぼ
有りません。古い時代に既に作ってしまったプログラムで名前が衝突して
困るような場合に使うと便利な機能として登場したのではないかと思っています。
199デフォルトの名無しさん
2019/09/29(日) 15:31:08.94ID:MP9GBJ11
せっかくの回避策をマクロでばっちり透過してくれた素敵なマイクロソフトw
200デフォルトの名無しさん
2019/09/29(日) 16:03:17.31ID:k4CvVXqN
>>198
昔作ったものに対してだけでなく、いま作ったものが将来使うときに名前の衝突を回避するという目的もあるぞ。
201デフォルトの名無しさん
2019/09/29(日) 16:52:41.21ID:1aVYpaid
なぜ日本人c++プログラマの99%はstd::vectorもstd::find_ifも見たことすらないのだろう。
c言語風の生ポインタ、生配列、if文、for文のみを使ったプログラムしか読めない。
外国の人でそういう人は見たことがない。
202デフォルトの名無しさん
2019/09/29(日) 17:03:09.76ID:bY9zxDl0
99%は盛り過ぎでは・・・
203デフォルトの名無しさん
2019/09/29(日) 17:06:09.85ID:cKDPFQQS
>>201
ワイド文字知らん人見たことあるわ
204デフォルトの名無しさん
2019/09/29(日) 17:28:35.45ID:TRtZnyIq
体感で8割ぐらいかな
まず規格があって改訂されてるってことも知らないのもいる

これは他の言語にも言えることだが
職場で使ったことのあるJavaやPHPのバージョンと環境がすべてみたいな
205デフォルトの名無しさん
2019/09/29(日) 17:37:04.15ID:MP9GBJ11
>>201
おまえ豚小屋にでも住んでるのか?w
206デフォルトの名無しさん
2019/09/29(日) 17:38:36.19ID:MCSEZmay
C++20に入るauto変数を使った簡易関数テンプレートは宣言と実装を分割してコンパイルできますか?
207デフォルトの名無しさん
2019/09/29(日) 18:02:01.75ID:xopwPRlT
全部ヘッダーファイルに書いてしまえ
208デフォルトの名無しさん
2019/09/29(日) 18:13:05.80ID:Lkb9fNY1
vector知らんのはいたとしても組み込みマンくらいだろ
209デフォルトの名無しさん
2019/09/29(日) 19:02:41.77ID:bY9zxDl0
>>206
多分戻り値型と同じで、1つの翻訳単位内ならできると思う
宣言だけヘッダに書いたりするとautoのままだと呼び出せない
210デフォルトの名無しさん
2019/09/29(日) 19:46:49.92ID:qdFsd7WD
>>208
組み込みマンはC言語だろ
C++使っててstd::vector知らないのは流石に勉強不足
211デフォルトの名無しさん
2019/09/29(日) 19:56:43.66ID:MCSEZmay
>>209
ありがとう
やっぱだめか
212デフォルトの名無しさん
2019/09/29(日) 21:36:43.15ID:MP9GBJ11
>>210
組み込みマンだからprinf知りませんみたいなもんだなw
213デフォルトの名無しさん
2019/09/29(日) 21:44:06.01ID:xcXauKC9
vectorの存在は知っていても中身は知らんやつばっかだろ
いまだに生配列の方が速いとか言ってるやついるし
214デフォルトの名無しさん
2019/09/29(日) 21:51:00.97ID:lvoGL429
まあ実際計ってる奴はそんなにはいないわな。
てきとうな演算するくらいなら配列だろうとvectorだろうとほとんど変わらん
(ただしコンパイルオプションによる。
O2 ならそんな変わらんが最適化しないとvectorは本当に遅い。)
215デフォルトの名無しさん
2019/09/29(日) 21:57:52.25ID:OYiClG3B
まあ最適化有効にすれば、すればそこいらの玄人が生配列でごちゃごちゃ書くより速くなることが多いがな
216デフォルトの名無しさん
2019/09/29(日) 22:09:42.47ID:7KCLRAec
サイズを変えない操作でvectorと生配列の効率に違いなんかないだろ
217デフォルトの名無しさん
2019/09/29(日) 22:16:27.22ID:C35/CdkS
ただ最近のc++の最適化前提のスタンスはいただけないな
デバッグのためにデバッグビルド使おうとするが一桁二桁遅くなって実用に耐えないとか
問題再現できないとか多々あって困る
218デフォルトの名無しさん
2019/09/29(日) 22:58:28.58ID:UVnMNq40
>>217
そういうのはコンパイラベンダに言わないと変わらないでしょ。
言語規格としては知ったことではない。
219デフォルトの名無しさん
2019/09/29(日) 23:03:53.99ID:7KCLRAec
もし最適化の有無で速度の変わらないコードがあったとしたら、まず間違いなく人が読めるものではないだろうな
220デフォルトの名無しさん
2019/09/29(日) 23:06:55.39ID:C35/CdkS
こういう開き直りのスタンスって何か固有名詞ついてなかったっけ?
マッチポンプではないし・・なんかなかったかな?
221デフォルトの名無しさん
2019/09/29(日) 23:10:51.16ID:C35/CdkS
>>219
Cはコードはそこまでひどく遅くならないからね
222デフォルトの名無しさん
2019/09/29(日) 23:28:02.53ID:bY9zxDl0
そのおかげで実行時の速度と抽象化した書き方の両立ができるのでまあ仕方ないのでは
223デフォルトの名無しさん
2019/09/29(日) 23:34:47.03ID:C35/CdkS
仕事でやってるので仕方ないで済まないんですよね
かつ遅いところは自分達では手が入れられないところだったり
こういうところ共感できる人いないのかな
224デフォルトの名無しさん
2019/09/29(日) 23:37:19.27ID:SfsnISLI
>>217
良いPC買え
225デフォルトの名無しさん
2019/09/29(日) 23:39:36.92ID:C35/CdkS
>>224
10、100倍遅い問題がPC買い替えてなんとかなると思います?
あと使ってるPC結構いいスペックですよ
開発環境には金かけてくれる会社なんで
226デフォルトの名無しさん
2019/09/29(日) 23:53:13.21ID:7KCLRAec
仕事でやってようと高水準言語とはそういうものなのだから仕方ないものは仕方ない
仕方ないで済まされないなら仕事をやめるしかない
仕事は不可能を可能にするものではない

そんなに最適化が気に入らないなら最適化なしでリリースすりゃいい
プロダクトとデバッグ環境が同一になる
227デフォルトの名無しさん
2019/09/29(日) 23:55:18.86ID:lvoGL429
仕方ないで済まないのでc++使わずc使うっていう話だな。
そこまで無理してc++を使う必然性はない。
結局組み込み系で行われる判断というのはそういったものなんだろう。
228デフォルトの名無しさん
2019/09/29(日) 23:56:29.88ID:SfsnISLI
じゃあ使わなければいい終わり
苦行を強いられているなら文句を言わずに甘んじて受け入れてくれうざい
デバッグができないくらい時間がかかるのであればデバッグ用にデータを減らすかデバッガを使わずにデバッグすればいいだけ
229デフォルトの名無しさん
2019/09/30(月) 00:01:41.09ID:1t7BL5a5
c++の問題を指摘したら自分が否定されてる気持ちになる人ですね?
こういうのって何か固有名詞ついてましたよね?
心理学かなにかの
230デフォルトの名無しさん
2019/09/30(月) 00:07:48.80ID:K1luVxXx
自分以外は仕事でC++使ってないと思ってるのかねえ
231デフォルトの名無しさん
2019/09/30(月) 00:12:05.55ID:d3KN1ocd
C++の問題ではなく、トレードオフなものを両取りできないことに腹を立てている馬鹿の頭が問題
232デフォルトの名無しさん
2019/09/30(月) 00:29:11.50ID:BjVWgoML
debugバージョンでもinline有効にすれば良い
233デフォルトの名無しさん
2019/09/30(月) 00:41:06.86ID:BjVWgoML
gccなら-Ogとか使えば楽
234デフォルトの名無しさん
2019/09/30(月) 08:38:56.00ID:96lznZkD
>>217
問題再現できないのってUB踏んでるんじゃ...
235デフォルトの名無しさん
2019/09/30(月) 20:10:40.43ID:m19D9tLr
c++ほどサンクコストに引っ張られる輩を作り出す言語はないだろうな。
236デフォルトの名無しさん
2019/09/30(月) 20:22:13.77ID:H9c5jpU6
つまり他の言語は底の浅いオモチャ、と
237デフォルトの名無しさん
2019/09/30(月) 20:56:24.52ID:m19D9tLr
そんな掘ってもしょうがないところが深くても邪魔なだけなんだよ。
238デフォルトの名無しさん
2019/09/30(月) 21:49:42.53ID:A2h+ApYr
あっさ
239デフォルトの名無しさん
2019/09/30(月) 21:53:05.92ID:eLbbGbO7
速度や効率を度外視すれば実はプログラミングはものすごく簡単になることが多い。
ところがそれだと劇的に遅くなってしまう。うまく工夫して書かれたプログラムの
所要時間を1とすると、何にも考えずに書かれたプログラムの所要時間は、
100兆位になることがある。そこまで極端でないにしても何にも考えなければ
100位にはなる。その意味で高速化を常に意識しながら組むことは結構
大切な事だと思う。特にアルゴリズム的な部分においては。
240デフォルトの名無しさん
2019/09/30(月) 22:05:07.81ID:JjfJ0hCF
アルゴリズム的に改善できる話なら言語関係ないじゃん
241デフォルトの名無しさん
2019/09/30(月) 22:28:45.63ID:29SpHEC8
固定少数が速いとかdoubleよりもfloatが速いとか割算は遅いから掛け算だとか色々な噂聞いたけど・・・

今時ほとんど変わらんよね?
242デフォルトの名無しさん
2019/09/30(月) 22:34:03.50ID:/hygPyRQ
>>241
実際測ってみりゃいいよ
243デフォルトの名無しさん
2019/09/30(月) 22:48:36.98ID:ypiuCBLp
その時のためのtemplateです。
244デフォルトの名無しさん
2019/09/30(月) 23:07:55.69ID:ypiuCBLp
https://ideone.com/p9ISAq
これなんで通らんのやろう?
コード補完で読み切れないのはいいけど、コンパイラさんは読めても良いのでは?
245デフォルトの名無しさん
2019/09/30(月) 23:15:32.33ID:d3KN1ocd
class A :public T...{
にすりゃ通る
246デフォルトの名無しさん
2019/09/30(月) 23:19:40.15ID:d3KN1ocd
もしくは
struct A :T...{
継承元にアクセスできんのが原因
247デフォルトの名無しさん
2019/09/30(月) 23:29:43.59ID:ypiuCBLp
>>245-246
あ、俺環だったか。
マジで通った。。。@vc

https://ideone.com/Eahhnl
248デフォルトの名無しさん
2019/09/30(月) 23:42:29.68ID:ypiuCBLp
>>247
自分で作っておいてあれだが、なにに・・・つか・・・えるん・・・だ・・・。ぐああああ。
考えれば考えるほどもやもやする。
249デフォルトの名無しさん
2019/09/30(月) 23:50:49.59ID:ypiuCBLp
ヴェーダに接続するときに使うんかいな。とかおかしなことしか思い浮かばねー。
250デフォルトの名無しさん
2019/10/01(火) 10:39:26.07ID:SeWV7ZFb
>>217
この場合に A<B,C,D>とした場合、public T... の部分は、
public B, public C, public D
と展開されるんでしたっけ?
251デフォルトの名無しさん
2019/10/01(火) 15:52:31.87ID:vnyPyC//
>>193-194,196
では、Edgeという名前の構造体の定義を問題によって変えたいときはどうすれば良いですか?
252デフォルトの名無しさん
2019/10/01(火) 21:48:01.50ID:9tGbOXPW
>>241
今どきのプロセッサではdoubleは速いよ
doubleは専用チップ積んでるから。floatはdoubleに内部的に変換かけられるから、原理的にdoubleより速くはならない
253デフォルトの名無しさん
2019/10/01(火) 21:50:51.00ID:sOAgszt0
いや、今時のプロセッサはSIMDで不動小数点演算するからdoubleよりfloatの方が速いよ
演算やプロセッサによるが、大抵2~4倍差が出る
254デフォルトの名無しさん
2019/10/01(火) 23:04:08.95ID:+hOGjxeQ
floatが早い今どきのプロセッサってGPUの話か?
ちゃんと区別しろ
255デフォルトの名無しさん
2019/10/01(火) 23:06:13.36ID:geI6I9WY
直前の計算結果を次の計算で使うようなありがちな状況だと、SIMDじゃ一切早くならないのでは?よく知らんけど
256デフォルトの名無しさん
2019/10/01(火) 23:06:54.09ID:sOAgszt0
x86とかも典型的だろ
doubleよりfloatの方が倍速いよ
最近はbfloat16の方がさらに速いまである
257デフォルトの名無しさん
2019/10/01(火) 23:26:39.35ID:5ranOfZi
SIMDで1語で複数のfloat演算を並列にやったら早くなる
しかしコンパイラの最適化が普通はそこまでやってくれない
258デフォルトの名無しさん
2019/10/01(火) 23:28:12.34ID:DRbEIshC
今はfloatのが速い
amd64出てからsse基本なので
昔とは状況が違う
259デフォルトの名無しさん
2019/10/01(火) 23:28:49.51ID:DRbEIshC
>>257
やるけど
260デフォルトの名無しさん
2019/10/01(火) 23:30:04.90ID:5ranOfZi
>>259
やるんか?
261◆QZaw55cn4c
2019/10/01(火) 23:32:20.09ID:3zNRBOOL
>>253
1個のプログラムの中に一個か二個の float しか使わなくても、 double の場合より速くなるのですか?
そもそもイントリンシックを書かないのに SIMD のコードが出力されるのですか?

私は、コンパイラは fpu のコードしか吐かないじゃないか?って考えています
262デフォルトの名無しさん
2019/10/01(火) 23:37:45.74ID:KZgN44vw
>>261
それはお前の頭が老害だから
263デフォルトの名無しさん
2019/10/01(火) 23:39:09.19ID:84uW7JaU
速さ計測すればいいじゃん
逆アセンブル見ればいいじゃん
264◆QZaw55cn4c
2019/10/01(火) 23:40:49.69ID:3zNRBOOL
>>262
1個のプログラムの中に一個か二個の float しか使わなくても、 double の場合より速くなるのですか?
そもそもイントリンシックを書かないのに SIMD のコードが出力されるのですか?
265デフォルトの名無しさん
2019/10/01(火) 23:44:09.36ID:sOAgszt0
そもそもx64ではFPUは無かったことにされている
doubleやfloatの計算したかったらSIMDで1レーンだけ使って計算する仕組み
266デフォルトの名無しさん
2019/10/01(火) 23:54:05.20ID:5ranOfZi
>1個のプログラムの中に一個か二個の float しか使わなくても、 double の場合より速く
その条件だとどっちを使っても良い大して変わらん

やっぱループアンローリングできるぐらいループリッチな課題でないと意味が無い
https://www.isus.jp/products/c-compilers/compiler_part2/
https://cpplover.blogspot.com/2015/03/blog-post_30.html
267デフォルトの名無しさん
2019/10/02(水) 00:10:27.89ID:eo8nmuYy
しかしコンパイラの最適化はイマイチっぽい
https://www.isus.jp/products/c-compilers/compiler_part4/
268◆QZaw55cn4c
2019/10/02(水) 07:48:44.41ID:BafSfR+Q
>>265
いいえ x64 でも fpu コードは使えますよ、嘘はやめて!
269デフォルトの名無しさん
2019/10/02(水) 07:54:44.99ID:Y2eIpMbX
>>228
こういうやつって何かしらソフト完成させたこともない初心者のクセしてイキってるんだろ
マジ邪魔だから消えて欲しい
テンプレート使ったコードで遅くなるというのがわからんならboostのspiritとか使ってみたらいいわ
言ってる意味わかるから
270デフォルトの名無しさん
2019/10/02(水) 07:59:03.00ID:Y2eIpMbX
あ、もちろんデバッグビルドの話な
最適化ありならspiritは当然速い
271デフォルトの名無しさん
2019/10/02(水) 08:01:33.95ID:sddCZQNP
C++を使わないと言っているやつに、どうぞご勝手にということと何の関係が?
272デフォルトの名無しさん
2019/10/02(水) 08:22:40.25ID:QmwKmz4W
>>268
でもアセンブラで直接使わないと無かったことにされるだろ
273デフォルトの名無しさん
2019/10/02(水) 08:29:18.29ID:0zoKeqvU
>>261
amd64でfpuコード吐かせるほうが手間じゃwwww
274デフォルトの名無しさん
2019/10/02(水) 08:30:44.39ID:0zoKeqvU
そもそもプログラム中に一個か二個の浮動小数点演算なんて最適化ポイントちゃうがなwwww
自説を通すためにバカな例を仮定するアホに絡むだけ無駄やなw
275デフォルトの名無しさん
2019/10/02(水) 11:21:30.36ID:iITLzrzf
>>272
プロジェクトの設定でfpも選べるよ
既定だとsse使われると思うけど
276デフォルトの名無しさん
2019/10/02(水) 22:05:22.14ID:VK3sSC9+
コンパイラの種類変わったら算術演算ぶん回す場合は結構差が出るだろうけど、同じコンパイラでバージョンかわると最適化とかの進化で結構かわるのかな?
gccの3と4、msvcの2005と2017とかそういう違いで
277デフォルトの名無しさん
2019/10/03(木) 04:57:05.82ID:vAL7lUst
質問です
既にクラス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() {}
}

詳しい方がいたら教えていただきたいです
これ以外の賢いやり方があればそれでも大丈夫です
278デフォルトの名無しさん
2019/10/03(木) 07:04:32.42ID:damPur2/
絶対に、の理由が知りたいところだけど、普通はA_funcを仮想関数にしてBは空関数でオーバーライド。
279デフォルトの名無しさん
2019/10/03(木) 07:05:22.94ID:OJdSM3QH
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();
  }
}
}
280デフォルトの名無しさん
2019/10/03(木) 07:12:55.92ID:OJdSM3QH
std::is_same<T,A> じゃなくて std::is_same_v<T,A> か
281デフォルトの名無しさん
2019/10/03(木) 07:31:04.45ID:5EMHpFEj
>>278
HogeがAかBを継承するんだからそれじゃだめやろ
ただ設計見直したいところだけどそういうわけにもいかんのかね
282デフォルトの名無しさん
2019/10/03(木) 07:54:23.64ID:r73Y/293
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> { /*...*/ }
283デフォルトの名無しさん
2019/10/03(木) 09:13:02.91ID:r91xqmRv
>>281
なにか問題起きる?
284デフォルトの名無しさん
2019/10/03(木) 11:57:14.92ID:z1c5xmGq
>>277
基底クラスを切替たいってこと?
しかも片方の基底クラスにしかないメソッドを派生クラス側で呼出すとかどんな状況なんだろう…
まあ、やっつけでやるなら素直にB側に空のメソッド追加しとけばいいと思うよ
どう見てもまともな設計じゃなさそうだし、かと言って設計を見直すこともできなさそうだしね
プリプロセッサなんて愚の骨頂にしかならん
285281
2019/10/03(木) 12:22:59.66ID:GJuckdYX
>>283
A_funcを持つものを継承するならオーバーライドが理想的だろうけど、基底がAかBってことだから無理っしょ
しかもAは書き換えられないときてる

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

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

それだと修正箇所が多すぎるのかもしれんけど
286デフォルトの名無しさん
2019/10/03(木) 13:00:06.78ID:t4NBMq8s
こんなマトモじゃないケースに
ベストな解答なんかないわな
287デフォルトの名無しさん
2019/10/03(木) 13:00:33.56ID:YSTER/9m
>>284
Qtをdisってんの
288デフォルトの名無しさん
2019/10/03(木) 15:51:04.04ID:z1c5xmGq
まさかと思うがQtを盲信してるのか?w
289デフォルトの名無しさん
2019/10/03(木) 16:04:15.58ID:LjcEi/T6
ちょとっ猛進
290デフォルトの名無しさん
2019/10/03(木) 16:37:32.38ID:vAL7lUst
回答ありがとうございます
プリプロセッサまみれになるより空の関数生やした方が見通しよさそうですね
291デフォルトの名無しさん
2019/10/03(木) 18:04:25.67ID:SL8wP/0a
>>288
え、qt便利じゃん
292デフォルトの名無しさん
2019/10/03(木) 19:00:51.01ID:BEqWQnsI
旧版は知らんけどQt5はかなり良いと思う
不満に思うのはベンチ厨くらいでは
293デフォルトの名無しさん
2019/10/03(木) 19:22:01.27ID:z1c5xmGq
>>291
便利かどうかなんて言ってないのにいきなりどうした?w
294デフォルトの名無しさん
2019/10/03(木) 21:53:13.09ID:Uq6PP8Ux
コンパイル通らないので助けてください。
メンバテンプレートを持つクラスを継承して、派生先からメソッドが呼べません。
一見問題なさそうにはみえるのですが・・・

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>();}
};
295デフォルトの名無しさん
2019/10/03(木) 21:59:37.34ID:A/fPHEZe
>>294 エラーメッセージとか出てないの?
296デフォルトの名無しさん
2019/10/03(木) 22:06:09.67ID:BrhogHgJ
>>294
clangさんが教えてくれた
std::string hogehoge() { return A<_T3>::template get<std::string>();}
297デフォルトの名無しさん
2019/10/03(木) 22:13:42.78ID:Uq6PP8Ux
ありがとうございました。
通りました。

つか、そんなtemplate文の使い方初めて知った・・
298デフォルトの名無しさん
2019/10/03(木) 22:31:15.90ID:zkquM/gX
この場合Aがテンプレートなので、Aの先のgetが何者かコンパイラは判断つかないので
"<" が比較演算なのかテンプレートのかっこなのか判断つかないから
らしい
clangは教えてくれるんだから判断ついてるわけだが・・・
まったく醜い文法を持った言語だよ
299デフォルトの名無しさん
2019/10/03(木) 22:49:50.59ID:BrhogHgJ
この場合のエラーメッセージ、GCCはほんとに何言ってるのか分からないのを出すのでclang様様
300デフォルトの名無しさん
2019/10/04(金) 01:11:35.70ID:gSpEwnzq
C++テンプレートのプログラミングでのエラーを読み解く訓練をしているうちに
実世界での初心者が投げてくる質問へのエスパー力がやしなわれる
これ豆
301デフォルトの名無しさん
2019/10/04(金) 02:30:32.92ID:gpJXYiEy
そのうちエラーメッセージを見ずにエラーを修正できるようになる
302デフォルトの名無しさん
2019/10/04(金) 02:54:08.89ID:P4b1n6up
ちなVC2015か2017か忘れたけど、一時期までのVCは
その場合のtemplateを書くと逆にエラーにされてた
303デフォルトの名無しさん
2019/10/04(金) 03:18:41.39ID:I4catYuR
goで変数用いて
*******
*****
***
*
***
*****
*******
って出力するにはどうすりゃいいのっと
304デフォルトの名無しさん
2019/10/04(金) 03:19:28.61ID:I4catYuR
あ、↑のは砂時計みたいな形にしたい
305蟻人間 ◆T6xkBnTXz7B0
2019/10/04(金) 04:12:53.14ID:NaWoGk/Z
>>303
二重のループか仮想画面
306デフォルトの名無しさん
2019/10/04(金) 04:19:18.14ID:I4catYuR
>>305
申し訳ないが初心者ゆえ、数字の二重ループはできるけどそれを文字列にする仕方がわからず
307デフォルトの名無しさん
2019/10/04(金) 05:45:45.52ID:jwb6jSs+
goスレ行け
308デフォルトの名無しさん
2019/10/04(金) 08:20:48.47ID:FzFdUbJu
>>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 が型名なのか、変数名なのかはちゃんと調べる必要がある。
309デフォルトの名無しさん
2019/10/04(金) 08:25:56.64ID:FzFdUbJu
>>308
補足
「Bが型名であることが明確な場合には文脈によらず < はテンプレート記号だと断定
できます。」
の部分ですが、B<CPerson(実引数列) などとした場合、CPersonは型名ですが、
CPerson(実引数列) 全体は、型名ではなくCPersonクラスの引数つき
コンストラクタを呼び出した結果の「一時オブジェクト」です。なので、
Bが変数名の場合は、< は比較演算子の可能性があります。
310デフォルトの名無しさん
2019/10/04(金) 08:33:37.62ID:FzFdUbJu
>>308
誤:なぜか偶然ですが、このスレを見る前から昨日からその辺に関係するパーサーを
正:なぜか偶然ですが、このスレを見る前の昨日からその辺に関係するパーサーを

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

誤:単純な作業でく、Q::A が型名なのか、変数名なのかはちゃんと調べる必要がある。
正:単純な作業ではなく、Q::A がtemplate名なのか、変数名なのかはちゃんと調べる必要がある。
311デフォルトの名無しさん
2019/10/04(金) 08:37:14.54ID:P4b1n6up
>>225
>>224=228や>>226=219みたいなどうみても初心者なヤツにプロが敬語使う必要ないと思うよ
C++スゲー=俺スゲーみたいな明らかにプログラミングに向いてない精神構造のクソバカが多く居るからねここ
312デフォルトの名無しさん
2019/10/04(金) 08:41:34.48ID:FzFdUbJu
>>306
一般論として、文字列の長さを len として、文字列型の変数を str としたとき、
for ( len 回のループ ) {
 str = str + "*"
}
で行けます。
313デフォルトの名無しさん
2019/10/04(金) 09:33:34.23ID:8yIxxMU3
>>311
ようクソバカ
314デフォルトの名無しさん
2019/10/04(金) 09:41:54.97ID:P4b1n6up
>>313
すまんな図星だったか?
邪魔だから出てけよ
315デフォルトの名無しさん
2019/10/04(金) 11:43:51.24ID:FzFdUbJu
>>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)を
完全に「特定」する必要があります。ここまでやるとなると、コンパイラの層分けが
上手く出来ないことになります。
316デフォルトの名無しさん
2019/10/04(金) 12:03:58.19ID:FzFdUbJu
>>315
A::B くらいの場合なら、意味解析の情報だけを元に、Bが何なのかを特定をすることは
可能です。ところが、A<1+2,decltype(x*y)>::B の様な場合、x, y の意味論的な型
を調べた後、x*yに適応可能な operator*() 関数が定義されて言うかどうかも調べ、
定義されていれば、その戻り値の型を調べてx*y の型として、A<・・・> の部分が
結局何なのかを特定しなくてはなりません。今述べた x*y の部分の処理は、
トークン解析層(?)より上位のコンパイル層で行う処理です。なのでこのやり方
だと、コンパイラ内部の「層」の切り分けが難しくなります(技術的に不可能な
わけではありませんが。)。
317デフォルトの名無しさん
2019/10/04(金) 12:07:27.45ID:FzFdUbJu
>>315
誤:なので、もし、>>308 の 2.のやり方でパース使用とすると、Aがtemplate名であると
正:なので、もし、>>308 の 2.のやり方でパースしようとすると、Aがtemplate名であると

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

>>316
誤:を調べた後、x*yに適応可能な operator*() 関数が定義されて言うかどうかも調べ、
正:を調べた後、x*yに適応可能な operator*() 関数が定義されているかどうかも調べ、
318デフォルトの名無しさん
2019/10/04(金) 12:36:35.66ID:cK/f4a5x
>>312
ありがとうございます!
やってみます
319デフォルトの名無しさん
2019/10/04(金) 12:41:17.15ID:G1/ISgxb
c++って文法に曖昧さがないことどうやって保証してんだろ
形式的なアプローチ無理だと思うんだが
320デフォルトの名無しさん
2019/10/04(金) 13:05:22.64ID:MVQV/kgg
いや、そんな保証は端っから諦めてるだろ
引数なしの関数宣言とデフォコン呼び出しの曖昧さなんか
長年放置してたのをC++11でようやく対応したし
関数ポインタにキャストするoperatorはtypedef使えとか
言語としての完全性なんか重視してない
321デフォルトの名無しさん
2019/10/04(金) 13:28:40.80ID:FzFdUbJu
>>319
曖昧さはあるといわれています。例えば、CPersonというクラスがあったとき、関数内で
CPerson person();
と書いた場合、person という名前で、戻り値の型が CPerson の関数のプロトタイプ宣言なのか、
CPerson クラスの person という変数名(オブジェクト名)の定義なのかの曖昧さがあります。
後者は、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) >
と書くと良いと思われます。
322デフォルトの名無しさん
2019/10/04(金) 14:48:30.02ID:D8qarNFk
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にあったような気がする。
323デフォルトの名無しさん
2019/10/04(金) 14:55:11.92ID:FzFdUbJu
>>322
あるライブラリでのq1 * q2 という書き方が、q2 * q1
がどういう意味に解釈されるかは、
324デフォルトの名無しさん
2019/10/04(金) 15:01:05.28ID:FzFdUbJu
>>322
(>>323 は誤投です。)
あるライブラリでの q1 * q2 という書き方が、別のライブラリでは
q2 * q1 と等価なことが有り得て、それはベクトルや行列計算全般に
言える記法の違いなのでこのソースだけではなんとも言えない。
ベクトルの場合、成分表示を1列の縦行列と考えるか1行の横行列
と考えるかによって、賭け全の左右が逆さまになる。
その結果、成分表示で書かない表記も、左右どちらかで書くかは
好みの問題となる。
特に Quaternion の場合も同様。
325デフォルトの名無しさん
2019/10/04(金) 15:02:02.33ID:FzFdUbJu
>>324
誤:と考えるかによって、賭け全の左右が逆さまになる。
正:と考えるかによって、掛け算の左右が逆さまになる。
326デフォルトの名無しさん
2019/10/04(金) 15:45:42.88ID:P4b1n6up
OpenGL系は縦ベクトルだね
D3Dを前提にしたライブラリとは逆になる(行列も転置
327デフォルトの名無しさん
2019/10/04(金) 15:58:00.91ID:FzFdUbJu
>>326
数学や物理学では縦ベクトルが多いが、D3Dはそれに従ってない。
328デフォルトの名無しさん
2019/10/04(金) 16:08:07.51ID:JXWhYfPM
テンプレが糞だと思う瞬間はいくつもあるが
その一つはネストしてるときの閉じ括弧
>> じゃだめで > > ってわざわざ分けないといかんうざい
329デフォルトの名無しさん
2019/10/04(金) 16:08:35.30ID:P4b1n6up
>数学や物理学では縦ベクトルが多いが、D3Dはそれに従ってない。
みたいだね
D3Dからそれ以外に移るとみんなここで引っかかるけど
実は行列周りは(大文字は行列として)
OpenGLに合わせるとA*B*C*xとなるのを
D3Dではx*C*B*Aと書けた方が、左からの計算が全部結果がベクトルなので計算量が減るというメリットはある
MSはC++での書きやすさと効率を考えたのかもしれない
330デフォルトの名無しさん
2019/10/04(金) 16:09:02.58ID:JXWhYfPM
>>326-327
縦横ってより右から掛けるか左から掛けるかだと思ってた
意味は一緒なんだろうけど
331デフォルトの名無しさん
2019/10/04(金) 16:11:58.82ID:P4b1n6up
>>328
C++11からは連続して書けるようになったで
332デフォルトの名無しさん
2019/10/04(金) 16:14:31.61ID:MVQV/kgg
C++03いやC++98?のまま更新止まってるやつ
俺が想像するより遙かに多いのかもしかして

もうC++11でさえ要注意な旧規格になってるんだが
333デフォルトの名無しさん
2019/10/04(金) 16:16:30.52ID:JXWhYfPM
>>329
メモリ上の順序も変わるぞ
SIMDとかで計算されるときの効率にも影響する
必ずしもD3D(横ベクトル方式)が高速化に都合が良いとは言えないんじゃないか

行列の各要素のメモリ上の並びって
glの行列AとD3Dの行列A'はいちいち転置しなくても結局同じになるんだっけ
334デフォルトの名無しさん
2019/10/04(金) 16:22:07.03ID:P4b1n6up
ああ確かにメモリの中身は同じだった
格納方式も違うから結果的に同じになるんだよね
そこが余計ややこしい
335デフォルトの名無しさん
2019/10/04(金) 16:29:39.34ID:FzFdUbJu
>>329
行列計算は、縦ベクトル方式、横ベクトル方式でも、(それぞれで)「結合則」があるので、
A*B*C*x = A*(B*(C*x))
でもあり、
A*B*C*x = ((A*B)*C)*x)
でもあり、どっちで計算しても結果は同じになる。

また、3D計算の場合、点の座標がいくつあっても、行列を一度計算しておくと、
使いまわしできるので、先に行列の方を計算しておいて、最後に座標の変換
を行うと、点が2個以上あるときには効率が高い。
336デフォルトの名無しさん
2019/10/04(金) 16:31:49.50ID:FzFdUbJu
>>332
C++98くらいから、実際問題上使いたくない機能ばかりが追加されるような
傾向があったのに、Upgrade 版は適用外になったりしたりして買う機を逃した。
337デフォルトの名無しさん
2019/10/04(金) 16:38:53.10ID:FzFdUbJu
>>329
>MSはC++での書きやすさと効率を考えたのかもしれない
>>335 に既に書いたけど、OpenGL 形式でも、右結合でも、
左結合でも、好きな方で計算は出来る。だから、行列部分を
先に計算しても良いし、座標部分から計算しても良い。
座標部分から計算していくと一見計算量が減るように思える
かも知れないが、点の個数が多くなると、一度だけ行列部分の
積を予め計算しておいて、その結果を全ての点の変換部分に
遣うと効率が劇的に向上するので、むしろ、効率が良いのは逆。
338デフォルトの名無しさん
2019/10/04(金) 16:40:53.55ID:P4b1n6up
>>335
確かに(OpenGLでも上で書いたような式が使えるライブラリ使うとして)括弧でくくったりして優先順位変えればいいし
言う通り行列はまとめればいいんだけど
どちらにもメリットデメリットあると言いたかった
339デフォルトの名無しさん
2019/10/04(金) 16:51:20.07ID:FzFdUbJu
>>338
実は、アメリカで有名な 3D Graphics の本が、横ベクトル方式を採用していた
事が関係しているかもしれない。要はその本が数学や物理の標準とは何故か
逆の記法を採用していたということ。
340デフォルトの名無しさん
2019/10/04(金) 17:00:49.77ID:FW+Y/3wm
>>337
GL
(A*B*C)*(x0(縦),x1(縦),x2(縦),x3(縦), ... , xN(縦))(横)
D3D
(x0(横),x1(横),x2(横),x3(横), ... , xN(横))(縦)*(C*B*A)
が最速やね
341◆QZaw55cn4c
2019/10/04(金) 19:54:25.76ID:5CiM54x6
>>335
行列って結合則は約束されてましたっけ?
342デフォルトの名無しさん
2019/10/04(金) 20:17:27.71ID:gZky9oRw
当たり前だろ。
そんなレベルの知識しかないからフォントライブラリ書けないんだよ
343◆QZaw55cn4c
2019/10/04(金) 20:27:59.81ID:5CiM54x6
>>342
では証明してください(キリッ)
344デフォルトの名無しさん
2019/10/04(金) 21:24:32.75ID:FzFdUbJu
>>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つの行列の場合ではなく、一般の個数の行列の場合、
最初に書いたように数学的帰納法を使います。それは、あなた自身で
お考えください。考える力の練習になります。
345デフォルトの名無しさん
2019/10/04(金) 22:10:52.87ID:cDY60lSZ
doubleの値を++aした時にaの値は+1と規定されてる?
346デフォルトの名無しさん
2019/10/04(金) 23:19:26.96ID:FzFdUbJu
>>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.
347デフォルトの名無しさん
2019/10/04(金) 23:36:52.32ID:NJj/Utu/
>>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...と歯抜けになる
348デフォルトの名無しさん
2019/10/04(金) 23:42:33.92ID:8yIxxMU3
丸められただけでは
349デフォルトの名無しさん
2019/10/04(金) 23:55:23.10ID:YWySipM2
>>341-344
また5ch名物のしょーもない煽り煽られの流れかとおもったら
ちゃんと勉強になる流れでワロタ
350デフォルトの名無しさん
2019/10/05(土) 00:03:15.79ID:bnoeYdBm
行列の結合則なんて高校で習っただろ
線形代数わからないプログラマって生き残れないと思うわ
351デフォルトの名無しさん
2019/10/05(土) 00:05:26.41ID:KADe2ROY
>>347
・そのコードは、完全に上記の通りですか?

例えば、ループ回数が1000回より遥かに多くなると、
誤差の都合でそうなることがあるかもしれませんが、1000回くらい
だと、正しい処理系ではその現象は起きないはずです。
352デフォルトの名無しさん
2019/10/05(土) 01:17:38.13ID:d5aP5JOP
キャストする前にlround呼んだらええんちゃうん。
353デフォルトの名無しさん
2019/10/05(土) 01:44:04.24ID:VkhEKreX
(0.2+0.3)+0.4 == 0.2+(0.3+0.4)の結果がfalseになるのは正しいの?
354デフォルトの名無しさん
2019/10/05(土) 01:54:00.97ID:Lbi5NeET
浮動小数点を勉強しておいで
355デフォルトの名無しさん
2019/10/05(土) 02:07:17.64ID:5hJZ4CgN
有効数字1桁の計算で誤差は生じない
356デフォルトの名無しさん
2019/10/05(土) 07:04:22.03ID:UfPJq4d2
10進の0.1を2進表現すると循環小数定期

>>355
バカ乙
357デフォルトの名無しさん
2019/10/05(土) 08:03:13.32ID:9T2eUTn8
>>336
本当、人って色々だな
俺はC++98は未完成感があまりに強くて続きはまだかと待ちかねていた
具体的には例えば右辺値参照だ
一時オブジェクトにいちいちconstがつくのがイヤでイヤで待望のやつがやっと来た
358デフォルトの名無しさん
2019/10/05(土) 08:28:45.86ID:iS4eZEWC
>>337, >>340
ちょっと誤解招くのでやっぱ突っ込んでおくけど、
多数のベクトルを変換するのに行列をまとめておかないと無駄になるのはどっちの方式でも同じだよ
俺が言ったのは(少なくとも同一の行列が)一度限りしか出てこない場合の話
まぁそれを最適化する必要があるのか、またそういう処理を大量にループするなら最適化の方法は他にあるだろうけど
>>333
GL方式でも列優先だから結局d3dと同じ無駄はあるんやで
最近のは知らんけど
359デフォルトの名無しさん
2019/10/05(土) 08:49:33.11ID:KADe2ROY
>>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)
は必ず真になることが保障されています。
360デフォルトの名無しさん
2019/10/05(土) 08:55:38.66ID:KADe2ROY
>>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)
は誤差が生じることがないため、必ず真になるはずです。
361デフォルトの名無しさん
2019/10/05(土) 10:06:32.18ID:e1uvrqu3
>>360
浮動小数の計算誤差を考慮して比較する時にstd::abs(a-b) < std::numeric_limit<double>::epsilon()というふうにするのはどう思う?
362デフォルトの名無しさん
2019/10/05(土) 11:34:20.93ID:KADe2ROY
>>361
誤差の量が計算の順序や書き方によって変わってくるので、
そのようなヘッダに書かれているような誤差定数を使うことは
余り意味がありません。
363デフォルトの名無しさん
2019/10/05(土) 11:37:49.72ID:7pdQvekm
実用数学
364デフォルトの名無しさん
2019/10/05(土) 11:43:08.23ID:rY1OpV0v
>>361
機械イプシロンはそういうふうに使うものじゃない
365デフォルトの名無しさん
2019/10/05(土) 12:09:22.39ID:uol03Q2n
cpprefjpが>>361と全く同じ間違いしてたわ馬鹿が湧くのはこいつのせいか
cppreference.comは正しかったからそっち見れ
366デフォルトの名無しさん
2019/10/05(土) 12:34:57.85ID:dFaPF8AB
>>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)みたいな場合によっては莫大な値になりえる係数を掛けねばならないの?
367デフォルトの名無しさん
2019/10/05(土) 13:04:02.75ID:rY1OpV0v
イプシロンに誤差を掛けても意味ない。
つか、許容誤差の絶対値が与えられているならイプシロン使う必要もない。
cppreference.comのは許容誤差をULP単位で与える場合のやりかたで、
abs(x+y)はxとyの指数のうち大きい方を意味するものだったはず。
368デフォルトの名無しさん
2019/10/05(土) 13:12:59.71ID:uol03Q2n
>>366
なんか色々根本的に勘違いしてる
cppreference.comのalmost_equal関数の仕事はあくまで与えられたxとyがalmost equalかどうかの判定だよ
> x、yがそれぞれ±e、±gの誤差を有するなら
なにこれ?「誤差」って何に対する何の誤差?
369デフォルトの名無しさん
2019/10/05(土) 13:28:00.03ID:dFaPF8AB
>>367
>イプシロンに誤差を掛けても意味ない。
>つか、許容誤差の絶対値が与えられているならイプシロン使う必要もない。
左様ですなスマンカッタorz

>>368
>なにこれ?「誤差」って何に対する何の誤差?
真の値に対する誤差じゃわパオーン
真の値に対する誤差に依存しないalmost equal判定とか、使いどころはきわめて限定されるはず、
370デフォルトの名無しさん
2019/10/05(土) 14:05:34.77ID:dFaPF8AB
>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))という意味か左様か、
371デフォルトの名無しさん
2019/10/05(土) 14:08:05.45ID:dFaPF8AB
んまーulpをxとyの来歴に応じて調整すべき量とするなら
cppreference.comのalmost_equal関数は理解してやらないでもない
372デフォルトの名無しさん
2019/10/05(土) 16:03:17.50ID:NXndjuW4
だれか、俺に分数を教えてくれないか?
足し算と引き算がマジ解らなくなってるんだ。
https://ideone.com/IfCcGz

一番のネックはネガフラグの扱い。
マイナスとプラスの反転演算でどうかくとスマートだろうか。
だれか教えてプリーズ。
373デフォルトの名無しさん
2019/10/05(土) 16:21:25.21ID:bnoeYdBm
分子に符号もたせりゃいいだろ
374デフォルトの名無しさん
2019/10/05(土) 16:25:36.94ID:NXndjuW4
>>373
え、それでよかったっけ?
375デフォルトの名無しさん
2019/10/05(土) 16:34:31.54ID:hwiNAqBO
>>350
今習わないよ
俺の時でも選択
376デフォルトの名無しさん
2019/10/05(土) 17:18:56.47ID:NXndjuW4
一応以下のような感じになった。Thx!
http://coliru.stacked-crooked.com/
377デフォルトの名無しさん
2019/10/05(土) 17:19:54.63ID:NXndjuW4
http://coliru.stacked-crooked.com/a/5fa6ab838f9ff15a
こっちだった。Orz

んじゃ。
378デフォルトの名無しさん
2019/10/05(土) 17:28:26.58ID:QHD8CUaF
>>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();
}
379デフォルトの名無しさん
2019/10/05(土) 19:08:43.36ID:NXndjuW4
>>378
1.できなくはない。機械的に接頭語つけるだけでいいよね。
2.暇だから作るわ。

行ってきまーす。
380デフォルトの名無しさん
2019/10/05(土) 19:46:54.47ID:NXndjuW4
https://ideone.com/uzd7EF
ただいまー。イデオンで動かせるようにした。Gcdがバグってないといいなぁ。
あとvc2019では意味不明なエラーで動かない。
381デフォルトの名無しさん
2019/10/05(土) 19:58:28.51ID:NXndjuW4
フィードバックハブに投げておいた。
382デフォルトの名無しさん
2019/10/06(日) 10:28:58.03ID:yc9LKsYB
>>380
マルチ禁止
383デフォルトの名無しさん
2019/10/06(日) 13:42:53.69ID:bPt7YQEe
>>382
ソーリー。
384デフォルトの名無しさん
2019/10/07(月) 19:17:43.20ID:PHxdOQnu
C++ってなんでヘッダファイルいるんですか
最近マシン早いんだし
全部ソースに書いてインポートすればいいのに
385デフォルトの名無しさん
2019/10/07(月) 19:38:58.27ID:Xs+XlBV4
やれば?(クレヨンしんちゃん風に)
386デフォルトの名無しさん
2019/10/07(月) 19:52:54.51ID:9pxPpXZa
来年まで待ってね
387デフォルトの名無しさん
2019/10/07(月) 20:58:42.59ID:A3KSW75p
>>384
むしろソースがいらなくて全部ヘッダに書けばいい
inline変数とかもできるようになったことだし
388デフォルトの名無しさん
2019/10/07(月) 21:05:07.29ID:8FnUNDHt
>>387
たまに趣味で何でもかんでもtemplateでゴリゴリ実装してるとガチでそれになるww
389デフォルトの名無しさん
2019/10/07(月) 21:26:10.24ID:YMM6HSZT
>>385
ヤレばデキるは魔法の言葉
390デフォルトの名無しさん
2019/10/08(火) 09:06:39.07ID:xr4jQIWZ
プリコンパイルヘッダーって使ってます?

使っているプロジェクト見たことないですわ。
391デフォルトの名無しさん
2019/10/08(火) 20:03:58.69ID:kGAGzuS0
>>387
こういう馬鹿野郎が出てくるからメタプロとかテンプレ好き連中ってのは嫌いなんだよ。
392デフォルトの名無しさん
2019/10/08(火) 21:04:41.31ID:OCfPMe68
C++なんて趣味でやってるんだからテンプレ好きでもええやん
393デフォルトの名無しさん
2019/10/08(火) 21:16:41.69ID:/kdim2Vo
出てくることの何が嫌なんだろうか
はっきり言って病気だ
394デフォルトの名無しさん
2019/10/08(火) 21:42:59.95ID:lGNioH0G
headerオンリーってのは可搬性に優れた良いものだろ
特にテンプレート多用している奴は、一部関数だけソースファイル分離する意味が薄い
395デフォルトの名無しさん
2019/10/08(火) 21:43:38.32ID:asJ1ctJB
>>391
どんなものにだって馬鹿は出てくるだろうに
396デフォルトの名無しさん
2019/10/08(火) 21:54:07.26ID:J87hrB1p
「全部ヘッダ」と言われると、そのときの「ヘッダ」の定義がどういうものなのか気になる。
397デフォルトの名無しさん
2019/10/08(火) 21:57:19.52ID:EwyBASw5
趣味でやってる人は全部ヘッダでいいと思う
398デフォルトの名無しさん
2019/10/08(火) 22:09:52.63ID:tSj7di+z
>>390
VCのやつは使いまくり
依存するライブラリのヘッダファイルを標準のやつもソリューション内のやつも全部まとめて
stdafx.hの中でインクルードしたらことのほか便利
ただし同じプロジェクトのヘッダファイルを入れだしたら目的を見失って氏ぬ
399デフォルトの名無しさん
2019/10/08(火) 22:10:50.35ID:hpLG4xMo
テンプレート関数は便利だしconstexpr関数は市民の義務だし
結局ほとんどヘッダファイルに書くことになるでしょ
400デフォルトの名無しさん
2019/10/08(火) 22:30:34.35ID:X4FGjRpd
初心者ですが質問させてください

print(1, 3.14, "abc");とやると引数の中身を順番にスペース区切りで出力してくれるような関数は
可変引数テンプレートの再帰呼出しを使うと便利にできることを知りました。
そこで引数の型に応じて出力の見た目を少し変えたいのですが、
関数の特殊化をすればいいですか?
typeidだと動的な評価になってしまうんですよね?
401デフォルトの名無しさん
2019/10/08(火) 22:33:59.15ID:kGAGzuS0
予想通りの馬鹿回答で笑ってしまった。
やっぱいい判別になるわテンプレバカ。
402蟻人間 ◆T6xkBnTXz7B0
2019/10/08(火) 22:37:33.87ID:jfG+k1ni
>>400
引数一つに対するテンプレート関数を作って特殊化してそれに少しずつ渡せばできるよ。
403デフォルトの名無しさん
2019/10/08(火) 22:42:38.66ID:/kdim2Vo
C++嫌いなのにいつまで居座るんだろうなこのガイジ
404デフォルトの名無しさん
2019/10/08(火) 22:57:34.25ID:HxNAD6ah
好き嫌いの問題じゃねーんだわ
405デフォルトの名無しさん
2019/10/08(火) 23:04:05.43ID:/kdim2Vo
こんな雑談スレ好きな奴以外に需要ないだろ
こんな辺境別に見なくて良いんだよ?
406デフォルトの名無しさん
2019/10/08(火) 23:08:13.69ID:hpLG4xMo
>>400
c++17以降ならif constexprとstd::is_same_vの使用を検討してみるのもいいかも
407デフォルトの名無しさん
2019/10/09(水) 04:08:22.18ID:NmoqHfbB
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;
}
408デフォルトの名無しさん
2019/10/09(水) 04:17:51.46ID:NmoqHfbB
あ、こういうふうにするとコンパイルできました。引数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...);
}
409デフォルトの名無しさん
2019/10/09(水) 04:21:52.30ID:NmoqHfbB
>>406
いわゆる型特性というやつでしょうか?enable_ifを使うのかと思い試したもののうまくいかず、
ネットで調べるとenable_ifと可変引数テンプレートは相性が悪いという意見を見つけたり...
410デフォルトの名無しさん
2019/10/09(水) 07:02:07.47ID:8qv563yz
>>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...);
}
}
411デフォルトの名無しさん
2019/10/09(水) 10:59:59.89ID:RbUf+g7C
const char * 自体も class First や class Args と一致するんじゃね
412デフォルトの名無しさん
2019/10/09(水) 21:59:58.44ID:8qv563yz
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), ...);
}
413デフォルトの名無しさん
2019/10/09(水) 22:42:32.58ID:J+0BhmRu
win系のOSの画面に1.txt~5.txtがあります。1.txtと2.txtをドラッグして選択したとします。
この状態で3.txt~5.txtを選択したことにするにはどのようなコードを書けば良いですか?
414蟻人間 ◆T6xkBnTXz7B0
2019/10/09(水) 22:52:59.82ID:bPxMjWa1
>>413
ListView_SetItemState
415デフォルトの名無しさん
2019/10/10(木) 00:29:05.87ID:uUO69neG
エクスプローラにdll注入とか?
416蟻人間 ◆T6xkBnTXz7B0
2019/10/10(木) 01:32:41.34ID:VnnXeZwz
前にやったことがある。
https://github.com/katahiromz/SysNotifyHooker
417デフォルトの名無しさん
2019/10/11(金) 01:40:25.90ID:n351RXRL
std::shared_ptrを構築後に(カスタム)デリータを変更するのは無理?

既にどっかで作成済みのshared_ptrについて、破棄タイミングを後から見れないかなと
418デフォルトの名無しさん
2019/10/11(金) 02:44:16.61ID:uKeO6WuZ
別のstd::shared_ptrをカスタムデリータ付きで構築してswapすれば
419デフォルトの名無しさん
2019/10/11(金) 04:06:16.56ID:RvdWaBLb
shared_ptrとunique_ptrでdeleterの指定方法が違うってのが興味深いね。
420デフォルトの名無しさん
2019/10/11(金) 12:29:56.77ID:w5dDNHMJ
VCのlatestでchar8_tが入ってたわ
やっとC++erが文字コード問題から解放されるんだな
421デフォルトの名無しさん
2019/10/11(金) 14:00:32.34ID:XWYiG0pn
やったぜ。
422デフォルトの名無しさん
2019/10/11(金) 15:19:50.16ID:iqVlf+4W
>>418
デリータごとswapされたわ
stackoverflowにも似たような質問があったけど結論としては出来ないっぽい
たぶん
423デフォルトの名無しさん
2019/10/11(金) 23:12:48.13ID:WXWRLB/C
>>392
別にテンプレ好きでも構わんが、C++ユーザー全員が趣味だと思ってんの?
424デフォルトの名無しさん
2019/10/11(金) 23:15:04.89ID:WXWRLB/C
>>405
雑談以外に役に立つ書き込み出来なくてすみません、ってことか
425デフォルトの名無しさん
2019/10/12(土) 08:08:31.86ID:vgsPsMOm
>>423
C++ユーザが全員趣味なんてどこにも書いてないし、あるプログラミング言語が趣味でしか使われてない状況なら、委員会なんていらないわwww
426デフォルトの名無しさん
2019/10/12(土) 08:48:46.65ID:fl5cgmi7
衣食住の確保以外の仕事なんてみんな趣味みたいなもんだよ
なくたって構わんのだから
427デフォルトの名無しさん
2019/10/12(土) 08:58:25.57ID:rY+KRAa3
農業以外は遊びってことか!
428デフォルトの名無しさん
2019/10/12(土) 09:03:04.22ID:tzOo7sle
原始人から見たら1次産業以外は遊びだしそうだろ
429デフォルトの名無しさん
2019/10/12(土) 09:06:03.19ID:w6XAfbR5
委員会なんて何の役にもたってねーだろ。
構文解析もまともに理解できてないバカが俺様仕様の理想に突っ走ってるだけのクソ組織で、
仕様の実装、デバッグの手間なんてこれっぽっちも考えてないのがよくわかる。
430デフォルトの名無しさん
2019/10/12(土) 09:14:16.17ID:Fi90LVHu
デバッグできねえのを人のせいにするクズがよく言うぜ
431デフォルトの名無しさん
2019/10/12(土) 09:54:19.46ID:DT43rpFP
近年は新機能は三大コンパイラ(GCC,MSVC,Clang)での試験実装が入ってから仕様入りするのが普通になってるし
コンセプトなんてまさにデバッグの手間の軽減を第一目的に苦心して作られた機能なんだけど
どのへんを見てよくわかったのか教えて
432デフォルトの名無しさん
2019/10/12(土) 10:00:51.19ID:w6XAfbR5
>>431
実装したことないやつは黙っててね。
で、そのコンセプトを実際のコードでコンパイルした時間がどれくらいになるかわかってる?
そういう有用なベンチマークもほとんど出さずに無理やり入れようとするから
信頼を無くしてるんだよ。
433デフォルトの名無しさん
2019/10/12(土) 10:19:47.03ID:Nq/Z/R6A
経験したことは全て正しいっていう日本特有のアホ理論だろそれ
経験してないお前に発言権は無い、っていう
その理屈を持ち出すヤツは大抵はアホ
434デフォルトの名無しさん
2019/10/12(土) 10:24:58.21ID:69fBrMS4
コンパイル時間は、コンパイラの出力する最適化されたバイナリの実行速度に比べたら問題ではないだろ

しかも構文解析にかかる時間なんて最適化時間に比べりゃ屁みたいなもの
435デフォルトの名無しさん
2019/10/12(土) 10:26:15.49ID:mYzO26Pi
似たようなものを複数書いてもバグ修正時に一部見落としなんて馬鹿げたことになるわけで
マクロでもテンプレートでもまとめられるものはまとめたほうがいいわな
436デフォルトの名無しさん
2019/10/12(土) 10:27:43.23ID:69fBrMS4
c++言語の場合、パースのコンテキスト依存が、識別子の種類でも変わるから、テンプレート時の記述でtypename やらtemplateやらで、識別子の種類自体を指定する羽目になっているのはあるよね
437デフォルトの名無しさん
2019/10/12(土) 11:23:13.45ID:zNYGVDyE
>>434
テンプレートふんだんに使ったライブラリ実用してるとひどいことにはなる
アプリ自体は数万行なのにコンパイル10分以上とか
438デフォルトの名無しさん
2019/10/12(土) 11:27:59.19ID:KmpqQhzT
>>432
お前が信用しないのは勝手だが、みんなの総意みたいに言うなよ
439デフォルトの名無しさん
2019/10/12(土) 12:09:52.46ID:73DoxmjF
数万行で10分が早いのか遅いのかよくわからない
440デフォルトの名無しさん
2019/10/12(土) 12:15:22.09ID:69fBrMS4
それは本当にパースの複雑さのせいなのかは疑問だな
templateだと、プログラマは簡単にコンパイラの仕事をあまり意図せず増やしてしまいがちだからね。

std visitで引数増やすとコンパイル時間は簡単に増やせるよ。
5つくらいでもうコンパイラが落ちたりする
やらせていることの面倒くささ、それを手書きすることを考えれば妥当なのだけど
441デフォルトの名無しさん
2019/10/12(土) 12:41:57.75ID:Tqr7IA/6
最近C++触ってないけど数万程度で10分もかかるの?
10万行程度なら5分以内に終わってほしいところだけど…
442デフォルトの名無しさん
2019/10/12(土) 13:13:02.91ID:trzfpzAc
>>439
かなり遅いです。
ヘッダファイル *.h とソース本体のファイル *.c では事情が違いますが、
OSのバージョンによりますが、Win32の標準ヘッダファイルの windows.h などだけでも
コメントを除外しても2万行弱くらいあります。
これのパースは、VC++で1秒~数秒くらいです。
通常は、precompiled header を使うので、一つのプロジェクトで一度だけ
パースされることが多いです。
ただし、プロトタイプ宣言やマクロ定義、構造体定義、inline関数定義
などだけで、実際のコード生成は伴わないので、*.c の数万行とは
また事情が違います。*.c はコード生成を伴うので、同じ行数であれば*.hよりも
遅くなる傾向があります。
しかし、それでも、C++98 の場合、数万行だと3秒~10秒以下でコンパイルできます。
443デフォルトの名無しさん
2019/10/12(土) 13:23:47.19ID:UpKv7BB3
↑こいつはVSスレで有名なキチガイなので放置で
444デフォルトの名無しさん
2019/10/12(土) 13:24:45.74ID:69fBrMS4
c++の文法のせいでパースが遅いってレベルの話じゃないような
445デフォルトの名無しさん
2019/10/12(土) 15:33:32.46ID:UCFxfzGx
ヘッダオンリーのライブラリがポータブルとか言われてもてはやされるのがc++だからね
生産性の意識が間違った方向に向いてる
コンセプトでどうなることやら
446デフォルトの名無しさん
2019/10/12(土) 15:52:13.73ID:K75UXpIa
俺の10万行程度のアプリは1分以内にコンパイル終わるが・・・
10分てどこの世界だ
447デフォルトの名無しさん
2019/10/12(土) 19:26:26.29ID:8VsKOlOD
「参照の配列」を作りたいときって現状 reference_wrapper を使う以外ないですか?
448デフォルトの名無しさん
2019/10/12(土) 20:29:07.16ID:iehpkqJW
ポインタやスマポじゃいかんのか
449デフォルトの名無しさん
2019/10/12(土) 20:55:57.96ID:cS98TRHZ
>>437
プリコンパイルヘッダー使え…!

>>446
VC++2010の場合配列要素のアドレスの配列というのを
それぞれ1万行ぐらい書いてリリースビルドすると10分かかる
450デフォルトの名無しさん
2019/10/12(土) 23:18:34.83ID:zNYGVDyE
spiritで構文解析させてたコード(その上et使った自作ライブラリあり)だから例として極端だったかもしれんけどね
プリコンパイルドヘッダは使ってたよ
効いてるときは数分かからなかったと思う
というか5年以上そのコード使ってないんで今のマシンならまだマシになるとは思う
451デフォルトの名無しさん
2019/10/13(日) 01:04:01.79ID:2Ilco01g
boostを多用した10数万行のソースでprecompileありでreleaseビルドしたら10分くらいかかってたけど、debugビルドでは1,2分くらいだった気がする。パースだけなら大したことないけど最適化がかなり遅いと思われる。
452デフォルトの名無しさん
2019/10/13(日) 01:06:42.02ID:uORMYh+w
翻訳単位が増えると単純に遅くなるし
リンク時最適化でもさらに遅くなる
453デフォルトの名無しさん
2019/10/13(日) 01:16:58.35ID:Fwjkj11x
LTOは本当のリリース時や速度検証の時以外は外しても問題ないよね
454デフォルトの名無しさん
2019/10/13(日) 09:37:54.86ID:kfwaB+Y7
ここの話で出ている

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

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

<_T3>::templateやtypenameをどの様な場合に書かないといけないのか?
この辺を解説した初心者向けか入門者向けの解説サイトみたいな所が
何処かに有りませんか?
サイトが無さそうなら検索に向いている単語みたいなのでも有れば助かる
::templateとかで検索しても上手く引っ掛からないみたい(有るには有るけど少ない)
455デフォルトの名無しさん
2019/10/13(日) 10:06:17.74ID:zTi0Tc1S
コンパイラが出すメッセージで検索してみれば?
456デフォルトの名無しさん
2019/10/13(日) 11:14:46.72ID:Fwjkj11x
>>454
https://ja.cppreference.com/w/cpp/language/dependent_name
457デフォルトの名無しさん
2019/10/13(日) 17:23:21.82ID:Y0ptPfKA
他の言語で書かれたコードをスクリプトの要領で
C++から呼び出して実行したいのですが、
そういった事をするのに適した言語ってどういった物があるのでしょうか?
458デフォルトの名無しさん
2019/10/13(日) 17:23:50.21ID:Y5pFrXym
>>457
パイソン
459デフォルトの名無しさん
2019/10/13(日) 17:31:01.31ID:9auzzyVZ
言語間のABIの違いを透過的にしたいのならアセンブラの出番だね
460デフォルトの名無しさん
2019/10/13(日) 17:36:26.67ID:1+8oai62
まさにそういう用途で作られたluaとか
461デフォルトの名無しさん
2019/10/13(日) 17:44:25.71ID:j3fG3YC6
>>457
今ならluaかjs(V8/ChakraCore/SpiderMonkey)だな。

【Lua】組み込み系言語総合 その7【Squirrel】 [無断転載禁止]©2ch.net
http://2chb.net/r/tech/1474536226/

pythonもできなくはないけど手軽とは言えない。
pythonを使いたい理由がなければやめておくのが吉。
462デフォルトの名無しさん
2019/10/13(日) 18:10:48.99ID:pJwii1Hg
pythonは呼ぶ方で、呼ばれる方としてはほとんど想定されてないわな。
463デフォルトの名無しさん
2019/10/13(日) 19:05:43.03ID:m8H1BiEu
lua以外無い
464デフォルトの名無しさん
2019/10/13(日) 19:35:48.57ID:rjz838Ki
>>457
tcl
465デフォルトの名無しさん
2019/10/13(日) 20:24:22.36ID:kfwaB+Y7
>455,456さんどうもです

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

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

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

どうもでした
466デフォルトの名無しさん
2019/10/14(月) 15:05:53.73ID:rfaLGQBa
template<size_t N>
class Test{
public:
private:
int m[N];
};

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

こういう場合のコンストラクタの書き方ってどうすればいいのでしよう?
可変引数?
467デフォルトの名無しさん
2019/10/14(月) 15:12:05.32ID:BPBGG2nS
コンパイル時に決まってないならvectorかなんかにするしかない
468デフォルトの名無しさん
2019/10/14(月) 15:18:08.00ID:P81x9Tjl
templateパラメータの整数にはコンパイル時に決まらない数値は入れられない
469デフォルトの名無しさん
2019/10/14(月) 15:28:00.19ID:qN7fFVrS
>>466
そもそも、そのような生配列は、デフォルトでは0初期化もされないので、
メンバ初期化子リストを使わなくても効率は落ちないので、
コンストラクタ内部で普通に代入演算子を使って初期化すればいい。
すると、単に任意個数の引数をコンストラクタに渡す問題になる。
それには、昔ながらの va_list を使って渡す方法と、
関数テンプレートやテンプレートクラスを使って、自分自身を一つずつ引数を
減らしながら呼び出していく方法の二通りある。
470デフォルトの名無しさん
2019/10/14(月) 15:28:52.79ID:Y7o3BEyU
>>466
Test(std::initializer_list<int>&& arg)
{
std::copy_n(std::begin(arg), N, std::begin(m));
}
471デフォルトの名無しさん
2019/10/14(月) 15:30:45.59ID:rfaLGQBa
>>469

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

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

templateの可変引数の為にどんな型でも一致してしまい、そのくせにdoubleからintなどの変換をしてくれないのでinitializer_listを引数に出来たり、もしくはもっといい初期化方法があるのかなと思った次第です。
472デフォルトの名無しさん
2019/10/14(月) 16:18:31.70ID:1VO4fG6M
http://ideone.com/TPZu2J
473デフォルトの名無しさん
2019/10/14(月) 16:48:34.42ID:REdvl5Gt
>>471
>そのくせにdoubleからintなどの変換をしてくれないので
この点に関しては、以下の拡張展開でいけるはず。
template<typename... T>
 Test(T... args):m{((int)args)...}{
}
474デフォルトの名無しさん
2019/10/14(月) 16:55:25.15ID:REdvl5Gt
templateの「非型引数」を使えば、理論上は、
template<int...args>
Test(int...args):m{args...}{
}
と書ける可能性はあるかもしれないけど、試してみてないので分からない。
475デフォルトの名無しさん
2019/10/14(月) 17:04:44.38ID:REdvl5Gt
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.
476デフォルトの名無しさん
2019/10/14(月) 17:48:47.38ID:DdI7aqm2
>>466
要素数がコンパイル時に決まってるなら std::array 使って Test<3> x{{1,2,3}} とすることは簡単にできそう。
477デフォルトの名無しさん
2019/10/14(月) 20:20:29.10ID:ljIrzJ7B
>>464 >>457
tcl + 1
478デフォルトの名無しさん
2019/10/16(水) 00:49:52.16ID:4OT/K/L6
>>473 Thank you!!
479デフォルトの名無しさん
2019/10/18(金) 03:20:02.11ID:kbBE7aSe
他クラスのメンバ関数テンプレートを呼び出すときってtemplateキーワードを関数名の前に付けないと
operator<と間違われてエラーになりますですよね?具体的に例をあげてみますと

https://wandbox.org/permlink/F7zl1fDh3qc216hd

これの t.template func<T2>(); のところですが、実はこのtemplateキーワードを外しても
WindowsのVisualStudioだとコンパイルが通ってしまいます。
これってVisualStudioが規約違反しているという理解で合っていますか?
480デフォルトの名無しさん
2019/10/18(金) 03:32:35.18ID:L8qU11hp
vsのバージョンは?
2017の途中からtwo phaseに対応しだしてtemplate周りの怪しい挙動は大分改善された
481デフォルトの名無しさん
2019/10/18(金) 11:35:03.93ID:kGqx1xn0
>>480
Express 2017 for Windows DesktopとProfessional 2019で確認しています
準拠モードを「はい」にしたら標準の規約に従うのかと思ったんですが変化なしでした

開発はWindowsでしつつもWindowsとLinuxどちらでもコンパイルできるようにしたいんですが
もしかしてそう簡単な話ではないんですかね
482デフォルトの名無しさん
2019/10/18(金) 12:11:07.40ID:8CoI4J3v
>>481
visual studio cmakeプロジェクトでググる
483デフォルトの名無しさん
2019/10/18(金) 15:49:49.04ID:/qIwU54Z
effective modern c++のnoexceptの項読んで思ったんだが、
C++の関数内でCの関数(具体的にはOpenGLとか)を呼び出した時に
C++側でcatchできる例外って具体的にどんなものがあるの?

試したことないけどmalloc失敗でbad_allocは飛ばないよね?
484デフォルトの名無しさん
2019/10/18(金) 18:57:22.15ID:eJANlQqR
Windowsなら構造化例外とか
485デフォルトの名無しさん
2019/10/18(金) 19:16:01.68ID:rTjJuJDg
>>482
cmakeってビルドに関するものだったような?
ソース自体はWindowsとLinuxで完全同一にしたいんですが
あれなんか自分勘違いしてるかな

とりあえずcmakeくぐります、有難う
486デフォルトの名無しさん
2019/10/18(金) 19:19:00.58ID:5559SrY6
VCコンパイラがWindows専用だからcmakeだけでは解決しない
clangオプション使えばいけるんじゃね
487デフォルトの名無しさん
2019/10/18(金) 19:27:02.65ID:BPo3Wxa0
cmakeってなんとなくしか使ってないんですけど何なんですか
OpenCVのソースをビルドするときに使いましたけど、cmakeした後にまたVisual Studioでコンパイルする必要があるのはなぜですか
488デフォルトの名無しさん
2019/10/18(金) 21:38:24.25ID:1VxWd/yq
>>487
cmakeってmakeの代用じゃなくてmakefileとかxxx.slnとかを作るソフト
なのでcmake実行後に各々の環境にあったビルドを行う
489デフォルトの名無しさん
2019/10/18(金) 22:32:33.72ID:HsDKWWc7
>>487
ビルドするためのスクリプトを作るツール、みたいに考えるといいよ
linux環境ならLinux用のものを作ってくれる
makeだと基本はlinux専用だし、.slnや.vcxprojはwindows専用だから、両方を面倒見るのは大変でしょ
490デフォルトの名無しさん
2019/10/18(金) 22:48:18.41ID:f2FG8XiO
ビルドするためのスクリプトを作るためのスクリプトを作るためのスクリプトなんてよくある話だよ。
491デフォルトの名無しさん
2019/10/18(金) 22:49:57.04ID:a3uRi/Ig
秘伝のタレな
492デフォルトの名無しさん
2019/10/18(金) 23:06:23.18ID:liCy40EB
GNU autotoolsをまともにいじる輩は消え去ったという現実をcmakeも味わうことになる。
バカは同じ間違いをする。歴史も見ずに。
493デフォルトの名無しさん
2019/10/19(土) 00:19:02.04ID:JKxr+RAJ
CMakeってKitwareっていう大学発ベンチャーから出てきたやつだよな
もとはVTKとか可視化用ライブラリ開発してるしがないベンチャーだったのに
CMakeのおかげでやたら顔が知られるようになった
494デフォルトの名無しさん
2019/10/19(土) 00:40:35.72ID:kiA3Djjo
VTKとparaviewの方が有名じゃなかったのか
495デフォルトの名無しさん
2019/10/19(土) 00:44:42.31ID:JKxr+RAJ
ParaViewは最近になって有名になってるけど所詮はVTKのラッパーでしょ
CMakeのほうが影響度はでかいと思う
ベンチャーでここまでやれたなら大成功な事例だね
496デフォルトの名無しさん
2019/10/19(土) 00:58:43.11ID:kiA3Djjo
cmakeより前から有名じゃね?
497デフォルトの名無しさん
2019/10/19(土) 01:00:35.87ID:4XSJxZBk
cmake邪魔くさい
Makefile.am, configure.acからautoreconfしてconfigure作る方が楽。
windows用もmingwでクロスビルドしちゃえば楽だし。
WSLでwindowsからも見えるパスでビルドすると作ったwindows用binaryをすぐに起動できるしいうことなし
498デフォルトの名無しさん
2019/10/19(土) 01:28:27.26ID:kDntEbbb
mingw使わずに標準のwindowsの環境で使えるようになってから出直してきて
499デフォルトの名無しさん
2019/10/19(土) 01:36:12.28ID:+xsHXYvs
mesonいいぞー
500デフォルトの名無しさん
2019/10/19(土) 01:37:16.21ID:JKxr+RAJ
makeとかのビルドツールって超重要なはずなのにおざなりな状況になってるのは不思議だ
なんとかしてくれ
501デフォルトの名無しさん
2019/10/19(土) 01:49:35.75ID:kiA3Djjo
クロスプラットフォームなソフト作るにしても、成果物が対象の環境で動けば良い訳で、ビルドをどの環境でも出来ることにそれほど意味はないからね
てかunix系でgccやclang使って開発しているものをVCに入れても謎の独自仕様でコンパイルできないとかザラだしね
502デフォルトの名無しさん
2019/10/19(土) 04:05:50.65ID:kDntEbbb
>>500
そう言って立ち上がった人は100億人くらいいたが誰一人として帰ってくる者はいなかった
503デフォルトの名無しさん
2019/10/19(土) 04:25:19.36ID:Qviva8VV
>>502
ほんとこれw
504デフォルトの名無しさん
2019/10/19(土) 07:26:21.05ID:4XSJxZBk
>>498
wslでmingwクロス環境はマクソ提供だけど
505デフォルトの名無しさん
2019/10/19(土) 09:24:58.31ID:wYu0/eCZ
あらゆるビルドツールは怪獣化して、怪獣を飼いならすためのラッパーが必要になり、そしてそのラッパーももれなく怪獣化する
歴史が証明しており例外はない
506デフォルトの名無しさん
2019/10/19(土) 09:25:25.42ID:WQwZNfDO
会社で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(); が必要なのか。
507デフォルトの名無しさん
2019/10/19(土) 09:50:39.86ID:wYu0/eCZ
ifsreamってcloseの後に再使用できる保証あったっけ?
ifs1の宣言をfor文の中に入れて毎回オブジェクト作り直す方が無難に見える
508デフォルトの名無しさん
2019/10/19(土) 09:51:32.93ID:wYu0/eCZ
宣言じゃないや定義
509デフォルトの名無しさん
2019/10/19(土) 09:54:59.18ID:Xn59Im0u
makeが複雑なんじゃなくて
多様な環境すべてに対応するように書くことが複雑なわけで。
だったらdockerなり使って一つの環境だけでの提供を考える方が楽。
510デフォルトの名無しさん
2019/10/19(土) 11:50:11.90ID:Xq/UOX2V
>>506
まずファイル開く権限あるのかな
最近それで引っかかった
511デフォルトの名無しさん
2019/10/19(土) 12:33:25.60ID:IyvFodwr
>>484
あれ、Winの構造化例外ってそもそもtry..catchには引っかからなかったような……
512デフォルトの名無しさん
2019/10/19(土) 12:41:43.65ID:IyvFodwr
Rakefileを使っている俺は小数派。

>>506
古いVCの場合ifstreamのclear()後再使用はできなかった記憶がある。
513デフォルトの名無しさん
2019/10/19(土) 13:51:45.42ID:2wK0PqU+
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にはないんだけど、
どこにあるか誰か知りませんか?

スレチだったらごめんなさい。
514デフォルトの名無しさん
2019/10/19(土) 14:48:33.14ID:g7gJ/kc1
おま環
何をダウソしたかくらいは書け
515デフォルトの名無しさん
2019/10/19(土) 15:03:15.21ID:g7gJ/kc1
python2.7 が既に入ってるなら
その bin に path 通しとけば良いんかな
516デフォルトの名無しさん
2019/10/19(土) 15:14:23.88ID:Q3nSZoDU
>>483
C の関数が呼び出すコールバックを C++ で書いた場合、環境によってはコールバックからの例外が
C の関数を通過してくる。環境によっては通過できずに terminate() するけど。
厳密に「Cの関数」じゃなくなるけど qsort(), bsearch() については例外が通過できるものと規定されている。
あとは未定義動作となる場合の反応として例外が飛んでくることはあるかもしれない。
517デフォルトの名無しさん
2019/10/19(土) 15:22:29.09ID:2wK0PqU+
>>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フォルダは試してませんでした。
ちょっとやってみます。
518デフォルトの名無しさん
2019/10/19(土) 15:27:23.69ID:g7gJ/kc1
OS とかツールは全部違うけど
https://chromium.googlesource.com/chromium/tools/depot_tools.git
これ clone しても確かに win_tools-2_7_6_bin は無かった
519デフォルトの名無しさん
2019/10/19(土) 15:29:04.62ID:ydKYIai+
何故公式のインストール手順を読まないのか
520デフォルトの名無しさん
2019/10/19(土) 19:15:58.17ID:fDUUZQql
Node.js じゃ、ダメなのか?
521デフォルトの名無しさん
2019/10/19(土) 20:05:28.35ID:+xsHXYvs
>>511
なんか設定次第で引っかかるようにならなかったっけ・・・
522517です
2019/10/20(日) 17:45:24.74ID:njFFTJVf
>>519
インストール手順自体は試したんだけど、
あまりに訳わからんちんで途中で断念して
他のサイトを見ながら入れようとしています。

>>520
Node.jsってv8の上に乗っかったjavascriptというイメージなんだけど、
C++から呼び出せるのでしょうか?
523蟻人間 ◆T6xkBnTXz7B0
2019/10/20(日) 20:19:16.97ID:hyX4MvIl
今、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.もっといいバッファリングの方法はないか。

お願いします。
524蟻人間 ◆T6xkBnTXz7B0
2019/10/20(日) 21:02:47.12ID:hyX4MvIl
スピード命です。フレーム落ちは絶対にダメだそうです。
525デフォルトの名無しさん
2019/10/20(日) 21:06:32.98ID:I/H74RW7
古臭いスタイルはさておき・・・
(別にそれでいいと思うよ)

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

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

最適なバッファ量はそのルーチンがどれぐらいのジッターで駆動してか計測して決めればいい
あとバッファリングすればそれだけ遅延が発生するから注意
本来ビデオ側と同期をとる必要あるけどPCだと適当だよな
CE機器だと完璧に合わせるけど
526デフォルトの名無しさん
2019/10/20(日) 21:15:47.21ID:PJrfugKB
COBOLのWRITE命令みたいに非同期書き込み&バッファローテーションてか?
あの当時のアホOSならともかく今どきアプリでそんなことせにゃならんか?
ベアメタルなら面白そうだけど
527デフォルトの名無しさん
2019/10/20(日) 21:16:42.61ID:Vt7fKSBc
遅延の原因は、vector::insert()でしょ。
528デフォルトの名無しさん
2019/10/20(日) 21:24:56.14ID:akKR2ina
ズらすの?
529デフォルトの名無しさん
2019/10/20(日) 21:27:13.38ID:peAHiKUT
誰がハゲやねん
530蟻人間 ◆T6xkBnTXz7B0
2019/10/20(日) 22:12:11.93ID:2g822Cxo
ああそうか。std::FILE/CreateFileそのものがバッファリングしてるんだ。ならば下手なバッファリングは必要ないと。

普通にI/Oすることにします。ありがとうございます。
531蟻人間 ◆T6xkBnTXz7B0
2019/10/20(日) 22:21:50.50ID:2g822Cxo
std::vectorのメモリー動的確保は音声処理では不味いと。

ハードディスク環境でジッターを測定して見ないと。わかりました。
532デフォルトの名無しさん
2019/10/20(日) 22:32:55.48ID:I/H74RW7
>>530
ただそのスレッドでwriteするのが問題ないかはよく確認した方がいいよ
writeでブロックされることで音声のソース側の処理が滞る可能性がある
その場合はやっぱり別スレッドにすべきだね
533蟻人間 ◆T6xkBnTXz7B0
2019/10/20(日) 22:59:16.11ID:2g822Cxo
プログラム高速化の禁術
https://qiita.com/kotauchisunsun/items/84e01c6fb621fcc1a647
534蟻人間 ◆T6xkBnTXz7B0
2019/10/20(日) 23:12:22.20ID:2g822Cxo
setvbufって便利な関数を見つけた。これ使うか。
535デフォルトの名無しさん
2019/10/20(日) 23:13:52.92ID:fVQAzz8M
音声のバッファリングには普通はリングバッファを使う
536蟻人間 ◆T6xkBnTXz7B0
2019/10/20(日) 23:28:56.20ID:2g822Cxo
ここまでのまとめ。

リングバッファを使う。
十分大きなバッファサイズでsetvbufを使う。
リングバッファへの読み書きは別スレッドにする。
バッファが空のときはイベント待ちで休ませる。
537デフォルトの名無しさん
2019/10/20(日) 23:44:50.34ID:Vt7fKSBc
別スレッドにキューイングするのに適したC++標準クラスは何かな?
538デフォルトの名無しさん
2019/10/21(月) 06:50:33.92ID:iwcvXj42
ゴチャゴチャ言うならビルトイン配列使っとけ
539デフォルトの名無しさん
2019/10/21(月) 15:01:03.56ID:c9dhXgWB
C++から呼べるし
C++を呼べる
540デフォルトの名無しさん
2019/10/21(月) 15:43:44.16ID:M4XH2/Bk
>>537
Queue への読み書きは、1要素当たりは短時間で済むことが多いので、
Queueを読み書きする場所で、必ず Critical Section などで囲むと良い。
一度に沢山の要素をまとめて書き込みたい場合は、原則的には、
1要素を書き込む処理をこまめに、Critical Section で囲むようにする。
必ずしも1要素ずつ囲む必要は無いが、こまめに囲った方が、
別スレッドの待ち時間が減ることが期待できるが、その意味が有る場合と
無い場合とが有る。
Critical Section の代わりに、Mutex や Semaphore などを使うことも出来る。
541デフォルトの名無しさん
2019/10/21(月) 17:20:19.00ID:Yxovtd3S
キャッシュに配列を置けばいいじゃねえか
かんたんだろ

APUの近くに配列でOK
複雑なデータ構造なんて考える必要ナシ
542デフォルトの名無しさん
2019/10/21(月) 18:19:39.76ID:iwcvXj42
タイミングで問題が出てるのにvectorにこだわるのはアホだよな
543デフォルトの名無しさん
2019/10/21(月) 18:33:52.73ID:K8Ck/3Ch
実行時のパラメータでバッファサイズ可変にするならvectorで始めにresizeしておくのが楽
size使える分配列のunique_ptrより取り回しも楽だし
544デフォルトの名無しさん
2019/10/21(月) 18:43:04.52ID:Kc9FjQwr
boostにリングバッファのクラスあるよ
545蟻人間 ◆T6xkBnTXz7B0
2019/10/21(月) 18:50:23.92ID:LVq8IpRv
天才だから自分でリングバッファ作った。
https://github.com/katahiromz/YappyCam/blob/master/ring.hpp
546蟻人間 ◆T6xkBnTXz7B0
2019/10/21(月) 19:22:51.62ID:ICV7tWge
バッファがいっぱいになったらどうしよう?
547537
2019/10/21(月) 19:27:27.31ID:iqf1snDW
>>540
それらの同期機能って標準C++のクラスだけで実現できるもんなの?
548デフォルトの名無しさん
2019/10/21(月) 19:30:51.93ID:Kc9FjQwr
>>546
捨てるしかないだろ
549デフォルトの名無しさん
2019/10/21(月) 20:56:31.15ID:NgTxqwl+
>>547
どこまでを標準と言ってるのか知らんけどお前の考える標準でスレッドをサポートしてるならたいてい同期機構もあるはず
550蟻人間 ◆T6xkBnTXz7B0
2019/10/21(月) 21:02:21.32ID:LVq8IpRv
>>547
WindowsではCriticalSection, CreateMutexなどがあったからC++11以前でも使えた。
C++11からstd::mutex, std::lock_guardなどが使えるぞ。
551デフォルトの名無しさん
2019/10/22(火) 00:25:01.95ID:IM/z9Y8P
ロックフリー的ななんか無かったっけ?
552蟻人間 ◆T6xkBnTXz7B0
2019/10/22(火) 16:18:00.26ID:QN5InCe0
リングバッファの排他制御どうするか?

push/popごとにロックかけたら遅くなりそう。
553デフォルトの名無しさん
2019/10/22(火) 16:36:38.23ID:LzjGZCpL
>>545
stlライクにしてる割にコピーやムーブが内部の値ベースなのおかしくない?
554デフォルトの名無しさん
2019/10/22(火) 17:03:31.86ID:mzkWHCb9
用途的に
reader 1
wrtier 1
だと思うけどそれならwait freeな実装が可能
read pointer/writer pointerで制御するやつね
かつかつに最適化するならこれ

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

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

とにかく原則どおりまずシンプルにミスなく作って計測して最適化ね
555デフォルトの名無しさん
2019/10/22(火) 17:19:01.36ID:mzkWHCb9
ringのソース見たけど
おれはm_full なしでやるのが好みだな
つまりm_front_indexとm_back_indexが一致するのはemptyのときのみ
full時には実際は1個空きがある状態

これを推し進めればwait freeの実装に近づけるぞ
車輪の再発明だが勉強にはなる
556デフォルトの名無しさん
2019/10/22(火) 17:21:45.79ID:2ZhQSHmS
>>551
std::atomicとかあるね
原理的に競合が起きないやつ
557蟻人間 ◆T6xkBnTXz7B0
2019/10/22(火) 17:29:01.30ID:QN5InCe0
まずは記憶媒体の性能を計測してみた。
https://github.com/katahiromz/YappyCam/blob/master/tests/diskrate/diskrate.cpp
https://twitter.com/katahiromz/status/1186558848393285633
これはSSDの場合だ。HDDでも同様に計測しないといけない。
https://twitter.com/5chan_nel (5ch newer account)
558蟻人間 ◆T6xkBnTXz7B0
2019/10/22(火) 17:43:23.84ID:QN5InCe0
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バイトあるようだ。
559デフォルトの名無しさん
2019/10/22(火) 18:28:33.04ID:HSQTG8Jj
>>558
Win32APIや音声仕様はC++じゃないのでよそでどうぞ。>蟻人間
560蟻人間 ◆T6xkBnTXz7B0
2019/10/22(火) 19:41:50.02ID:+0Lq2R8m
>>553
具体的にどうやればいい?
561蟻人間 ◆T6xkBnTXz7B0
2019/10/22(火) 20:08:29.90ID:+0Lq2R8m
【初心者歓迎】C/C++室 Ver.105【環境依存OK】
http://2chb.net/r/tech/1556142878/

こっちに移動します。回答者に感謝します。
562デフォルトの名無しさん
2019/10/22(火) 21:35:58.70ID:SC+tqfVH
Win32APIって何だよ
20年前からタイムスリップでもしてきたか?
563◆QZaw55cn4c
2019/10/22(火) 21:43:35.88ID:afWm6mlf
>>562
win32api(64bit版)で書くのが正義、という価値観もまだまだ存在するようです
564デフォルトの名無しさん
2019/10/22(火) 23:33:30.81ID:QUuuj0zF
C++11からできた属性構文あるけどこの属性は宣言にだけつければOK?
定義にも同じ属性を記載するべき?
565デフォルトの名無しさん
2019/10/23(水) 00:34:15.61ID:kAyiuXKe
>>563
それはお前だけの価値観だろハゲ
566デフォルトの名無しさん
2019/10/23(水) 00:50:12.41ID:/s0IRa9G
>>563,565
Mozilla Firefoxなどサードパーティ大手は今もWin32APIをネイティブに使っており.NETを使ってない。
567はちみつ餃子 ◆8X2XSCHEME
2019/10/23(水) 01:51:47.45ID:GER+FSVM
>>562 は .NET より WinRT とかを想定している気がするが。
568デフォルトの名無しさん
2019/10/23(水) 02:03:48.66ID:my1FePPi
単に64bitのWindows APIもなぜかwin32と呼ばれ続けてること知らないんだろ
569デフォルトの名無しさん
2019/10/23(水) 06:28:47.24ID:/lpUBik0
それこそ20年前からタイムスリップしたのかって話だなw
570デフォルトの名無しさん
2019/10/23(水) 18:08:41.93ID:bvZ5IXVl
速度重視な場面ならWin32APIは今でも普通に使う
571デフォルトの名無しさん
2019/10/23(水) 20:43:18.87ID:R0F6kh0V
うわぁ・・・
572デフォルトの名無しさん
2019/10/23(水) 21:15:01.42ID:kC3TvNwV
正直なところWin32APIで速度でるの?
573デフォルトの名無しさん
2019/10/23(水) 21:30:55.10ID:/s0IRa9G
>>572
「Linuxシステムコールで速度でるの?」という質問と同じくらい矛盾に満ちた質問。
Win32APIも含めシステムコールはOSが提供するAPIなので、プログラマは他の手段で代替しようない。
574デフォルトの名無しさん
2019/10/23(水) 21:35:56.58ID:H9cLmi0l
Native APIがあるじゃろ
575デフォルトの名無しさん
2019/10/23(水) 22:12:26.70ID:B7dtMHRy
Visual C++ 2015なんですが、
goto文でERRORというラベルに飛ばそうとしたら、コンパイルエラーが出ました。
ERRにしたらコンパイルできるようになったんですが、
なぜERRORのラベルはダメなんでしょうか?
576蟻人間 ◆T6xkBnTXz7B0
2019/10/23(水) 22:22:13.25ID:bxABcYeD
>>575
<wingdi.h>に#define ERROR 0がある。
577デフォルトの名無しさん
2019/10/23(水) 22:22:30.17ID:R0F6kh0V
#undef ERROR
578デフォルトの名無しさん
2019/10/23(水) 22:24:20.08ID:H9cLmi0l
単語1つのラベルなんか使うなってこった
579デフォルトの名無しさん
2019/10/23(水) 22:28:23.69ID:R0F6kh0V
いやC++ではマクロが悪だ
580575
2019/10/23(水) 22:32:44.87ID:B7dtMHRy
ERRORのdefineがあるんですね・・・!
ありがとうございました!
581デフォルトの名無しさん
2019/10/24(木) 09:12:01.73ID:m57JSwXI
クソみたいなマクロにsmallもある
他にもwindows.hには地雷が入念に仕込まれてる

普通の神経の人間が爆死して厭らしい人間だけが生き残るように整えられている厭らしい環境がwindows.hだよ
マトモな人間にはまず耐えられない
頭のオカシイ厭らしい人間だけが残るように設計されているのがwindows.h
このヘッダは頭がおかしい
582デフォルトの名無しさん
2019/10/24(木) 13:45:08.38ID:VURCQr2T
>>581
お前の頭がおかしいだけだと思う
583デフォルトの名無しさん
2019/10/24(木) 13:57:45.03ID:SfEmAS3k
林檎だってcheckマクロでBoostに大迷惑かけてるしお互い様
584デフォルトの名無しさん
2019/10/24(木) 17:59:23.36ID:0EVcBOG9
>>582
そこは
ヘッダだけにな
と言ってやるところだろ
585デフォルトの名無しさん
2019/10/24(木) 18:05:45.17ID:pgieaG2c
ヘッダ「嫌ならincludeするな」
586デフォルトの名無しさん
2019/10/24(木) 19:57:40.06ID:WiWlXxwu
このスレはみんなWindows嫌いなのかな
587デフォルトの名無しさん
2019/10/24(木) 20:17:56.94ID:TRYJth0S
んなわけない
588デフォルトの名無しさん
2019/10/24(木) 21:28:21.53ID:hxYU3Lux
たしかmaxとかもマクロ定義されてたよね
初心者のころはどハマリして殺意がわいたわ
589デフォルトの名無しさん
2019/10/24(木) 21:49:18.24ID:omM/Gkq5
いまはIDEが色変えてくれるからすぐわかるから別にいいけどね
590デフォルトの名無しさん
2019/10/24(木) 23:20:19.58ID:M5uvwdA8
マクロがあればなんでもできる
591デフォルトの名無しさん
2019/10/24(木) 23:40:29.47ID:PIyGP0m1
最近ちょいちょい思うことだが、ある言語のここがどうであーだこうだと議論する場合
テキストエディタでコーディング作業してる連中と IDE でコーディング作業してる連中では
わりと大きな認識の違いがあることが多い
592デフォルトの名無しさん
2019/10/24(木) 23:44:34.75ID:8Fri6DgZ
windows.hのマクロ回りでトラブル起こしているのは、殆んどvisual studio使用者だと思うのだが
593デフォルトの名無しさん
2019/10/25(金) 00:24:04.41ID:AZBzSxe6
認識の違いはコンパイラによるものであってコードエディタは関係ない。
594デフォルトの名無しさん
2019/10/25(金) 00:39:26.61ID:ghRRxqDU
モジュールでマクロとか気にしなくて良くなる(なるといいなぁ...)
595デフォルトの名無しさん
2019/10/25(金) 07:52:28.01ID:51G3P59H
コンパイラ変えてもマクロは変わらんでしょ
せいぜいエラーメッセージ変わるぐらいじゃ
596デフォルトの名無しさん
2019/10/25(金) 09:14:30.39ID:AZBzSxe6
>>595
何言ってるのか意味がわかりにくいエラーメッセージを吐くのはコンパイラでしょ。
597デフォルトの名無しさん
2019/10/25(金) 12:19:38.16ID:51G3P59H
マクロは影響範囲わからんからなんとも

vcでマクロがテンプレートに影響したらマジでわからん
clangはテンプレートのエラーメッセージわかりやすいとかみたな
598デフォルトの名無しさん
2019/10/25(金) 12:45:17.61ID:yKAgzXLG
>>593
お前はまず日本語を正しく認識できるようになれよ…
>>591は連中(=人間)の認識の話な
599デフォルトの名無しさん
2019/10/25(金) 17:33:51.00ID:AZBzSxe6
初心者であればあるほど親切なエラーメッセージが必要なのだけど、VCのエラーメッセージはgccに比べて不親切な印象がある。
STL関連のエラーメッセージは、わかりにくい代表格。かたやgccはprintf系の書式ミスを指摘してくれるなど初心者に優しい。
600デフォルトの名無しさん
2019/10/25(金) 18:03:22.82ID:AZBzSxe6
C#が使いやすいと思っている人は、Visual Studioの入力補完に救われていることに気づいていない。
Visual Studioがなければヘッダーファイル相当のgrep検索もままならない不便な言語であると感じるだろう。
601デフォルトの名無しさん
2019/10/25(金) 18:50:41.74ID:StYWqeWG
VS込みでいいじゃん
どうせC#なんて大半がWindows向けなんだしVS使える環境で開発してるでしょ

って変なこと言うと思ったらADSLか
602デフォルトの名無しさん
2019/10/25(金) 19:00:26.80ID:r/2esNbS
referencesource.microsoft.comみたいなありがたいものがあるのに
603デフォルトの名無しさん
2019/10/25(金) 19:58:41.60ID:q2iK2L4t
基本的には MSDN こそ C++ である。
604デフォルトの名無しさん
2019/10/26(土) 00:56:44.62ID:7AoWPXY8
class A{};

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

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

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

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

これ以外でできますか?
605デフォルトの名無しさん
2019/10/26(土) 00:59:53.57ID:SyjizfQh
全部消す
606デフォルトの名無しさん
2019/10/26(土) 01:35:09.91ID:dcsgYCXg
>>604
「コンパイルできるようにする」
というだけであれば、何も修正しない元のままでもコンパイルできるはずだし、
最初の class A {} の行をコメントアウトする、消す。
Nの中のAを消す、namespace N {・・・} の部分を全部消す、
などなどいくらでも有りえる。
607デフォルトの名無しさん
2019/10/26(土) 06:20:26.55ID:3CUGZWDU
BのfriendをN::AにしたいってことであればNとBの間にclass A;とAの宣言を入れる
これ以上のエスパーは無理
608デフォルトの名無しさん
2019/10/26(土) 08:16:08.08ID:kGqH5EJJ
>>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.
609デフォルトの名無しさん
2019/10/26(土) 21:50:06.24ID:JNlbd3QN
投稿テスト

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.
610デフォルトの名無しさん
2019/10/26(土) 22:03:59.61ID:JNlbd3QN
vs2019で::Aをコメントアウトするとokの意味がわからんorz
611デフォルトの名無しさん
2019/10/27(日) 08:17:56.25ID:/F19lavA
試してないが、理論上はこれでいけるはず :
namespace N
{
class A;
class B{
int i;
friend class A;
};

class A{
B b;
A(){b.i = 0;}
};
};
612デフォルトの名無しさん
2019/10/27(日) 08:27:09.91ID:C3DsRDjK
N::Aを前方宣言するなら、宣言を名前空間Nの中に入れるかN::Aで宣言する必要があるってのはC++の規約通りじゃないのか?
>>608が意味わからん
613デフォルトの名無しさん
2019/10/27(日) 09:08:16.09ID:M7FyKfzv
friend宣言は、当該宣言を含むクラスが属するスコープを対象とし
なおかつ、対象スコープに識別子を導入しない

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

namespace H
{
class I
{
friend class A; //H::A
};
}
614デフォルトの名無しさん
2019/10/27(日) 12:21:23.69ID:C3DsRDjK
>>604はfriend宣言ではなく前方宣言の問題なんだが?
615デフォルトの名無しさん
2019/10/27(日) 14:03:45.40ID:M7FyKfzv
いや前方宣言は関係ない
「もし」::Aがあったら、H::Aがあったら
と言っているだけのものだ
616デフォルトの名無しさん
2019/10/27(日) 14:25:39.88ID:vcUKQgsd
>>614
前方参照をfriendがどう解釈するかの問題だろ
617デフォルトの名無しさん
2019/10/27(日) 15:28:12.27ID:itfBjV2c
>>616なのは明白だが
>>604のコードのどこにコメントアウトすべき::Aがあるのかわからん…

ひょっとして、>>604が禁じていないのを良いことに、
最も外側のclass A{};を丸ごとコメントアウトしようとしている?
618デフォルトの名無しさん
2019/10/27(日) 15:53:16.22ID:ho9vIROt
>>617
???
>>608はVisual Studio 2019(2017でも同じだったが)の話だと言うことは理解できてるか?
619デフォルトの名無しさん
2019/10/27(日) 15:56:22.52ID:M7FyKfzv
>>617
そのとおりだが?

//class A{};

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

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

friend宣言が識別子を導入したり
関係ないはずのグローバルに干渉するなど
vcはfriendにクセがある
620デフォルトの名無しさん
2019/10/27(日) 16:07:13.81ID:6193c9It
規格的にはどうなるのが正しいの?
むしろ、もとの話がどうしたいのかに依る気がしないでもない
621デフォルトの名無しさん
2019/10/27(日) 16:13:20.11ID:rrcAfXPk
>>620
規格の話は>>608じゃねーの?
コンパイルできるようにするにはg++にするかVisual Studioなら>>619みたいにするってことでしょ
それ以外なら環境を提示してねってことかと
622デフォルトの名無しさん
2019/10/27(日) 16:22:22.30ID:itfBjV2c
>Visual Studioなら>>619みたいにするってことでしょ
C++相談室 part145 	->画像>2枚

>>604
>・最初のクラスAを別の名前にする
と何が違うんだそれ
623デフォルトの名無しさん
2019/10/27(日) 16:55:17.47ID:rrcAfXPk
>>622
一緒だよ
だからそれができないならg++(とか他のちゃんと規格準拠して処理系)にしろって書いてあるだ
まあVisual Studioが規格準拠するのを待つとかMSにねじ込むか金払って対応してもらうとかでもいいけどw
624デフォルトの名無しさん
2019/10/27(日) 20:50:09.77ID:5FCyBaq0
トンチンカンな質問かもしれませんが許して。

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

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

宣言してあるfunc(A,A)とかfunc(A,B)とかfunc(B,B)とかが
呼ばれるようにするにはどうしたらいいですかね?
あるいは、ガラっとコード変わってもだいたい似たようなことを実現するとしたら
どう書きますか?
625デフォルトの名無しさん
2019/10/27(日) 20:52:12.38ID:oi2VB0wA
シェアポの配列を作って添え字で切り替え。
626デフォルトの名無しさん
2019/10/27(日) 20:54:15.22ID:oi2VB0wA
あ、すまん。誤読していた。
>>宣言してあるfunc(A,A)とかfunc(A,B)とかfunc(B,B)とか
多態やってる意味を潰しに来てないか?
627蟻人間 ◆T6xkBnTXz7B0
2019/10/27(日) 20:54:19.69ID:irXhIBVc
>>624
funcを仮想化すれば?
628蟻人間 ◆T6xkBnTXz7B0
2019/10/27(日) 20:59:49.33ID:cNZwDfUU
もしくはfuncでは仮想化された関数しか使わないとか。
629デフォルトの名無しさん
2019/10/27(日) 21:09:28.45ID:aWGByvYb
>>624
visitorパターン
630642
2019/10/27(日) 21:09:54.33ID:5FCyBaq0
>>627
func(Base,Base)だけをvirtualってこと…ですよね?
え、こういうときにもvirtualて使えるの?と思って試したけどダメですね。

>>628
もうちょっと考えてみますけどたぶん難しいです
631624
2019/10/27(日) 21:14:40.36ID:5FCyBaq0
名前欄間違えてた…

>>629
あー…それかも
なんとなく知ってるだけで
まだ実装したことはないですが

それ正解かもしれません
調べつつやってみます
632デフォルトの名無しさん
2019/10/27(日) 21:34:36.36ID:4WtkkchW
>>624
愚直に dynamic_cast で N*N 分岐からはじめたら?
633デフォルトの名無しさん
2019/10/27(日) 22:12:39.30ID:5au4GxkL
2引数ならdouble dispatchとか
634デフォルトの名無しさん
2019/10/27(日) 22:14:23.71ID:SYtHJPpD
派生クラスの種類が決まっているなら
variantに置き換えたらvisit使えるから簡単
635デフォルトの名無しさん
2019/10/28(月) 05:15:43.29ID:VJWcm+Z+
>>624
こうゆうことやのうて?
https://ideone.com/BoNrnP
636デフォルトの名無しさん
2019/10/29(火) 01:15:36.46ID:Vnr+WSpj
C++でCOM扱うの苦痛すぎる
何が正攻法なのかさっぱりわからん
637蟻人間 ◆T6xkBnTXz7B0
2019/10/29(火) 01:32:18.86ID:CdNgVa0z
>>636
ATL
CComPtr
638デフォルトの名無しさん
2019/10/29(火) 01:41:40.05ID:Vnr+WSpj
別にCOMは作るんじゃないんだよ。
参照するだけなんだよ。
それでもATLなんーーーーーーーーー?
639デフォルトの名無しさん
2019/10/29(火) 01:43:16.61ID:Vnr+WSpj
そもそも文字コードどうなってるんやーーーー
コマンドプロンプトに出す時、どうするんやーー
現在のchcpの設定に従って変換線といかんのカーーーーーー
640蟻人間 ◆T6xkBnTXz7B0
2019/10/29(火) 02:28:13.51ID:OOQqvLIR
変換なんてWideCharToMultiByte使って一つ変換関数作ってその関数を使い回せばいいやん。
641デフォルトの名無しさん
2019/10/29(火) 02:42:32.11ID:/DWax9vx
WriteConsoleW
642デフォルトの名無しさん
2019/10/29(火) 04:01:15.69ID:ymnLB/52
>>640
Unicode文字列(絵文字とか)が文字化けするんだよー!
フォントの問題でないことは確認済み
643デフォルトの名無しさん
2019/10/29(火) 04:07:41.50ID:ymnLB/52
例えばググって見つけた、こことか
http://www.t-net.ne.jp/~cyfis/win_api/sdk/WideCharToMultiByte.html

wchar_t を const wchar_t にするのはまあいいとして、
日本語はOKだけど絵文字とか化けるじゃねーか
わーけわかねなんdfっrね;jk
644デフォルトの名無しさん
2019/10/29(火) 04:13:15.89ID:ymnLB/52
ん?WideCharToMultiByteってShiftJISに戻すやつじゃねーのか?
俺はUnicode文字すべてを表示したいだけだぞ
645デフォルトの名無しさん
2019/10/29(火) 04:20:56.50ID:xS90z6YC
chcpくらい使えよ
646デフォルトの名無しさん
2019/10/29(火) 04:26:03.90ID:/DWax9vx
windowsのコマンドプロンプトはまだ絵文字とかに対応してないよ
647デフォルトの名無しさん
2019/10/29(火) 04:29:31.79ID:YQKoC2Uo
>>646
全てではないだろうけど対応してる。

↑文字化けしそうだけど、横向きのハートとか
❤ とか
648デフォルトの名無しさん
2019/10/29(火) 04:29:44.12ID:YQKoC2Uo
お、文字化けしなかったw
649デフォルトの名無しさん
2019/10/29(火) 04:30:10.10ID:YQKoC2Uo
?????
Jane経由だとだめだろうな
650デフォルトの名無しさん
2019/10/29(火) 04:31:42.98ID:YQKoC2Uo
>>645
chcp 65001にしてもムダだったぞ
651デフォルトの名無しさん
2019/10/29(火) 04:54:41.95ID:pnjVF+Pb
コマンドプロンプトよりJaneは早く絵文字に対応しろ
652デフォルトの名無しさん
2019/10/29(火) 05:06:04.44ID:xS90z6YC
>>650
それutf8じゃねーか
653デフォルトの名無しさん
2019/10/29(火) 05:14:54.35ID:YQKoC2Uo
>>652
ぐぐってからいえwww
654デフォルトの名無しさん
2019/10/29(火) 05:19:50.17ID:YQKoC2Uo
なんでコードページ932なのに、NSimSunにすると
日本語以外もちゃんと表示できるのかわからない
655デフォルトの名無しさん
2019/10/29(火) 05:26:40.69ID:xS90z6YC
wcharがutf8なのか?あほか?
656デフォルトの名無しさん
2019/10/29(火) 05:36:55.26ID:YQKoC2Uo
Visual StudioのソースコードのデフォルトはBOM付きUTF8なんだな
657デフォルトの名無しさん
2019/10/29(火) 06:38:53.94ID:d5obkYRE
Windows依存の話は、以下すれでどうぞ。

Win32API質問箱 Build125
http://2chb.net/r/tech/1551247748/
658デフォルトの名無しさん
2019/10/29(火) 12:08:17.89ID:HlsBbRfa
自分の理解と違ってたので教えてください。

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でも同様の結果でした。
659はちみつ餃子 ◆8X2XSCHEME
2019/10/29(火) 12:09:55.91ID:0JV7MfqT
>>658

RVO でググって
660デフォルトの名無しさん
2019/10/29(火) 12:10:21.23ID:gvGgQxyJ
最適化で消された
661デフォルトの名無しさん
2019/10/29(火) 12:14:30.49ID:HlsBbRfa
>>659
まさにピンポイントでした。
ありがとうございます。
662デフォルトの名無しさん
2019/10/29(火) 13:58:53.43ID:cpD/FVFn
>>636
node.js
663はちみつ餃子 ◆8X2XSCHEME
2019/10/29(火) 13:59:57.20ID:0JV7MfqT
>>636
マイクロソフトのコンパイラならまあまあ補助があったりするでしょ。
それでも面倒くさいことにかわりないけど。
664デフォルトの名無しさん
2019/10/29(火) 15:55:18.54ID:VnX4qZP9
失礼します。テストです:
ハート:❤
横向きハート:❥
665はちみつ餃子 ◆8X2XSCHEME
2019/10/29(火) 16:08:16.15ID:0JV7MfqT
>>664
失礼な奴だな!
666デフォルトの名無しさん
2019/10/29(火) 18:43:54.18ID:NclFvQSb
>>663
補助なんてあったっけ?
まあ俺の知識はもう5年以上前の知識だから最近はちょっとはマシになったのかな
667デフォルトの名無しさん
2019/10/29(火) 21:55:11.67ID:daQRKG1l
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が入ってるんだけど、
これは、どのハードウェアでもこうなると仕様と決まってるの?
668デフォルトの名無しさん
2019/10/29(火) 22:07:48.92ID:VnX4qZP9
>>667
決まってない。
範囲外のアクセスなので、本来は絶対にやってはいけない。
読むだけでも不法例外が起きてしまう可能性もあるが、
書くのはもっとダメ。
たまたま、コンパイラシステムが何らかの目的で使っている
グローバル変数が arr 配列の直前にい配置されていて、
それが0になっているか、padding領域がたまたまそこにある
だけだと考えられる。
669デフォルトの名無しさん
2019/10/29(火) 23:33:23.00ID:B0gwdLKJ
.bssは0初期化されてる
670デフォルトの名無しさん
2019/10/30(水) 04:47:43.23ID:oMdYt0Tq
オブジェクトがスタックに作られてるかヒープに作られてるかってどうやって調べるの

具体的にはboostのmulti_arrayがどっちに作られてるか知りたい
671デフォルトの名無しさん
2019/10/30(水) 06:54:34.02ID:2wpdugOW
>>668
そりゃそうか。0で埋まってりゃコードが少し短くなって助かるんだが、まあやめとこう。
672デフォルトの名無しさん
2019/10/30(水) 07:31:59.85ID:yREk150+
>>670
アドレスでわかる
正しくはリンカからロケーションを取得だが
簡易的には自動変数のアドレスと上の方の桁が同じかどうかでも見当はつく
673デフォルトの名無しさん
2019/10/30(水) 09:19:14.69ID:C/RG5q83
>>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のそれぞれはまとまった
領域のアドレスを使っているので、推定ではなく断定できる。
674デフォルトの名無しさん
2019/10/30(水) 09:33:17.69ID:scNMtFri
どう考えてもヒープだろ
675デフォルトの名無しさん
2019/10/30(水) 09:45:24.54ID:vMK+Q7lg
>>670
ローカルスコープだけがスタック。
newしたものはヒープ。
676デフォルトの名無しさん
2019/10/30(水) 11:38:54.67ID:M6J6raPE
コンテナの場合はスタックに置いたつもりでも、コンテナがデータ部分を内部でnewするとかそういう話だろ
677はちみつ餃子 ◆8X2XSCHEME
2019/10/30(水) 12:07:14.45ID:qu4eF7c5
>>667-668
仕様上は配列の範囲外を指すポインタを作るのさえも未定義。
たとえアクセスしなくても。
なので、 ptr-1 という式の時点で未定義動作になる。

ただし、アクセスしないなら配列の最後の要素より一個うしろを指すポインタを作るのは許される。
つまりこの例で言えば ptr+2 や &ptr[2] は有りだけど ptr[2] は駄目。

&ptr[2] は ptr[2] に対して & を付けているので一見すると途中で ptr[2] を評価しているように見えるけど、
・ ptr[2] は (*(ptr+2)) の構文糖である
・ * の結果に & を適用している場合には * も & も評価されず、両方とも取り除いたのと同じことになる
というルールの合わせ技によって &ptr[2] は ptr+2 と同じ意味になる。

ちなみに、配列ではないオブジェクトは要素が一個の配列と同じレイアウトを持つことは保証される。
678デフォルトの名無しさん
2019/10/30(水) 12:14:10.66ID:pPHw66rS
>>677
&*p を p とみなす特別ルールは C の規格にあるけど C++ には無かったりする。
もう10年以上審議中。 https://wg21.cmeerw.net/cwg/issue232
679デフォルトの名無しさん
2019/10/30(水) 12:21:16.92ID:C/RG5q83
>>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)
の式が常に厳密に成り立つことが保証される。
680デフォルトの名無しさん
2019/10/30(水) 12:25:41.94ID:C/RG5q83
>>678
operator&(), operator*() をユーザーが定義した場合には、それに従うが、
定義しなかった場合、&*pX == pX が どんなポインタ pX についても
成り立つことは保証されるはず。
681デフォルトの名無しさん
2019/10/30(水) 13:28:14.72ID:JDSjHFuf
>>670
一般的なPC環境なら、
適当に用意した別の関数を呼び出して(multi_arrayのインスタンスがまだ有効で、インスタンス生成したスレッドと同一スレッドからなら、どこから呼び出してもよい)、
その関数のローカル変数のアドレスよりも&multi_array[0]の値のほうが大きければ、multi_arrayのデータ領域はスタックに確保されたと判断できるのでは
682デフォルトの名無しさん
2019/10/30(水) 13:38:23.28ID:C/RG5q83
>>681
自分も最初、同じような勘違いをしていたが、
シングルスレッドの場合に限定すれば、
スタックの構造からすれば、最初に確保したローカル変数のアドレスが、
そのごろのローカル変数のアドレスよりも必ず大きい。
そして、ヒープから確保したオブジェクトのアドレスは、必ずそれらよりも大きい。
なので、後から別の関数を呼び出す必要はない。
main()関数の中で最初に定義したローカル変数のアドレスが分かればそれで十分。
683デフォルトの名無しさん
2019/10/30(水) 13:39:27.23ID:C/RG5q83
>>682
誤:そのごろのローカル変数のアドレスよりも必ず大きい。
正:その後のローカル変数のアドレスよりも必ず大きい。

早い話が、スタックは、上下逆になっていることが味噌。
684デフォルトの名無しさん
2019/10/30(水) 16:43:27.90ID:iACLsVPd
0 埋め勝手に期待してると
Debug build と Release build の変化ではまるんじゃね
685デフォルトの名無しさん
2019/10/30(水) 18:21:24.13ID:sLIKMMS8
未定義動作に頼って幸せになった人間はいない
686デフォルトの名無しさん
2019/10/30(水) 18:25:45.90ID:PFJwOjFS
問題は未定義動作が多すぎることだ
687デフォルトの名無しさん
2019/10/30(水) 19:14:52.52ID:NnKRxbK9
>>682
> そして、ヒープから確保したオブジェクトのアドレスは、必ずそれらよりも大きい。
スタックエリアとヒープエリアの前後関係なんて決まってたっけ?
688デフォルトの名無しさん
2019/10/30(水) 19:53:22.92ID:/8g3afGg
c++なら暗黙に0で初期化するところでcだと死ぬ
689はちみつ餃子 ◆8X2XSCHEME
2019/10/30(水) 20:10:37.29ID:qu4eF7c5
Boehm GC にスタック・ヒープの範囲を判定する部分があったはず。
690デフォルトの名無しさん
2019/10/30(水) 20:42:33.17ID:MNbPntdA
>>682
ヒープから確保したアドレスがスタックより大きいっていうのはかなり特殊な環境では?
691デフォルトの名無しさん
2019/10/30(水) 20:46:40.08ID:7FaQcqiv
>>682
スタックとヒープのアドレスに前後関係の縛りなんかねえよ
互いに全く別個のデータ構造で相互に依存関係はない
692デフォルトの名無しさん
2019/10/30(水) 21:02:17.94ID:xN/ut28D
お前ら甘いぞ
ヒープから確保したメモリをスタックにすることもできるんやで
逆にいうとスタックの情報もとれる
pthread_attr_getstackな
693デフォルトの名無しさん
2019/10/30(水) 21:28:56.04ID:KWwo/1iW
https://ideone.com/Q4ek9R
デストラクタを後から書き換えるってできなかったっけ?
694デフォルトの名無しさん
2019/10/30(水) 21:37:47.50ID:scNMtFri
なんで出来ると思ったのか
695デフォルトの名無しさん
2019/10/30(水) 21:41:50.59ID:/8g3afGg
おまえらはなんですぐ破壊的なメモリアクセスしようとするんだよ。
696デフォルトの名無しさん
2019/10/30(水) 21:44:55.49ID:KWwo/1iW
>>694
なんでだろ・・・。
できなそうだな。さんきゅー。
697デフォルトの名無しさん
2019/10/30(水) 21:47:25.90ID:M6J6raPE
変にトリッキーなことをせず普通に書けば平和なのに
698デフォルトの名無しさん
2019/10/30(水) 21:51:21.63ID:Z1e8Gfkt
平和を求めるならc++使わないことだな
699デフォルトの名無しさん
2019/10/30(水) 21:56:38.45ID:Z1e8Gfkt
>>696
virtualでないと子のデストラクタは呼ばれないってのとごっちゃになってるとか?
700デフォルトの名無しさん
2019/10/30(水) 21:57:32.16ID:/8g3afGg
>>698
平和は求めるが性能も求めるから仕方なく使うのがc++だよ、馬鹿。
701デフォルトの名無しさん
2019/10/30(水) 22:07:52.76ID:KWwo/1iW
>>699
多分それだ。もやもや取れたわ。ありがとう。
702デフォルトの名無しさん
2019/10/30(水) 22:15:48.21ID:Z1e8Gfkt
>>700
お前moveだからコピーコストゼロ!カロリーゼロとか言ってるだろ
703デフォルトの名無しさん
2019/10/30(水) 22:18:45.46ID:T2yRPHdv
>>693
正直何をしたいのかさっぱりわからん
704デフォルトの名無しさん
2019/10/31(木) 00:30:04.67ID:Mfb82uAb
>>687
なるほど、想定していたのは、Windows環境限定だった。
705デフォルトの名無しさん
2019/10/31(木) 01:11:19.07ID:Z73hoFPo
>>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 もサポートしてる実装)では保証されているとか、
保証されてないと困るという話ならそうなんだろうとは思うけど。
706デフォルトの名無しさん
2019/10/31(木) 07:54:20.46ID:CWgnmwch
保証は知らんけどアドレス計算だから1じゃなくてsizeofの値じゃないのそれ
あとだめならベクタで&v[x]みたいのも未定義になっちゃうけども
707はちみつ餃子 ◆8X2XSCHEME
2019/10/31(木) 12:29:41.78ID:/W+zTx1p
>>705
俺も仕様としての保証はないと思う。
C の規格を見て関連しそうな項目として

- ポインタを型変換して変換後のアライン (処理系定義) が正しければそれを元の型に再変換したものは変換前と等しい
- ポインタを別のポインタに型変換した後のアラインが正しくなければ未定義
- ポインタを文字を指すポインタに型変換した場合、オブジェクトの最も低位のアドレスを指す
- 文字を指すポインタに変換されたポインタは元のオブジェクトの大きさまで連続して増分すると
  そのオブジェクトの残りのバイトへのポインタを順次生成できる

(注:ここで言うポインタには関数ポインタを含まない)

という保証は見つけられたので

(((BYTE *)arr) + sizeof(TYPE) * k)

までは妥当な式と言えると思うんだけど、 (TYPE *) というキャストが出来る根拠は見つけられなかった。
708デフォルトの名無しさん
2019/10/31(木) 13:00:56.65ID:Mfb82uAb
>>707
C言語の基礎として、TYPE *ptr に対し、
 ptr + k == (TYPE *)(((BYTE *)ptr) + sizeof(TYPE) * k)
は保証されているはず。
709デフォルトの名無しさん
2019/10/31(木) 13:06:36.29ID:iFqs222y
×基礎
○妄想の中の理想世界・ご都合ワールド
710デフォルトの名無しさん
2019/10/31(木) 13:21:36.49ID:Mfb82uAb
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)
711デフォルトの名無しさん
2019/10/31(木) 13:43:36.78ID:hGg8JwcT
C++のヘッダファイルのクラス定義って、
privateまで定義しないといかんのが嫌だな。

privateだから内部に隠蔽されて、外部からは知らなくていい情報なのに
内部で使ってる型をヘッダファイルに書かなければいけないから、
それをincludeしてる方も、その型の存在を知ってしまう。

どうにかならんのかな?
712デフォルトの名無しさん
2019/10/31(木) 13:54:48.05ID:Nmr38VJU
ヘッダに描くのをやめればいい
713デフォルトの名無しさん
2019/10/31(木) 14:01:21.28ID:Mfb82uAb
>>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 は正しい。
714デフォルトの名無しさん
2019/10/31(木) 14:04:09.17ID:/uM4xbrd
>>711
pimpl
715デフォルトの名無しさん
2019/10/31(木) 14:46:45.02ID:Mfb82uAb
>>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)
 に一致する。」
となります。
716デフォルトの名無しさん
2019/10/31(木) 14:50:36.73ID:Mfb82uAb
>>691
言語仕様的には決まっていませんが、Win32で実験する場合、
最初の質問者が、答えを見つける手段としては、正しいやり方なのです。
Win32で実験してヒープからの確保なのかどうか判明してしまえば、同じ
boostのソースを他の環境で動かしても、#ifdef などで動作が変えられていない
限りは、同じ結果となるからです。
717はちみつ餃子 ◆8X2XSCHEME
2019/10/31(木) 14:53:56.72ID:/W+zTx1p
>>713
アドレスがどうこうじゃなくてキャストが許されるかっていう話なんだけど。
718デフォルトの名無しさん
2019/10/31(木) 15:27:23.28ID:CWgnmwch
ポインタのキャストてポインタが指してるアドレスのデータの解釈だけの問題だから許されないキャストがそもそもないのでは
適切かどうかは知ったことではないが

というか配列のデータが連続していれば当然のごとく成り立つ話じゃん
それは保証されてるわけだし
719デフォルトの名無しさん
2019/10/31(木) 16:06:33.06ID:hGg8JwcT
>>714
サンクス。集約を使えば行けるんかいなーとか雑に思っていたが、
そういうイディオムがあるんだな!
720デフォルトの名無しさん
2019/10/31(木) 16:29:14.27ID:Mfb82uAb
>>718
構造体型へのポインタ同士については、単なる解釈し直しではなく、
アドレスの加減算を伴うことがあります。
しかし、BYTE型へのポインタから構造体型へのポインタへのキャストに
ついては、解釈のし直ししか、コンパイルのしようがなく、その場合に
ついては、ポインタの指すオブジェクトがマシン後レベルで同じアドレス
を持つことになります。ただし、厳密な仕様は知りません。
721はちみつ餃子 ◆8X2XSCHEME
2019/10/31(木) 16:32:02.98ID:/W+zTx1p
pimpl ってプライベートなメンバを隠したいだけのために導入するのは面倒くさ過ぎない?
手間かけてでもやりたいって場面もあるのかもしれんが、どうにも割に合う気がしない。
722デフォルトの名無しさん
2019/10/31(木) 17:07:47.69ID:NdDnFbFX
どうしても実装を隠さないと発狂する人が使う
723デフォルトの名無しさん
2019/10/31(木) 17:11:39.47ID:M7zdaumA
unique_ptrで作ればそれだけで勝手にmovableなクラスになって便利だよpimpl
724デフォルトの名無しさん
2019/10/31(木) 17:17:39.90ID:hGg8JwcT
>>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を隠したかったんだよ!


言いたかったことはこれ
725デフォルトの名無しさん
2019/10/31(木) 17:29:24.06ID:Mfb82uAb
>>724
また髪の毛の話してる、などというと荒れそうなので決して言いません。
726はちみつ餃子 ◆8X2XSCHEME
2019/10/31(木) 17:52:49.82ID:/W+zTx1p
C++20 でモジュールの機能が入るとかいう話になってるから
それが成れば pimpl なんていらんようになると思うんだが、
実際のところモジュールの様子ってどうなの?ちゃんと入りそう?
727デフォルトの名無しさん
2019/10/31(木) 18:23:02.02ID:ZttcTVl1
無理。
テンプレートとの両立、オーバーヘッドの問題
どの視点でみてもくそなものしかできないことは明白。

こういうのに引っかかるバカが増えたよね。
728デフォルトの名無しさん
2019/10/31(木) 18:32:01.00ID:gpc+5FVL
>>721
そう思うのは複数人で規模のでかいもの作ってないから
729デフォルトの名無しさん
2019/10/31(木) 19:37:56.00ID:/uM4xbrd
pimplは開発規模は関係なくて、ライブラリの公開するヘッダでユーザーに関係ないものを隠すために使わないか?
730はちみつ餃子 ◆8X2XSCHEME
2019/10/31(木) 20:03:49.64ID:/W+zTx1p
>>729
それも pimpl の目的としてはあるんだけど、 >>724 が書いているように C++ だとファイルの依存関係が必要以上になることもある。
それをどうにかしたら make で差分ビルドしたときに走るタスクが少なくなるので
規模が大きいプログラムで pimpl を使うとビルドがだいぶん速くなるということはありうる。
規模が小さいと体感するほどの差が出ない。 割に合わない。
そういう意味では規模は関係ある。
731デフォルトの名無しさん
2019/10/31(木) 20:09:29.87ID:jES25g+p
個人的には、自分ひとりで作ってるプログラムは、高頻度で全ビルドに
かける癖が付いてしまってる。
こうしておくと、OSをSleepモードにしていて、誤って電源を切ってしまったような
時にIDEが管理しているプロジェクトのデータファイルの何かが壊れていても
気付なかった時や、プロジェクトのバックアップ処理の時のコピー操作の何らか
の間違いで何かがおかしくなってしまったようなときに変な不具合に悩まされなく
て済む。
732デフォルトの名無しさん
2019/10/31(木) 22:29:01.40ID:GkSnEle2
C++とオブジェクト指向をきちんと身につけてる人ばかりの環境ならいいんだけどね、pimpl
経験不足な人だと理解出来なさそう
733デフォルトの名無しさん
2019/10/31(木) 22:54:10.87ID:/p/NkBNt
使ってるうちにインターフェースを使った典型的な奴とそう変わらない事に気付く
734デフォルトの名無しさん
2019/10/31(木) 22:58:21.62ID:KjvgkRuG
継承使いたくないからpimplの方が好き
735デフォルトの名無しさん
2019/10/31(木) 23:14:49.56ID:FGj4X+XO
cpprefjpのサンプルの赤字の部分使い方合ってる?

https://cpprefjp.github.io/reference/memory/allocator_traits/select_on_container_copy_construction.html
736デフォルトの名無しさん
2019/10/31(木) 23:43:47.06ID:/p/NkBNt
確かに、select_on_container_copy_construction(other.alloc_)が正しいような気はする
737デフォルトの名無しさん
2019/11/01(金) 00:03:47.15ID:8rUFWNXZ
テンプレート活用のための最適化が全盛期の今 pimpl は時代遅れ。
738デフォルトの名無しさん
2019/11/01(金) 00:09:16.78ID:rKg4WNgJ
はいはい
739デフォルトの名無しさん
2019/11/01(金) 00:19:47.84ID:TUcr0tQH
pimplが時代遅れというのなら、それに代わる
依存する必要がない所を断ち切る方法を提示してくれ
740デフォルトの名無しさん
2019/11/01(金) 00:24:57.04ID:8rUFWNXZ
>>739
クラスの前方宣言。
テンプレートによるコンパイルエラー回避。
741デフォルトの名無しさん
2019/11/01(金) 01:06:00.24ID:pNQbmHLO
>>739
インターフェースと継承
742デフォルトの名無しさん
2019/11/01(金) 03:35:55.36ID:TUcr0tQH
>>740-741
どちらも型を書くので依存を断ち切れてない
743デフォルトの名無しさん
2019/11/01(金) 05:46:43.28ID:xzGeRMKo
pimplでも型を書くのに、何を言っているんだか
そんなに型を書くのが嫌なら、Cの不透明型でも使ってろ
744デフォルトの名無しさん
2019/11/01(金) 06:27:26.52ID:62eq0k7o
pimplの目的も方法も全く理解してないって白状したぞこいつ
745デフォルトの名無しさん
2019/11/01(金) 06:54:21.26ID:vkO9vKkI
>>739
目の前のパソコンを窓から投げ捨てます
746デフォルトの名無しさん
2019/11/01(金) 07:17:25.47ID:luUnrp0t
privateをどうしても隠蔽したいならpimpl使うのもやむを得ないのかも知らんけど、そんな事態になったこと無いからよくわからんな
747デフォルトの名無しさん
2019/11/01(金) 07:43:37.38ID:62eq0k7o
ライブラリ作る時にstd::unordered_mapとかメンバに使いたいと思わないもんなのか、よくわからんな
pimplで.cppに閉じ込めないとコンパイラやSTLのバージョン違いで壊れるんだけど
748デフォルトの名無しさん
2019/11/01(金) 07:44:21.36ID:nMXewbQV
>>739
自部屋に引き籠もって外界との依存を断ち切ります。
749デフォルトの名無しさん
2019/11/01(金) 07:58:26.02ID:OvwU0XDV
ライセンスに書いとけば良い
・プライベートは見ないで下さい。お触り禁止。
750デフォルトの名無しさん
2019/11/01(金) 08:11:36.17ID:s5avmMq4
ただ単に仕様と実装をすっきり分離できるというだけでも充分な動機になる
751デフォルトの名無しさん
2019/11/01(金) 08:20:42.72ID:luUnrp0t
>>747
> pimplで.cppに閉じ込めないとコンパイラやSTLのバージョン違いで壊れるんだけど
ん?どう言うこと?
なんかやり方間違えてね?
752デフォルトの名無しさん
2019/11/01(金) 08:22:07.06ID:luUnrp0t
>>750
private部分を見なきゃいいだけだろw
そもそも実装は.cppに書くんだし
753デフォルトの名無しさん
2019/11/01(金) 08:25:35.79ID:StFJ+6Yp
エディタが貧弱だったころの名残を未だに引き摺っている
仕様と実装を分離したらそれだけでファイルが倍に増えて管理が面倒になる
仕様はソースコードから逐次自動生成すればいい
なので昨今の言語はIDEに迎合していて、暗黙の大前提でIDEでの運用が見込まれている
それ単体で成り立つものでは無くなっている
754デフォルトの名無しさん
2019/11/01(金) 09:01:23.35ID:DyENPU43
因果関係を理解できない人ってプログラマ向いてない
755デフォルトの名無しさん
2019/11/01(金) 09:41:29.48ID:Oq+eTBHB
class Util() {
public:
  int aaa();
  std::string bbb();
private:
  MinorClass mc;
  MinorClass mc zzz();
}


こういうユーティリティクラスがあって便利だなーって思ったときに、
便利だと思うのはaaaメソッドとかbbbメソッドであって
内部で使ってるMinorClassとかどうでもいいねん

Utilクラスのインクルードファイルはインクルードしたいけど
MinorClassのインクルードファイルはインクルードしたくないねん
そんなもんインクルードしたらMinorClassが変更になっただけで
Utilクラス使ってるところも変更になるやろ?
756はちみつ餃子 ◆8X2XSCHEME
2019/11/01(金) 10:06:12.42ID:ichmHmwx
>>755
そこをわからんって言ってるやついないんだよ。
わかった上で変更になったらどんくらい問題なんや? 別にええやろ。 と言う場面の方が多いという話なんだよ。
pimpl が有用な場面があるっていう主張もわかるよ。 わかるけど、そういう場面に遭遇したことないなぁという話なんだよ。
757デフォルトの名無しさん
2019/11/01(金) 10:29:23.31ID:9RAuu3bH
>>755
それだけならMinorClassを前方宣言するだけでincludeいらない
758デフォルトの名無しさん
2019/11/01(金) 10:32:58.37ID:XsK+HhVl
>>757
MinorClassの実体をメンバにするなら前方宣言じゃだめ
ポインタなら前方宣言にできる
759デフォルトの名無しさん
2019/11/01(金) 10:33:41.18ID:o99mOnqi
Utilはあるライブラリの公開クラスです
MinorClassは標準ライブラリのテンプレートクラス(例えばstd::unordered_map<Hoge>)です
Aさんはとあるコンパイラver1.0でコンパイルしたライブラリのバイナリとヘッダーを配布しました(ソースは配ってない)
10年後にBさんがこのライブラリのバイナリを入手して使おうと思いました
その間にコンパイラの標準ライブラリも劇的な進化を遂げ、コンテナの内部構造に大幅な改良を加えて超高速化したと宣伝していました
Bさんはヘッダーをincludeしてコンパイラver8.0でビルドしました

さーて何が起こる?Utilがpimplだとどうなる?よくよく考えよう
760デフォルトの名無しさん
2019/11/01(金) 10:43:47.44ID:9RAuu3bH
>>758
そんなんかすまん
勘違いしてた
761デフォルトの名無しさん
2019/11/01(金) 11:01:10.12ID:XsK+HhVl
privateメンバをポインタ型にする手間や不都合とpImplの手間や管理コストのどっちを取るかだろうな
基本的には継承するクラス以外のincludeは排除できる
ヘッダ内部での外部ライブラリのincludeは可能な限り避けるべき
762はちみつ餃子 ◆8X2XSCHEME
2019/11/01(金) 11:10:39.87ID:ichmHmwx
>>760
オブジェクトを生成するには「大きさの情報」が必要だと覚えておくとわかりやすいと思う。
クラスの内容がわからないと大きさが確定しないから生成できないけど、ポインタの大きさはわかる。
763はちみつ餃子 ◆8X2XSCHEME
2019/11/01(金) 11:11:24.16ID:ichmHmwx
>>759
そういう状況があることはわかるよ。
でもそんなことしねーよって話なんだってば。
764デフォルトの名無しさん
2019/11/01(金) 13:00:57.84ID:aQLx28Zt
>>763
それお前個人がしたことないって言う経験談?
それとも他の代替手段を取るってこと?
先に言っておくと前者ならすっこんでろ
765はちみつ餃子 ◆8X2XSCHEME
2019/11/01(金) 13:23:21.41ID:ichmHmwx
>>764
俺がしたことないという経験談だが、
ここで pimpl が割に合わないと出ている意見は
そういう状況があんまりないという内容だということの説明でもある。

そういう状況で必要だってのはわかってるし、
そういう状況にあるなら使えばいいよ。
それはわかってるんだよ。
だからしつこく説明しないいよっていう話。
766はちみつ餃子 ◆8X2XSCHEME
2019/11/01(金) 13:29:29.85ID:ichmHmwx
要するに >>759 はまるで見当はずれのこと言ってんなぁという感想。
767デフォルトの名無しさん
2019/11/01(金) 14:32:22.73ID:o99mOnqi
単機能ライブラリ作って渡す仕事してる人にとっては日常なんで、検討外れとか抜かされても勝手なこと言ってんなあとしか
まあ、OSSしかやらないとか、最終の実行バイナリしか作らないとか、そもそも個人プレーで人にプログラム成果物渡したりしないとかなら、
pimplの価値わからんという気持ちになるのはしょうがないし、それが世界の全てだと思っちゃうのかもな
768はちみつ餃子 ◆8X2XSCHEME
2019/11/01(金) 14:59:10.92ID:ichmHmwx
>>767
それが全てといってるわけじゃなくて、
pimpl がどうしても必要! と言ってる人こそライブラリ販売の世界しか見てないという話をしてんの。
769はちみつ餃子 ◆8X2XSCHEME
2019/11/01(金) 15:01:01.21ID:ichmHmwx
いる場所ではいるし、いらない場所ではいらないという当たり前のことしか言ってないつもりなんだけど。
770デフォルトの名無しさん
2019/11/01(金) 15:04:22.58ID:E92xj2lK
全員知らないことの方が多いのに相手が自分の分野のことを知らないと無知扱いするのは草生える
771デフォルトの名無しさん
2019/11/01(金) 16:16:45.44ID:luUnrp0t
>>759
そもそもVer. 1.0でコンパイルしたクラスライブラリをVer. 8.0でコンパイルしたオブジェクトとリンクできるの?
10年間互換性保ってるC++コンパイラの名前教えてくれるかなw
772デフォルトの名無しさん
2019/11/01(金) 18:28:24.75ID:5daK08GN
動的リンクなら古いコンパイラでコンパイルしたライブラリが使えるかどうかはOSの互換性次第だろ
773デフォルトの名無しさん
2019/11/01(金) 18:36:37.94ID:VMz8o48U
>>766
一般的な現象よ
周回遅れのやつに絡まれたらキョトンとしちゃうやろ
今の餃子ちゃんがまさにそれよ
幼稚園児に絡まれたお兄さんみたいになっとる
774デフォルトの名無しさん
2019/11/01(金) 18:38:39.54ID:OIX3BcSW
あぁ、メモリーレイアウトでずっこけるやつか。
775デフォルトの名無しさん
2019/11/01(金) 19:03:19.99ID:luUnrp0t
>>772
マングリングって知ってるか?
そもそもC++のクラスライブラリを簡単に動的リンクできるOSってあるのか?w
776デフォルトの名無しさん
2019/11/01(金) 19:25:46.93ID:4VV6x0Mu
まんぐりがえし
777デフォルトの名無しさん
2019/11/01(金) 19:41:21.97ID:N2gtvXpa
comはクラスライブラリになるのかな
いろいろ面倒だけど
778デフォルトの名無しさん
2019/11/01(金) 19:44:45.43ID:8Rp12Rb3
念のため確認だけど、pimplの代替手段については把握されてる前提でOK?
http://site.oukasei.com/?p=148
779デフォルトの名無しさん
2019/11/01(金) 19:56:12.78ID:o5qRV/vr
リンク問題はABIの話だよな?
それはリンカのオプション次第じゃないのん?
780デフォルトの名無しさん
2019/11/01(金) 20:26:50.93ID:luUnrp0t
>>779
広い意味だとABI
リンカのオプションで前のバージョンに対応してるとかの例もあるけど10年前まで対応してる例とかあるのかな?
781デフォルトの名無しさん
2019/11/01(金) 20:51:10.72ID:62eq0k7o
>>778
結局、pimplのI/F用外側クラスを基底クラスに、implを派生クラスにするってだけでやってることはpimplと同じ
むしろ以下の点でより悪い
・I/F用のクラスと実装用のクラスに不必要な継承関係が導入されていらない複雑度が増える
・↑と同じことだが、実装用クラスがI/F用クラスと同じメンバ関数を実装することが強制される
・コンストラクタが使えず、独自のファクトリ関数の使い方を利用者に覚えさせる必要がある
・利用者に生ポが露出する。生ポを避けたい利用者は自分でunique_ptrなどで包まなければならない
・I/F用クラスを利用者が勝手実装して混入させることを許す

上に挙げたのはポリモさせたい場合はメリットでもあるんだが、ポリモを意図しない単独クラスに継承構造なんか入れるべきではない
782デフォルトの名無しさん
2019/11/01(金) 21:03:35.70ID:gYA8Bkai
いっそのことヘッダオンリーライブラリにしようぜ
783デフォルトの名無しさん
2019/11/01(金) 21:04:43.68ID:tPmTFLHa
>>766
検討はずれかどうかは意見が分かれるかもしれないけど、pimplには速度的な
オーバーヘッドが少しはあるのと、記述が分かりにくいような気がするので、
個人的にはまずは使うのを躊躇する。

ポインタのワンクッションを置いても速度的なオーバーヘッドが問題ない場合には、
単純なクラスへのポインタを使ってそのクラスの実装に依存しないようなコードを書く
ことはある。しかし、pimpleと言われているものよりずっと単純なもの。
pimplの定義もよく分からないので、それが全く同じものかどうかは分からない。
784デフォルトの名無しさん
2019/11/01(金) 21:10:39.48ID:gbx33EDY
>>752
目指す理想が違いすぎるやつとは話にならん
785デフォルトの名無しさん
2019/11/01(金) 21:13:24.24ID:tPmTFLHa
>>778
そういう風に、C++の抽象クラス(Javaではinterfaceと呼ばれるものと等価
だったはず)を使うと分かり易いですね。
786デフォルトの名無しさん
2019/11/01(金) 21:15:27.37ID:N2gtvXpa
実装方法もいろいろでメリットデメリットもいろいろやから好きなの使えばええねん
787デフォルトの名無しさん
2019/11/01(金) 21:18:26.92ID:tPmTFLHa
interface を使って、データメンバを隠したい場合は、new CXxxx にあたる部分を
どうやって実装するかの問題になるんですね。グローバル関数にしてしまう
方法もありますが、確か、デザインパターンの「Factoryパターン」というものが
それに該当したかもしれません。
788デフォルトの名無しさん
2019/11/01(金) 21:34:43.52ID:aQLx28Zt
>>768
依存切りたいならpimplと言ってるところに
依存気にしてないからpimpl不要っていってるのがお前
不要ならすっこんでろって
789デフォルトの名無しさん
2019/11/01(金) 22:03:59.28ID:p6e3QfJv
COM最強やな
790デフォルトの名無しさん
2019/11/01(金) 22:07:08.70ID:tPmTFLHa
>>789
めちゃくちゃ使いにくい。
791デフォルトの名無しさん
2019/11/01(金) 22:10:22.26ID:U/a7Wx11
>>784
目指す理想がpimpl?
確かに話にならんなw
792デフォルトの名無しさん
2019/11/01(金) 22:13:09.54ID:U/a7Wx11
>>790
ただ20年間I/F変えないようにするにはあの程度の手間は必要なわけで
まあもうちょいスマートにできるんじゃないかなって思うところは多々あるけど
793デフォルトの名無しさん
2019/11/01(金) 23:37:29.12ID:NpcjLENm
>>789-790

COMが使いづらいと言うか、C++とstdとSTLとWindows APIとCOMの流儀が
ごちゃまぜで、メモリの確保の仕方と文字列の扱いが混沌を極めてるw
794デフォルトの名無しさん
2019/11/01(金) 23:41:19.87ID:NpcjLENm
.NETは(特に起動の)遅ささえなければ、ずっと簡単だよな。
C#でもなんでもさ

0.5~1秒クラスの起動速度の差が気になることやってるんで、
久々にC++使ってるけど大変すぎ

でもまあ20年ぐらい前に比べれば随分と楽になってるけど
795デフォルトの名無しさん
2019/11/02(土) 03:47:26.33ID:dYVngRw/
>>791
> 目指す理想がpimpl?

違うけど、おまえなんかに説明してもチンパンジーに因数分解を教えるようなものだ
796デフォルトの名無しさん
2019/11/02(土) 06:10:30.99ID:QFHeQDAU
std::filesystem はいいな。やっとまともに使えるものができたって感じ
C++17からって遅すぎだと思うが
797デフォルトの名無しさん
2019/11/02(土) 07:36:04.48ID:esIitHWU
>>795
単に馬鹿にされてることに気づけよw
798デフォルトの名無しさん
2019/11/02(土) 08:38:38.13ID:dYVngRw/
>>797
おまえがな
799デフォルトの名無しさん
2019/11/02(土) 08:48:08.81ID:E6JKa4Vv
文字コード周りの混沌ぶりに比べれば、文字列クラス乱立なぞ微々たるものよ。
800デフォルトの名無しさん
2019/11/02(土) 09:26:25.84ID:esIitHWU
>>798
まさかまだ気づいてないとか?w
801デフォルトの名無しさん
2019/11/02(土) 09:27:02.38ID:s0WXD89V
>>776
それだ!
802デフォルトの名無しさん
2019/11/02(土) 09:49:41.56ID:smHgTNTv
>>759
ver1.0とver8.0がライブラリの呼び出し規約レベルで違うならpimplでも静的にはリンクできないし、
ver1.0とver8.0がCRTレベルで違うならやっぱ静的にはリンクできないし、
ver1.0とver8.0がライブラリの呼び出し規約レベルで同じかつCRTレベルでも同じならpimplでなくとも静的にリンクできるし、

pimpl関係無くね?
803デフォルトの名無しさん
2019/11/02(土) 09:57:16.61ID:l25LSbph
ライブラリだとpimplというかvoid*にして、各種操作をc関数として公開
c++ではラップしたinterfaceクラスを提供って形だろ
実装側はc++の実装クラスにstatic_castして後はc++の世界で書く

pimplは中途半端だから使わない
804デフォルトの名無しさん
2019/11/02(土) 10:06:07.78ID:egbBWGD9
windowsのハンドルがそんなだね
中身どんぐらい変わってるんだろうか
805デフォルトの名無しさん
2019/11/02(土) 10:06:09.13ID:smHgTNTv
void*からC++クラスのポインタ型にstatic_castってできたっけ、
806デフォルトの名無しさん
2019/11/02(土) 10:12:48.91ID:l25LSbph
出来るよ
多態使いたかったらbase ptrとvoid*の相互変換をする

派生ptrからvoid*に直接変換すると危険
807デフォルトの名無しさん
2019/11/02(土) 10:18:39.64ID:smHgTNTv
>>806
安全性と危険性が反対くね?
void*が指すアドレスは構造体やクラスの境界に整列している保証が無いのでは…

>>804
WIN32の内部において、ハンドルが単なるindexでなくポインタとして使われているという根拠は?
確かに正体がvoid*だったりするが、ポインタだとしたらOS視点では
INVALID_HANDLE_VALUE判定が
難しくなるのであった、(一般論として
808デフォルトの名無しさん
2019/11/02(土) 10:20:03.47ID:dYVngRw/
>>800
だからおまえがな
809デフォルトの名無しさん
2019/11/02(土) 10:21:28.65ID:dYVngRw/
static_cast<void*>は最派生クラスにダウンキャストだね
810デフォルトの名無しさん
2019/11/02(土) 10:27:48.65ID:egbBWGD9
>>807
外見維持してることが重要なんであって中身でなにをどうしてようがはどうでもいいがな
811デフォルトの名無しさん
2019/11/02(土) 10:28:34.71ID:smHgTNTv
やべービルド通るわこれ
うちのコンパイラは壊れてるな…
int g_nSomeValue;
int main()
{
int* p = &g_nSomeValue;
int* q = static_cast<int*>(p);
printf("p=0x%p\n", q);

return 0;
}
812デフォルトの名無しさん
2019/11/02(土) 10:30:01.86ID:smHgTNTv
貼りまつがえた、
誤: int* p = &g_nSomeValue;
正: void* p = &g_nSomeValue;
813デフォルトの名無しさん
2019/11/02(土) 10:39:33.14ID:l25LSbph
void*は型情報が完全に消えるから、
型が完全に一つだとわかっているならそのままstatic_castすればいい

多態だと派生型からvoid*に直接変換してしまうと、void*から戻す場合に基底ポインタには戻せる保証がない
814デフォルトの名無しさん
2019/11/02(土) 10:39:40.95ID:RcR6NuMm
>>802
依存している構造体のサイズやレイアウト変わったらアウトだろ
815デフォルトの名無しさん
2019/11/02(土) 10:45:21.22ID:RcR6NuMm
>>803
C++でラップしてる時点で中途半端なのはかわらない
むしろ手間増えてる
816デフォルトの名無しさん
2019/11/02(土) 10:46:18.05ID:pWYzNK5/
過去の遺産のCOMなんて使いにくいて横で話ししてるやろ
10年後の環境のことまで気にする必要ないんだよ
ばっさり捨ててその時代にあったものを作るべき
無理に資産転用とか互換性とか気にするからクソが生まれる
817デフォルトの名無しさん
2019/11/02(土) 10:47:10.74ID:l25LSbph
pimplで実装隠したところで、
引数に例えばstd::string使うだけでコンパイラバージョン変えたときの保証は無くなるしなぁ
818デフォルトの名無しさん
2019/11/02(土) 10:56:15.43ID:vl/bFsjF
要するに>>759は知ったかが無理矢理考えたアホストーリーと言うことでいいかな?w
819デフォルトの名無しさん
2019/11/02(土) 10:57:17.10ID:vl/bFsjF
>>808
ああ、もうそういう返ししかできないのか…
高い理想とか笑えるわw
820デフォルトの名無しさん
2019/11/02(土) 11:06:42.79ID:smHgTNTv
>>814
pimplだと構造体の実装はライブラリ側に完全隠蔽なのでその観点はおかしい
つかjコンパイラのバージョンも関係無い
821デフォルトの名無しさん
2019/11/02(土) 11:16:21.46ID:smHgTNTv
>pimplだと構造体の実装はライブラリ側に完全隠蔽なのでその観点はおかしい
何が言いたいのかというとライブラリ使用側がライブラリが依存する構造体メンバに直アクセスする前提なら
そんなライブラリはpimplにできんだろとゆーこと
つまりpimpl対非pimplの比較の想定が変
非pimpl条件のライブラリのインターフェース仕様だけ抽象度を下げて議論しても仕方が無い
822デフォルトの名無しさん
2019/11/02(土) 11:16:32.42ID:EX+sUHBj
>>816
そんなライブラリ誰が使いたがるんだよ
823デフォルトの名無しさん
2019/11/02(土) 11:23:46.22ID:l25LSbph
オープンソースやクローズドでも社内での話だったらソースごと提供すれば終わる話だし
社外提供なら多言語で使えるようにcのAPIを出すのが普通じゃないのか
その上で各言語用のラッパーも提供されるってのがありがちなパターン
824デフォルトの名無しさん
2019/11/02(土) 11:37:12.15ID:pWYzNK5/
>>822
現時点で有用なら使うでしょ
逆に10年前からメンテされてなくて現時点でも使われてるライブラリなんてある?
メンテされてるかよりその時代に即したものに乗り換えてくでしょ
825デフォルトの名無しさん
2019/11/02(土) 11:50:05.18ID:EX+sUHBj
いやメンテなり機能追加はしろよ
仕様がらっと変わるのわかってるもんなんて使いたくないわ
作り手も使う側めんどいだろ
826デフォルトの名無しさん
2019/11/02(土) 12:26:20.48ID:DuRHh2CY
D なぜ流行らなかったし
Go 突き抜けてる
Rust ちょっと意識高い系
Nim 有望
JULIA 話にならない
827デフォルトの名無しさん
2019/11/02(土) 12:50:14.99ID:esIitHWU
>>824
ライブラリじゃないけど例えばExcel2003とかまだCOM経由なら動かせるでしょ
COMの泥臭いインターフェースだから面倒だけどね
828デフォルトの名無しさん
2019/11/02(土) 12:54:19.41ID:pWYzNK5/
>>827
動かせるけどクソだよね?
だから新しいのつかうじゃん?
つうかoffice系は延々と互換性意識してメンテされ続けてるじゃん
829デフォルトの名無しさん
2019/11/02(土) 13:22:43.30ID:esIitHWU
>>828
俺が言ってるのはCOMの話な
Excelの話はケースバイケースだからなんとも言えんし俺には関係ないからどうでもいい
830デフォルトの名無しさん
2019/11/02(土) 13:28:52.76ID:pWYzNK5/
>>829
COMの中身詳しくないんだけど一切メンテされてないの?
今までwinは山ほど脆弱性をupdateしてるけど、そういう中にCOM周りの修正とかなかったの?
間違いなくあったと思うんだよね。
COMに限らず現状使えるMS産のもので10年間内部が未修正のものなんて多分存在しないんじゃない?
だから10年後のことだけなんて考慮する必要なくて将来に渡り有益ならどうせメンテされるし一時的なもので将来無益になるなら消え去るんだよ
831デフォルトの名無しさん
2019/11/02(土) 13:32:28.90ID:pWYzNK5/
>>829
なんか前後で俺の主張がずれてる感じで申し訳ない
832デフォルトの名無しさん
2019/11/02(土) 13:52:05.38ID:esIitHWU
>>830-831
インターフェースの話とインターフェースの先にあるライブラリとかCOMサーバーの話をごっちゃにしてないか?
833デフォルトの名無しさん
2019/11/02(土) 14:07:55.01ID:RcR6NuMm
>>821
勘違い甚だしい
ライブラリ使用者に無関係で見せたくないからpimplで隠すという話をしてる隠さなかったら無用にincludeが増えるし、最悪そのinclude先の仕様変更で互換がくずれる場合もあると
834デフォルトの名無しさん
2019/11/02(土) 14:12:10.51ID:RcR6NuMm
>>823
そう、それが結局いまだによくも悪くもベストプラクティス
わかってないやつ多いんだよ
いきってc++で自称モダンな設計で作り上げてあとで泣きながらcのインタフェース作るはめになる
たいてい機械的なラッパーではすまないからな
835デフォルトの名無しさん
2019/11/02(土) 14:34:01.62ID:SXOl8GCi
void*的な「ハンドル」を経由して操作するやーつ
C由来のインターフェースは強いな
836デフォルトの名無しさん
2019/11/02(土) 14:53:41.66ID:QFHeQDAU
>>827
> ライブラリじゃないけど例えばExcel2003とかまだCOM経由なら動かせるでしょ

Excelとか以前に、DirectXやシェル(エクスプローラー)そのものがCOMだから
837デフォルトの名無しさん
2019/11/02(土) 14:55:12.97ID:QFHeQDAU
>>832
そうそう。脆弱性の話はCOMじゃなくてDCOM。

もちろんCOMも脆弱性とは無関係ではないんだけど、
それはC++がバッファーオーバーフローと無関係ではないのと
同じようにCOMの設計自体の問題じゃない
838デフォルトの名無しさん
2019/11/02(土) 15:00:15.19ID:4213U75y
ComPtr使ってる?
839デフォルトの名無しさん
2019/11/02(土) 15:04:46.15ID:i1zx37WV
Essential COMの第1章で、C++からいかにしてCOMに至るか書いてあるけど、あの流れすごい好き
840デフォルトの名無しさん
2019/11/02(土) 15:07:11.40ID:QFHeQDAU
std::filesystem はようやくできたかって感じだが、環境変数でまたorz

なんでこう、使う道具がまともに作られてないんだろうな
C++はメモリ管理ばっかり気にしてる気がする。
841デフォルトの名無しさん
2019/11/02(土) 15:09:57.95ID:esIitHWU
>>836-837
> Excelとか以前に、DirectXやシェル(エクスプローラー)そのものがCOMだから
だからCOMとその先を区別してくれよ
COM自体は単なるインターフェース規約で実装は別
脆弱性とかは実装の不具合だから見つかり次第修正されてる
インターフェース規約も仕様バグとかありうるけどCOM自体の仕様バクは聞いたことない
842蟻人間 ◆T6xkBnTXz7B0
2019/11/02(土) 15:13:34.66ID:OyXmLdGY
                   _
            .:⌒: 、  __ >: : : : : : :.   <
         |: : : :/´ : : : : : : : : : : : : :.     `゙  、 
       ‐.、/: : : : : : : : : : : : : : : : : : : i      
      У: : : : : : : : : : : : : : : : : : : : :/             \
     /: : : : : : : : : : : : ', : { : : : : : : :}         __   \  
.      j: : ;彡': : : : : : : : : ' : ', : : : : : リ       / : : : : : : . . \
     : : : : : : : : : : : : : : : }: :ト : : : : ′     /: : : : : : : : : : : ヽ '.
    : : : : : : : : : : : : : : :ノ :∧: : : : {       / : : : : : : : : : : : : : : v
.     i: : : : : : : : : : , ‐< >: :∧: : : :',  >‐:'―: : : : : : : : : : : : : : :.
.     | : : /⌒y:/   /: : : : : _ヽ: : /: ヽ: : : : : : : : : : : : : : : : : : :|
   八: : {   ^      {: : : Y´   ∨: : : x ― - . . __: : : : :__, : : : : }
      ー′        У: : j    {: : : ノ /: : : : : : : ̄: : : : : : イ
                 〈: : :/^     ー^ / : : : : : : : : : : : : : <
                ^彡        /: : :ヽ -‐=    ̄ ̄
                          {: : :ノ
                        ゞ´
843デフォルトの名無しさん
2019/11/02(土) 15:31:17.24ID:QFHeQDAU
>>841
俺に言うなよ。俺はCOMは使われてるとしか言ってない。
シェル(エクスプローラー)をCOMで操作できるという
基本的な機能の互換性をなくすとか考えられん。
844デフォルトの名無しさん
2019/11/02(土) 15:36:48.55ID:16zH/LAn
>>840
環境変数は昔から標準化されてるだろ。設定は微妙だけどデファクト標準関数があるし。
845デフォルトの名無しさん
2019/11/02(土) 15:56:49.53ID:QFHeQDAU
>>844
std::cout << なんとか("PATH");
のように一行でやる方法教えて
もちろん脆弱性などで非推奨と言われるようなやり方は禁止

俺はここまでできて「使える道具」だと思ってるよ
846デフォルトの名無しさん
2019/11/02(土) 16:32:02.24ID:neC/7x9U
>>843
だからCOMの話にその先であるエクスプローラの話を混ぜるなよ…
ところでExplorerってCOMで操作できたっけ?
Internet Explorerの話じゃないよね?
847デフォルトの名無しさん
2019/11/02(土) 16:32:29.90ID:neC/7x9U
>>845
なぜに一行縛りなの?
848デフォルトの名無しさん
2019/11/02(土) 16:50:16.72ID:TAka4wsD
OpenStack, Terraform でも、クレデンシャルなどの環境変数は、1つのファイルにまとめる

それでプログラム内で、os.environ[ 'OS_PASSWORD' ]
みたいに取得する

直接、設定ファイルに書いて、git に保存するのは禁止!
849デフォルトの名無しさん
2019/11/02(土) 17:09:24.74ID:orbX83iK
>>845
curl
env()
850デフォルトの名無しさん
2019/11/02(土) 18:41:30.33ID:QFHeQDAU
>>847
実現可能な最小の行数

(一行でできるようにすることは他の言語で実現されてることからも明らか)
851デフォルトの名無しさん
2019/11/02(土) 18:44:29.21ID:QFHeQDAU
ちなみにさっきオレオレで20行ぐらいの関数を書いて
一行で環境変数を取得できるようにしたよ。
でもこういうのは標準ライブラリで用意してあるべきもの
852デフォルトの名無しさん
2019/11/02(土) 18:44:52.66ID:RcR6NuMm
こいつアホだろ
853デフォルトの名無しさん
2019/11/02(土) 18:46:14.06ID:neC/7x9U
>>850
短ければ偉いとか思ってる?w
854デフォルトの名無しさん
2019/11/02(土) 18:48:21.60ID:QFHeQDAU
>>853
俺が思ってるかどうかじゃなくて、
お前が、こういう理由で短いのがいい or だめと
"お前の意見" を書け
855デフォルトの名無しさん
2019/11/02(土) 19:23:54.18ID:neC/7x9U
いや、お前がそう思ってるならいいんじゃね?w
856デフォルトの名無しさん
2019/11/02(土) 20:10:41.91ID:QFHeQDAU
ん?反対意見があるんじゃないのか?
ないんだね。

お前がなにか思ってるだけかよw
857デフォルトの名無しさん
2019/11/02(土) 20:16:14.52ID:FTVoAoH0
この手のバカでもたった20行で作れるんだろ
やっぱりC++は偉大じゃないか
858デフォルトの名無しさん
2019/11/02(土) 20:17:34.65ID:QFHeQDAU
車輪の再発明。ってか他の言語使ったほうがいいよ。
859デフォルトの名無しさん
2019/11/02(土) 20:28:57.58ID:16zH/LAn
>>845
だったらはじめから「僕はこうじゃなきゃヤなんだー」って言ってくれないと何も伝わらないぞ
860デフォルトの名無しさん
2019/11/02(土) 20:32:42.04ID:QFHeQDAU
はじめから言ってる

> std::cout << なんとか("PATH");
> のように一行でやる方法教えて
861デフォルトの名無しさん
2019/11/02(土) 20:36:29.98ID:dYVngRw/
> 車輪の再発明

典型的なアイディアキラー! マジ死ねよ

ガタガタくだらねえこと言ってねえで
本能のままにやってみたいことに暴走しなきゃ
何もできちゃ来ねえんだよ

そういう生産物の上にあぐらかいて怠けているゴミ共にわかるわけねえ!
862デフォルトの名無しさん
2019/11/02(土) 20:42:10.52ID:QFHeQDAU
std::filesystemができたように、
std:envも作れってだけの話なのにね
何がそんなに気に触ったんだろう?
863デフォルトの名無しさん
2019/11/02(土) 20:49:43.64ID:16zH/LAn
>>860
はあ?845が初出じゃん

getenvでいいだろ。
未定義時のエラー処理まで自動でやってほしいのか?
864デフォルトの名無しさん
2019/11/02(土) 20:58:09.22ID:wdMk8lAB
一行じゃないとヤダとか条件を後出ししたからじゃね
865デフォルトの名無しさん
2019/11/02(土) 21:01:20.92ID:dYVngRw/
> 何がそんなに気に触ったんだろう?

とぼけてんなよ、はっきり書いてんだろ
車輪の再発明と貴様はほざいた
撤回も修正も今さらいらねえ
866デフォルトの名無しさん
2019/11/02(土) 21:08:11.55ID:QFHeQDAU
>>864
そんな下らないことで(笑)

一行とかそんなの重要なところじゃなく、
stdの名の元でまともなライブラリを作ってくれって話だよ
仮にも「標準」ライブラリなんだからさ

昔ながらのgetenvやその安全版はstd:stringが使われてないし、
std::getenvも、なぜかstd::stringではなくchar*が使われていて
使うとエラーとされるレベルの非推奨関数だし、当然ワイド文字版もないし
使おうと思った人なら、まともじゃないの意味ぐらいわかるはず

あ、使ったことない人が噛み付いてきたのかw


あと環境変数の未定義は正常な状態としてありえるのでエラーではない
細かくてすまんなw 適当な発言は気になるんだよ。
867デフォルトの名無しさん
2019/11/02(土) 21:09:21.56ID:QFHeQDAU
>>865
噛み付いてばかりじゃなくて、"自分の意見"を言うだけの
知識はあるのかい?
868デフォルトの名無しさん
2019/11/02(土) 21:11:47.48ID:RcR6NuMm
c++の標準ライブラリにプラットフォーム抽象の機能求めるってのは筋が悪いんだよ
filesystemだって結局はposixをテンプレートの味付けで焼き直した程度でファイルの監視もできないだろ
envとか別に標準で提供されなくても何も困ってない
1行かどうかなんてさらにどうでもいい
あと標準ライブラリが提供する範囲の機能で足りてるアプリ作ってるやつは
c++以外の言語使うことを考えた方がいい
869デフォルトの名無しさん
2019/11/02(土) 21:29:52.49ID:neC/7x9U
>>856
> お前がなにか思ってるだけかよw
うん、バカな縛りだなと思ってるw
870デフォルトの名無しさん
2019/11/02(土) 21:36:05.57ID:lCdDFN2K
組み込み系なんてenvどころかfilesystemとかそもそもねぇの普通な環境も多いしね
871デフォルトの名無しさん
2019/11/02(土) 21:56:35.34ID:dYVngRw/
>>867
本能の枯れた人生の搾りかすめ
872デフォルトの名無しさん
2019/11/02(土) 22:00:29.09ID:jnnO2x8F
ここは毎回しょうもないことで荒れるな
これだからC++界隈って嫌い
873デフォルトの名無しさん
2019/11/02(土) 22:07:02.10ID:lY37zOLC
まあもともと広いレンジで使われることを目的とした言語だし
いろんな輩が入ってくるのはしゃーない。
しかしc++11以降は明らかに開発してないクソガキが増えたなという印象はある。
874デフォルトの名無しさん
2019/11/02(土) 22:52:35.22ID:egbBWGD9
ないなら作りゃいいのに
なんのためプログラミングなんだろか
875デフォルトの名無しさん
2019/11/02(土) 22:57:03.69ID:l25LSbph
せっかくhas_includeみたいなのも出来たのだから、環境ごとに存在しない場合機能提供されないようなものも標準化進めていったらいいんだよね
876デフォルトの名無しさん
2019/11/02(土) 22:57:09.83ID:oLFNuF1W
2chのゴミスレ=C++界隈
877デフォルトの名無しさん
2019/11/02(土) 23:15:11.30ID:FTVoAoH0
>>876
そこに涌く小バエ
878デフォルトの名無しさん
2019/11/02(土) 23:38:30.50ID:dJ3V2vrm
>>876 >>877
場所そのものを馬鹿にするのはよくない。
それは差別や権威主義を生み易い。
879デフォルトの名無しさん
2019/11/03(日) 00:27:38.19ID:wm/wPyZM
>>875
一応フリースタンディング処理系っていう分類があるのでそれはもうされてる
880◆QZaw55cn4c
2019/11/03(日) 21:55:47.13ID:A1whpPq+
>>732
一つ教えてください、pimpl とか何べん読み返しても「利益の源泉」がわからないのですが、一つ一言で言い切っていただけませんか?
881◆QZaw55cn4c
2019/11/03(日) 21:58:20.86ID:A1whpPq+
>>775
>マングリングって知ってるか?
>そもそもC++のクラスライブラリを簡単にリンク

私は Java も ruby も触っていますが、お手軽に java のライブラリを c++ から使いたいと、ふつふつ、と、思っているのです…
882デフォルトの名無しさん
2019/11/04(月) 00:16:08.68ID:J7PIJnTc
>>880 (732じゃないけど)
クラス実装の変更に対する再コンパイルの必要性の削減。


これが利益とならない環境では用はない。これが利益となる環境はある。

個人的には同じ目的ならインターフェースクラス+生成関数のほうが手間が少なくて好み。
公開済みのクラス(具象クラス)に後付けでも適用できるのが pimpl の強みじゃないかな。
883デフォルトの名無しさん
2019/11/04(月) 00:45:00.04ID:sHXph+lc
>>833
>>821は、>>802からの流れなのでヨロ

そうした上で、
>ライブラリ使用者に無関係で見せたくないからpimplで隠す
それがpimpl固有の特質である根拠とは…
構造体の詳細を見せる必要が無いなら
別にハンドルでも良いじゃん?Cだと昔からそうしてきたわけやし…

>>834
構造体の詳細を見せる必要が無いなら
別にハンドルでも良いじゃん?Cだと昔からそうしてきたわけやし…

pimplとかC++で実装する側がソースコードを整理したい目的で使うものであって、
ライブラリの公開インターフェースがpimplであるべきという論こそ勘違い甚だしい
884デフォルトの名無しさん
2019/11/04(月) 00:50:27.63ID:HxncxYCK
>>881
お前の老害頭では無理だと思う
885デフォルトの名無しさん
2019/11/04(月) 01:01:50.05ID:qdasM095
コンパイル時にリフレクションできたらC++にはもう何も望まないんだけどな
886デフォルトの名無しさん
2019/11/04(月) 01:16:04.50ID:bOoSbled
リフレクションしたいとか実行時にあれだとかこれだとかしたいとか
もっと安全性を高めたいとかいう人はC#にいったらいいとおもうんだが
なぜいかないのか
887デフォルトの名無しさん
2019/11/04(月) 04:20:27.81ID:6RBgtjpd
マングリングとかも規格で決めてほしいよね
そうすればクラスのエクスポートなんかも簡単になるのに
888デフォルトの名無しさん
2019/11/04(月) 06:09:25.96ID:26dKwYrd
動的はともかく静的リフレクションはあって困る場面は無いだろ

冗長な記述や変なマクロを使わずに、enumを文字列化したりしたいだろ
889デフォルトの名無しさん
2019/11/04(月) 06:17:29.31ID:ktSXuT3K
名前マングリングの方法がコンパイラ毎に違うおかげで
互換性のないオブジェクトファイル同士がリンクされる事故を防げる、って
『More Effective C++』に出てたな。

便利さも欲しいが安全性も保ちたい、という要求のせめぎあいだな。
890デフォルトの名無しさん
2019/11/04(月) 06:59:32.99ID:1EaGoi2+
今生き残ってるC++のコンパイラってどのくらい種類あんの
特定ハード向けのもgccの派生なんでしょ?
891デフォルトの名無しさん
2019/11/04(月) 09:40:11.27ID:sHXph+lc
>>833
>>883とオモタがちょっち訂正しておき鯛、
publicなメンバ関数だけでprivateを一切含まずに事を済ますクラス定義を広義のpimplとみなすなら
ライブラリの公開インターフェースとしてpimpl最高じゃな

ハンドルだけだとユーザーが間違った呼び出しをしかねない
これをpimpl式にクラスでwrapするのはスゲー有効
892デフォルトの名無しさん
2019/11/04(月) 10:05:11.25ID:7p81GTJD
つーかハンドルで渡して使う時にキャストするって面倒だからさ
privateだからいいでしょとかいう問題じゃない
893デフォルトの名無しさん
2019/11/04(月) 12:16:24.53ID:pwba8h1Q
記述の煩雑さはもう諦めるけどインラインPimplでゼロオーバーヘッドにしてほしい
894デフォルトの名無しさん
2019/11/04(月) 12:22:24.34ID:TNJ/Yj6e
煩雑さを許容できるならやれるでしょ
pointerでなくバイト配列にしておいて中でcastするやつ
気を付けないところいろいろあるけど
895デフォルトの名無しさん
2019/11/04(月) 12:35:35.98ID:jCRIC3rQ
オーバーヘッドを気にしている人の大半は、気にする必要のあるものを作っていない
896デフォルトの名無しさん
2019/11/04(月) 12:35:45.49ID:DlV1X8tk
実装をpimplに押し込めて公開インターフェース上の変数メンバの増減を無くすのが肝なんだから
pimplのデリファレンスのオーバーヘッドは避けようがないだろう。
897デフォルトの名無しさん
2019/11/04(月) 12:41:44.84ID:7p81GTJD
そもそもprivateな関数宣言をpublicなヘッダに
書かないといけないというC++言語仕様の欠陥

publicヘッダとprivateヘッダの二つに分けて
クラス宣言できればよかった

ちなみにC#ではpartialクラスといって
複数のファイルにまたがってクラスの定義ができる
898デフォルトの名無しさん
2019/11/04(月) 13:33:20.96ID:TNJ/Yj6e
>>896
こういうの
https://ideone.com/EB36N2
pointerじゃないからpimplではない
899デフォルトの名無しさん
2019/11/04(月) 13:45:03.05ID:7wrIz40y
まあ欠陥って言われてもprivateメンバー変数変更されたらインスタンスのサイズ変わったりするから
1) 参照してるソースも含めてリコンパイルする
2) ポインタで持つ(pimpl)
しかないからねぇ
C++的には現状の言語仕様でIDEでprivateは見せないようにもできるとかでいいと思う
900デフォルトの名無しさん
2019/11/04(月) 13:47:25.16ID:ncwvkXHO
>>898
パズルとしてはいいけど真顔で書いてたらちょっと引くわw
901デフォルトの名無しさん
2019/11/04(月) 13:59:48.02ID:DlV1X8tk
>>898
その場合でも任意の変数メンバの拡張性は結局 Hide::a の存在で保証されているわけだろう。
impl[32] と予約された範囲まで拡張できるというのもあるのかもしれんが。
902デフォルトの名無しさん
2019/11/04(月) 14:00:47.43ID:7P/NsyXI
結局低レイヤーを考慮しないでバカが文句言ってるだけで
そんなことに付き合う必要はないんだよ。
903デフォルトの名無しさん
2019/11/04(月) 14:16:11.73ID:TNJ/Yj6e
>>901
バイナリ境界にしたときの拡張性のこと言ってる?
それはまさに配列のサイズでリザーブだね
溢れたら終わり

目的がヘッダー依存を切ることなら必要に応じて配列サイズ増やせばいいだけ
めんどいけどassertかけてあるからミスることはない
あとpimplは中でnewされるのがいやな場合あるからそれを避けられるってのも大きいね
904デフォルトの名無しさん
2019/11/04(月) 14:34:36.07ID:mRc+a4F8
>>897
(使う側が)、CPerson person[10]; や、new CPerson[10] のように書いたと
すると、C++は高速化のため、CPersonのバイトサイズを定数値として
静的にコンパイルして、スタックや Heapからそれらのオブジェクトの領域を
確保する。
なので、たとえC++でCPersonのprivateメンバがC#のpartialの様に分けて宣言できた
としても、それらを全て合わせた全体のバイトサイズが分からないと静的に処理できない。
故に結局、partialの一部であっても全体のサイズに影響のあるような変更が行われた
場合には、上記の様な形でCPersonを使うプログラムは再コンパイルが必要となる。
905デフォルトの名無しさん
2019/11/04(月) 14:57:14.11ID:VEKGTWb6
プリコンパイルドヘッダが標準化されればなんとかなるかも
906◆QZaw55cn4c
2019/11/04(月) 16:01:14.23ID:fwURXfb5
>>905
そういうのはやめてほしいです…
907デフォルトの名無しさん
2019/11/04(月) 16:31:03.20ID:q2OPdcJi
>>906
良いか悪いかは仕様次第なんじゃないの?
コンパイルされてたら無条件でアウト?
908デフォルトの名無しさん
2019/11/04(月) 16:35:25.90ID:q2OPdcJi
差分とりづらいってのはあるか
909デフォルトの名無しさん
2019/11/04(月) 20:26:00.54ID:sHXph+lc
>>897
構造体データメンバのメモリ配置を正確に定義したいという目的を捨てない限り
privateなデータメンバをprivateヘッダに分けて定義できるようにしたところで
pimplが目指すような解決にはならない
ほとんど意味が無い
910デフォルトの名無しさん
2019/11/04(月) 20:31:52.81ID:sHXph+lc
pimplが目指すような解決というのは筆が滑ったorz

とにかくprivateなデータメンバをprivateヘッダに分けて定義できるようにしたところで
実装の隠蔽にはやっぱハンドル経由とかポインタ経由(pimpl)な間接参照が必要なままである
構造体データメンバの追加や削除や順序変更が
publicなヘッダに定義されたインターフェース仕様に影響しなくなりはしない
911デフォルトの名無しさん
2019/11/04(月) 21:34:38.56ID:TNJ/Yj6e
>>900
言うてもplacement newしたオブジェクトに移譲してるだけだからたいしたことやってない
まぁこれが規格的にセーフかどうかは知らんけどな
912デフォルトの名無しさん
2019/11/04(月) 21:53:48.72ID:7wrIz40y
>>911
> uint8_t impl[32];
固定サイズで確保してる時点であり得んわ
913デフォルトの名無しさん
2019/11/04(月) 22:09:21.71ID:TNJ/Yj6e
そこはどうにもならんな
他にいい方法あるなら知りたい
上で触れてるけど、逆にバイナリ互換とるときはそういうリザーブが役立つこともある
914デフォルトの名無しさん
2019/11/04(月) 22:38:30.89ID:7wrIz40y
>>913
> 他にいい方法あるなら知りたい
ないからpimplとかなんだろ
だからと言ってテキトーに領域定義とかあり得んだろ
915デフォルトの名無しさん
2019/11/04(月) 22:40:59.70ID:jCRIC3rQ
そもそもポインタ参照ごときのオーバーヘッドをも許さないほどリアルタイム性を要求するもの作ってんの?
916デフォルトの名無しさん
2019/11/04(月) 22:51:45.72ID:TNJ/Yj6e
>>914
適当がいやなら同じサイズにすりゃいいじゃん
static_asserの条件を==にすればいい
手間はかかるが、それが許容できる前提の案ね
917デフォルトの名無しさん
2019/11/04(月) 22:58:08.77ID:7wrIz40y
>>916
バカなの?
ちょっとサイズ変更されたら使えない
かと言ってどんだけ余裕持てばいいかは未来予知能力でもないと無理
要するに常人には使いどころがないってことな
918デフォルトの名無しさん
2019/11/04(月) 23:05:23.77ID:J+RS26ji
>>915
C++の用途として可能な限りオーバーヘッドをゼロとすることが要求されるケースがあるのは当然の話であるが、別に議論に参加するものがそういう物を作っている必要性はないだろうに、何でこだわってるんだ?
919デフォルトの名無しさん
2019/11/04(月) 23:12:26.97ID:TNJ/Yj6e
>>917
だから手間がかかると言ってるわけ
やる気になれば自動化できるスクリプトは作れるだろうけどね
バカと思うかもしれないけどreserveフィールドでバイナリ互換を保つってのは実際やるんだよ
未来を予測できないのはそのとおり
適当に決める
まぁお前の知らない世界の話だから気にするな
920デフォルトの名無しさん
2019/11/04(月) 23:25:59.73ID:DlV1X8tk
外部からはデストラクタもコピーコンストラクタも動かせないのにあえてインラインにする
理由がよくわからないな。
よっぽど特殊でピンポイントな要件なのかもしれないが。
921デフォルトの名無しさん
2019/11/05(火) 01:47:52.32ID:8w7ODMFL
placement new を使った
char* ptr = (char *)malloc(sizeof(CPerson));
CPerson *pPerson = new(ptr) CPerson;
という書き方、実は、「コンストラクタの明示的呼び出し」なるものを使って、
CPerson *pPerson = (CPerson *)malloc(sizeof(CPerson));
pPerson->CPerson::CPerson();  // コンストラクタの明示的呼び出し
と書くことも出来るらしいことを最近知った。
922デフォルトの名無しさん
2019/11/05(火) 06:17:56.31ID:cY6SY5gz
ああそうそれは良かったね~
923デフォルトの名無しさん
2019/11/05(火) 07:19:41.62ID:UkGDCuYx
>>919
手間の問題じゃないよ
せっかく変更に強くするためにやってるのに
> 適当がいやなら同じサイズにすりゃいいじゃん
なんてやったら本末転倒だろ

> やる気になれば自動化できるスクリプトは作れるだろうけどね
未来予知機能付きのスクリプトができたらいいねw

> バカと思うかもしれないけどreserveフィールドでバイナリ互換を保つってのは実際やるんだよ
ああ、昔のコボラー爺の発想ねw
ファイルとか通信とかで外部とやり取りするようなものだと今でも普通にあるけどメモリーレイアウトでやるのは流石に悪手でしかない

> まぁお前の知らない世界の話だから気にするな
時代遅れのお前の妄想に閉じ込めといてくれw
924デフォルトの名無しさん
2019/11/05(火) 07:51:55.68ID:rlbxGVpf
>>780
cygwinで配布してるwxwidgitはgcc3時代のabiでバイナリ作られてるが当然gcc8でもabiオプションで変えてリンクできる
925デフォルトの名無しさん
2019/11/05(火) 07:55:46.59ID:Cze7w/ei
>>921 何を見て「出来るらしい」と言ってるのかな?
926デフォルトの名無しさん
2019/11/05(火) 08:36:03.93ID:g61EG+/r
解放も自前でやるんなら別にいんじゃね?
927デフォルトの名無しさん
2019/11/05(火) 08:47:49.22ID:wVD+ILW8
>>819
pimplが理想だなんて頓珍漢なレスで
ひっ絡んで来たのそっちだろうが
何がそういう返しだ
冗談は顔だけにしろ奇形チンパンジーめ
928デフォルトの名無しさん
2019/11/05(火) 12:36:38.02ID:UkGDCuYx
>>927
まさかと思うが
> 目指す理想がpimpl?
って理想がpimplって言ってるとでも思ったのか?
デザインパターンの前に日本語の勉強しろよw
929デフォルトの名無しさん
2019/11/05(火) 12:48:20.10ID:XPYDDbPn
日本人じゃないんじゃない?
930デフォルトの名無しさん
2019/11/05(火) 16:03:35.45ID:wVD+ILW8
>>928
安心しろ
あからさまにラリッてる廃人の戯言など
どうとも取ってねえよ
そんな価値があるとでも思っているなら
とんだナルシストだw
931デフォルトの名無しさん
2019/11/05(火) 17:28:48.96ID:X2+zjlng
>>923
pimplの目的が変更に強いことってはお前の見方にすぎない
コンパイル時に検知できるんだから特別手間ではないし、
呼び出しコストを下げる目的は達している
技術的な話したいなら物事をフェアに見ような
932デフォルトの名無しさん
2019/11/05(火) 18:57:55.00ID:lmPmis8+
手間はあるけど(俺は)手間だと感じないだから、変更に強いとは思わない

って言ってるの?
933デフォルトの名無しさん
2019/11/05(火) 19:21:00.26ID:X2+zjlng
>>894
934デフォルトの名無しさん
2019/11/05(火) 19:48:59.34ID:C6JaWlq+
実装側のサイズが想定をオーバーしたら互換性無くなって再コンパイルになるんでしょ
それが許容される環境ならインターフェース切る意味が薄れるんじゃないの?

まぁ実際はオーバーしないようにするんだろうけど
935デフォルトの名無しさん
2019/11/05(火) 19:52:57.91ID:UkGDCuYx
>>930
どうとも取ってないのに顔真っ赤にしてレスするとか珍しいなw
936デフォルトの名無しさん
2019/11/05(火) 19:54:47.54ID:UkGDCuYx
>>931
ごめん、お前なんのために>>898みたいなことやるの?
説明できる?w
937デフォルトの名無しさん
2019/11/05(火) 20:04:16.17ID:Rmlz0hln
>>936
pimplの説明ならこのスレで何度も出てると思うが?
それにしたいして、お前の反論は「俺はそうは思わない」という感想でしょ?

技術的な話したいなら物事をフェアに見ような
938デフォルトの名無しさん
2019/11/05(火) 20:18:38.99ID:GaJDeol8
>>893 というお題な対して出した案が >>898
privateは隠蔽できて、かつ呼び出しコストは低い
配列サイズ増やしたらバイナリ互換がとれないのは承知してる
しかしそれはI/Fにする構造体一般の話であってこの件に限ったことではない

もう十分説明したつもり
939デフォルトの名無しさん
2019/11/05(火) 20:37:36.25ID:UkGDCuYx
>>937
>>898がpimplに見えるならちょっと黙っててもらっていいかな?
邪魔なだけだし

>>938
なるほどね
とにかくprivateは見せたくないって事ならそれでいいんじゃね?
俺はやりたくないけどw
940デフォルトの名無しさん
2019/11/05(火) 20:51:01.63ID:mHpC8FDb
>>935
とID真っ赤にしてレスするやつ
別に珍しくもねえ どこにでもいる虫けらめ
941デフォルトの名無しさん
2019/11/05(火) 21:09:19.41ID:uxZ9xTP+
可愛そうなやつ…
942デフォルトの名無しさん
2019/11/05(火) 21:15:13.47ID:ZKJgPI6j
事務職だけど、C++使ってる 
こんな便利なプログラミング言語があるとは
943蟻人間 ◆T6xkBnTXz7B0
2019/11/05(火) 21:19:49.70ID:36DcdPPB
pimplesが顔に出たのは中学・高校時代だったか。
944蟻人間 ◆T6xkBnTXz7B0
2019/11/05(火) 21:23:07.90ID:36DcdPPB
pointer to implementation
945デフォルトの名無しさん
2019/11/05(火) 22:48:13.18ID:5N1tjWFS
結局のところ、>>893の言う「インラインPimpl」なるものの解釈なんだよな。

「そんなものありえない」>>896
「こうすればできるよ」>>898

俺は「ありえない」派だが。
946デフォルトの名無しさん
2019/11/05(火) 22:54:52.19ID:JFmkzqZr
ピンプルはシンプルじゃないとダメでしょ
947デフォルトの名無しさん
2019/11/05(火) 23:19:34.53ID:+/SJ/H3y
他の言語ではprivateを隠すための努力なんてしなくていいよね
あくまでc++特有のパターンとしてpimplがある
pimplの肝は、ポインタだけなら前方宣言すればincludeしなくてOKっていう
抜け穴的なところからきていてポインタであることは妥協の産物
implクラスを変更しても互換性が保たれるというのはあくまで副次的
ゼロコストじゃないわけでc++の思想からも外れている
948デフォルトの名無しさん
2019/11/05(火) 23:26:17.64ID:+K1+YrIp
何をもって思想から外れていると?
C++の設計思想は最速を目指すことじゃないからな
949デフォルトの名無しさん
2019/11/05(火) 23:41:22.87ID:+/SJ/H3y
Bjarne Stroustrupがそう言ってる
950デフォルトの名無しさん
2019/11/05(火) 23:55:16.05ID:+K1+YrIp
始まりはそうだったかも知れんが、現在の規格の設計思想は明らかに違う
951デフォルトの名無しさん
2019/11/05(火) 23:58:36.99ID:UFe3q3jM
最速を目指すって言うと少し外れてるけど、速度を重視するという所は変わってない
952デフォルトの名無しさん
2019/11/06(水) 00:01:20.76ID:x6qzxIK7
それ以上に集団での開発効率を重視したもの
>>898のような奇怪なものよりpImplの方がモダンC++の設計思想に合っているのは間違いない
953デフォルトの名無しさん
2019/11/06(水) 00:04:55.89ID:pco2p4E4
別に抜け穴でも何でもないだろ
なきゃこまるじゃん
954デフォルトの名無しさん
2019/11/06(水) 00:12:17.42ID:L0p3vvTY
>>950
明らかに~
説明できないときにつかう常套句だよね
少なくともc++17まではその設計ポリシーが挙げられてるよ
955デフォルトの名無しさん
2019/11/06(水) 00:18:49.38ID:L0p3vvTY
>>952
はぁ?
pimplのどこがモダンなの?
最低限delegateを手で書かなくてもいいようにしてから言ってくれよ
スマートポインタ以下だから
956デフォルトの名無しさん
2019/11/06(水) 00:32:45.47ID:EoKh/jsd
設計の方針は曖昧なものではなく明文化されてるから調べてきてね
957デフォルトの名無しさん
2019/11/06(水) 01:17:04.07ID:mNM1KOm6
ピンプルってピンポンみたいだね
958デフォルトの名無しさん
2019/11/06(水) 01:37:31.84ID:clVAOuCS
ハリソン・フォード主演映画「逃亡者」(1993年)の主人公の名前は、キンブルだったね。
この映画はサントラが良い。ジェームズ・ニュートン・ハワードが音楽担当。
このサントラの「Helicopter Chase」という曲は、「タクティクスオウガ」(1995年)というテレビゲームの「VENDETTA!」という曲によく似ている。
959デフォルトの名無しさん
2019/11/06(水) 05:47:10.84ID:iGLzVPkM
pimpl使ったことないからスルーしてたけど
>>947=>>949
ゼロオーバーヘッドの原則は言語が掲げるもので言語利用者を縛るものじゃねーよ

実際それが便利でコストが問題にならない使い方ならどう使ってもいいだろ
960デフォルトの名無しさん
2019/11/06(水) 05:56:01.23ID:iGLzVPkM
>>954
君もなんか勘違いしてない?
最速を目指すなんて厨二病みたいなことを挙げていたというソースは?
961デフォルトの名無しさん
2019/11/06(水) 06:54:13.33ID:cnDla3Ge
>>959
> ゼロオーバーヘッドの原則は言語が掲げるもので言語利用者を縛るものじゃねーよ
そうだよ、だからこの手の機能は言語仕様には含まれないってことな

> 実際それが便利でコストが問題にならない使い方ならどう使ってもいいだろ
誰もお前に使うななんて言ってないから使いたいなら勝手に使ってろよw
962デフォルトの名無しさん
2019/11/06(水) 07:21:04.31ID:GB7Qlzkj
>>947
その主張にincludeは関係ないぞ
963デフォルトの名無しさん
2019/11/06(水) 07:24:02.54ID:hwyI/gg2
質問です。
サンプルプログラムで割り込み処理の一文で

ISR(TIMER1_CAPT_vect) {}でサブルーチンを呼び出してたんだけど、()内の意味わかりますか?
964デフォルトの名無しさん
2019/11/06(水) 07:41:29.30ID:iGLzVPkM
>>961
>そうだよ、だからこの手の機能は言語仕様には含まれないってことな
誰か言語仕様に含めろなんて言ってたか?
さすがに隠したいメンバをポインタ経由で隠して無駄にコストかかる言語なら俺もお断りだが
ちな俺はplmpl使いたいなどと書いてない、人の主張を勝手に捏造するな
965デフォルトの名無しさん
2019/11/06(水) 08:14:41.32ID:N/klFKt1
あと>>961=947と想定してもう一つ言っておくと
ポインタ変数の宣言に型(クラス)の実際の定義が必要ないのは抜け穴じゃない
必要ないから要求されないだけだ
どうもC++に対する認識がおかしい気がする
D&Eでも読んでこい
966デフォルトの名無しさん
2019/11/06(水) 08:16:11.65ID:cnDla3Ge
>>964
> 誰か言語仕様に含めろなんて言ってたか?
誰もお前が言語仕様に含めろと言ってるなんて言ってないぞ
自意識過剰すぎだろ

> ちな俺はplmpl使いたいなどと書いてない、人の主張を勝手に捏造するな
使いたい「なら」な
C++の前に日本語やり直してこいw
967デフォルトの名無しさん
2019/11/06(水) 08:17:38.83ID:cnDla3Ge
>>965
> あと>>961=947と想定して
バカほどこういう想定をしたがるw
968デフォルトの名無しさん
2019/11/06(水) 08:21:27.02ID:N/klFKt1
ただの荒らしなら出てけ
969デフォルトの名無しさん
2019/11/06(水) 08:31:26.58ID:zr2SzfAm
>>963
コンパイラが分からんけど、割り込みベクタテープルのシンボルだと思う。
タイマ1キャプチャ割り込みのハンドラを今から定義しますよ、みたいな。
970デフォルトの名無しさん
2019/11/06(水) 09:33:53.63ID:GEOrtix2
サイズの違うコンテナ同士で代入を試みたらセグメンテーション違反になったんだが、リサイズしつつ代入って簡単にできないの?
971デフォルトの名無しさん
2019/11/06(水) 09:54:01.45ID:B/9oP97H
>>970 できるよ。
#include <vector>
#include <cassert>
int main()
{
std::vector v1{1}, v2{1,2};
v1 = v2;
assert(v1 == v2);
}
972デフォルトの名無しさん
2019/11/06(水) 10:35:41.19ID:GEOrtix2
>>971
普通できるのか
boostの「STLコンテナらしく振る舞う」というある多次元配列コンテナでできなかったから一般的にできないんだと思っちゃった
スマン
973デフォルトの名無しさん
2019/11/06(水) 10:42:41.76ID:rSUWYkcI
そのためのstd::vectorのメンバ関数operator=だしな
974デフォルトの名無しさん
2019/11/06(水) 12:22:15.65ID:2MfY+5W5
>>968
頓珍漢な想定でくだらんことしか言えないお前が出て行けよw
975デフォルトの名無しさん
2019/11/06(水) 15:11:24.10ID:BVN8Da8w
今事務職であいてる時間C++やってるんだけど、事務職に特化したライブラリとかってない?
976デフォルトの名無しさん
2019/11/06(水) 15:24:12.57ID:EoKh/jsd
>>975
awk,sed
977デフォルトの名無しさん
2019/11/06(水) 17:52:40.67ID:lpQz5w/v
>>975
Excelのアドオン
978デフォルトの名無しさん
2019/11/06(水) 18:44:11.86ID:XJugYxC8
char str[ ];
と宣言した場合、str[0] = '\0';というNULL終端をしなければなりませんが
string str[ ];
と宣言した場合は、特にNULL終端の必要性っていうのはないのでしょうか?
979デフォルトの名無しさん
2019/11/06(水) 19:20:03.22ID:x6qzxIK7
980蟻人間 ◆T6xkBnTXz7B0
2019/11/06(水) 19:23:25.64ID:Z1hQUtYe
std::stringはstd::string::c_strメソッドを使ってアクセスするとヌル終端になることが保証されている。
981デフォルトの名無しさん
2019/11/06(水) 19:45:32.35ID:o3tEvZiY
char hoge[] は char の配列
別に文字列として扱う気がなければ 0 終端は必須ではない

string hoge[] は(突っ込まれるかもしれんが敢えて言うと) char[] の配列
上の char hoge[] とは別物
982デフォルトの名無しさん
2019/11/06(水) 19:48:44.64ID:o3tEvZiY
あと片山の答えは >>978 の回答になっていない無関係な話 (いつものことだが)
983デフォルトの名無しさん
2019/11/06(水) 19:59:36.42ID:JQYyTTQU
今やc_strでなくてもnull終端は保証されてるしな
984デフォルトの名無しさん
2019/11/06(水) 20:14:12.93ID:KdcLkZY9
char str="";で多分null終端される。
stringは多分std::stringなのでそもそも文字列ではなくアドレスを扱う。

た・・・ぶ・・・ん・・・。うぼぁあああああああ。
985デフォルトの名無しさん
2019/11/06(水) 20:14:31.39ID:XJugYxC8
>>978です
すみません 文字列として扱い、いきなりその変数を文字列と文字列の連携で使う場合の話です
つまり、その場合でも std::stringで宣言する場合は、"\0"で初期化する必要は無しということですね?
986デフォルトの名無しさん
2019/11/06(水) 20:16:22.14ID:KdcLkZY9
すまん書き直し。

char str[]="";で多分初期化時にnull終端される。

「string str[];」は多分std::stringの配列なのでそもそも文字列ではなくアドレスを扱う。
987デフォルトの名無しさん
2019/11/06(水) 20:52:15.48ID:vhzIqEHb
>>985
説明が上手くないからもうコードで書きなよ
988デフォルトの名無しさん
2019/11/06(水) 20:56:59.66ID:y5v/16J4
ひょっとするとstd::string str[]じゃなくてstd::string strの間違いじゃないの?
989デフォルトの名無しさん
2019/11/06(水) 21:29:23.43ID:3LXwRiA7
日本語の説明よりコード片の方が多少間違っていても意図を理解できるという
990デフォルトの名無しさん
2019/11/06(水) 23:14:40.66ID:7z10T+eB
char[]は文字の配列=一つの文字列でstring[]は文字列の配列だからそもそも比較するのが間違ってる
991デフォルトの名無しさん
2019/11/07(木) 06:10:28.61ID:+Fv/+mh5
>>978 の char str[ ]; string str[ ]; は、どっちも
要素数不明の配列の定義でコンパイルエラーになるんと違うか?
宣言ってことは extern のつもりなんじゃろか。

>>988 の言う通り string str[ ]; は string str; かも知れんけど、
いずにせよ「質問が曖昧で答えようがない」の類かと。
992デフォルトの名無しさん
2019/11/07(木) 08:06:36.36ID:N9TqrKuA
アスペ多すぎ
まともな頭していればstring str;の書き間違いだってわかる
993デフォルトの名無しさん
2019/11/07(木) 08:28:39.90ID:pA1g5yhx
コンパイラが空気読むわけないだろ(笑)
994デフォルトの名無しさん
2019/11/07(木) 08:37:03.72ID:S+DlaQTT
・・・からけ?
995デフォルトの名無しさん
2019/11/07(木) 08:39:29.18ID:t3M9+vGM
>>992
本気でstring str[];だと思ってる可能性を否定しきれない
現実にその手の奴はいるし
996デフォルトの名無しさん
2019/11/07(木) 08:44:57.00ID:C1GJGInU
>>978です
明らかに自分が悪いです

char str[ ];
と宣言した場合、str[0] = '\0';というNULL終端をしなければなりませんが
std::string str;
と宣言した場合は、特にNULL終端の必要性っていうのはないのでしょうか?

に修正です
997デフォルトの名無しさん
2019/11/07(木) 09:42:08.88ID:GEuBrdxx
無い
というか元々stringはC言語由来のゼロ終端とは違い、
「サイズ持ってんだから最後を示すデータは不要」という考え方だった
C++11からは利便性のためにゼロ終端が保証されてるけどユーザーが何かする必要はない
998デフォルトの名無しさん
2019/11/07(木) 09:51:34.14ID:GEuBrdxx
初心者ぽいから説明が悪かったかもしれん
クラスが内部でやってくれることなので特に何かする必要はない
けど、内部データを直接書き換えたりするとおかしなことになるので注意
999デフォルトの名無しさん
2019/11/07(木) 10:35:04.78ID:Q8xac2sp
stringに対するstring_viewみたいにint配列等にたいするviewはありますか?
1000デフォルトの名無しさん
2019/11/07(木) 10:38:43.53ID:dB1QBGXo
'\0' と 0 とどっち使うのが良い?
NULL は論外だよな
10011001
Over 1000Thread
このスレッドは1000を超えました。
新しいスレッドを立ててください。
life time: 54日 17時間 25分 19秒
10021002
Over 1000Thread
5ちゃんねるの運営はプレミアム会員の皆さまに支えられています。
運営にご協力お願いいたします。


───────────────────
《プレミアム会員の主な特典》
★ 5ちゃんねる専用ブラウザからの広告除去
★ 5ちゃんねるの過去ログを取得
★ 書き込み規制の緩和
───────────────────

会員登録には個人情報は一切必要ありません。
月300円から匿名でご購入いただけます。

▼ プレミアム会員登録はこちら ▼
https://premium.5ch.net/

▼ 浪人ログインはこちら ▼
https://login.5ch.net/login.php

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



lud20250310134131ca
このスレへの固定リンク: http://5chb.net/r/tech/1568362404/
ヒント:5chスレのurlに http://xxxx.5chb.net/xxxx のようにbを入れるだけでここでスレ保存、閲覧できます。

TOPへ TOPへ  

このエントリをはてなブックマークに追加現在登録者数177 ブックマークへ


全掲示板一覧 この掲示板へ 人気スレ | Youtube 動画 >50 >100 >200 >300 >500 >1000枚 新着画像

 ↓「C++相談室 part145 ->画像>2枚 」を見た人も見ています:
C++相談室 part126
C++相談室 part151
C++相談室 part164
C++相談室 part152
C++相談室 part156
C++相談室 part155
C++相談室 part158
C++相談室 part157
C++相談室 part149
C++相談室 part153
C++相談室 part148
C++相談室 part165
C++相談室 part154
C++相談室 part143
C++相談室 part161
C++相談室 part163
C++相談室 part159
C++相談室 part166
C++相談室 part150
C++相談室 part124
C++相談室 part134
C++相談室 part135
C++相談室 part133
C++相談室 part144
C++相談室 part142
C++相談室 part117
C++相談室 part132
C++相談室 part137
C++相談室 part136
C++相談室 part131
C++相談室 part146
C++相談室 part130
C++相談室 part140
C++相談室 part141
C++相談室 part137
C++相談室 part138
C++Builder相談室 Part21
0からの、超初心者C++相談室
Cygwin + MinGW + GCC 相談室 Part 8
Cygwin + MinGW + GCC 相談室 Part 3
【初心者歓迎】デジタル一眼質問・購入相談室 170+
【初心者歓迎】デジタル一眼質問・購入相談室 169+
【初心者歓迎】デジタル一眼質問・購入相談室 166+
【初心者歓迎】デジタル一眼質問・購入相談室 168+
C♯相談室 Part20
Mac G5 中古買入相談室
屯田五目須のお悩み相談室
C#, C♯, C#相談室 Part79
C#, C♯, C#相談室 Part75
自営業 悩みごと相談室 16
MFC相談室 mfc23d.dll
自営業 悩みごと相談室 40
C#, C♯, C#相談室 Part98
C#, C♯, C#相談室 Part91
0からの、超初心者C#相談室
自営業 悩みごと相談室 47
C#, C♯, C#相談室 Part94
C#, C♯, C#相談室 Part93
C#, C♯, C#相談室 Part97
C#, C♯, C#相談室 Part96
C#, C♯, C#相談室 Part91
自営業 悩みごと相談室 52
C#, C♯, C#相談室 Part95
19:01:06 up 62 days, 19:59, 0 users, load average: 9.81, 9.22, 9.40

in 0.18551802635193 sec @0.18551802635193@0b7 on 061908