X



C++相談室 part145

レス数が1000を超えています。これ以上書き込みはできません。
0001デフォルトの名無しさん
垢版 |
2019/09/13(金) 17:13:24.60ID:/ygW08Jq
C++に関する質問やら話題やらはこちらへどうぞ。
ただし質問の前にはFAQに一通り目を通してください。
IDE (VC++など)などの使い方の質問はその開発環境のスレにお願いします。

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

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

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

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

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

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

おまえさん、そもそもdynamic_castとは何か理解しているか?
0004デフォルトの名無しさん
垢版 |
2019/09/13(金) 21:41:31.76ID:/ygW08Jq
あ、ID出るんだったな
「スレ主」としての発言ではないんで気にしないでくれ
0005デフォルトの名無しさん
垢版 |
2019/09/13(金) 22:48:38.62ID:ZW8mwhnp
整理すると
安全にダウンキャストするにはdynamic_castを使うし
その際vtableが必要
そんだけ
0006デフォルトの名無しさん
垢版 |
2019/09/13(金) 22:49:53.22ID:ZW8mwhnp
ちなみにdynamic_castでアップキャストする場合はvtable要らね
どうでもいいが
0012デフォルトの名無しさん
垢版 |
2019/09/14(土) 11:41:42.14ID:Hd+E1riT
そもそもアップキャストはリスコフの置換原則が成り立つクラスになってんなら何もしなくも勝手にできる
0017デフォルトの名無しさん
垢版 |
2019/09/14(土) 17:57:41.80ID:JExEJ5Ds
バッチ処理系統の仕事ならポリモルフィズムなんて糞の役にも立たんどころか
かえって有害だわ。
0018デフォルトの名無しさん
垢版 |
2019/09/14(土) 18:14:18.81ID:MJsGg5EL
COBOLでもEVALUATE文なんて普通に出てくるだろ
力技でダッセーけどあれもポリモだぞ
0022デフォルトの名無しさん
垢版 |
2019/09/14(土) 20:10:10.91ID:MJsGg5EL
正直、初めてポリモの話を聞いたときは
混ぜちまってから後で選別なんてアホだろって思った
0025デフォルトの名無しさん
垢版 |
2019/09/15(日) 01:12:05.95ID:+QluEOXC
C++は型の実行時識別をvtblのアドレスでやるからdynamic_castする以上はアップだろうがダウンだろうが対象クラスに仮想関数が一つは含まれないといけない
さもないとゼロコストの原則からクラスにvtblが作られない
ただし、仮想関数であれば良く、必ずしも仮想デストラクタである必要は無い、、、ハズ、、、
0028デフォルトの名無しさん
垢版 |
2019/09/15(日) 01:47:31.12ID:+QluEOXC
コールバック関数ならいちいちポリモとかしなくとも無名関数とかで良いやんジャバじゃあるまいし、
0030デフォルトの名無しさん
垢版 |
2019/09/15(日) 03:24:46.48ID:2F/PGB+Q
>>28
ラムダをどっこかに登録してコールバックしてもらうとき
自分が死ぬとき登録を解除するのが面倒じゃね?
結局thisとpairで登録する羽目に
だったら初めから仮想関数で良くね?
0031デフォルトの名無しさん
垢版 |
2019/09/15(日) 04:39:33.80ID:+QluEOXC
コールバック関数を渡す側がコールバックされるより先に死ぬ可能性があるとか
一体何がしたいのかっていうか、
0032デフォルトの名無しさん
垢版 |
2019/09/15(日) 04:41:18.12ID:+QluEOXC
仮にそうであるとしても死ぬ際に空のコールバック関数に登録し直せば良い
なお関数オブジェクト自体の破棄は関数オブジェクトをコピー渡しなりすれば何の問題も無い
0034デフォルトの名無しさん
垢版 |
2019/09/15(日) 09:03:14.13ID:XPArYK5v
C言語がなんとか使えるようになりました。
今度は、生産性の向上とstringとか面白そうなので、
C++を学習しようと思っています。

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

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

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

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

ほかにもあれば教えてください。
0038デフォルトの名無しさん
垢版 |
2019/09/15(日) 09:47:48.80ID:uSEm3H+m
ただで読めるし「江添亮のC++入門」とかでいいんじゃない?
どうしても書籍が良ければ9/20発売みたいだし
0039デフォルトの名無しさん
垢版 |
2019/09/15(日) 10:08:14.78ID:j54Ms8Tr
どいつもこいつも嵌める気しかねーのか。。
せめてロベールとかビャーネのやつを紹介しろよ。
0040デフォルトの名無しさん
垢版 |
2019/09/15(日) 10:14:24.35ID:uK9KHo8O
>>34
もちろんこういう書き込みは駄目だね
まず言語を学ぶ時点で実用性がない
学ぶならフレームワークだね
それにどうせ金にならないんだから、実用性なんて最初ならない
0041デフォルトの名無しさん
垢版 |
2019/09/15(日) 10:29:15.30ID:Fzt4Iz1L
ビャーネはまだしもロベール古くない?
0044◆QZaw55cn4c
垢版 |
2019/09/15(日) 10:37:36.53ID:gb0f216/
>>35
>書籍は11月、電子ならすぐに手に入るようです。
電子キンドル版もやはり11月まで入手できないとのことでした
0045デフォルトの名無しさん
垢版 |
2019/09/15(日) 10:47:37.02ID:j54Ms8Tr
cやったばっかの人に江添とか薦めるくらいならc++03のとこから地道に教える方を選択するわ。
あんな糞本でc++なんかいじられると目も当てられん結果になる。
0046デフォルトの名無しさん
垢版 |
2019/09/15(日) 10:49:41.53ID:Fzt4Iz1L
もちろんC++11,14,17,20と教えていくんだろうな?
今時C++03なんて使ってられんぞ
0047デフォルトの名無しさん
垢版 |
2019/09/15(日) 10:56:43.80ID:+TjQqAK6
今となっては「auto_ptrはコンテナに入れるな」だの「vectorのメモリ領域が連続してると仮定するな」だのを
初心者に教える方が有害だと思う
0049デフォルトの名無しさん
垢版 |
2019/09/15(日) 12:29:28.22ID:qCqOeXfn
ビャーネを勧めるとかw

否定が多いスレ

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

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

必要な情報は客観的事実でどっかの馬の骨の主張じゃない
解らんところをどう攻めるかも自分の頭で考えるのが大事だ
0051デフォルトの名無しさん
垢版 |
2019/09/15(日) 13:17:14.19ID:d26DY9ov
>>34
stringとかをライトに使いたいのならサンプルコード探して真似るだけでもいいかと
ただ、stringやvectorがどういう仕組みで出来ているのかはいずれ理解する必要出てくるから
独習みたいな本を手元に置いといた方がいい(>>47みたいに古い本だと一部仕様が違ってたりするけど
0052デフォルトの名無しさん
垢版 |
2019/09/15(日) 15:21:24.21ID:2F/PGB+Q
言っちゃなんだが、実際使ってみるっつーか
何かソフト書いて覚えるしかないと思うよ
参考書はネットに転がってる文献で十分でしょ
0054デフォルトの名無しさん
垢版 |
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.

であるなら分かりますが。どなたか分かる人にご教授いただければ幸いです。
005654
垢版 |
2019/09/15(日) 15:59:33.27ID:w00J0OPy
>>54
さっき、名前探索の「優先順位」に違いが出てくるからかもしれないと気付きました。
using-directive を書いた namespace よりも、その親や先祖となっている
namespace で名前が宣言されているかのよに振舞うということは、
その分、名前探索では優先順位が少し低くなります。このことによって
同名の名前が内側に宣言されていた場合、振る舞いが変わってきそうです。
0058デフォルトの名無しさん
垢版 |
2019/09/15(日) 18:52:44.08ID:XPArYK5v
34です。
みなさん、ありがとうございました。
詳しい人多いですね。

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

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

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

>全体が、
>「using-directive」であるという理解なのですが。
まあそのページの下の方にもそう書いてあるな
0076デフォルトの名無しさん
垢版 |
2019/09/17(火) 06:05:19.69ID:mC1Fem4G
cout << sizeof "abc";
これで4と表示されるから
文字列リテラルはポインタだなんて書いてるサイトもあるしな
0078デフォルトの名無しさん
垢版 |
2019/09/17(火) 09:03:18.20ID:kyKgfAv0
sejukuの侍エンジニア塾ブログじゃねえの?

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

読んじゃいけないサイトのトップにランクインしてる
さっさと検索結果から消えてほしい
0080デフォルトの名無しさん
垢版 |
2019/09/17(火) 12:04:06.87ID:MolJflMP
色々ツッコミどころがあるんだよねあれ

・C言語初心者はスクールがオフィシャルで出す解説を書くべきではない
・掲載前にはレビューするべき
・サイレント修正ではなく、お詫びと訂正を実施すべき
0081デフォルトの名無しさん
垢版 |
2019/09/17(火) 17:38:47.21ID:IoM9hprN
>>65
0082デフォルトの名無しさん
垢版 |
2019/09/17(火) 19:24:38.79ID:vP5fcRYP
実際糞記事読むくらいなら
ビャーネの本とかeffective modern c++読んだ方がよっぽど良い。
0087デフォルトの名無しさん
垢版 |
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を呼び出しています。
どうしたらよいでしょうか?
0089デフォルトの名無しさん
垢版 |
2019/09/17(火) 22:15:18.09ID:D0xFlgCf
C++に限らないが仕様が膨大だから一冊の本にするのは無理があるのに
色々網羅して中途半端な本多いよな。特には和書は。
0090蟻人間 ◆T6xkBnTXz7B0
垢版 |
2019/09/17(火) 22:21:08.25ID:vrvr50SL
カウント変数を追加し、ゼロで初期化。ロックがかかるときにカウントを1増やす。増やす直前にゼロだったら実際にロックする。ロックを解除するときにカウントを1減らす。ゼロになったら、実際にロックを解除する。
0092デフォルトの名無しさん
垢版 |
2019/09/17(火) 22:51:59.37ID:/ZgM52F4
>>87
同じスレッドでAの中からBが呼び出せるのは正常な動作です
逆に同じスレッドでAの中からBを呼び出したとき、Bでロックしてしまったら
誰がロックを解除するんですか?
0096デフォルトの名無しさん
垢版 |
2019/09/17(火) 23:06:00.71ID:TcK6H4+J
マイクロソフトがgithubにSTLの実装を公開してる。
どんどんオープンにしていくのな・・・

https://github.com/microsoft/STL
0098デフォルトの名無しさん
垢版 |
2019/09/17(火) 23:15:14.52ID:aYbHZN9j
>>92
それはwindowsのCRITICAL_SECTIONが再帰的ロック取得を認めているというだけで、
普遍的に通用する話じゃない。例えばstd::mutexを使った場合とかな。
>>87みたいなケースでは高階インターフェースのB()とinner_B()を分離するとかが常套手段だな。
0102デフォルトの名無しさん
垢版 |
2019/09/17(火) 23:35:00.33ID:aYbHZN9j
>>100
だからwindowsのCRITICAL_SECTIONなら通用する話だけど一般に通用する話じゃないってことだよ。
そういう環境だと

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

誰が解除するか心配する以前にBでロックを試みた時点で例外が飛んだりする。
0104デフォルトの名無しさん
垢版 |
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()は外部から呼べないようにするべきである。
0106デフォルトの名無しさん
垢版 |
2019/09/17(火) 23:47:40.49ID:ZBXs33c7
ジャヴァのsynchronizeとか再帰ロックオールOK
なんでかわ知らん
ていうかwait()をsynchronizeでかこわなけっればならないという
謎仕様
意味わからん…
0107デフォルトの名無しさん
垢版 |
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対応とかを言語が暗黙のうちに仮定しているからか、
今わかったわ糞が…!!
0112デフォルトの名無しさん
垢版 |
2019/09/18(水) 15:09:43.97ID:cX0n8f6q
ファイルにテキストを書き込みする際に、
ファイルにどれだけ書き込んだかを取得してプログレスバー的な処理をしたいのですが、
どのようにして書き込んだ量を取得すればいいのでしょうか?
0113蟻人間 ◆T6xkBnTXz7B0
垢版 |
2019/09/18(水) 15:14:37.40ID:d3y9L0GY
書き込んだバイト数の合計を数えるしかない。fprintfなら戻り値。文字列ならstrlen。
0114蟻人間 ◆T6xkBnTXz7B0
垢版 |
2019/09/18(水) 15:19:25.37ID:d3y9L0GY
合計バイト数がわからない場合は最初に全部数えるか、バイト数の代わりに行数などを使う手もある。
0115デフォルトの名無しさん
垢版 |
2019/09/18(水) 23:17:12.89ID:UKnFRk4i
頑張ってプログレスバーを実装したはいいがいざ実行すると
一瞬で表示が終り実装した意味あったのか・・と嘆く >>112 の未来の姿がみえる・・
0116デフォルトの名無しさん
垢版 |
2019/09/19(木) 00:44:38.80ID:zP6ZrAr3
書き込んだ量を取得することより、書き込み総量を計算するほうが難しい
ですよね。特にプログレスバーが必要になるほどトータル時間の掛かる処理の場合
に正確な総量を計算するとなれば莫大な時間が掛かってしまう可能性が高くて。
だから推定量を何らかの方法で求めるしかない事が多いでしょう。
0118デフォルトの名無しさん
垢版 |
2019/09/19(木) 01:11:02.88ID:b8NtymRi
つーかテキストだろ?ギガ単位のサイズじゃないんなら
一回メモリにバコバコ貯めといて一気にブワァーッと書くほうが早いよいろいろと
0119デフォルトの名無しさん
垢版 |
2019/09/19(木) 01:23:42.33ID:wlX+Ifsh
だな
今のコンピュータなら数十MBくらいガバっと読み込んでいいのに、いまだに少しずつみたいな解説してる本やウェブサイト大杉
0120デフォルトの名無しさん
垢版 |
2019/09/19(木) 06:29:12.29ID:TNTldw8V
プログレスバーとかユーザーの気を静めるためのインテリアみたいなもんなので
過度に精度に凝っても仕方が無い
例えばウィンドーズのファイルシステムで1フォルダに10万個ぐらいファイルがあって
それをリモートのウィンドーズのファイルシステムにコピーするとかな場合は
ファイルのトータル容量とか気にせずに
 進捗率(%) = 100 * コピーしたファイル数/10万個ぐらい
でも役に立つ
0121デフォルトの名無しさん
垢版 |
2019/09/19(木) 06:32:56.13ID:1k0/HGmS
いやプログレスバーは「きちんと」「しっかり」作らないと
ユーザーのイライラゲージを却って煽ることになるぞ
0122デフォルトの名無しさん
垢版 |
2019/09/19(木) 06:34:12.46ID:TNTldw8V
長らくぴくりとも動かなかったプログレスバーが一気に進んだとき
ユーザーに爽快感を与えることができうる
0124デフォルトの名無しさん
垢版 |
2019/09/19(木) 08:27:53.76ID:UG8ew1B1
99%で止まるやつはイライラするな。
進捗率よりも、書き込んだバイト数とか表示してくれると動いてるのがわかるから好きだな。
0127デフォルトの名無しさん
垢版 |
2019/09/20(金) 08:56:12.04ID:Qo6+tgpY
全支店のファイルを集計するツール作った時
九州支店とか遠方の支店に入ると突然90%とかから進まなくなって
イライラおじさんに「なら最初から期待させるな」みたいなお説教された思い出

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

きちんとやるなら面倒だけどやるしかないよな
それとも運用方法の変更なりで逃げるか
プログレスバーの工数見積り怖い・・・
0128デフォルトの名無しさん
垢版 |
2019/09/20(金) 09:04:34.21ID:Qo6+tgpY
処理中のファイル名をリアルタイム表示して
進捗率の方はあくまで参考値という体にする手もあるか
あとは費用対効果を説明してこれで我慢してもらう交渉でって感じで
キャンセルボタンも付けるべきだよな上司はイランて言ってたけど
0130デフォルトの名無しさん
垢版 |
2019/09/20(金) 09:29:35.36ID:JFYTR1x6
その支店に接続するのにかかった時間を計測しておいて
それをベースに表示してみたら
0137デフォルトの名無しさん
垢版 |
2019/09/20(金) 18:37:33.58ID:xrPkbjYn
あるクラスのインスタンスを生成するときに、必ずあるメンバを初期化してほしいとします。
このとき、コンストラクタで初期化することにしたのですが、初期化は必ずやってほしいためデフォルトコンストラクタは禁止したいです。

デフォルトコンストラクタを禁止するのはどうやりますか。
0139さまよえる蟻人間 ◆T6xkBnTXz7B0
垢版 |
2019/09/20(金) 19:02:34.17ID:sJdfK6qv
>>137
モダンなやり方は = delete;だろう。

古臭いやり方はprivateにして定義を書かないようにすれば、アクセスできないようになる。
0141デフォルトの名無しさん
垢版 |
2019/09/20(金) 19:32:15.62ID:mfXfj+Qu
どうでもいいがC++界隈はハチミツギョーザとか蟻人間とか
なかなかユニークなコテが多い印象
0143デフォルトの名無しさん
垢版 |
2019/09/20(金) 21:54:40.66ID:Q9EEZSVd
キャンセルボタンなしの進捗ダイアログ表示して安心してたらESCキーで閉じられて不正動作
0144◆QZaw55cn4c
垢版 |
2019/09/21(土) 12:33:44.52ID:HPdvwX1r
>>141
「蟻人間」のコテは最近それに改名されたものですよ…
0145デフォルトの名無しさん
垢版 |
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」と記述して、パスは通したのですが改善されません。

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

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

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

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

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

いじょ 耕運を祈る、
0149デフォルトの名無しさん
垢版 |
2019/09/22(日) 06:52:19.04ID:wJwJ26l5
std::variantってテンプレートによる静的ポリモーフィズムを実現しつつ一つのコンテナで管理したいという要求から生まれたんでしょうか
であるとしたら今後継承による動的ポリモーフィズムは下火になっていくのでしょうか
0151デフォルトの名無しさん
垢版 |
2019/09/22(日) 22:04:08.49ID:P121omqV
> std::variantってテンプレートによる静的ポリモーフィズムを実現
継承もstd::variantも実際に格納されている型が実行時まで分からないのだから、
静的(コンパイル時)ポリモーフィズムにはならないのでは?
0156デフォルトの名無しさん
垢版 |
2019/09/23(月) 03:12:30.92ID:aMvJGSmY
iccって高いだけで性能もgccとほぼ変わらないなら値段に見合う利点あるのか?
0160デフォルトの名無しさん
垢版 |
2019/09/23(月) 12:02:46.51ID:P5eYiou7
お仕事だとそうぽんぽんバージョンあげられないし
使っていい標準ライブラリのしばりもあったりするんですよ
特にプラットフォーム抽象する系はあんまり使わない
そんなのにべったり頼るぐらいならc++でなくてよくね?ってなる
0161デフォルトの名無しさん
垢版 |
2019/09/23(月) 12:08:09.26ID:rVs/BJT1
最近はmsvcがバイナリ互換保ち続けているから安心してあげられる。
gccやclangはもともと対応早いから安心だったし。
0162デフォルトの名無しさん
垢版 |
2019/09/23(月) 12:19:16.90ID:f1jovMGd
>>160
filesystem使って見た?
まだ荒削りで所々変なところがあるけど
方向性としてはいい線ついてると思うぜ
0166デフォルトの名無しさん
垢版 |
2019/09/23(月) 13:15:30.01ID:WS0TgAIm
まあケースバイケースだろ
ポンポンバージョン上げられないって言うだけで古い環境使い続ける職場もどうかと思うし
0167デフォルトの名無しさん
垢版 |
2019/09/23(月) 13:21:49.79ID:P5eYiou7
>>162
ファイルシステムまわりはこてこてにネイティブ依存の内製のものがあるので出番はないでしょうね
パフォーマンス第一の仕事なもので
あと標準ライブラリはデバッガやプロファイラのことがスコープ外なのでそのあたり自分達で整備しないと採用できないってのもある
0168デフォルトの名無しさん
垢版 |
2019/09/23(月) 13:33:54.17ID:f1jovMGd
なるほどね
パフォーマンス第一か
どっちかつーと標準なんぞ糞くらえつーか
標準の意味が違ったりするわけか
0169デフォルトの名無しさん
垢版 |
2019/09/23(月) 14:04:13.62ID:JqkYM16h
同じじゃん標準ライブラリは一般性重視故に特定の問題領域において必ずしも最高の性能は発揮しない(最高の性能となる保証がない)ことは確定的に明らかよって80-20の法則の80部分からパフォチューしていく
0176デフォルトの名無しさん
垢版 |
2019/09/24(火) 18:32:13.78ID:9F3bEWFD
汎用性・可搬性を重視するかパフォーマンスを重視するかのスタンスの違いだけでしょ
0178デフォルトの名無しさん
垢版 |
2019/09/24(火) 20:52:11.47ID:ZtSwhx8Z
visual studio 2019 16.3でついにconceptが使えるように(赤線でるけど。。。
0188デフォルトの名無しさん
垢版 |
2019/09/28(土) 14:48:43.27ID:nKwEArCO
このスレはwinapiを扱ってますか?
sendmessageとか。
0190◆QZaw55cn4c
垢版 |
2019/09/28(土) 16:12:26.72ID:QJtrgyVU
>>188
win32api ならやってる人は少なからず居ると思います
0191デフォルトの名無しさん
垢版 |
2019/09/28(土) 16:37:07.73ID:nKwEArCO
>>190
サンクス!
0192デフォルトの名無しさん
垢版 |
2019/09/29(日) 07:24:31.34ID:wVCOjSn/
文法とか開発思想の初歩的な質問なんだが、例えば最大流問題を解くプログラムと最小費用流問題を解くプログラムで「Edge」という構造体や「dfs」という関数の意味を変えたいときに使うのが名前空間だという理解でOK?
(関数の意味を変えたいだけなら名前空間じゃなくて別のクラスを用意すれば良いだけかな?)


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

これは他の言語にも言えることだが
職場で使ったことのあるJavaやPHPのバージョンと環境がすべてみたいな
0206デフォルトの名無しさん
垢版 |
2019/09/29(日) 17:38:36.19ID:MCSEZmay
C++20に入るauto変数を使った簡易関数テンプレートは宣言と実装を分割してコンパイルできますか?
0209デフォルトの名無しさん
垢版 |
2019/09/29(日) 19:02:41.77ID:bY9zxDl0
>>206
多分戻り値型と同じで、1つの翻訳単位内ならできると思う
宣言だけヘッダに書いたりするとautoのままだと呼び出せない
0213デフォルトの名無しさん
垢版 |
2019/09/29(日) 21:44:06.01ID:xcXauKC9
vectorの存在は知っていても中身は知らんやつばっかだろ
いまだに生配列の方が速いとか言ってるやついるし
0214デフォルトの名無しさん
垢版 |
2019/09/29(日) 21:51:00.97ID:lvoGL429
まあ実際計ってる奴はそんなにはいないわな。
てきとうな演算するくらいなら配列だろうとvectorだろうとほとんど変わらん
(ただしコンパイルオプションによる。
O2 ならそんな変わらんが最適化しないとvectorは本当に遅い。)
0215デフォルトの名無しさん
垢版 |
2019/09/29(日) 21:57:52.25ID:OYiClG3B
まあ最適化有効にすれば、すればそこいらの玄人が生配列でごちゃごちゃ書くより速くなることが多いがな
0217デフォルトの名無しさん
垢版 |
2019/09/29(日) 22:16:27.22ID:C35/CdkS
ただ最近のc++の最適化前提のスタンスはいただけないな
デバッグのためにデバッグビルド使おうとするが一桁二桁遅くなって実用に耐えないとか
問題再現できないとか多々あって困る
0218デフォルトの名無しさん
垢版 |
2019/09/29(日) 22:58:28.58ID:UVnMNq40
>>217
そういうのはコンパイラベンダに言わないと変わらないでしょ。
言語規格としては知ったことではない。
0219デフォルトの名無しさん
垢版 |
2019/09/29(日) 23:03:53.99ID:7KCLRAec
もし最適化の有無で速度の変わらないコードがあったとしたら、まず間違いなく人が読めるものではないだろうな
0220デフォルトの名無しさん
垢版 |
2019/09/29(日) 23:06:55.39ID:C35/CdkS
こういう開き直りのスタンスって何か固有名詞ついてなかったっけ?
マッチポンプではないし・・なんかなかったかな?
0222デフォルトの名無しさん
垢版 |
2019/09/29(日) 23:28:02.53ID:bY9zxDl0
そのおかげで実行時の速度と抽象化した書き方の両立ができるのでまあ仕方ないのでは
0223デフォルトの名無しさん
垢版 |
2019/09/29(日) 23:34:47.03ID:C35/CdkS
仕事でやってるので仕方ないで済まないんですよね
かつ遅いところは自分達では手が入れられないところだったり
こういうところ共感できる人いないのかな
0225デフォルトの名無しさん
垢版 |
2019/09/29(日) 23:39:36.92ID:C35/CdkS
>>224
10、100倍遅い問題がPC買い替えてなんとかなると思います?
あと使ってるPC結構いいスペックですよ
開発環境には金かけてくれる会社なんで
0226デフォルトの名無しさん
垢版 |
2019/09/29(日) 23:53:13.21ID:7KCLRAec
仕事でやってようと高水準言語とはそういうものなのだから仕方ないものは仕方ない
仕方ないで済まされないなら仕事をやめるしかない
仕事は不可能を可能にするものではない

そんなに最適化が気に入らないなら最適化なしでリリースすりゃいい
プロダクトとデバッグ環境が同一になる
0227デフォルトの名無しさん
垢版 |
2019/09/29(日) 23:55:18.86ID:lvoGL429
仕方ないで済まないのでc++使わずc使うっていう話だな。
そこまで無理してc++を使う必然性はない。
結局組み込み系で行われる判断というのはそういったものなんだろう。
0228デフォルトの名無しさん
垢版 |
2019/09/29(日) 23:56:29.88ID:SfsnISLI
じゃあ使わなければいい終わり
苦行を強いられているなら文句を言わずに甘んじて受け入れてくれうざい
デバッグができないくらい時間がかかるのであればデバッグ用にデータを減らすかデバッガを使わずにデバッグすればいいだけ
0229デフォルトの名無しさん
垢版 |
2019/09/30(月) 00:01:41.09ID:1t7BL5a5
c++の問題を指摘したら自分が否定されてる気持ちになる人ですね?
こういうのって何か固有名詞ついてましたよね?
心理学かなにかの
0231デフォルトの名無しさん
垢版 |
2019/09/30(月) 00:12:05.55ID:d3KN1ocd
C++の問題ではなく、トレードオフなものを両取りできないことに腹を立てている馬鹿の頭が問題
0234デフォルトの名無しさん
垢版 |
2019/09/30(月) 08:38:56.00ID:96lznZkD
>>217
問題再現できないのってUB踏んでるんじゃ...
0239デフォルトの名無しさん
垢版 |
2019/09/30(月) 21:53:05.92ID:eLbbGbO7
速度や効率を度外視すれば実はプログラミングはものすごく簡単になることが多い。
ところがそれだと劇的に遅くなってしまう。うまく工夫して書かれたプログラムの
所要時間を1とすると、何にも考えずに書かれたプログラムの所要時間は、
100兆位になることがある。そこまで極端でないにしても何にも考えなければ
100位にはなる。その意味で高速化を常に意識しながら組むことは結構
大切な事だと思う。特にアルゴリズム的な部分においては。
0241デフォルトの名無しさん
垢版 |
2019/09/30(月) 22:28:45.63ID:29SpHEC8
固定少数が速いとかdoubleよりもfloatが速いとか割算は遅いから掛け算だとか色々な噂聞いたけど・・・

今時ほとんど変わらんよね?
0248デフォルトの名無しさん
垢版 |
2019/09/30(月) 23:42:29.68ID:ypiuCBLp
>>247
自分で作っておいてあれだが、なにに・・・つか・・・えるん・・・だ・・・。ぐああああ。
考えれば考えるほどもやもやする。
0249デフォルトの名無しさん
垢版 |
2019/09/30(月) 23:50:49.59ID:ypiuCBLp
ヴェーダに接続するときに使うんかいな。とかおかしなことしか思い浮かばねー。
0250デフォルトの名無しさん
垢版 |
2019/10/01(火) 10:39:26.07ID:SeWV7ZFb
>>217
この場合に A<B,C,D>とした場合、public T... の部分は、
public B, public C, public D
と展開されるんでしたっけ?
0252デフォルトの名無しさん
垢版 |
2019/10/01(火) 21:48:01.50ID:9tGbOXPW
>>241
今どきのプロセッサではdoubleは速いよ
doubleは専用チップ積んでるから。floatはdoubleに内部的に変換かけられるから、原理的にdoubleより速くはならない
0253デフォルトの名無しさん
垢版 |
2019/10/01(火) 21:50:51.00ID:sOAgszt0
いや、今時のプロセッサはSIMDで不動小数点演算するからdoubleよりfloatの方が速いよ
演算やプロセッサによるが、大抵2〜4倍差が出る
0255デフォルトの名無しさん
垢版 |
2019/10/01(火) 23:06:13.36ID:geI6I9WY
直前の計算結果を次の計算で使うようなありがちな状況だと、SIMDじゃ一切早くならないのでは?よく知らんけど
0256デフォルトの名無しさん
垢版 |
2019/10/01(火) 23:06:54.09ID:sOAgszt0
x86とかも典型的だろ
doubleよりfloatの方が倍速いよ
最近はbfloat16の方がさらに速いまである
0257デフォルトの名無しさん
垢版 |
2019/10/01(火) 23:26:39.35ID:5ranOfZi
SIMDで1語で複数のfloat演算を並列にやったら早くなる
しかしコンパイラの最適化が普通はそこまでやってくれない
0261◆QZaw55cn4c
垢版 |
2019/10/01(火) 23:32:20.09ID:3zNRBOOL
>>253
1個のプログラムの中に一個か二個の float しか使わなくても、 double の場合より速くなるのですか?
そもそもイントリンシックを書かないのに SIMD のコードが出力されるのですか?

私は、コンパイラは fpu のコードしか吐かないじゃないか?って考えています
0264◆QZaw55cn4c
垢版 |
2019/10/01(火) 23:40:49.69ID:3zNRBOOL
>>262
1個のプログラムの中に一個か二個の float しか使わなくても、 double の場合より速くなるのですか?
そもそもイントリンシックを書かないのに SIMD のコードが出力されるのですか?
0265デフォルトの名無しさん
垢版 |
2019/10/01(火) 23:44:09.36ID:sOAgszt0
そもそもx64ではFPUは無かったことにされている
doubleやfloatの計算したかったらSIMDで1レーンだけ使って計算する仕組み
0268◆QZaw55cn4c
垢版 |
2019/10/02(水) 07:48:44.41ID:BafSfR+Q
>>265
いいえ x64 でも fpu コードは使えますよ、嘘はやめて!
0269デフォルトの名無しさん
垢版 |
2019/10/02(水) 07:54:44.99ID:Y2eIpMbX
>>228
こういうやつって何かしらソフト完成させたこともない初心者のクセしてイキってるんだろ
マジ邪魔だから消えて欲しい
テンプレート使ったコードで遅くなるというのがわからんならboostのspiritとか使ってみたらいいわ
言ってる意味わかるから
0271デフォルトの名無しさん
垢版 |
2019/10/02(水) 08:01:33.95ID:sddCZQNP
C++を使わないと言っているやつに、どうぞご勝手にということと何の関係が?
0274デフォルトの名無しさん
垢版 |
2019/10/02(水) 08:30:44.39ID:0zoKeqvU
そもそもプログラム中に一個か二個の浮動小数点演算なんて最適化ポイントちゃうがなwwww
自説を通すためにバカな例を仮定するアホに絡むだけ無駄やなw
0276デフォルトの名無しさん
垢版 |
2019/10/02(水) 22:05:22.14ID:VK3sSC9+
コンパイラの種類変わったら算術演算ぶん回す場合は結構差が出るだろうけど、同じコンパイラでバージョンかわると最適化とかの進化で結構かわるのかな?
gccの3と4、msvcの2005と2017とかそういう違いで
0277デフォルトの名無しさん
垢版 |
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() {}
}

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

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

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

それだと修正箇所が多すぎるのかもしれんけど
0287デフォルトの名無しさん
垢版 |
2019/10/03(木) 13:00:33.56ID:YSTER/9m
>>284
Qtをdisってんの
0289デフォルトの名無しさん
垢版 |
2019/10/03(木) 16:04:15.58ID:LjcEi/T6
ちょとっ猛進
0290デフォルトの名無しさん
垢版 |
2019/10/03(木) 16:37:32.38ID:vAL7lUst
回答ありがとうございます
プリプロセッサまみれになるより空の関数生やした方が見通しよさそうですね
0292デフォルトの名無しさん
垢版 |
2019/10/03(木) 19:00:51.01ID:BEqWQnsI
旧版は知らんけどQt5はかなり良いと思う
不満に思うのはベンチ厨くらいでは
0294デフォルトの名無しさん
垢版 |
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>();}
};
0297デフォルトの名無しさん
垢版 |
2019/10/03(木) 22:13:42.78ID:Uq6PP8Ux
ありがとうございました。
通りました。

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

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

誤:単純な作業でく、Q::A が型名なのか、変数名なのかはちゃんと調べる必要がある。
正:単純な作業ではなく、Q::A がtemplate名なのか、変数名なのかはちゃんと調べる必要がある。
0311デフォルトの名無しさん
垢版 |
2019/10/04(金) 08:37:14.54ID:P4b1n6up
>>225
>>224=228や>>226=219みたいなどうみても初心者なヤツにプロが敬語使う必要ないと思うよ
C++スゲー=俺スゲーみたいな明らかにプログラミングに向いてない精神構造のクソバカが多く居るからねここ
0312デフォルトの名無しさん
垢版 |
2019/10/04(金) 08:41:34.48ID:FzFdUbJu
>>306
一般論として、文字列の長さを len として、文字列型の変数を str としたとき、
for ( len 回のループ ) {
 str = str + "*"
}
で行けます。
0315デフォルトの名無しさん
垢版 |
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)を
完全に「特定」する必要があります。ここまでやるとなると、コンパイラの層分けが
上手く出来ないことになります。
0316デフォルトの名無しさん
垢版 |
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 の部分の処理は、
トークン解析層(?)より上位のコンパイル層で行う処理です。なのでこのやり方
だと、コンパイラ内部の「層」の切り分けが難しくなります(技術的に不可能な
わけではありませんが。)。
0317デフォルトの名無しさん
垢版 |
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*() 関数が定義されているかどうかも調べ、
0319デフォルトの名無しさん
垢版 |
2019/10/04(金) 12:41:17.15ID:G1/ISgxb
c++って文法に曖昧さがないことどうやって保証してんだろ
形式的なアプローチ無理だと思うんだが
0320デフォルトの名無しさん
垢版 |
2019/10/04(金) 13:05:22.64ID:MVQV/kgg
いや、そんな保証は端っから諦めてるだろ
引数なしの関数宣言とデフォコン呼び出しの曖昧さなんか
長年放置してたのをC++11でようやく対応したし
関数ポインタにキャストするoperatorはtypedef使えとか
言語としての完全性なんか重視してない
0321デフォルトの名無しさん
垢版 |
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) >
と書くと良いと思われます。
0322デフォルトの名無しさん
垢版 |
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にあったような気がする。
0324デフォルトの名無しさん
垢版 |
2019/10/04(金) 15:01:05.28ID:FzFdUbJu
>>322
(>>323 は誤投です。)
あるライブラリでの q1 * q2 という書き方が、別のライブラリでは
q2 * q1 と等価なことが有り得て、それはベクトルや行列計算全般に
言える記法の違いなのでこのソースだけではなんとも言えない。
ベクトルの場合、成分表示を1列の縦行列と考えるか1行の横行列
と考えるかによって、賭け全の左右が逆さまになる。
その結果、成分表示で書かない表記も、左右どちらかで書くかは
好みの問題となる。
特に Quaternion の場合も同様。
0325デフォルトの名無しさん
垢版 |
2019/10/04(金) 15:02:02.33ID:FzFdUbJu
>>324
誤:と考えるかによって、賭け全の左右が逆さまになる。
正:と考えるかによって、掛け算の左右が逆さまになる。
0326デフォルトの名無しさん
垢版 |
2019/10/04(金) 15:45:42.88ID:P4b1n6up
OpenGL系は縦ベクトルだね
D3Dを前提にしたライブラリとは逆になる(行列も転置
0328デフォルトの名無しさん
垢版 |
2019/10/04(金) 16:08:07.51ID:JXWhYfPM
テンプレが糞だと思う瞬間はいくつもあるが
その一つはネストしてるときの閉じ括弧
>> じゃだめで > > ってわざわざ分けないといかんうざい
0329デフォルトの名無しさん
垢版 |
2019/10/04(金) 16:08:35.30ID:P4b1n6up
>数学や物理学では縦ベクトルが多いが、D3Dはそれに従ってない。
みたいだね
D3Dからそれ以外に移るとみんなここで引っかかるけど
実は行列周りは(大文字は行列として)
OpenGLに合わせるとA*B*C*xとなるのを
D3Dではx*C*B*Aと書けた方が、左からの計算が全部結果がベクトルなので計算量が減るというメリットはある
MSはC++での書きやすさと効率を考えたのかもしれない
0330デフォルトの名無しさん
垢版 |
2019/10/04(金) 16:09:02.58ID:JXWhYfPM
>>326-327
縦横ってより右から掛けるか左から掛けるかだと思ってた
意味は一緒なんだろうけど
0332デフォルトの名無しさん
垢版 |
2019/10/04(金) 16:14:31.61ID:MVQV/kgg
C++03いやC++98?のまま更新止まってるやつ
俺が想像するより遙かに多いのかもしかして

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

行列の各要素のメモリ上の並びって
glの行列AとD3Dの行列A'はいちいち転置しなくても結局同じになるんだっけ
0334デフォルトの名無しさん
垢版 |
2019/10/04(金) 16:22:07.03ID:P4b1n6up
ああ確かにメモリの中身は同じだった
格納方式も違うから結果的に同じになるんだよね
そこが余計ややこしい
0335デフォルトの名無しさん
垢版 |
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個以上あるときには効率が高い。
0336デフォルトの名無しさん
垢版 |
2019/10/04(金) 16:31:49.50ID:FzFdUbJu
>>332
C++98くらいから、実際問題上使いたくない機能ばかりが追加されるような
傾向があったのに、Upgrade 版は適用外になったりしたりして買う機を逃した。
0337デフォルトの名無しさん
垢版 |
2019/10/04(金) 16:38:53.10ID:FzFdUbJu
>>329
>MSはC++での書きやすさと効率を考えたのかもしれない
>>335 に既に書いたけど、OpenGL 形式でも、右結合でも、
左結合でも、好きな方で計算は出来る。だから、行列部分を
先に計算しても良いし、座標部分から計算しても良い。
座標部分から計算していくと一見計算量が減るように思える
かも知れないが、点の個数が多くなると、一度だけ行列部分の
積を予め計算しておいて、その結果を全ての点の変換部分に
遣うと効率が劇的に向上するので、むしろ、効率が良いのは逆。
0338デフォルトの名無しさん
垢版 |
2019/10/04(金) 16:40:53.55ID:P4b1n6up
>>335
確かに(OpenGLでも上で書いたような式が使えるライブラリ使うとして)括弧でくくったりして優先順位変えればいいし
言う通り行列はまとめればいいんだけど
どちらにもメリットデメリットあると言いたかった
0339デフォルトの名無しさん
垢版 |
2019/10/04(金) 16:51:20.07ID:FzFdUbJu
>>338
実は、アメリカで有名な 3D Graphics の本が、横ベクトル方式を採用していた
事が関係しているかもしれない。要はその本が数学や物理の標準とは何故か
逆の記法を採用していたということ。
0340デフォルトの名無しさん
垢版 |
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)
が最速やね
0341◆QZaw55cn4c
垢版 |
2019/10/04(金) 19:54:25.76ID:5CiM54x6
>>335
行列って結合則は約束されてましたっけ?
0342デフォルトの名無しさん
垢版 |
2019/10/04(金) 20:17:27.71ID:gZky9oRw
当たり前だろ。
そんなレベルの知識しかないからフォントライブラリ書けないんだよ
0344デフォルトの名無しさん
垢版 |
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つの行列の場合ではなく、一般の個数の行列の場合、
最初に書いたように数学的帰納法を使います。それは、あなた自身で
お考えください。考える力の練習になります。
0346デフォルトの名無しさん
垢版 |
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.
0347デフォルトの名無しさん
垢版 |
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...と歯抜けになる
0350デフォルトの名無しさん
垢版 |
2019/10/05(土) 00:03:15.79ID:bnoeYdBm
行列の結合則なんて高校で習っただろ
線形代数わからないプログラマって生き残れないと思うわ
0351デフォルトの名無しさん
垢版 |
2019/10/05(土) 00:05:26.41ID:KADe2ROY
>>347
・そのコードは、完全に上記の通りですか?

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

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

一番のネックはネガフラグの扱い。
マイナスとプラスの反転演算でどうかくとスマートだろうか。
だれか教えてプリーズ。
0378デフォルトの名無しさん
垢版 |
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();
}
0379デフォルトの名無しさん
垢版 |
2019/10/05(土) 19:08:43.36ID:NXndjuW4
>>378
1.できなくはない。機械的に接頭語つけるだけでいいよね。
2.暇だから作るわ。

行ってきまーす。
0382デフォルトの名無しさん
垢版 |
2019/10/06(日) 10:28:58.03ID:yc9LKsYB
>>380
マルチ禁止
0384デフォルトの名無しさん
垢版 |
2019/10/07(月) 19:17:43.20ID:PHxdOQnu
C++ってなんでヘッダファイルいるんですか
最近マシン早いんだし
全部ソースに書いてインポートすればいいのに
0387デフォルトの名無しさん
垢版 |
2019/10/07(月) 20:58:42.59ID:A3KSW75p
>>384
むしろソースがいらなくて全部ヘッダに書けばいい
inline変数とかもできるようになったことだし
0390デフォルトの名無しさん
垢版 |
2019/10/08(火) 09:06:39.07ID:xr4jQIWZ
プリコンパイルヘッダーって使ってます?

使っているプロジェクト見たことないですわ。
0394デフォルトの名無しさん
垢版 |
2019/10/08(火) 21:42:59.95ID:lGNioH0G
headerオンリーってのは可搬性に優れた良いものだろ
特にテンプレート多用している奴は、一部関数だけソースファイル分離する意味が薄い
0396デフォルトの名無しさん
垢版 |
2019/10/08(火) 21:54:07.26ID:J87hrB1p
「全部ヘッダ」と言われると、そのときの「ヘッダ」の定義がどういうものなのか気になる。
0398デフォルトの名無しさん
垢版 |
2019/10/08(火) 22:09:52.63ID:tSj7di+z
>>390
VCのやつは使いまくり
依存するライブラリのヘッダファイルを標準のやつもソリューション内のやつも全部まとめて
stdafx.hの中でインクルードしたらことのほか便利
ただし同じプロジェクトのヘッダファイルを入れだしたら目的を見失って氏ぬ
0399デフォルトの名無しさん
垢版 |
2019/10/08(火) 22:10:50.35ID:hpLG4xMo
テンプレート関数は便利だしconstexpr関数は市民の義務だし
結局ほとんどヘッダファイルに書くことになるでしょ
0400デフォルトの名無しさん
垢版 |
2019/10/08(火) 22:30:34.35ID:X4FGjRpd
初心者ですが質問させてください

print(1, 3.14, "abc");とやると引数の中身を順番にスペース区切りで出力してくれるような関数は
可変引数テンプレートの再帰呼出しを使うと便利にできることを知りました。
そこで引数の型に応じて出力の見た目を少し変えたいのですが、
関数の特殊化をすればいいですか?
typeidだと動的な評価になってしまうんですよね?
0401デフォルトの名無しさん
垢版 |
2019/10/08(火) 22:33:59.15ID:kGAGzuS0
予想通りの馬鹿回答で笑ってしまった。
やっぱいい判別になるわテンプレバカ。
0402蟻人間 ◆T6xkBnTXz7B0
垢版 |
2019/10/08(火) 22:37:33.87ID:jfG+k1ni
>>400
引数一つに対するテンプレート関数を作って特殊化してそれに少しずつ渡せばできるよ。
0405デフォルトの名無しさん
垢版 |
2019/10/08(火) 23:04:05.43ID:/kdim2Vo
こんな雑談スレ好きな奴以外に需要ないだろ
こんな辺境別に見なくて良いんだよ?
0407デフォルトの名無しさん
垢版 |
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;
}
0408デフォルトの名無しさん
垢版 |
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...);
}
0409デフォルトの名無しさん
垢版 |
2019/10/09(水) 04:21:52.30ID:NmoqHfbB
>>406
いわゆる型特性というやつでしょうか?enable_ifを使うのかと思い試したもののうまくいかず、
ネットで調べるとenable_ifと可変引数テンプレートは相性が悪いという意見を見つけたり...
0410デフォルトの名無しさん
垢版 |
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...);
}
}
0411デフォルトの名無しさん
垢版 |
2019/10/09(水) 10:59:59.89ID:RbUf+g7C
const char * 自体も class First や class Args と一致するんじゃね
0412デフォルトの名無しさん
垢版 |
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), ...);
}
0413デフォルトの名無しさん
垢版 |
2019/10/09(水) 22:42:32.58ID:J+0BhmRu
win系のOSの画面に1.txt~5.txtがあります。1.txtと2.txtをドラッグして選択したとします。
この状態で3.txt~5.txtを選択したことにするにはどのようなコードを書けば良いですか?
0417デフォルトの名無しさん
垢版 |
2019/10/11(金) 01:40:25.90ID:n351RXRL
std::shared_ptrを構築後に(カスタム)デリータを変更するのは無理?

既にどっかで作成済みのshared_ptrについて、破棄タイミングを後から見れないかなと
0420デフォルトの名無しさん
垢版 |
2019/10/11(金) 12:29:56.77ID:w5dDNHMJ
VCのlatestでchar8_tが入ってたわ
やっとC++erが文字コード問題から解放されるんだな
0422デフォルトの名無しさん
垢版 |
2019/10/11(金) 15:19:50.16ID:iqVlf+4W
>>418
デリータごとswapされたわ
stackoverflowにも似たような質問があったけど結論としては出来ないっぽい
たぶん
0425デフォルトの名無しさん
垢版 |
2019/10/12(土) 08:08:31.86ID:vgsPsMOm
>>423
C++ユーザが全員趣味なんてどこにも書いてないし、あるプログラミング言語が趣味でしか使われてない状況なら、委員会なんていらないわwww
0426デフォルトの名無しさん
垢版 |
2019/10/12(土) 08:48:46.65ID:fl5cgmi7
衣食住の確保以外の仕事なんてみんな趣味みたいなもんだよ
なくたって構わんのだから
0429デフォルトの名無しさん
垢版 |
2019/10/12(土) 09:06:03.19ID:w6XAfbR5
委員会なんて何の役にもたってねーだろ。
構文解析もまともに理解できてないバカが俺様仕様の理想に突っ走ってるだけのクソ組織で、
仕様の実装、デバッグの手間なんてこれっぽっちも考えてないのがよくわかる。
0431デフォルトの名無しさん
垢版 |
2019/10/12(土) 09:54:19.46ID:DT43rpFP
近年は新機能は三大コンパイラ(GCC,MSVC,Clang)での試験実装が入ってから仕様入りするのが普通になってるし
コンセプトなんてまさにデバッグの手間の軽減を第一目的に苦心して作られた機能なんだけど
どのへんを見てよくわかったのか教えて
0432デフォルトの名無しさん
垢版 |
2019/10/12(土) 10:00:51.19ID:w6XAfbR5
>>431
実装したことないやつは黙っててね。
で、そのコンセプトを実際のコードでコンパイルした時間がどれくらいになるかわかってる?
そういう有用なベンチマークもほとんど出さずに無理やり入れようとするから
信頼を無くしてるんだよ。
0433デフォルトの名無しさん
垢版 |
2019/10/12(土) 10:19:47.03ID:Nq/Z/R6A
経験したことは全て正しいっていう日本特有のアホ理論だろそれ
経験してないお前に発言権は無い、っていう
その理屈を持ち出すヤツは大抵はアホ
0434デフォルトの名無しさん
垢版 |
2019/10/12(土) 10:24:58.21ID:69fBrMS4
コンパイル時間は、コンパイラの出力する最適化されたバイナリの実行速度に比べたら問題ではないだろ

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

std visitで引数増やすとコンパイル時間は簡単に増やせるよ。
5つくらいでもうコンパイラが落ちたりする
やらせていることの面倒くささ、それを手書きすることを考えれば妥当なのだけど
0441デフォルトの名無しさん
垢版 |
2019/10/12(土) 12:41:57.75ID:Tqr7IA/6
最近C++触ってないけど数万程度で10分もかかるの?
10万行程度なら5分以内に終わってほしいところだけど…
0442デフォルトの名無しさん
垢版 |
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秒以下でコンパイルできます。
0445デフォルトの名無しさん
垢版 |
2019/10/12(土) 15:33:32.46ID:UCFxfzGx
ヘッダオンリーのライブラリがポータブルとか言われてもてはやされるのがc++だからね
生産性の意識が間違った方向に向いてる
コンセプトでどうなることやら
0446デフォルトの名無しさん
垢版 |
2019/10/12(土) 15:52:13.73ID:K75UXpIa
俺の10万行程度のアプリは1分以内にコンパイル終わるが・・・
10分てどこの世界だ
0447デフォルトの名無しさん
垢版 |
2019/10/12(土) 19:26:26.29ID:8VsKOlOD
「参照の配列」を作りたいときって現状 reference_wrapper を使う以外ないですか?
0449デフォルトの名無しさん
垢版 |
2019/10/12(土) 20:55:57.96ID:cS98TRHZ
>>437
プリコンパイルヘッダー使え…!

>>446
VC++2010の場合配列要素のアドレスの配列というのを
それぞれ1万行ぐらい書いてリリースビルドすると10分かかる
0450デフォルトの名無しさん
垢版 |
2019/10/12(土) 23:18:34.83ID:zNYGVDyE
spiritで構文解析させてたコード(その上et使った自作ライブラリあり)だから例として極端だったかもしれんけどね
プリコンパイルドヘッダは使ってたよ
効いてるときは数分かからなかったと思う
というか5年以上そのコード使ってないんで今のマシンならまだマシになるとは思う
0451デフォルトの名無しさん
垢版 |
2019/10/13(日) 01:04:01.79ID:2Ilco01g
boostを多用した10数万行のソースでprecompileありでreleaseビルドしたら10分くらいかかってたけど、debugビルドでは1,2分くらいだった気がする。パースだけなら大したことないけど最適化がかなり遅いと思われる。
0454デフォルトの名無しさん
垢版 |
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とかで検索しても上手く引っ掛からないみたい(有るには有るけど少ない)
0457デフォルトの名無しさん
垢版 |
2019/10/13(日) 17:23:21.82ID:Y0ptPfKA
他の言語で書かれたコードをスクリプトの要領で
C++から呼び出して実行したいのですが、
そういった事をするのに適した言語ってどういった物があるのでしょうか?
0465デフォルトの名無しさん
垢版 |
2019/10/13(日) 20:24:22.36ID:kfwaB+Y7
>455,456さんどうもです

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

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

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

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

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

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

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

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

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

https://wandbox.org/permlink/F7zl1fDh3qc216hd

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

開発はWindowsでしつつもWindowsとLinuxどちらでもコンパイルできるようにしたいんですが
もしかしてそう簡単な話ではないんですかね
0483デフォルトの名無しさん
垢版 |
2019/10/18(金) 15:49:49.04ID:/qIwU54Z
effective modern c++のnoexceptの項読んで思ったんだが、
C++の関数内でCの関数(具体的にはOpenGLとか)を呼び出した時に
C++側でcatchできる例外って具体的にどんなものがあるの?

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

とりあえずcmakeくぐります、有難う
0486デフォルトの名無しさん
垢版 |
2019/10/18(金) 19:19:00.58ID:5559SrY6
VCコンパイラがWindows専用だからcmakeだけでは解決しない
clangオプション使えばいけるんじゃね
0487デフォルトの名無しさん
垢版 |
2019/10/18(金) 19:27:02.65ID:BPo3Wxa0
cmakeってなんとなくしか使ってないんですけど何なんですか
OpenCVのソースをビルドするときに使いましたけど、cmakeした後にまたVisual Studioでコンパイルする必要があるのはなぜですか
0488デフォルトの名無しさん
垢版 |
2019/10/18(金) 21:38:24.25ID:1VxWd/yq
>>487
cmakeってmakeの代用じゃなくてmakefileとかxxx.slnとかを作るソフト
なのでcmake実行後に各々の環境にあったビルドを行う
0489デフォルトの名無しさん
垢版 |
2019/10/18(金) 22:32:33.72ID:HsDKWWc7
>>487
ビルドするためのスクリプトを作るツール、みたいに考えるといいよ
linux環境ならLinux用のものを作ってくれる
makeだと基本はlinux専用だし、.slnや.vcxprojはwindows専用だから、両方を面倒見るのは大変でしょ
0490デフォルトの名無しさん
垢版 |
2019/10/18(金) 22:48:18.41ID:f2FG8XiO
ビルドするためのスクリプトを作るためのスクリプトを作るためのスクリプトなんてよくある話だよ。
0492デフォルトの名無しさん
垢版 |
2019/10/18(金) 23:06:23.18ID:liCy40EB
GNU autotoolsをまともにいじる輩は消え去ったという現実をcmakeも味わうことになる。
バカは同じ間違いをする。歴史も見ずに。
0493デフォルトの名無しさん
垢版 |
2019/10/19(土) 00:19:02.04ID:JKxr+RAJ
CMakeってKitwareっていう大学発ベンチャーから出てきたやつだよな
もとはVTKとか可視化用ライブラリ開発してるしがないベンチャーだったのに
CMakeのおかげでやたら顔が知られるようになった
0495デフォルトの名無しさん
垢版 |
2019/10/19(土) 00:44:42.31ID:JKxr+RAJ
ParaViewは最近になって有名になってるけど所詮はVTKのラッパーでしょ
CMakeのほうが影響度はでかいと思う
ベンチャーでここまでやれたなら大成功な事例だね
0497デフォルトの名無しさん
垢版 |
2019/10/19(土) 01:00:35.87ID:4XSJxZBk
cmake邪魔くさい
Makefile.am, configure.acからautoreconfしてconfigure作る方が楽。
windows用もmingwでクロスビルドしちゃえば楽だし。
WSLでwindowsからも見えるパスでビルドすると作ったwindows用binaryをすぐに起動できるしいうことなし
0500デフォルトの名無しさん
垢版 |
2019/10/19(土) 01:37:16.21ID:JKxr+RAJ
makeとかのビルドツールって超重要なはずなのにおざなりな状況になってるのは不思議だ
なんとかしてくれ
0501デフォルトの名無しさん
垢版 |
2019/10/19(土) 01:49:35.75ID:kiA3Djjo
クロスプラットフォームなソフト作るにしても、成果物が対象の環境で動けば良い訳で、ビルドをどの環境でも出来ることにそれほど意味はないからね
てかunix系でgccやclang使って開発しているものをVCに入れても謎の独自仕様でコンパイルできないとかザラだしね
0505デフォルトの名無しさん
垢版 |
2019/10/19(土) 09:24:58.31ID:wYu0/eCZ
あらゆるビルドツールは怪獣化して、怪獣を飼いならすためのラッパーが必要になり、そしてそのラッパーももれなく怪獣化する
歴史が証明しており例外はない
0506デフォルトの名無しさん
垢版 |
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(); が必要なのか。
0507デフォルトの名無しさん
垢版 |
2019/10/19(土) 09:50:39.86ID:wYu0/eCZ
ifsreamってcloseの後に再使用できる保証あったっけ?
ifs1の宣言をfor文の中に入れて毎回オブジェクト作り直す方が無難に見える
0509デフォルトの名無しさん
垢版 |
2019/10/19(土) 09:54:59.18ID:Xn59Im0u
makeが複雑なんじゃなくて
多様な環境すべてに対応するように書くことが複雑なわけで。
だったらdockerなり使って一つの環境だけでの提供を考える方が楽。
0512デフォルトの名無しさん
垢版 |
2019/10/19(土) 12:41:43.65ID:IyvFodwr
Rakefileを使っている俺は小数派。

>>506
古いVCの場合ifstreamのclear()後再使用はできなかった記憶がある。
0513デフォルトの名無しさん
垢版 |
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にはないんだけど、
どこにあるか誰か知りませんか?

スレチだったらごめんなさい。
0514デフォルトの名無しさん
垢版 |
2019/10/19(土) 14:48:33.14ID:g7gJ/kc1
おま環
何をダウソしたかくらいは書け
0515デフォルトの名無しさん
垢版 |
2019/10/19(土) 15:03:15.21ID:g7gJ/kc1
python2.7 が既に入ってるなら
その bin に path 通しとけば良いんかな
0516デフォルトの名無しさん
垢版 |
2019/10/19(土) 15:14:23.88ID:Q3nSZoDU
>>483
C の関数が呼び出すコールバックを C++ で書いた場合、環境によってはコールバックからの例外が
C の関数を通過してくる。環境によっては通過できずに terminate() するけど。
厳密に「Cの関数」じゃなくなるけど qsort(), bsearch() については例外が通過できるものと規定されている。
あとは未定義動作となる場合の反応として例外が飛んでくることはあるかもしれない。
0517デフォルトの名無しさん
垢版 |
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フォルダは試してませんでした。
ちょっとやってみます。
0522517です
垢版 |
2019/10/20(日) 17:45:24.74ID:njFFTJVf
>>519
インストール手順自体は試したんだけど、
あまりに訳わからんちんで途中で断念して
他のサイトを見ながら入れようとしています。

>>520
Node.jsってv8の上に乗っかったjavascriptというイメージなんだけど、
C++から呼び出せるのでしょうか?
0523蟻人間 ◆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.もっといいバッファリングの方法はないか。

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

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

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

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

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

ハードディスク環境でジッターを測定して見ないと。わかりました。
0532デフォルトの名無しさん
垢版 |
2019/10/20(日) 22:32:55.48ID:I/H74RW7
>>530
ただそのスレッドでwriteするのが問題ないかはよく確認した方がいいよ
writeでブロックされることで音声のソース側の処理が滞る可能性がある
その場合はやっぱり別スレッドにすべきだね
0536蟻人間 ◆T6xkBnTXz7B0
垢版 |
2019/10/20(日) 23:28:56.20ID:2g822Cxo
ここまでのまとめ。

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

APUの近くに配列でOK
複雑なデータ構造なんて考える必要ナシ
0543デフォルトの名無しさん
垢版 |
2019/10/21(月) 18:33:52.73ID:K8Ck/3Ch
実行時のパラメータでバッファサイズ可変にするならvectorで始めにresizeしておくのが楽
size使える分配列のunique_ptrより取り回しも楽だし
0547537
垢版 |
2019/10/21(月) 19:27:27.31ID:iqf1snDW
>>540
それらの同期機能って標準C++のクラスだけで実現できるもんなの?
0549デフォルトの名無しさん
垢版 |
2019/10/21(月) 20:56:31.15ID:NgTxqwl+
>>547
どこまでを標準と言ってるのか知らんけどお前の考える標準でスレッドをサポートしてるならたいてい同期機構もあるはず
0550蟻人間 ◆T6xkBnTXz7B0
垢版 |
2019/10/21(月) 21:02:21.32ID:LVq8IpRv
>>547
WindowsではCriticalSection, CreateMutexなどがあったからC++11以前でも使えた。
C++11からstd::mutex, std::lock_guardなどが使えるぞ。
0552蟻人間 ◆T6xkBnTXz7B0
垢版 |
2019/10/22(火) 16:18:00.26ID:QN5InCe0
リングバッファの排他制御どうするか?

push/popごとにロックかけたら遅くなりそう。
0554デフォルトの名無しさん
垢版 |
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側のキューに戻す
っての

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

これを推し進めればwait freeの実装に近づけるぞ
車輪の再発明だが勉強にはなる
0558蟻人間 ◆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バイトあるようだ。
0563◆QZaw55cn4c
垢版 |
2019/10/22(火) 21:43:35.88ID:afWm6mlf
>>562
win32api(64bit版)で書くのが正義、という価値観もまだまだ存在するようです
0564デフォルトの名無しさん
垢版 |
2019/10/22(火) 23:33:30.81ID:QUuuj0zF
C++11からできた属性構文あるけどこの属性は宣言にだけつければOK?
定義にも同じ属性を記載するべき?
0566デフォルトの名無しさん
垢版 |
2019/10/23(水) 00:50:12.41ID:/s0IRa9G
>>563,565
Mozilla Firefoxなどサードパーティ大手は今もWin32APIをネイティブに使っており.NETを使ってない。
0572デフォルトの名無しさん
垢版 |
2019/10/23(水) 21:15:01.42ID:kC3TvNwV
正直なところWin32APIで速度でるの?
0573デフォルトの名無しさん
垢版 |
2019/10/23(水) 21:30:55.10ID:/s0IRa9G
>>572
「Linuxシステムコールで速度でるの?」という質問と同じくらい矛盾に満ちた質問。
Win32APIも含めシステムコールはOSが提供するAPIなので、プログラマは他の手段で代替しようない。
0575デフォルトの名無しさん
垢版 |
2019/10/23(水) 22:12:26.70ID:B7dtMHRy
Visual C++ 2015なんですが、
goto文でERRORというラベルに飛ばそうとしたら、コンパイルエラーが出ました。
ERRにしたらコンパイルできるようになったんですが、
なぜERRORのラベルはダメなんでしょうか?
0580575
垢版 |
2019/10/23(水) 22:32:44.87ID:B7dtMHRy
ERRORのdefineがあるんですね・・・!
ありがとうございました!
0581デフォルトの名無しさん
垢版 |
2019/10/24(木) 09:12:01.73ID:m57JSwXI
クソみたいなマクロにsmallもある
他にもwindows.hには地雷が入念に仕込まれてる

普通の神経の人間が爆死して厭らしい人間だけが生き残るように整えられている厭らしい環境がwindows.hだよ
マトモな人間にはまず耐えられない
頭のオカシイ厭らしい人間だけが残るように設計されているのがwindows.h
このヘッダは頭がおかしい
0588デフォルトの名無しさん
垢版 |
2019/10/24(木) 21:28:21.53ID:hxYU3Lux
たしかmaxとかもマクロ定義されてたよね
初心者のころはどハマリして殺意がわいたわ
0591デフォルトの名無しさん
垢版 |
2019/10/24(木) 23:40:29.47ID:PIyGP0m1
最近ちょいちょい思うことだが、ある言語のここがどうであーだこうだと議論する場合
テキストエディタでコーディング作業してる連中と IDE でコーディング作業してる連中では
わりと大きな認識の違いがあることが多い
0592デフォルトの名無しさん
垢版 |
2019/10/24(木) 23:44:34.75ID:8Fri6DgZ
windows.hのマクロ回りでトラブル起こしているのは、殆んどvisual studio使用者だと思うのだが
0595デフォルトの名無しさん
垢版 |
2019/10/25(金) 07:52:28.01ID:51G3P59H
コンパイラ変えてもマクロは変わらんでしょ
せいぜいエラーメッセージ変わるぐらいじゃ
0597デフォルトの名無しさん
垢版 |
2019/10/25(金) 12:19:38.16ID:51G3P59H
マクロは影響範囲わからんからなんとも

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

って変なこと言うと思ったらADSLか
0604デフォルトの名無しさん
垢版 |
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を別の名前にする

これ以外でできますか?
0606デフォルトの名無しさん
垢版 |
2019/10/26(土) 01:35:09.91ID:dcsgYCXg
>>604
「コンパイルできるようにする」
というだけであれば、何も修正しない元のままでもコンパイルできるはずだし、
最初の class A {} の行をコメントアウトする、消す。
Nの中のAを消す、namespace N {・・・} の部分を全部消す、
などなどいくらでも有りえる。
0607デフォルトの名無しさん
垢版 |
2019/10/26(土) 06:20:26.55ID:3CUGZWDU
BのfriendをN::AにしたいってことであればNとBの間にclass A;とAの宣言を入れる
これ以上のエスパーは無理
0608デフォルトの名無しさん
垢版 |
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.
0609デフォルトの名無しさん
垢版 |
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.
0611デフォルトの名無しさん
垢版 |
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;}
};
};
0612デフォルトの名無しさん
垢版 |
2019/10/27(日) 08:27:09.91ID:C3DsRDjK
N::Aを前方宣言するなら、宣言を名前空間Nの中に入れるかN::Aで宣言する必要があるってのはC++の規約通りじゃないのか?
>>608が意味わからん
0613デフォルトの名無しさん
垢版 |
2019/10/27(日) 09:08:16.09ID:M7FyKfzv
friend宣言は、当該宣言を含むクラスが属するスコープを対象とし
なおかつ、対象スコープに識別子を導入しない

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

namespace H
{
class I
{
friend class A; //H::A
};
}
0615デフォルトの名無しさん
垢版 |
2019/10/27(日) 14:03:45.40ID:M7FyKfzv
いや前方宣言は関係ない
「もし」::Aがあったら、H::Aがあったら
と言っているだけのものだ
0617デフォルトの名無しさん
垢版 |
2019/10/27(日) 15:28:12.27ID:itfBjV2c
>>616なのは明白だが
>>604のコードのどこにコメントアウトすべき::Aがあるのかわからん…

ひょっとして、>>604が禁じていないのを良いことに、
最も外側のclass A{};を丸ごとコメントアウトしようとしている?
0619デフォルトの名無しさん
垢版 |
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にクセがある
0620デフォルトの名無しさん
垢版 |
2019/10/27(日) 16:07:13.81ID:6193c9It
規格的にはどうなるのが正しいの?
むしろ、もとの話がどうしたいのかに依る気がしないでもない
0621デフォルトの名無しさん
垢版 |
2019/10/27(日) 16:13:20.11ID:rrcAfXPk
>>620
規格の話は>>608じゃねーの?
コンパイルできるようにするにはg++にするかVisual Studioなら>>619みたいにするってことでしょ
それ以外なら環境を提示してねってことかと
0623デフォルトの名無しさん
垢版 |
2019/10/27(日) 16:55:17.47ID:rrcAfXPk
>>622
一緒だよ
だからそれができないならg++(とか他のちゃんと規格準拠して処理系)にしろって書いてあるだ
まあVisual Studioが規格準拠するのを待つとかMSにねじ込むか金払って対応してもらうとかでもいいけどw
0624デフォルトの名無しさん
垢版 |
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)とかが
呼ばれるようにするにはどうしたらいいですかね?
あるいは、ガラっとコード変わってもだいたい似たようなことを実現するとしたら
どう書きますか?
0626デフォルトの名無しさん
垢版 |
2019/10/27(日) 20:54:15.22ID:oi2VB0wA
あ、すまん。誤読していた。
>>宣言してあるfunc(A,A)とかfunc(A,B)とかfunc(B,B)とか
多態やってる意味を潰しに来てないか?
0630642
垢版 |
2019/10/27(日) 21:09:54.33ID:5FCyBaq0
>>627
func(Base,Base)だけをvirtualってこと…ですよね?
え、こういうときにもvirtualて使えるの?と思って試したけどダメですね。

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

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

それ正解かもしれません
調べつつやってみます
0634デフォルトの名無しさん
垢版 |
2019/10/27(日) 22:14:23.71ID:SYtHJPpD
派生クラスの種類が決まっているなら
variantに置き換えたらvisit使えるから簡単
0636デフォルトの名無しさん
垢版 |
2019/10/29(火) 01:15:36.46ID:Vnr+WSpj
C++でCOM扱うの苦痛すぎる
何が正攻法なのかさっぱりわからん
0638デフォルトの名無しさん
垢版 |
2019/10/29(火) 01:41:40.05ID:Vnr+WSpj
別にCOMは作るんじゃないんだよ。
参照するだけなんだよ。
それでもATLなんーーーーーーーーー?
0639デフォルトの名無しさん
垢版 |
2019/10/29(火) 01:43:16.61ID:Vnr+WSpj
そもそも文字コードどうなってるんやーーーー
コマンドプロンプトに出す時、どうするんやーー
現在のchcpの設定に従って変換線といかんのカーーーーーー
0640蟻人間 ◆T6xkBnTXz7B0
垢版 |
2019/10/29(火) 02:28:13.51ID:OOQqvLIR
変換なんてWideCharToMultiByte使って一つ変換関数作ってその関数を使い回せばいいやん。
0642デフォルトの名無しさん
垢版 |
2019/10/29(火) 04:01:15.69ID:ymnLB/52
>>640
Unicode文字列(絵文字とか)が文字化けするんだよー!
フォントの問題でないことは確認済み
0643デフォルトの名無しさん
垢版 |
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
0644デフォルトの名無しさん
垢版 |
2019/10/29(火) 04:13:15.89ID:ymnLB/52
ん?WideCharToMultiByteってShiftJISに戻すやつじゃねーのか?
俺はUnicode文字すべてを表示したいだけだぞ
0647デフォルトの名無しさん
垢版 |
2019/10/29(火) 04:29:31.79ID:YQKoC2Uo
>>646
全てではないだろうけど対応してる。

↑文字化けしそうだけど、横向きのハートとか
❤ とか
0649デフォルトの名無しさん
垢版 |
2019/10/29(火) 04:30:10.10ID:YQKoC2Uo
?????
Jane経由だとだめだろうな
0650デフォルトの名無しさん
垢版 |
2019/10/29(火) 04:31:42.98ID:YQKoC2Uo
>>645
chcp 65001にしてもムダだったぞ
0653デフォルトの名無しさん
垢版 |
2019/10/29(火) 05:14:54.35ID:YQKoC2Uo
>>652
ぐぐってからいえwww
0654デフォルトの名無しさん
垢版 |
2019/10/29(火) 05:19:50.17ID:YQKoC2Uo
なんでコードページ932なのに、NSimSunにすると
日本語以外もちゃんと表示できるのかわからない
0656デフォルトの名無しさん
垢版 |
2019/10/29(火) 05:36:55.26ID:YQKoC2Uo
Visual StudioのソースコードのデフォルトはBOM付きUTF8なんだな
0658デフォルトの名無しさん
垢版 |
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でも同様の結果でした。
0662デフォルトの名無しさん
垢版 |
2019/10/29(火) 13:58:53.43ID:cpD/FVFn
>>636
node.js
0663はちみつ餃子 ◆8X2XSCHEME
垢版 |
2019/10/29(火) 13:59:57.20ID:0JV7MfqT
>>636
マイクロソフトのコンパイラならまあまあ補助があったりするでしょ。
それでも面倒くさいことにかわりないけど。
0666デフォルトの名無しさん
垢版 |
2019/10/29(火) 18:43:54.18ID:NclFvQSb
>>663
補助なんてあったっけ?
まあ俺の知識はもう5年以上前の知識だから最近はちょっとはマシになったのかな
0667デフォルトの名無しさん
垢版 |
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が入ってるんだけど、
これは、どのハードウェアでもこうなると仕様と決まってるの?
0668デフォルトの名無しさん
垢版 |
2019/10/29(火) 22:07:48.92ID:VnX4qZP9
>>667
決まってない。
範囲外のアクセスなので、本来は絶対にやってはいけない。
読むだけでも不法例外が起きてしまう可能性もあるが、
書くのはもっとダメ。
たまたま、コンパイラシステムが何らかの目的で使っている
グローバル変数が arr 配列の直前にい配置されていて、
それが0になっているか、padding領域がたまたまそこにある
だけだと考えられる。
0670デフォルトの名無しさん
垢版 |
2019/10/30(水) 04:47:43.23ID:oMdYt0Tq
オブジェクトがスタックに作られてるかヒープに作られてるかってどうやって調べるの

具体的にはboostのmulti_arrayがどっちに作られてるか知りたい
0671デフォルトの名無しさん
垢版 |
2019/10/30(水) 06:54:34.02ID:2wpdugOW
>>668
そりゃそうか。0で埋まってりゃコードが少し短くなって助かるんだが、まあやめとこう。
0672デフォルトの名無しさん
垢版 |
2019/10/30(水) 07:31:59.85ID:yREk150+
>>670
アドレスでわかる
正しくはリンカからロケーションを取得だが
簡易的には自動変数のアドレスと上の方の桁が同じかどうかでも見当はつく
0673デフォルトの名無しさん
垢版 |
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のそれぞれはまとまった
領域のアドレスを使っているので、推定ではなく断定できる。
0676デフォルトの名無しさん
垢版 |
2019/10/30(水) 11:38:54.67ID:M6J6raPE
コンテナの場合はスタックに置いたつもりでも、コンテナがデータ部分を内部でnewするとかそういう話だろ
0677はちみつ餃子 ◆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 と同じ意味になる。

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

早い話が、スタックは、上下逆になっていることが味噌。
0684デフォルトの名無しさん
垢版 |
2019/10/30(水) 16:43:27.90ID:iACLsVPd
0 埋め勝手に期待してると
Debug build と Release build の変化ではまるんじゃね
0687デフォルトの名無しさん
垢版 |
2019/10/30(水) 19:14:52.52ID:NnKRxbK9
>>682
> そして、ヒープから確保したオブジェクトのアドレスは、必ずそれらよりも大きい。
スタックエリアとヒープエリアの前後関係なんて決まってたっけ?
0691デフォルトの名無しさん
垢版 |
2019/10/30(水) 20:46:40.08ID:7FaQcqiv
>>682
スタックとヒープのアドレスに前後関係の縛りなんかねえよ
互いに全く別個のデータ構造で相互に依存関係はない
0692デフォルトの名無しさん
垢版 |
2019/10/30(水) 21:02:17.94ID:xN/ut28D
お前ら甘いぞ
ヒープから確保したメモリをスタックにすることもできるんやで
逆にいうとスタックの情報もとれる
pthread_attr_getstackな
0705デフォルトの名無しさん
垢版 |
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 もサポートしてる実装)では保証されているとか、
保証されてないと困るという話ならそうなんだろうとは思うけど。
0706デフォルトの名無しさん
垢版 |
2019/10/31(木) 07:54:20.46ID:CWgnmwch
保証は知らんけどアドレス計算だから1じゃなくてsizeofの値じゃないのそれ
あとだめならベクタで&v[x]みたいのも未定義になっちゃうけども
0707はちみつ餃子 ◆8X2XSCHEME
垢版 |
2019/10/31(木) 12:29:41.78ID:/W+zTx1p
>>705
俺も仕様としての保証はないと思う。
C の規格を見て関連しそうな項目として

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

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

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

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

までは妥当な式と言えると思うんだけど、 (TYPE *) というキャストが出来る根拠は見つけられなかった。
0708デフォルトの名無しさん
垢版 |
2019/10/31(木) 13:00:56.65ID:Mfb82uAb
>>707
C言語の基礎として、TYPE *ptr に対し、
 ptr + k == (TYPE *)(((BYTE *)ptr) + sizeof(TYPE) * k)
は保証されているはず。
0710デフォルトの名無しさん
垢版 |
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)
0711デフォルトの名無しさん
垢版 |
2019/10/31(木) 13:43:36.78ID:hGg8JwcT
C++のヘッダファイルのクラス定義って、
privateまで定義しないといかんのが嫌だな。

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

どうにかならんのかな?
0712デフォルトの名無しさん
垢版 |
2019/10/31(木) 13:54:48.05ID:Nmr38VJU
ヘッダに描くのをやめればいい
0713デフォルトの名無しさん
垢版 |
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 は正しい。
0715デフォルトの名無しさん
垢版 |
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)
 に一致する。」
となります。
0716デフォルトの名無しさん
垢版 |
2019/10/31(木) 14:50:36.73ID:Mfb82uAb
>>691
言語仕様的には決まっていませんが、Win32で実験する場合、
最初の質問者が、答えを見つける手段としては、正しいやり方なのです。
Win32で実験してヒープからの確保なのかどうか判明してしまえば、同じ
boostのソースを他の環境で動かしても、#ifdef などで動作が変えられていない
限りは、同じ結果となるからです。
0718デフォルトの名無しさん
垢版 |
2019/10/31(木) 15:27:23.28ID:CWgnmwch
ポインタのキャストてポインタが指してるアドレスのデータの解釈だけの問題だから許されないキャストがそもそもないのでは
適切かどうかは知ったことではないが

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


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

こういうのに引っかかるバカが増えたよね。
0729デフォルトの名無しさん
垢版 |
2019/10/31(木) 19:37:56.00ID:/uM4xbrd
pimplは開発規模は関係なくて、ライブラリの公開するヘッダでユーザーに関係ないものを隠すために使わないか?
0730はちみつ餃子 ◆8X2XSCHEME
垢版 |
2019/10/31(木) 20:03:49.64ID:/W+zTx1p
>>729
それも pimpl の目的としてはあるんだけど、 >>724 が書いているように C++ だとファイルの依存関係が必要以上になることもある。
それをどうにかしたら make で差分ビルドしたときに走るタスクが少なくなるので
規模が大きいプログラムで pimpl を使うとビルドがだいぶん速くなるということはありうる。
規模が小さいと体感するほどの差が出ない。 割に合わない。
そういう意味では規模は関係ある。
0731デフォルトの名無しさん
垢版 |
2019/10/31(木) 20:09:29.87ID:jES25g+p
個人的には、自分ひとりで作ってるプログラムは、高頻度で全ビルドに
かける癖が付いてしまってる。
こうしておくと、OSをSleepモードにしていて、誤って電源を切ってしまったような
時にIDEが管理しているプロジェクトのデータファイルの何かが壊れていても
気付なかった時や、プロジェクトのバックアップ処理の時のコピー操作の何らか
の間違いで何かがおかしくなってしまったようなときに変な不具合に悩まされなく
て済む。
0732デフォルトの名無しさん
垢版 |
2019/10/31(木) 22:29:01.40ID:GkSnEle2
C++とオブジェクト指向をきちんと身につけてる人ばかりの環境ならいいんだけどね、pimpl
経験不足な人だと理解出来なさそう
0733デフォルトの名無しさん
垢版 |
2019/10/31(木) 22:54:10.87ID:/p/NkBNt
使ってるうちにインターフェースを使った典型的な奴とそう変わらない事に気付く
0737デフォルトの名無しさん
垢版 |
2019/11/01(金) 00:03:47.15ID:8rUFWNXZ
テンプレート活用のための最適化が全盛期の今 pimpl は時代遅れ。
0739デフォルトの名無しさん
垢版 |
2019/11/01(金) 00:19:47.84ID:TUcr0tQH
pimplが時代遅れというのなら、それに代わる
依存する必要がない所を断ち切る方法を提示してくれ
0740デフォルトの名無しさん
垢版 |
2019/11/01(金) 00:24:57.04ID:8rUFWNXZ
>>739
クラスの前方宣言。
テンプレートによるコンパイルエラー回避。
0743デフォルトの名無しさん
垢版 |
2019/11/01(金) 05:46:43.28ID:xzGeRMKo
pimplでも型を書くのに、何を言っているんだか
そんなに型を書くのが嫌なら、Cの不透明型でも使ってろ
0746デフォルトの名無しさん
垢版 |
2019/11/01(金) 07:17:25.47ID:luUnrp0t
privateをどうしても隠蔽したいならpimpl使うのもやむを得ないのかも知らんけど、そんな事態になったこと無いからよくわからんな
0747デフォルトの名無しさん
垢版 |
2019/11/01(金) 07:43:37.38ID:62eq0k7o
ライブラリ作る時にstd::unordered_mapとかメンバに使いたいと思わないもんなのか、よくわからんな
pimplで.cppに閉じ込めないとコンパイラやSTLのバージョン違いで壊れるんだけど
0749デフォルトの名無しさん
垢版 |
2019/11/01(金) 07:58:26.02ID:OvwU0XDV
ライセンスに書いとけば良い
・プライベートは見ないで下さい。お触り禁止。
0751デフォルトの名無しさん
垢版 |
2019/11/01(金) 08:20:42.72ID:luUnrp0t
>>747
> pimplで.cppに閉じ込めないとコンパイラやSTLのバージョン違いで壊れるんだけど
ん?どう言うこと?
なんかやり方間違えてね?
0753デフォルトの名無しさん
垢版 |
2019/11/01(金) 08:25:35.79ID:StFJ+6Yp
エディタが貧弱だったころの名残を未だに引き摺っている
仕様と実装を分離したらそれだけでファイルが倍に増えて管理が面倒になる
仕様はソースコードから逐次自動生成すればいい
なので昨今の言語はIDEに迎合していて、暗黙の大前提でIDEでの運用が見込まれている
それ単体で成り立つものでは無くなっている
0755デフォルトの名無しさん
垢版 |
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クラス使ってるところも変更になるやろ?
0756はちみつ餃子 ◆8X2XSCHEME
垢版 |
2019/11/01(金) 10:06:12.42ID:ichmHmwx
>>755
そこをわからんって言ってるやついないんだよ。
わかった上で変更になったらどんくらい問題なんや? 別にええやろ。 と言う場面の方が多いという話なんだよ。
pimpl が有用な場面があるっていう主張もわかるよ。 わかるけど、そういう場面に遭遇したことないなぁという話なんだよ。
0759デフォルトの名無しさん
垢版 |
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だとどうなる?よくよく考えよう
0761デフォルトの名無しさん
垢版 |
2019/11/01(金) 11:01:10.12ID:XsK+HhVl
privateメンバをポインタ型にする手間や不都合とpImplの手間や管理コストのどっちを取るかだろうな
基本的には継承するクラス以外のincludeは排除できる
ヘッダ内部での外部ライブラリのincludeは可能な限り避けるべき
0762はちみつ餃子 ◆8X2XSCHEME
垢版 |
2019/11/01(金) 11:10:39.87ID:ichmHmwx
>>760
オブジェクトを生成するには「大きさの情報」が必要だと覚えておくとわかりやすいと思う。
クラスの内容がわからないと大きさが確定しないから生成できないけど、ポインタの大きさはわかる。
0764デフォルトの名無しさん
垢版 |
2019/11/01(金) 13:00:57.84ID:aQLx28Zt
>>763
それお前個人がしたことないって言う経験談?
それとも他の代替手段を取るってこと?
先に言っておくと前者ならすっこんでろ
0765はちみつ餃子 ◆8X2XSCHEME
垢版 |
2019/11/01(金) 13:23:21.41ID:ichmHmwx
>>764
俺がしたことないという経験談だが、
ここで pimpl が割に合わないと出ている意見は
そういう状況があんまりないという内容だということの説明でもある。

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

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

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

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

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

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

違うけど、おまえなんかに説明してもチンパンジーに因数分解を教えるようなものだ
0796デフォルトの名無しさん
垢版 |
2019/11/02(土) 06:10:30.99ID:QFHeQDAU
std::filesystem はいいな。やっとまともに使えるものができたって感じ
C++17からって遅すぎだと思うが
0799デフォルトの名無しさん
垢版 |
2019/11/02(土) 08:48:08.81ID:E6JKa4Vv
文字コード周りの混沌ぶりに比べれば、文字列クラス乱立なぞ微々たるものよ。
0801デフォルトの名無しさん
垢版 |
2019/11/02(土) 09:27:02.38ID:s0WXD89V
>>776
それだ!
0802デフォルトの名無しさん
垢版 |
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関係無くね?
0803デフォルトの名無しさん
垢版 |
2019/11/02(土) 09:57:16.61ID:l25LSbph
ライブラリだとpimplというかvoid*にして、各種操作をc関数として公開
c++ではラップしたinterfaceクラスを提供って形だろ
実装側はc++の実装クラスにstatic_castして後はc++の世界で書く

pimplは中途半端だから使わない
0806デフォルトの名無しさん
垢版 |
2019/11/02(土) 10:12:48.91ID:l25LSbph
出来るよ
多態使いたかったらbase ptrとvoid*の相互変換をする

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

>>804
WIN32の内部において、ハンドルが単なるindexでなくポインタとして使われているという根拠は?
確かに正体がvoid*だったりするが、ポインタだとしたらOS視点では
INVALID_HANDLE_VALUE判定が
難しくなるのであった、(一般論として
0811デフォルトの名無しさん
垢版 |
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;
}
0813デフォルトの名無しさん
垢版 |
2019/11/02(土) 10:39:33.14ID:l25LSbph
void*は型情報が完全に消えるから、
型が完全に一つだとわかっているならそのままstatic_castすればいい

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

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

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

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

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

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

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

(一行でできるようにすることは他の言語で実現されてることからも明らか)
0851デフォルトの名無しさん
垢版 |
2019/11/02(土) 18:44:29.21ID:QFHeQDAU
ちなみにさっきオレオレで20行ぐらいの関数を書いて
一行で環境変数を取得できるようにしたよ。
でもこういうのは標準ライブラリで用意してあるべきもの
0854デフォルトの名無しさん
垢版 |
2019/11/02(土) 18:48:21.60ID:QFHeQDAU
>>853
俺が思ってるかどうかじゃなくて、
お前が、こういう理由で短いのがいい or だめと
"お前の意見" を書け
0856デフォルトの名無しさん
垢版 |
2019/11/02(土) 20:10:41.91ID:QFHeQDAU
ん?反対意見があるんじゃないのか?
ないんだね。

お前がなにか思ってるだけかよw
0859デフォルトの名無しさん
垢版 |
2019/11/02(土) 20:28:57.58ID:16zH/LAn
>>845
だったらはじめから「僕はこうじゃなきゃヤなんだー」って言ってくれないと何も伝わらないぞ
0860デフォルトの名無しさん
垢版 |
2019/11/02(土) 20:32:42.04ID:QFHeQDAU
はじめから言ってる

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

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

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

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

getenvでいいだろ。
未定義時のエラー処理まで自動でやってほしいのか?
0865デフォルトの名無しさん
垢版 |
2019/11/02(土) 21:01:20.92ID:dYVngRw/
> 何がそんなに気に触ったんだろう?

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

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

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

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


あと環境変数の未定義は正常な状態としてありえるのでエラーではない
細かくてすまんなw 適当な発言は気になるんだよ。
0868デフォルトの名無しさん
垢版 |
2019/11/02(土) 21:11:47.48ID:RcR6NuMm
c++の標準ライブラリにプラットフォーム抽象の機能求めるってのは筋が悪いんだよ
filesystemだって結局はposixをテンプレートの味付けで焼き直した程度でファイルの監視もできないだろ
envとか別に標準で提供されなくても何も困ってない
1行かどうかなんてさらにどうでもいい
あと標準ライブラリが提供する範囲の機能で足りてるアプリ作ってるやつは
c++以外の言語使うことを考えた方がいい
0870デフォルトの名無しさん
垢版 |
2019/11/02(土) 21:36:05.57ID:lCdDFN2K
組み込み系なんてenvどころかfilesystemとかそもそもねぇの普通な環境も多いしね
0873デフォルトの名無しさん
垢版 |
2019/11/02(土) 22:07:02.10ID:lY37zOLC
まあもともと広いレンジで使われることを目的とした言語だし
いろんな輩が入ってくるのはしゃーない。
しかしc++11以降は明らかに開発してないクソガキが増えたなという印象はある。
0875デフォルトの名無しさん
垢版 |
2019/11/02(土) 22:57:03.69ID:l25LSbph
せっかくhas_includeみたいなのも出来たのだから、環境ごとに存在しない場合機能提供されないようなものも標準化進めていったらいいんだよね
0880◆QZaw55cn4c
垢版 |
2019/11/03(日) 21:55:47.13ID:A1whpPq+
>>732
一つ教えてください、pimpl とか何べん読み返しても「利益の源泉」がわからないのですが、一つ一言で言い切っていただけませんか?
0881◆QZaw55cn4c
垢版 |
2019/11/03(日) 21:58:20.86ID:A1whpPq+
>>775
>マングリングって知ってるか?
>そもそもC++のクラスライブラリを簡単にリンク

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


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

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

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

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

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

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

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

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

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

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

目的がヘッダー依存を切ることなら必要に応じて配列サイズ増やせばいいだけ
めんどいけどassertかけてあるからミスることはない
あとpimplは中でnewされるのがいやな場合あるからそれを避けられるってのも大きいね
0904デフォルトの名無しさん
垢版 |
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を使うプログラムは再コンパイルが必要となる。
0909デフォルトの名無しさん
垢版 |
2019/11/04(月) 20:26:00.54ID:sHXph+lc
>>897
構造体データメンバのメモリ配置を正確に定義したいという目的を捨てない限り
privateなデータメンバをprivateヘッダに分けて定義できるようにしたところで
pimplが目指すような解決にはならない
ほとんど意味が無い
0910デフォルトの名無しさん
垢版 |
2019/11/04(月) 20:31:52.81ID:sHXph+lc
pimplが目指すような解決というのは筆が滑ったorz

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

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

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

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

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

まぁ実際はオーバーしないようにするんだろうけど
0937デフォルトの名無しさん
垢版 |
2019/11/05(火) 20:04:16.17ID:Rmlz0hln
>>936
pimplの説明ならこのスレで何度も出てると思うが?
それにしたいして、お前の反論は「俺はそうは思わない」という感想でしょ?

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

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

>>938
なるほどね
とにかくprivateは見せたくないって事ならそれでいいんじゃね?
俺はやりたくないけどw
0945デフォルトの名無しさん
垢版 |
2019/11/05(火) 22:48:13.18ID:5N1tjWFS
結局のところ、>>893の言う「インラインPimpl」なるものの解釈なんだよな。

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

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

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

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

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

> ちな俺はplmpl使いたいなどと書いてない、人の主張を勝手に捏造するな
使いたい「なら」な
C++の前に日本語やり直してこいw
0969デフォルトの名無しさん
垢版 |
2019/11/06(水) 08:31:26.58ID:zr2SzfAm
>>963
コンパイラが分からんけど、割り込みベクタテープルのシンボルだと思う。
タイマ1キャプチャ割り込みのハンドラを今から定義しますよ、みたいな。
0970デフォルトの名無しさん
垢版 |
2019/11/06(水) 09:33:53.63ID:GEOrtix2
サイズの違うコンテナ同士で代入を試みたらセグメンテーション違反になったんだが、リサイズしつつ代入って簡単にできないの?
0971デフォルトの名無しさん
垢版 |
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);
}
0972デフォルトの名無しさん
垢版 |
2019/11/06(水) 10:35:41.19ID:GEOrtix2
>>971
普通できるのか
boostの「STLコンテナらしく振る舞う」というある多次元配列コンテナでできなかったから一般的にできないんだと思っちゃった
スマン
0975デフォルトの名無しさん
垢版 |
2019/11/06(水) 15:11:24.10ID:BVN8Da8w
今事務職であいてる時間C++やってるんだけど、事務職に特化したライブラリとかってない?
0978デフォルトの名無しさん
垢版 |
2019/11/06(水) 18:44:11.86ID:XJugYxC8
char str[ ];
と宣言した場合、str[0] = '\0';というNULL終端をしなければなりませんが
string str[ ];
と宣言した場合は、特にNULL終端の必要性っていうのはないのでしょうか?
0980蟻人間 ◆T6xkBnTXz7B0
垢版 |
2019/11/06(水) 19:23:25.64ID:Z1hQUtYe
std::stringはstd::string::c_strメソッドを使ってアクセスするとヌル終端になることが保証されている。
0981デフォルトの名無しさん
垢版 |
2019/11/06(水) 19:45:32.35ID:o3tEvZiY
char hoge[] は char の配列
別に文字列として扱う気がなければ 0 終端は必須ではない

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

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

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

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

>>988 の言う通り string str[ ]; は string str; かも知れんけど、
いずにせよ「質問が曖昧で答えようがない」の類かと。
0996デフォルトの名無しさん
垢版 |
2019/11/07(木) 08:44:57.00ID:C1GJGInU
>>978です
明らかに自分が悪いです

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

に修正です
0997デフォルトの名無しさん
垢版 |
2019/11/07(木) 09:42:08.88ID:GEuBrdxx
無い
というか元々stringはC言語由来のゼロ終端とは違い、
「サイズ持ってんだから最後を示すデータは不要」という考え方だった
C++11からは利便性のためにゼロ終端が保証されてるけどユーザーが何かする必要はない
0998デフォルトの名無しさん
垢版 |
2019/11/07(木) 09:51:34.14ID:GEuBrdxx
初心者ぽいから説明が悪かったかもしれん
クラスが内部でやってくれることなので特に何かする必要はない
けど、内部データを直接書き換えたりするとおかしなことになるので注意
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
レス数が1000を超えています。これ以上書き込みはできません。

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