X



C++相談室 part142
レス数が1000を超えています。これ以上書き込みはできません。
0001デフォルトの名無しさん
垢版 |
2019/04/01(月) 22:17:05.84ID:wmfpIKt/
次スレを立てる時は本文の1行目に以下を追加して下さい。
!extend:on:vvvvv:1000:512

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

前スレ
C++相談室 part137 (正しくはpart138)
http://mevius.5ch.net/test/read.cgi/tech/1535353320/
C++相談室 part139
https://mevius.5ch.net/test/read.cgi/tech/1538755188/
C++相談室 part140
https://mevius.5ch.net/test/read.cgi/tech/1547326582/
C++相談室 part141
https://mevius.5ch.net/test/read.cgi/tech/1550772463/

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

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

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

----- テンプレ ここまで -----
-
VIPQ2_EXTDAT: default:vvvvv:1000:512:----: EXT was configured
0002デフォルトの名無しさん
垢版 |
2019/04/01(月) 22:24:49.84ID:2cPHsZN4
すっぱい葡萄
ttps://ja.wikipedia.org/wiki/%E3%81%99%E3%81%A3%E3%81%B1%E3%81%84%E8%91%A1%E8%90%84
 自分のものにしたくてたまらないにもかかわらず、努力しても到底かなわない対象である場合、
 人はその対象を「価値の無いもの」「自分にふさわしくないもの」と見なそうとし、
 それをあきらめの理由として納得し、心の平安を得ようとするものである。
 フロイトの心理学では、これを防衛機制および合理化の例とする。また、社会心理学においては、認知的不協和の例とされる。
 英語には、この寓話を元に生まれた熟語として "sour grapes" があるが、これは「負け惜しみ」を意味する。
0007デフォルトの名無しさん
垢版 |
2019/04/02(火) 18:51:10.44ID:m0eX+8Q8
>>4
オブジェクト指向の何たるかをきちんと理解していれば、概念として使えなくはない。
もっとも、C 言語に限った話ではないけど。
0008デフォルトの名無しさん
垢版 |
2019/04/02(火) 19:17:21.52ID:LpV8NoZ4
>>4
原則、C言語ではclassは使えない。
そもそも、CをOOPの概念に対応させようとして、
classの概念(classというキーワードも)を追加したところから
始まったのがC++。
0010デフォルトの名無しさん
垢版 |
2019/04/03(水) 00:40:39.45ID:94cMasUZ
>>4
Win32API?
C++以前から(純粋OOPLな)smalltalk的な価値観をC言語に押し付けた結果。
0014デフォルトの名無しさん
垢版 |
2019/04/03(水) 21:15:34.88ID:2lV8d+D6
次スレから>>2に登場人物を列挙してはどうでしょうか?
0016デフォルトの名無しさん
垢版 |
2019/04/04(木) 01:26:19.69ID:NSLfK+j2
C++erはVS毛嫌いする人も多いけどVS2017あたりからC++対応もマジでかなり良くなってる
0017デフォルトの名無しさん
垢版 |
2019/04/04(木) 01:29:18.48ID:MCx08DTu
一番使えるIDEなのに毛嫌いする人はいないと思います。
0019デフォルトの名無しさん
垢版 |
2019/04/04(木) 01:33:38.34ID:MCx08DTu
4/2を選んだのはエイプリルフールを避けたからかな。
0020デフォルトの名無しさん
垢版 |
2019/04/04(木) 01:40:18.27ID:l5IgkZnr
>>16
そう言う輩はプログラマーではなく言語オタか、最新規格対応の入門書売って糧を得てる様な奴だけ。
0021デフォルトの名無しさん
垢版 |
2019/04/04(木) 01:46:00.78ID:tIFeeQbc
最近はCMakeに優しいけど標準的なビルドシステムに優しくない
clのオプションが独特すぎる
Linuxで動かない
Windows上でのライブラリの取り回しが悪すぎる

wslやらvcpkgでだいぶましになったとはいえまだ若干抵抗がある
0022デフォルトの名無しさん
垢版 |
2019/04/04(木) 01:48:02.16ID:c6BVWPCA
VS2017以前よりもコンパイルが速くなっている気がする。
色々細かい不満は出てくるかもしれないが、完全に乗り換える価値は十分ある。
私はVS2017をアンインストールして退路を断った。
002322
垢版 |
2019/04/04(木) 01:55:45.14ID:c6BVWPCA
わかりにくかったので訂正。
VS2019はVS2017よりもコンパイルが速くなっている気がする。
デフォルトでスタックメモリ消費の静的解析をしてくれるので、
10KB以上のバッファをスタックからとるクセのある人は、
C++のstd::vectorなどへの置き換えを考える良い手助けになるなのでは。
0026デフォルトの名無しさん
垢版 |
2019/04/04(木) 20:38:54.64ID:O7o9gYjG
つか、プラットホームに依存しないような
プログラミングをかける奴なんてほとんどいないだろ

素人が書いたようなおもちゃをなんで他に移植しなきゃいけないんだよ
0027デフォルトの名無しさん
垢版 |
2019/04/05(金) 00:33:23.07ID:Zwa/Lf0S
hppファイルに実装を書いてることがたまにあって、すごく違和感があるんですけどどういうメリットがあるんですかね?
0028デフォルトの名無しさん
垢版 |
2019/04/05(金) 00:43:12.95ID:fDyBpfV8
配布が容易
宣言と定義が分かれないから読みやすい(人による
宣言と定義が分かれないからリンケージとかの罠にはまりづらい(場合によってはむしろODRの罠にはまる
翻訳単位が大量にある状況ではヘッダに実装したうえで少数のcppからインクルードした方がコンパイル速い
テンプレートの場合はほぼそうせざるを得ない

などなど・・・
0029デフォルトの名無しさん
垢版 |
2019/04/05(金) 00:49:55.23ID:1W3Y/f1q
そもそもhppファイルは実装書くためのファイルじゃないの?
templateとかで、分割コンパイルできない場合の
0030デフォルトの名無しさん
垢版 |
2019/04/05(金) 00:54:41.98ID:yOtZbpQl
もしかしてhppをhとcppの間の子みたいに思ってる?
Cのヘッダと区別するためにhppにしてる人がいるだけでただのヘッダ拡張子だぞ
VCだとヘッダはhになるけど
0032デフォルトの名無しさん
垢版 |
2019/04/05(金) 02:32:36.17ID:5WucuzOp
流儀なんか10年もしたらガラっとかわるから拡張子なんか好きにやれ
c++ではじめの頃の昔はたまにソースを .c++ で書いてるやつもいた
0033デフォルトの名無しさん
垢版 |
2019/04/05(金) 02:42:38.39ID:qwUluuCg
ファイルパスにプラス記号使うのは、文字コード自動判定でUTF-7と誤認されやすくなるからさけたほうがいいね。
0038デフォルトの名無しさん
垢版 |
2019/04/05(金) 14:59:43.19ID:8pIebtc7
>>34
ほう、すごいね、そんな方法があったんだ。
これなら、enumの定義から自動的にunorderd_mapに登録して逆変換テーブルを作るとかもできるかもね。
0040デフォルトの名無しさん
垢版 |
2019/04/05(金) 20:58:14.82ID:Qo5/2ixY
.hは宣言だけ、.hppは実装ありって使い分けてたこともあったけどやめた
includeする方はそんなの知ったこっちゃないし、いちいちhかhppか判断させられるのが無駄だとわかった
0041 ◆QZaw55cn4c
垢版 |
2019/04/05(金) 21:25:06.14ID:sL+JrEGq
>>40
>hppは実装あり
それは悪手なのでは?
0042デフォルトの名無しさん
垢版 |
2019/04/05(金) 21:28:37.12ID:Qo5/2ixY
別に全部入りって意味じゃないよ
テンプレートとかinlineとか、処理の実装も書いてますよーっていうこと
0043デフォルトの名無しさん
垢版 |
2019/04/05(金) 21:42:34.57ID:Axh2Vo9Q
暗黙の了解でもそんなのないだろ
hppなら少なくともC言語ではないというくらいしかない
0045デフォルトの名無しさん
垢版 |
2019/04/05(金) 22:12:58.31ID:Qo5/2ixY
だから意味ないからやめたって言ってるじゃん
意味ないし有害だよやめた方がいいよ
0056デフォルトの名無しさん
垢版 |
2019/04/06(土) 01:27:27.25ID:XiUalYkv
速くてコンパクトなソフト作るのに最適だろ。
慣れてりゃ開発速度も同じようなのLLで作るのと大差ないし
0057デフォルトの名無しさん
垢版 |
2019/04/06(土) 01:41:14.78ID:zp0ZZwhH
言語によって作業量が増えるとか無いから
目的に合ったフレームワークがあるかどうかが重要
0060デフォルトの名無しさん
垢版 |
2019/04/06(土) 02:02:09.95ID:K6S/+wtb
どうせお前らなんて、数十行程度の小さなもばっか書いて、あーでもないこーでもない言ってるだけだろ

会社にもいるわ、細かいことばっか、正論言って
実際の仕事では何にもできない、言語規格ヲタ
0065デフォルトの名無しさん
垢版 |
2019/04/06(土) 07:57:21.33ID:/WRt9p3o
ドワンゴでコード書いてて江添みたいなバカに
しょうもないアドバイスされたらそらキレるだろうな。
0066デフォルトの名無しさん
垢版 |
2019/04/06(土) 08:47:14.06ID:dOsEQJqb
あの手の連中って小さなサンプルしか書いたことないんだろ
実際の数百万行あるようなプロジェクトなんかには
参加したことないんだろうな
0067デフォルトの名無しさん
垢版 |
2019/04/06(土) 09:02:21.08ID:jpD7ojAE
弁理士みたいなもんだろ。
自分じゃモノ作らないけど複雑なルールに精通してて「それじゃ通らないよ」とアドバイスする。
0072デフォルトの名無しさん
垢版 |
2019/04/06(土) 11:11:25.61ID:dOsEQJqb
>>67
作らないじゃなくて、作れないんだろ
標準ライブラリの使い方を示す小さなものは作れるけど、現実的に使用するアプリケーションはかけないんだろう
0077デフォルトの名無しさん
垢版 |
2019/04/06(土) 11:47:11.69ID:XiUalYkv
どうせその数百万行のコードで意味があるのは数万行から十数万行とかだろ

後は無駄なコピペやら、標準ライブラリにある機能を知らずに毎度一から書いて水増しされた無意味どころか保守考えたら害悪にしかならんくその塊
0079デフォルトの名無しさん
垢版 |
2019/04/06(土) 12:45:48.78ID:zp0ZZwhH
どうせ納期に追われて妥協に妥協を加えたやっつけのコードを○行書きましたwとか言われても自慢にもならん
0080デフォルトの名無しさん
垢版 |
2019/04/06(土) 12:59:26.47ID:zp0ZZwhH
>>78
ダメだぞ
弁護士は立法の経験が無いとダメだしスポーツの評論家は一流アスリートじゃないとダメだし調理器具を作る人は繁盛してるレストランで勤務したことがないとダメw
ライブラリ開発や教材の執筆には数百万行のシステム開発と組み込みの経験が無いとダメw
ちなみに数百万行のシステム開発や組み込みの経験があると自動的にライブラリ開発者や教材の執筆者より現実を知ってる格上()だし現場のニーズを満たした理想のライブラリを作れるようになるぞ
0081デフォルトの名無しさん
垢版 |
2019/04/06(土) 13:01:20.04ID:dOsEQJqb
ビャーネなんて、ロクなの作ってないよなw
数十行程度のものをあーでもないこーでもない言ってるだけだろ
0082デフォルトの名無しさん
垢版 |
2019/04/06(土) 13:04:46.19ID:zp0ZZwhH
せやなw
建築物の工法の研究者なんかろくに家も建てたこともない雑魚w
ネイルガンの一つも使えないくせに机上でああでもないこうでもないって言ってるだけw
0084デフォルトの名無しさん
垢版 |
2019/04/06(土) 14:25:22.19ID:HZH6vgE1
STLの美しさは時代を超越してるし、オーパーツに認定してもいいのではないか。
0086デフォルトの名無しさん
垢版 |
2019/04/06(土) 15:56:35.00ID:DWbJNRMu
ラムダ式使えない馬鹿「今まで書いたソースの行数は?」
そんなの気にしねえwwws
0087デフォルトの名無しさん
垢版 |
2019/04/06(土) 16:00:55.76ID:grJD5FiV
なるほどラムダ式が嫌いな奴は書く行数が減ってコードの生産量()が減るのが嫌なんだな
ボイラープレートコードを書き殴ってれば仕事したフリができる人たちは気楽っすなあ
0088デフォルトの名無しさん
垢版 |
2019/04/06(土) 16:07:07.88ID:/WRt9p3o
まあ実際クヌースなんかもtexプログラム作ってプログラムの大変さに気づいた
的なことは言っているしな。
偉い人でもその辺実際に作ってみると感覚が違うってのはあるんだろう
0089デフォルトの名無しさん
垢版 |
2019/04/06(土) 16:49:06.59ID:HZH6vgE1
コンセプト来い。
コンセプトはよう来い。
0092デフォルトの名無しさん
垢版 |
2019/04/06(土) 19:26:54.62ID:/WRt9p3o
クソライブラリやクソ開発メソッドを持ち込む怪しいコンサルと一緒なんだよな。
それが押し通ることが結構あるから怖い世の中なんだが。
0095デフォルトの名無しさん
垢版 |
2019/04/07(日) 02:59:31.42ID:KMX3xd+u
コードを書くしか能が無いというのでは
業界に名が通った有名人クラスにならない限り
コンサルに勝つのは難しい
0096デフォルトの名無しさん
垢版 |
2019/04/07(日) 09:59:23.22ID:AvqFg232
>>88
それソースある?
TeXの前にも色々プログラム書いてるみたいだし、そもそも大学で俺ならもぅとうまくやれるとアセンブラとコンパイラを書き換える決心したらしいからTeXでどうのこうの言うのはちょっと考えづらい
あとTeX自体は今の基準だとそんなにでかく無い
ソースは24ks程度で半分以上はweave出処理される解説だし
0099デフォルトの名無しさん
垢版 |
2019/04/07(日) 16:36:39.64ID:Uqhse/UH
>>98
自分は知らないからソースくれとだけ言えばいいところを、想像で要らんことをいうから反論されるのでは?
0108デフォルトの名無しさん
垢版 |
2019/04/07(日) 20:29:30.34ID:OFkYw0l7
>>105
rustぐらいですかね?
全然違うパラダイムの言語で作れないもんかと
アセンブラとの相性考えたら結局cっぽい言語しか選択肢ないのかな
0109デフォルトの名無しさん
垢版 |
2019/04/07(日) 21:29:30.01ID:NOCaxMAw
OSつったって、どのレベルのこと言ってるかによってかわるしな
電源ONから自分でブートして起動できるレベルのものいってるならC+アセンブラ一択だし
ブラウザで仮想環境動けばいいぐらいなら、まあいろいろ変な言語系の実験できるけど
それ実際的な意味あるの?っていう話になってくるし・・
というわけでブラウザで C++ の実行環境を動かしてみるっていうのはどうだろう?
emscripten のオルタネートみたいな・・
0111デフォルトの名無しさん
垢版 |
2019/04/07(日) 22:14:49.77ID:AvqFg232
>>110
> TeXの前にも色々プログラム書いてる
> 大学で俺ならもぅとうまくやれるとアセンブラとコンパイラを書き換える決心した
> あとTeX自体は今の基準だとそんなにでかく無い
> ソースは24ks程度で半分以上はweave出処理される解説だし
の中に事実でない箇所あるの?
0113デフォルトの名無しさん
垢版 |
2019/04/07(日) 23:51:05.57ID:WwvhmWfk
ソース出せと言った人が、ソースが出てきたら、ソース出すのは反則と言い出したって流れかな。
0118デフォルトの名無しさん
垢版 |
2019/04/08(月) 13:16:50.24ID:/rKIWzXZ
>>109
ブラウザの仮想環境とは何?
osなのでcpuが見えてて欲しいのだけど
ひとまずqemuで始めるつもりです
0119デフォルトの名無しさん
垢版 |
2019/04/08(月) 14:17:17.10ID:B03nMGGM
ビャーネストロヴストルップ先生のプログラミング入門買ったんだけど、読破した人っている?
0120デフォルトの名無しさん
垢版 |
2019/04/08(月) 14:40:49.88ID:yFytPSzO
いないんじゃあないの
本当に読破したと言える人間は日本人で20人しかいないと聞いた
0124デフォルトの名無しさん
垢版 |
2019/04/08(月) 19:33:22.28ID:RJuwHc+q
ストラウストラップの『プログラミング入門』って
日本語版で1100ページもあるんか。

このとっつぁん、厚い本を書きまくっとるなぁ。
そもそもプログラミング入門のお題でそんなに語るネタあるんか。
0126124
垢版 |
2019/04/09(火) 17:49:07.46ID:ZAJK3xJP
>>119
なんか『C++によるプログラミングの原則と実践』て本が
同じ原書の新版の和訳みたいだけど。
おまけに『ストラウストラップのプログラミング入門』よりお安い。
0129デフォルトの名無しさん
垢版 |
2019/04/10(水) 01:02:13.57ID:On8YhqHc
上級者の評価が高い入門書ってのは本質や精神を理解し免許皆伝まで至るような道の第一歩であるものだもの
素人が何も理解しないままこうすればこうなるでおいしいとこだけいきなり得ようとするようなハウツー本とは違う
0132デフォルトの名無しさん
垢版 |
2019/04/10(水) 11:09:30.74ID:dQX53bJY
同価格帯のXeonとThreadripperではどっちの方がコンパイル速いか知ってる人いますか?
0134デフォルトの名無しさん
垢版 |
2019/04/10(水) 11:25:06.35ID:dQX53bJY
それかCかC++のソースコードのコンパイルのベンチマークをCPU別で取っているサイトがあれば教えてほしいです
0135デフォルトの名無しさん
垢版 |
2019/04/10(水) 19:23:50.56ID:xcPdAU38
effective c++読めるくらいになればまあその先に薦める本や文献なんかは結構あるが、
そこまでにどういう本勧めればいいかは相当難しい。
とりあえずcからとか言いたいとこだがそれからeffective c++までの間に読む本としては何が良いのだろうか。
0140 ◆QZaw55cn4c
垢版 |
2019/04/10(水) 23:38:55.47ID:57hoitEO
>>135
独習→acceleratedとプレC++11STL(ハーバードシルト)→テンプレート本、くらいを私は歩いてきました…
0141デフォルトの名無しさん
垢版 |
2019/04/11(木) 00:09:23.85ID:SMdbPkuM
>>135
どの言語でも、言語を学ぶ順番は、
1. 入門書
2. Effective 何々
3. 逆引き・レシピ本
4. (必要なら) メタプログラミング

Ruby なら、
1. たのしいRuby 第6版
2. Effective Ruby
3. 改訂2版 Ruby逆引きハンドブック
4. メタプログラミング Ruby 第2版

先にRuby で、1〜3 を読んだ方が早いかも

もちろん他の言語でも良いけど、
プログラミング全般は、Rubyで学ぶのが、正確で紛れがないし、詳しい本が揃っている
0145デフォルトの名無しさん
垢版 |
2019/04/11(木) 00:47:54.22ID:XplD4nHz
少なくともeffective系統読んでもわけわからんレベルの人はまずはしっかりした本を読むべきと思う。
しかしc++は勧めたい本がない。。「独習c++」かな。。いいとは言いずらいがしかしほかに勧めたい本もない。
0146デフォルトの名無しさん
垢版 |
2019/04/11(木) 01:24:17.64ID:GbgLM3aJ
ネットさえありゃ本なんかいらんだろアホ、と思っていた時期が俺にもありました
実際ちょっと前まではそんな感じだったんだけど、最近は Google のアルゴリズムがポンコツなのか
それの裏をかく技がものすごく洗練されたからなのかしらんが、とにかく検索上位にアホみたいな
ページがひっかかる事が多い上に、ほんとうに必要な情報が見つからないことが多い
特に最近では Python 関係のネット情報はほんとどうしょうもなくぐらい腐ってるな
C++ 関係はまだかなりましな感じだが
0147141
垢版 |
2019/04/11(木) 02:06:27.08ID:SMdbPkuM
外人が書いた「Effective 何々」には、良い本が多い

「Rubyのしくみ」も良い。
RubyVM(仮想マシン)の内部の仕組みがどうなっているのか、など

コンパイラ・インタープリタを作る人は、読んでおいた方がよい

C++ の場合「1. 入門書、2. Effective 何々」の間隔が大きい

つまり、仕様が複雑すぎるから、入門書の範囲が大きすぎる!
独習1冊で、Rubyの1〜3 まで軽く読める

常識的には、C++ の本を読めるレベルは、Rubyなど数言語をやった後の話。
とてもじゃないが、素人がやるような言語じゃない!

素人は、細かい仕様の話よりも、
まず、Ruby on Rails などのフレームワークなどで、アプリが動くまでの全体の構造・工程を学ぶのが先

各部分の細かい仕様・バグは、後でよい。
そうしないと、バグってばかりで何も作れない
0148デフォルトの名無しさん
垢版 |
2019/04/11(木) 03:36:50.02ID:Fl8qN29n
ネットで学ぶのがアホってドワンゴ社員のあいつの主張繰り返すのかよ
誰が仕様書読むんだあほ
0151デフォルトの名無しさん
垢版 |
2019/04/11(木) 06:54:46.28ID:QTZ5s2CM
>>146
例の医療関係のページビュー稼ぎ対策の影響で個人が細々とやってる良質なサイトが引っ掛かりにくくなってる
って新聞に書いてあったな
0155デフォルトの名無しさん
垢版 |
2019/04/11(木) 18:46:33.30ID:Ukf06xgg
cpprefjp一択。
0165 ◆QZaw55cn4c
垢版 |
2019/04/11(木) 20:40:05.89ID:mnND5pqz
>>145
独習の後は同じくハーバートシルトの stl 本(ただしC++11じゃない) でしょうけれども…
0166デフォルトの名無しさん
垢版 |
2019/04/11(木) 21:41:21.15ID:Ukf06xgg
【小説】ストリームの悪魔
0167デフォルトの名無しさん
垢版 |
2019/04/11(木) 21:42:54.19ID:Ukf06xgg
>>157
でも、C++17だと圏外かも。
0168デフォルトの名無しさん
垢版 |
2019/04/11(木) 21:49:17.62ID:Ukf06xgg
C++の人気はだいたいWindowsと同期してて、XPで盛り上がり、その後下降して、Windows10発売後ちょっと盛り上がり、その後下降し始め、WSLでまたちょっと盛り上がり、みたいな感じで上下する。
0176デフォルトの名無しさん
垢版 |
2019/04/12(金) 00:33:29.09ID:Oce6Eotz
C++ coding standards が、入門書と effective C++の間という感じで良かったのですが、今新品で買いやすい和書の中で同じくらい良い本ありますか
0179デフォルトの名無しさん
垢版 |
2019/04/12(金) 09:37:34.83ID:uO4ZqrOg
コード書くために勉強したことが無い人間とコード書くために勉強した人間に分かれるな
0182デフォルトの名無しさん
垢版 |
2019/04/12(金) 13:56:50.34ID:phN3RSne
そこでレポート プログラム ジェネレータを思い出さないと
文句はユニシスに言っとくれ
0183デフォルトの名無しさん
垢版 |
2019/04/12(金) 16:07:32.84ID:JVT+o1/N
RPGなつかしいなw
知人でそれの専門で仕事やってるやついたが
今ごろどうしているだろうか・・
0184デフォルトの名無しさん
垢版 |
2019/04/12(金) 16:19:27.39ID:lUKpExyl
>>180
自分が具体的に何を作るのか見えていないとか、自分が何が分からないかがわかっていないとか。
0187デフォルトの名無しさん
垢版 |
2019/04/12(金) 22:35:09.99ID:20VLO3ye
これもSFINAE???

int plus(int a,int b){return a + b;}
double plus(double a,double b){return a + b;}

int main( int argc, char *argv[] )
{
double c = plus(1.0,2.0);
return 0;
}
0189デフォルトの名無しさん
垢版 |
2019/04/12(金) 23:50:14.00ID:WMCXK/Zp
それは関数のオーバーロード(オーバーロード関数)
SFINAEはテンプレートに関わる話
0190デフォルトの名無しさん
垢版 |
2019/04/12(金) 23:55:37.58ID:yQNXRLnI
SFINAE ていう単語みるたびになぜか
ソフバンの白犬が低い声で「スフィ姉ーーー」て言ってる映像が頭にうかぶ
0191デフォルトの名無しさん
垢版 |
2019/04/13(土) 00:08:44.65ID:pAXxDbKI
>>188
最初のplusで失敗して、次のオーバーロードを探しに行ってんじゃん。
もし最初でコンパイルエラーなら、このプログラムはコンパイルされないが、SFINAEのおかげでコンパイルエラーが出ない
0192デフォルトの名無しさん
垢版 |
2019/04/13(土) 00:43:18.21ID:2fZ9oexv
>>186
自分の興味のあることをやっていたら気づいたらコードが書けるようになっていた人と
コードを書けるようになることを目標に勉強をした人
前者は入門の仕方を聞かれると上手く答えられない傾向にある
とりあえず好きなもの作ってみて困ったらリファレンスとかみれば良いんじゃないの?とかは割とガチで言ってる
0194デフォルトの名無しさん
垢版 |
2019/04/13(土) 02:30:55.25ID:ExcsBrHj
rvalue・lvalueの見分け方について、=の左に書けないならrvalueって考えで良いですかね?
0195デフォルトの名無しさん
垢版 |
2019/04/13(土) 07:01:49.87ID:bq5Y4VLb
>>194 確かダメじゃないかな。
C の例でアレだけど、配列名 int a[5]; の a は
左辺値だけど代入の左辺に置けない、
「代入不可能な左辺値」というカテゴリになる。

『プログラミング言語C++』第4版 §6.4.1 (p. 175)の図によると
左辺値 lvalue は「アイデンティティを持ち、ムーブ不可能」
右辺値 rvalue は「(アイデンティティの有無によらず)ムーブ可能」

…ムーブできるか出来ないかの判断を、左辺値か右辺値か見分けることで
やろうとしてるなら、この説明は循環論法でしかないけどね。
0196デフォルトの名無しさん
垢版 |
2019/04/13(土) 08:07:08.65ID:odoOG67D
その場で(1つの文の中で)ムーブされ得るやつが右辺値、ぐらいで良いのでは、
と言いたいところだが
 SomeType a = b = 1;
でbあ右辺値なのかと言われるとうーん…
実際bがその場で所有権を失うこともできる(SomeTypeにムーブコンストラが定義されていた場合
のだから当たらずしも遠からずだとは思うが知らん
0197デフォルトの名無しさん
垢版 |
2019/04/13(土) 09:00:05.96ID:TufrjDxL
てかリファレンスだけ必要な奴はここにそういうことを聞きには来ないだろ。
なんかその辺の感覚がすでにずれてるように思うが。
0198デフォルトの名無しさん
垢版 |
2019/04/13(土) 09:09:41.91ID:TufrjDxL
>>195
「代入できない」って視点で言えば194で合ってるんでは?
確かに a[0] =5 なんかはできるけど、 a = b みたいにポインタそのものは代入できないわけだし。
0200L
垢版 |
2019/04/13(土) 11:50:51.08ID:U0TmzhoK
全く関係ない話になるけど、JNI = Java Native Interface(?) なるものを使えば、
C++で OS 非依存のアプリが作れるんだね。多分。
C++からJavaの任意のメソッドを呼び出せるし、逆も可能なので、
グラフィックをJavaに描かせて、キーやマウスのイベントをJavaからC++に
伝達すればよさそう。すると、LinuxやAndroidで共通に動くC++アプリ(?)
が出来てしまう。wasmも必要ない。
0202デフォルトの名無しさん
垢版 |
2019/04/13(土) 15:20:25.21ID:U0TmzhoK
スマン。CPU毎にバイナリは必要で、
clangに -macrh=xxx-xxx-xxx オプションを指定して CPUやOSを
指定してコンパイルしておくことを想定していた。
ただし、複数のCPU/OS向けのバイナリを1つのAPKにパッケージして、
使用時に自動選択する事が出来るらしい。
0203デフォルトの名無しさん
垢版 |
2019/04/13(土) 15:31:06.15ID:pwnjfljv
わざわざjavaを使わなきゃいけないのが気にくわない
その場合、javaだけで書くこと以上のメリットある?
0206デフォルトの名無しさん
垢版 |
2019/04/13(土) 15:36:48.83ID:U0TmzhoK
Androidアプリは、Javaで書くのが基本とされてるけど、
Chromeブラウザなんかはきっと、C++で書いたものを ARMなどの
CPU向けのnative binaryに直し、それをAPKにパッケージ化して
配布してるのではなかろうか? AmazonのFire7 や Fire HD 8 などの
タブレットのCPUはどちらもARMらしい。スマホもARMが多いのかな。
0207デフォルトの名無しさん
垢版 |
2019/04/13(土) 15:38:37.67ID:U0TmzhoK
>>205
基本的な描画系と入力系をライブラリ化しておけば、メインロジック部分は
C++で書けると思うよ。
0208デフォルトの名無しさん
垢版 |
2019/04/13(土) 15:42:52.17ID:U0TmzhoK
さっき、AdoptOpenJDK なるものをインストールしてみたら、
java と javac コマンドが起動することを確認した。
多分このJDKは、Oracle フリーで無料でクローズド商用利用できると思う。
0209デフォルトの名無しさん
垢版 |
2019/04/13(土) 15:46:26.77ID:MSTjQ8pp
jniはjavaのプラットフォームにc++での開発成果物を持ち込むためのもので、そうでないならわざわざそんなもの使う意味は薄い

マルチプラットフォームなアプリを作りたいならQtなりwxなりを使った方が速いし楽
0210デフォルトの名無しさん
垢版 |
2019/04/13(土) 15:47:10.35ID:Uq+8Y9kK
>>208
でもいつ訴えられるかわからないから怖いですう。
0211デフォルトの名無しさん
垢版 |
2019/04/13(土) 15:58:39.59ID:U0TmzhoK
そもそも、Androidアプリにとってのシステムコール(API)とは、Javaの関数だと
思うので、この構造自体は Android における「最も高速なアプリ」になっている
と思う。
0212デフォルトの名無しさん
垢版 |
2019/04/13(土) 15:59:50.41ID:U0TmzhoK
>>210
一般アプリ作者は大丈夫だと思うな。一番危ないのは、オイラみたいに、
ToolKit作って儲けようなんて思ってる人なのさ。(^_^;)
0214デフォルトの名無しさん
垢版 |
2019/04/13(土) 16:14:38.06ID:MSTjQ8pp
糞デカイ上に更新面倒なjavaのruntime入れさせるほうが害悪だろ

flashより糞度が高い
0215デフォルトの名無しさん
垢版 |
2019/04/13(土) 16:22:55.04ID:U0TmzhoK
AndroidはJREはプリインストール済みなんじゃないの?
オイラは実機持ってないので全く分からないんだな。
0216デフォルトの名無しさん
垢版 |
2019/04/13(土) 16:32:58.01ID:MSTjQ8pp
androidで実質c++でのアプリ開発する仕組みなら既にある
jniそのまま使うよりは大分マシ
0222デフォルトの名無しさん
垢版 |
2019/04/13(土) 19:21:24.16ID:mZFqlfzi
vector に格納されてる値から添え字の番号を取得するための最も手軽な方法はなんでしょうか

イテレータから添え字番号を取得することはできますが、あくまで値からやりたいです
0223デフォルトの名無しさん
垢版 |
2019/04/13(土) 19:26:24.27ID:ujTcdvrD
格納してる値にインデックスの手がかりがないんだったら
findで探して結果のイテレータから取得するしかないな
0225デフォルトの名無しさん
垢版 |
2019/04/13(土) 19:31:01.29ID:mZFqlfzi
>>223-224
ありがとうございます
格納する値の範囲もサイズも小さいvectorなので、今回は辞書を作って対応しようと思います
0228デフォルトの名無しさん
垢版 |
2019/04/14(日) 01:05:39.34ID:dZAE6IVm
そら奇遇ですな。
0229 ◆QZaw55cn4c
垢版 |
2019/04/14(日) 06:41:11.16ID:AVvjfIV7
>>200
とても興味を覚えました
私は、そろそろ言語間でライブラリも共用されるべきだと考えています
一つの記述体で各言語共通というのはさすがに難しいにせよ、
Java のライブラリと同等なもの(名前と機能が共通のもの)が C++ にもあってもいいんじゃないか?と数年前から妄想しています…
0231デフォルトの名無しさん
垢版 |
2019/04/14(日) 07:42:20.38ID:YohaqxbG
JavaとC++に共通インターフェースを作るのは反対。
車輪の再発明にしかならない。自由を奪うだけの愚策。
0232 ◆QZaw55cn4c
垢版 |
2019/04/14(日) 07:51:31.17ID:AVvjfIV7
>>231
強要するのではなく、オプション(選択肢)として提供するのはどうでしょうか?
0233デフォルトの名無しさん
垢版 |
2019/04/14(日) 08:04:00.89ID:YohaqxbG
>>232
共通ライブラリを使う側にとってはオプションであることは当然。
共通ライブラリを作る側の話をすべき。共通ライブラリの規格決定権者が増えすぎること自体が好ましくない。
これはEU諸国がトルコがEU参加することを拒否する感覚に近い。
0234 ◆QZaw55cn4c
垢版 |
2019/04/14(日) 08:50:47.24ID:AVvjfIV7
>>233
私は EU には否定的(グローバリストの巣窟であり、普通選挙/自由選挙による合意形成をスキップするポジションを作って人を操作するからくり、トルコもたぶん目が覚めているのでは?)ですが、それはさておき、
すでにある java/classpath スケルトンを真似してしまおう、という低姿勢・低いプライドを貫くのであれば、規格策定者は基本要らなくなりませんか?だって真似するだけだし…
0236デフォルトの名無しさん
垢版 |
2019/04/14(日) 09:09:36.38ID:YohaqxbG
まずは、Javaと瓜二つな C#、.NET、C++/CLIが今どうなっているか考えてみては。
0237L
垢版 |
2019/04/14(日) 09:28:45.12ID:Y1IcINvd
>>229
ちょっと話しはズレるけど、あなたの賛同で嬉しくなったので、入手した耳寄りな
情報を書いておこうと思う。既に知ってる人も当然いると思うけど、
WebAssemblyで作ったようなWebAppliは、ブラウザのURL欄やタイトルバーなどが
表示されてしまうのが難点として残っていた。ところがなぜかElectronでは消せて
いたのでChromeではなくChromiumを使っているからかと思っていた。
ところが、manifest.json なるものを書いて、HTMLにそのファイルを使うように
書いておいて、display プロパティーを standalone やfullscreen にすると、
URL欄が消せるらしい。
0238 ◆QZaw55cn4c
垢版 |
2019/04/14(日) 09:41:42.35ID:AVvjfIV7
>>237
もう時代はすっかり html/css/js ですね…
VSCode も Electron ですし…
0239デフォルトの名無しさん
垢版 |
2019/04/14(日) 10:28:52.88ID:k2b6YaL9
質問を変えてみよう。
C++11やC++14のコードは、職場で取り入れられてますか。
0240デフォルトの名無しさん
垢版 |
2019/04/14(日) 11:49:20.77ID:q+cUY/8y
>>239
ガンガン取りいれてるよ。

なにげにでかいのが日本語識別子の保証。適切に使うと可読性が笑っちゃうくらい上がるw
ヘッダーのプロトタイプ宣言とかが特におすすめかな。

あとchar16_t/char32_tも結構ありがたい。WindowsとUNIX系のOS間で同じ文字コードとして共通で使える型が以前はなかったからね。
20でようやく入るみたいだが、なぜchar8_tを入れかったのか(´・ω・`)

std::initializer_listもかなり便利。型安全で個数も分かる上に、引数の一番後ろじゃなくてもいいので、cの...と違って気軽に使える。

あとよく使うのは範囲for文と、イテレータの簡略化かな。いくつかの演算子をオーバーロードすれば良いだけだから、
結構気軽に範囲for文対応のイテレータを書ける。

ラムダ式も関数の引数に直接関数を埋め込んだりできて便利。
0242はちみつ餃子 ◆8X2XSCHEME
垢版 |
2019/04/14(日) 12:43:45.83ID:+qOUcSLR
ガンガン最新を追うべきとまでは思わないけど、
C++11 は最低限度じゃないかなぁ。
0244デフォルトの名無しさん
垢版 |
2019/04/14(日) 14:34:56.13ID:GSX89KOm
つーか今はもうC++11の機能は使わずにC++で書け!といわれても
やりきる自信がなくなった・・
0247デフォルトの名無しさん
垢版 |
2019/04/14(日) 16:06:36.29ID:dZAE6IVm
C#ってことか。
0251デフォルトの名無しさん
垢版 |
2019/04/14(日) 16:22:55.01ID:6Gooiv09
>>250
そんなどうでも良いもののために予約語追加する意味って
その文法じゃ初期値すら変えられない
0252デフォルトの名無しさん
垢版 |
2019/04/14(日) 16:24:45.44ID:6Gooiv09
初期値はi=0とかすればいいのか
でもそうなるとi=1にした場合何回ループするのか混乱しそう
0253デフォルトの名無しさん
垢版 |
2019/04/14(日) 16:32:41.09ID:IovzG98E
>>229
QtとかGtk、wxとか色々有るじゃん。。。
入れるの面倒くさいなら、Power Builder(だっけ?)とかの有料開発環境はVSを除いてマルチプラットフォームなライブラリが売りだぞ。
0254 ◆QZaw55cn4c
垢版 |
2019/04/14(日) 16:36:01.32ID:AVvjfIV7
>>253
Java の人も C# の人も c++ の人も python も ruby も一緒の名前で一緒の機能が使えたら,コストの中でも一番高くつく勉強コストを減らせるのではないでしょうか
0259デフォルトの名無しさん
垢版 |
2019/04/14(日) 17:09:53.36ID:IovzG98E
>>254
うん。
それはまさにそうで、だからQt,Gtk,wxあたりのメジャー所は色んな言語にラッパーがある。
0260デフォルトの名無しさん
垢版 |
2019/04/14(日) 17:10:32.89ID:h7KNzBMl
webプログラマーなんですが、右辺値、fowardっていつ使うのか気になります
というかなんでそこまで、厳密に分ける必要があるのか 
業務で使ってる方、使用例を教えてください
0261デフォルトの名無しさん
垢版 |
2019/04/14(日) 17:20:10.51ID:sCsh6GnA
右辺値というかムーブ関数の定義といらなくなるオブジェクトにstd::move付けとくのは絶対損にはならないからとりあえずやっとく
forwardはテンプレートライブラリ作るなら必須だけど自分では使ったことないなあ
0262さまよえる蟻人間 ◆T6xkBnTXz7B0
垢版 |
2019/04/14(日) 17:25:45.47ID:86P3zzV7
コピーにコストがかかる場合は、std::swapやstd::moveのが早い場合があるからね。ムーヴはコピーじゃなくて引っ越しだから。
0263デフォルトの名無しさん
垢版 |
2019/04/14(日) 17:27:07.70ID:YQLb8Tsj
まあ理論上はね。。そういう実装になってるかどうかはコード見ないとわからんけどね。
0264デフォルトの名無しさん
垢版 |
2019/04/14(日) 17:29:38.84ID:6Gooiv09
基本的には高速化が目的でmove使わなくてもなんとかなるが、
所有権絡むとmoveは必須になる

forwardはtemplateで引数渡すときにmoveやら参照やらの完全転送する場合必須
0265さまよえる蟻人間 ◆T6xkBnTXz7B0
垢版 |
2019/04/14(日) 18:16:04.21ID:86P3zzV7
ちょっと実際にやってみようか。コピーコンストラクタで十秒待つコードを書く。ムーヴコンストラクタとムーヴ代入でなにもしない。
この状態でstd::moveを使わないで代入すると十秒かかる。
0267デフォルトの名無しさん
垢版 |
2019/04/14(日) 18:47:05.84ID:xCvd3oj/
>>264
>所有権絡むとmoveは必須
必須とまでは言えない
 T::T(const T& obj)
という通常のコピコンを定義して、コピコンの中でconst剥がししたら
とりあえず所有権の移動もmove無しで逝ける
0268はちみつ餃子 ◆8X2XSCHEME
垢版 |
2019/04/14(日) 18:50:44.06ID:+qOUcSLR
>>260
高速化のために出来るのは、アルゴリズムのレベルでの工夫を別にすれば、出来ることはショートカットだ。
高速化とは近道なんだよ。

場合分けが出来るなら、どうしてもやらなければならないこと、やらなくてもいいことを「区別」できる。
区別できるなら、やらなくてもいいことは省略できる。

言語での区別が無くても、たとえば C でも区別を陽に書けばムーブみたいなことだって、そりゃあ出来るけども、
そんなクソ面倒くさいことはしたくないので言語でのサポートがあるとありがたい。

まあ速度的にそこまで必要ないってのなら、区別を積極的に利用しなくてもかまわないよ。
でも、必要なときに出来る方法が用意されているとうれしいし、
C++ を使うときというのはそれなりに実行速度が必要なときだろうし。
0269デフォルトの名無しさん
垢版 |
2019/04/14(日) 18:52:09.33ID:xCvd3oj/
とわいえmoveコンストラクタの方が意図が明確なコードが書けるから良い。
moveコンストラクタがふさわしい例っていやーつぎごケース。
class BarWithBigData {
  Foo* m_pBigData;
  BarWithBigData() : m_pBigData(new Foo[1000000000000] { }
  ~BarWithBigData() { delete[] m_pBigData; }
  BarWithBigData(BarWithBigData&& rhs) { m_pBigData = rhs.m_pBigData; rhs.m_pBigData = NULL; }
  Foo* refBigData() { return m_pBigData; }
};

ちなstd::arrayは使った無いから知らん
0270デフォルトの名無しさん
垢版 |
2019/04/14(日) 18:53:54.12ID:xCvd3oj/
訂正orz、

誤:
  Foo* m_pBigData;
  BarWithBigData() : m_pBigData(new Foo[1000000000000] { }

正:
  Foo* m_pBigData;
public:
  BarWithBigData() : m_pBigData(new Foo[1000000000000]) { }
0272さまよえる蟻人間 ◆T6xkBnTXz7B0
垢版 |
2019/04/14(日) 18:55:03.68ID:86P3zzV7
十秒待つ待つコードはWindowsなら#include <windows.h>してSleep(10*1000);であり、
Linuxなら#include <unistd.h>してsleep(10);だ。
C++11ならstd::chronoに待つ関数があったはず。
0275デフォルトの名無しさん
垢版 |
2019/04/14(日) 18:57:39.39ID:xCvd3oj/
>>271
こうじゃわ;
BarWithBigData::BarWithBigData(const BarWithBigData& rhs) { m_pBigData = rhs.m_pBigData; const_cast<BarWithBigData&>(rhs).m_pBigData = NULL; }

>>269もmoveコンストラの変わりに↑のように書いても逝ける
0276デフォルトの名無しさん
垢版 |
2019/04/14(日) 19:10:15.32ID:sCsh6GnA
まあ実際にはそんなムーブをゴリゴリ書くことはなくて
m_pBigDataをunique_ptr<array<Foo, 1000000000000>>にしてムーブctor、ムーブop=、デストラクタを=defaultにするけどな
0278デフォルトの名無しさん
垢版 |
2019/04/14(日) 19:38:34.53ID:xCvd3oj/
>>277
ちなconst T&で渡されたブツを関数内でconst_castして書き換えることはそれ自体は合法
ROM上のオブジェクトを渡して死ぬことは有り得るがしたら呼び出し側の違反
また最適化にしくるとしたらそれはコンパイラーのバグ
0279デフォルトの名無しさん
垢版 |
2019/04/14(日) 19:46:40.04ID:xbTIwD1q
>>278
ROM上になくても const T 型で構築されたオブジェクトを書き換えたら未定義動作になるから、
値が変わらない前提の最適化は許されてるよ。

const 無しで構築されたオブジェクトを指す const& の話と混同してそうだね。
0282デフォルトの名無しさん
垢版 |
2019/04/14(日) 19:57:44.28ID:6Gooiv09
>>278
未定義じゃないか
c++03 5.2.11の7にはこんなことが書いてある
[Note: Depending on the type of the object, a write operation through the pointer, lvalue or pointer to data
member resulting from a const_cast that casts away a const-qualifier68) may produce undefined behav-
ior (7.1.5.1). ]
0283デフォルトの名無しさん
垢版 |
2019/04/14(日) 20:14:45.20ID:xCvd3oj/
>>282
Depending on the type of the objectにおいてmay produce undefined behaviorである
すわなちオブジェクトの型によっては未定義動作に成りえる、
と言っているだけなのでconst T&渡しされたパラメータの書き換えがNGの祥子にはなんね

>>279
>const T 型で構築されたオブジェクトを書き換えたら未定義動作になる
それはそう。しかしconst T&渡しされた関数内でコンパイラはそれを判断できないから
そういった関数内で、参照型かポインタ型引数で関数に渡されたlvalueのconst_castした結果はあくまでlvalue扱い
のはず…
0284デフォルトの名無しさん
垢版 |
2019/04/14(日) 20:25:38.94ID:xbTIwD1q
>>283
関数内では const& であることを根拠に最適化に使えないのは合ってる。
でもだからといって const& で受け取ったものを書き換えてもよいとは言えない。

void f1(int const&);
int f2()
{
int const x = 1;
f1(x);
return x;
}

x は int const なので、 f2() の return x は f1() が const_cast して x を
書き換える可能性を無視して return 1 に最適化できる、という話。

BarWithBigData const x; が >>275 のコピーコンストラクタに渡された後も
const_cast<BarWithBigData&>(rhs).m_pBigData = NULL; を無視して書き換え前の
m_pBigData が使われる可能性がある。
0285デフォルトの名無しさん
垢版 |
2019/04/14(日) 20:33:37.36ID:mEGAHR/Y
規格が云々言わなくても、9割のプログラマの意図に反してるで終わる話
頼むからそんなコードは頭の中にしまっといてほしい
0286デフォルトの名無しさん
垢版 |
2019/04/14(日) 20:37:26.81ID:6Gooiv09
つまりはそれ自体は問題ないが、constとして生成したオブジェクトを渡した瞬間にダメになると言うことか
で、渡すこと自体は制限できないから
プログラム中に罠を仕掛ける事が出来るわけだ。
0289デフォルトの名無しさん
垢版 |
2019/04/14(日) 20:45:26.81ID:xCvd3oj/
>>285
わかりたそうする。>>275のケースは素直にムーブコンストラクタを使えば良い。または↓でもだいたいおk
BarWithBigData::BarWithBigData(BarWithBigData& rhs) { m_pBigData = rhs.m_pBigData; rhs.m_pBigData = NULL; }

だいたいというのはムーブコンストラクタ有りの規格のC++コンパイラで↑の非constなコピコンだけ書く警告が出ることがあるからイヤン、

>>286
>つまりはそれ自体は問題ないが
いや問題がある可能性が潰せていない。
void f1(int const&);
int f2()
{
int x = 1;
f1(x);
return x;
}
(xがconst無し)の場合であってもf1(x)がxを書き換えない前提の最適化がf2()にかかったりすると、
f1(x)内で変更したxの値がreturnされるxの値に反映されない可能性がある(f1(x)の呼び出し前後でxがレジスタに乗ったままであるとか、
0292デフォルトの名無しさん
垢版 |
2019/04/15(月) 01:36:50.54ID:20PlYkfs
ラムダに11個の引数を参照で渡すのと、キャプチャするの、どっちが速いかな?
0295デフォルトの名無しさん
垢版 |
2019/04/15(月) 02:59:24.82ID:XbOtvNIU
参照渡しな時点でその場で呼び出すのだろ。
最適化かければ結局同じようなアセンブリになるよ。
0297デフォルトの名無しさん
垢版 |
2019/04/15(月) 19:29:41.18ID:8vw8m6ly
引数で渡すとスタックに積まれる可能性があるけど、キャプチャするとそうならないのでは。
0298デフォルトの名無しさん
垢版 |
2019/04/15(月) 19:36:28.26ID:XbOtvNIU
いや、形式上は無名クラスにキャプチャを変数としてぶちこんだもののインスタンス作ってメンバ関数のoperator()呼ぶのだから、スタックは使うだろ。
0302デフォルトの名無しさん
垢版 |
2019/04/16(火) 01:01:07.13ID:ZVmLHBMP
>>298
じゃあ、引数で渡すとスタックに積まれない可能性があるので、速い場合もあるのでは?
0306デフォルトの名無しさん
垢版 |
2019/04/16(火) 18:28:44.44ID:ZVmLHBMP
>>304
Java圧倒的な強さだな。
0307デフォルトの名無しさん
垢版 |
2019/04/16(火) 18:30:10.89ID:ZVmLHBMP
全部足すと500%位になりそうだから、複数の言語を使う人が多いんだろね。
0308デフォルトの名無しさん
垢版 |
2019/04/16(火) 21:18:54.40ID:dFuxCqAG
江添が転職できずに困っとるw
まあこいつがクソなだけでc++の問題ってわけじゃないんだがイメージは悪いわな。
0309デフォルトの名無しさん
垢版 |
2019/04/16(火) 21:36:49.03ID:jMhdT2ep
こうしてみるとホッシーの全タクシー移動ってのは理に適ってるな
バカな公害に捕まる心配が減る
0312デフォルトの名無しさん
垢版 |
2019/04/17(水) 00:03:12.24ID:vVzTJh6n
知らね
よく人を招いているようだし揉めたことがある人も少なくはないんじゃいか
0313はちみつ餃子 ◆8X2XSCHEME
垢版 |
2019/04/17(水) 01:12:11.58ID:UWuCQ9XR
>>310-311
当事者の様々な主張の食い違いがあるので、結論としては「わからない」。
少なくとも彼自信の主張としては掴みかかってきたのを払いのけた結果として眼鏡が割れたということになっている。
(江添が殴りかかったわけではなく、むしろ防衛した側、と江添は主張している。)

江添が煙草について過激な意見を持っているのは確かだが、
シェアハウス内で禁煙場所であると合意がなされている場所で煙草を吸った客人がいたというところは当事者全体が認めているようだ。
0314デフォルトの名無しさん
垢版 |
2019/04/17(水) 08:21:52.75ID:DaACwh1w
恨みというかまともにコード書かない奴がクソ意見で現場荒らすって事自体がクソだと思うわけで、
まあその反動で現場で働くことができないって事になればザマァって思う。
0316デフォルトの名無しさん
垢版 |
2019/04/17(水) 09:53:30.15ID:vVzTJh6n
どのプロジェクトにも参加してないと認識してたけど乗り込んでケチつけてたりするのかな
まあ俺ドワンゴとは縁が無いからどこで何してようが関係ないけど
0317デフォルトの名無しさん
垢版 |
2019/04/17(水) 17:08:02.09ID:I32j715f
C++がPython抜いて3位 - 4月TIOBE言語ランキング 2019/04/17 10:55 後藤大地
https://news.mynavi.jp/article/20190417-810363/

TIOBE Softwareから、2019年4月のTIOBE Programming Community Index (PCI)が公開された。
TIOBE PCIは、複数の検索エンジンの検索結果から、対象となるプログラミング言語が
どれだけ話題になっているかをインデックス化したもの。

4月TIOBE Programming Community Index / 円グラフ
https://news.mynavi.jp/article/20190417-810363/images/001.jpg

2019年4月はC++がPythonを抜いて3位に返り咲いた。ただし、Pythonのシェアが下落したの
ではなく、Pythonの増加傾向をC++の増加が上回ったことによる結果と思われる。C++は
長期にわたって下落傾向が続いていいたものの、2019年に入ってから増加傾向へ転じている。
Pythonも増加傾向が続いており、どちらも今後さらにインデックス値を増やす可能性がある。

長期にわたって1位を確保しているJavaは依然として1位のポジションにあるが、下落の
傾向が続いている。2位のC言語も長期で見ると下落を続けており、C++やPythonの存在感が
強くなってきている。
0319デフォルトの名無しさん
垢版 |
2019/04/17(水) 18:34:58.84ID:LllPIzo0
俺が検索しまくったからだろうな。
0320デフォルトの名無しさん
垢版 |
2019/04/17(水) 19:59:29.56ID:fJF68+PR
今もしインターネットが完全にシャットダウンされると
プログラム書けなくなるプログラマけっこう数いるだろうな
0325デフォルトの名無しさん
垢版 |
2019/04/19(金) 02:16:29.43ID:/DYxLH/O
どういたしまして。
0326デフォルトの名無しさん
垢版 |
2019/04/19(金) 08:26:54.03ID:gmGy9oTC
江添は職質裁判でも、不当判決が出たので控訴するみたい

警官は、複数人で口裏合わせするから、民間人は勝てない

漏れもやられたけど、酒酔い運転でも、漏れが機械に息を吹き掛けても、ランプが点かない。
そこで、警官がクルッと後ろを向くと、ランプが点く

そっと見たら、酔っ払い警官が、自分で息を吹きかけて、ランプを点ける

こういう裁判で争っている人もいるけど、
警官は複数人で口裏合わせするから、絶対に勝てない!

警官は皆、このやり方で出世しとる
0327デフォルトの名無しさん
垢版 |
2019/04/19(金) 08:33:03.47ID:PWe5dNBv
ありゃ普通に対応してりゃ済む話だと思うがね。

やってることは完全に当たり屋だろ。
0331はちみつ餃子 ◆8X2XSCHEME
垢版 |
2019/04/19(金) 13:41:25.74ID:mypEidUJ
だけ、というのは言い過ぎだと思うが、
日本語で最新の C++ の事情を本にしているのは江添くらいしかいないからなぁ。

江添本人は自分のことを実務家ではなく教育者だと考えているようだし、
(肩書は何なんだろ? エヴァンジェリストのようにも見えるが……)
今のポストは妥当なとこだろ。
そのままやってくれればありがたいもんだ。
0333デフォルトの名無しさん
垢版 |
2019/04/19(金) 13:50:35.12ID:rPSCrubJ
江添個人の裁判は完全にスレチなんだよなあ
仮に違法な取り締まりだと判断されても警察のやり方が改まるわけもないだろうし
0337デフォルトの名無しさん
垢版 |
2019/04/19(金) 18:50:10.05ID:/DYxLH/O
はちみつさんも真剣にやってると思います。
0338デフォルトの名無しさん
垢版 |
2019/04/19(金) 19:16:13.92ID:yj9Iz3m1
こんな事言うと勘違いされそうだが、はちみつ餃子はちゃんとしてると思うよ
C++に関しておかしなことは言っていない
ていうか、はちみつ餃子ってものすごい不味そうなんだがそんなの本当にあるのだろうか・・?
0340デフォルトの名無しさん
垢版 |
2019/04/19(金) 19:28:19.17ID:PWe5dNBv
いや明らかに開発してねーだろって感覚じゃねーか。
まあここならそれでもいいんだろうけれど。
0341はちみつ餃子 ◆8X2XSCHEME
垢版 |
2019/04/19(金) 19:51:37.44ID:mypEidUJ
>>338
ググればわかるけどはちみつ餃子はそこそこありふれた料理だよ。

その昔、 higepon が自分でもどうして higepon などと名乗ったかわからない
と述べていたので、そのくらい意味不明感じにしようと思って適当に
思いついた語をコテハンにした。
Scheme スレが本来の住処なので当初は SCHEME餃子 と名乗っていたけど、
他のスレにも顔を出すようになったのでなんとなくはちみつ餃子になった。
およそ意味不明な組合せにしたつもりだったんだけど、
実際にある料理だとは後になってから知った。
0342デフォルトの名無しさん
垢版 |
2019/04/19(金) 21:11:54.81ID:fEN/Hp+M
initializer_listを引数に取るオブジェクトを引数に取る関数で
下記のケースでUniversal Initializationが効かないのですが
何かいい手はないでしょうか

using KVPCollectionType = std::map<std::string, std::string>;
void f(const KVPCollectionType&& kvps = {});

f(); // OK
f({}); // OK
f(KVPCollectionType{{"key1", "value1"},{"key2","value2"}}); // OK

f({{"key1", "value1"},{"key2","value2"}}); // NG これをやりたい!!
0344デフォルトの名無しさん
垢版 |
2019/04/19(金) 21:17:05.52ID:fEN/Hp+M
すみません、訂正です
× void f(const KVPCollectionType&& kvps = {});
○ void f(const KVPCollectionType& kvps = {});
0345デフォルトの名無しさん
垢版 |
2019/04/19(金) 21:22:53.30ID:/DYxLH/O
アークエンジェルに搭載されてるstd::variant<>。
0347デフォルトの名無しさん
垢版 |
2019/04/20(土) 00:01:37.25ID:a7z6m7l4
ごめんなさい、ごめんなさい。本当にごめんなさい。
勝手に脳内で要約したのが間違えまくってました

正確には以下の通りです。
#include <map>
#include <memory>
using KVPCollectionType = std::map<std::string, std::string>;
class c {
public:
c(const KVPCollectionType&& kvps = {}){}
};
int main()
{
auto ok = std::make_shared<c>(KVPCollectionType{{"key1", "value1"},{"key2","value2"}}); // OK
auto ng = std::make_shared<c>({{"key1", "value1"},{"key2","value2"}}); // NG!!!
}
0348デフォルトの名無しさん
垢版 |
2019/04/20(土) 10:47:21.77ID:5oa1AZjP
全てのバグを絶滅せよ。
「今日は死に日和」好評発売中。
0351デフォルトの名無しさん
垢版 |
2019/04/20(土) 11:30:38.02ID:5oa1AZjP
clとgcc。
0354はちみつ餃子 ◆8X2XSCHEME
垢版 |
2019/04/20(土) 13:30:02.11ID:7hm/FBJ7
>>347
テンプレートの推論ルールとして「関数テンプレートのパラメータとして波カッコの初期化子リストを渡して型推論させることはできない。」
ということになっている。 ( https://cpprefjp.github.io/lang/cpp11/uniform_initialization.html )
make_shared の実際の型は template <class T, class... Args> shared_ptr<T> make_shared(Args&&... args); なので、
このとき Args が推論できない以上はどうにもならん。
型を固定した専用の関数をはさんでこんな感じにするくらいのことしか思いつかないな。

#include <map>
#include <memory>
#include <initializer_list>
#include <utility>

using KVPCollectionType = std::map<std::string, std::string>;
class c {
public:
c(const KVPCollectionType&& kvps = {}){}
c(const std::initializer_list<typename KVPCollectionType::value_type>){}
};

std::shared_ptr<c> make_c_shared(std::initializer_list<typename KVPCollectionType::value_type> a) {
return std::make_shared<c>(std::move(a));
}

std::shared_ptr<c> make_c_shared(KVPCollectionType&& a) {
return std::make_shared<c>(std::move(a));
}

int main() {
auto ok = make_c_shared(KVPCollectionType{{"key1", "value1"},{"key2","value2"}});
auto ng = make_c_shared({{"key1", "value1"},{"key2","value2"}});
}
0355はちみつ餃子 ◆8X2XSCHEME
垢版 |
2019/04/20(土) 13:32:51.70ID:7hm/FBJ7
>>347 >>354
呼出す側で

auto ng = std::make_shared<c, std::initializer_list<typename KVPCollectionType::value_type>>({{"key1", "value1"},{"key2","value2"}});

というように型を明記してもかまわないけど、使う側でいちいちこんなこと書きたいわけじゃないだろ?
0356はちみつ餃子 ◆8X2XSCHEME
垢版 |
2019/04/20(土) 13:35:42.76ID:7hm/FBJ7
>>347
ちゃんと考えたら >>354 はいらんことしとるな……
これで充分か

#include <map>
#include <memory>
#include <utility>

using KVPCollectionType = std::map<std::string, std::string>;
class c {
public:
c(const KVPCollectionType&& kvps = {}){}
};

std::shared_ptr<c> make_c_shared(KVPCollectionType&& a) {
return std::make_shared<c>(std::move(a));
}

int main() {
auto ok = make_c_shared(KVPCollectionType{{"key1", "value1"},{"key2","value2"}});
auto ng = make_c_shared({{"key1", "value1"},{"key2","value2"}});
}
0357デフォルトの名無しさん
垢版 |
2019/04/21(日) 08:19:35.76ID:jJhiZdMc
>>354-356
ありがとうございます、その手を使わせていただきます
状況によって推定ルールが変わるのはやめて欲しいなってちょっと思ったんですけど。
0359デフォルトの名無しさん
垢版 |
2019/04/23(火) 00:01:58.24ID:cW1os5L0
エディタの補完機能使いたいときにたまにそうやって補完して最後に消す。
が、たまに忘れる。
0362デフォルトの名無しさん
垢版 |
2019/04/23(火) 18:16:01.64ID:Wx+D+gzo
メンバであるという保証ができるので付ける
0363デフォルトの名無しさん
垢版 |
2019/04/23(火) 19:39:28.32ID:cE0Yu4R7
メンバ名は頭にm_付けろみたいなクソルールよりずっといいと思うので付けるべき
0367 ◆QZaw55cn4c
垢版 |
2019/04/23(火) 20:16:13.74ID:JSYnwir1
>>366
それって var(var) でも問題ないんですよ…
0370デフォルトの名無しさん
垢版 |
2019/04/23(火) 21:34:08.78ID:3k1+3l7a
ハンガリアン記法は、入力補完のないエディタ上での可読性を高めるのに役立ってるでしょ。今でも。
0373デフォルトの名無しさん
垢版 |
2019/04/23(火) 21:39:11.30ID:lLaZpSEH
定期的にunsignedとsigned混在させてハマるアホをみるとハンガリアン必要だと思うわ
0374デフォルトの名無しさん
垢版 |
2019/04/23(火) 21:40:37.34ID:lAbUfbw7
C#で入力補完のないエディタがどうとかさすがにナンセンスでは
だってvisual studio使うじゃん
0375デフォルトの名無しさん
垢版 |
2019/04/23(火) 21:41:16.53ID:ZkNEZW45
どっちでもいいわ。
大抵の場合そんなとこに気を使わんといかんコードになってることのが問題。
0381デフォルトの名無しさん
垢版 |
2019/04/23(火) 22:06:36.15ID:lLaZpSEH
>>380
コードの問題じゃなくて言語仕様の問題だから
こういうえらそうなくせに何もわかってないカスが一番始末に困る
0383デフォルトの名無しさん
垢版 |
2019/04/23(火) 23:10:13.77ID:lLaZpSEH
ハンガリアンも防御的なプログラミングと考えたら悪くないよ
成り立ち調べてみな
でも基本型とポインタだけだな
クラスには無用だと思う
0386デフォルトの名無しさん
垢版 |
2019/04/23(火) 23:55:15.96ID:UPBQPhwq
VSがあっても何も書けない。
0387デフォルトの名無しさん
垢版 |
2019/04/23(火) 23:55:30.60ID:ZkNEZW45
c++みたいに型情報ありがデフォルトの言語でハンガリアンとか二重メンテもいいとこだわ。
0388デフォルトの名無しさん
垢版 |
2019/04/24(水) 01:00:02.97ID:pnt3hUol
前方宣言したクラスをTにしたスマポメンバでコンパイル通るときと通らないときがあって調べてたら
デストラクタがインライン(暗黙)だと駄目だとわかった
しかもこの問題が起こるのはunique_ptrのときだけでshared_ptrはデストラクタの定義に関係なく通る
わけわからんぞ
教科書に書いておいてくれ

class ClassB;
class ClassA{
public:
ClassA();
private:
std::unique_ptr<ClassB> u; // NG
std::shared_ptr<ClassB> s; // OK
}

---

class ClassB;
class ClassA{
public:
ClassA();
~ClassA(); ←これでunique_ptrもOK
private:
std::unique_ptr<ClassB> u; // OK
std::shared_ptr<ClassB> s; // OK
}
0389デフォルトの名無しさん
垢版 |
2019/04/24(水) 07:38:59.52ID:IdP8M60W
>>388
unique_ptr<T>のデストラクタはインスタンス化するときにTが完全型であることを要求する(デストラクタで直接Tのデストラクタを呼ぶ)
unique_ptrを内包するクラスのデストラクタが暗黙だとクラス内でコンパイラによって実装されるけど、その場でunique_ptrのデストラクタを要求する
しかし、その翻訳単位内でTの定義が無ければコンパイルエラーとなる

unique_ptr<T>を内包するクラスのデストラクタがとりあえず宣言だけでもあると
実際の定義がある場所で同様の事が起こるので、その場所でTの定義が見つかればいい
その場合に定義を書かないと、コンパイラさんが適切な翻訳単位内に定義をおいてくれるみたい

shared_ptrは動的削除子のおかげでデストラクタが呼ばれるところで適切にデリータを定義し、デストラクタを呼ぶようになっているのでこの様な問題は起こらない
shared_ptr<T>のデストラクタ内ではTのデストラクタを直接呼び出すようなコードが無い
0391デフォルトの名無しさん
垢版 |
2019/04/26(金) 01:05:34.79ID:UW94aXeh
うーんC++プライマー8500円かぁ。本家のプログラミング言語C++第4版はもっとするし
情報量からすると安いが本一冊にポンと出すにはお高い……日本語である程度網羅的な本となるとこの2冊くらいよね
0396デフォルトの名無しさん
垢版 |
2019/04/26(金) 23:59:20.16ID:LBUDtqYL
たしかにそうだな・・いよいよ平成最後なんだな
みなさん、>>393-394 みたいな事にならないよう、気をひきしめましょう
0400デフォルトの名無しさん
垢版 |
2019/04/27(土) 01:04:24.73ID:oB7jkl++
素直な実装だとitr++より++itrのほうが速いんじゃないかなあ、となんとなくみんなが思っているから
0402デフォルトの名無しさん
垢版 |
2019/04/27(土) 01:35:51.19ID:KjSesqKI
インクリメント後のイテレーターの値を返す処理の実装を考えると
先の場合はインクリメントしてそのまま渡せばいいけど
後の場合はインクリメント前の値を保存しといてそれを渡さないといけないので一手間かかるから
・・なんだけど諸々の最適化とか色んな条件とか考えたらそこまで差がでるかどうかはよくわからん
0403デフォルトの名無しさん
垢版 |
2019/04/27(土) 01:38:33.58ID:EJ6OYH9I
it++だと、戻り値をコピーしてとっておいてから、ポインタなりを進めた後にreturnする必要があるが、
++itだと、ポインタを進めた後に参照を返すだけでするからな。
0406デフォルトの名無しさん
垢版 |
2019/04/27(土) 11:46:20.51ID:Tan1PMrG
>>402-405
cppcheck にかけたらちゃんと警告出るね。
0407デフォルトの名無しさん
垢版 |
2019/04/27(土) 14:06:33.77ID:dwPa57iA
どうせ戻り値捨てるんだったら++itを選んでおいて損はない
無駄にit++を使うのは時期尚早な最不適化って奴だ
0408デフォルトの名無しさん
垢版 |
2019/04/27(土) 19:31:57.61ID:Ht8C3PIL
C++で書くんだから後置インクリメントの方がメインに決まってんじゃん
前置は異端だ
0415デフォルトの名無しさん
垢版 |
2019/04/28(日) 11:01:20.49ID:DJV+PGkd
CArrayは、<algorithm>ヘッダーで定義された信頼性の高いユーティリティ関数を使えないのがね・・・。
0420デフォルトの名無しさん
垢版 |
2019/04/28(日) 15:37:56.41ID:UbqPSgHc
inconsistent begin/end types in range-based ‘for’ statement

gcc(g++) 8.2で -std=c++17オプションでコンパイルで
範囲forでこのエラーが出るんだが
begin endの型不一致の制限緩和されいるはずだよな?
原因わかる方いますか?
0423デフォルトの名無しさん
垢版 |
2019/04/28(日) 16:22:25.11ID:UbqPSgHc
>>422
int _n = 0;
auto __begin = _container.begin();
auto __end = _container.end();
for (; __begin != __end; ++__begin) {
_n = *__begin;
}
比較演算子はちゃんと定義してるし
上のコードは何故かコンパイル通る
だけど
for (const auto _n : _container) {
//hoge
}

は何故か通らない
0425デフォルトの名無しさん
垢版 |
2019/04/28(日) 16:43:13.35ID:UbqPSgHc
>>424
auto&&にした時のみエラーが増えます
cannot bind rvalue reference of type ‘const long unsigned int&&’ to lvalue of type
0427デフォルトの名無しさん
垢版 |
2019/04/28(日) 17:02:57.34ID:UbqPSgHc
>>426
using iterator = typename std;;vector<int>::iterator;
using const_iterator = typename std;;vector<int>::const_iterator;
using my_iterator = MYIterator;
my_iterator begin();
iterator end();
const my_iterator begin() const;
const_iterator end() const;
const my_iterator cbegin() const;
const_iterator cend() const;
0428デフォルトの名無しさん
垢版 |
2019/04/28(日) 17:18:10.81ID:HBE/zmE6
これで動かん?
for (auto&& _n : _container) {
}
0430デフォルトの名無しさん
垢版 |
2019/04/28(日) 18:12:40.94ID:/ZzCGjK1
MYIteratorの実体がunsigned longみたいだけど
vector<int>::iteratorの実体がポインタだったらoperator!=の定義できなくない?
0434デフォルトの名無しさん
垢版 |
2019/04/28(日) 23:15:17.87ID:UbqPSgHc
>>427
自己解決
const iteratorとconst_iteratorが一緒だと勘違いしていた
const my_iteratorではなくmy_const_iteratorを実装して返り値とすべきでした
0435デフォルトの名無しさん
垢版 |
2019/04/29(月) 08:12:30.69ID:caHZo185
struct A{
int member;
};
struct B: A{
void run(){member = 0;}//ok
};

template<typename T>
struct TA{
T member;
};
template<typename T>
struct TB:TA<T>{
void run(){member = 0;}//NG。this->memberとするとok
};
クラステンプレートを継承してクラステンプレートを作成した場合にthisでないと継承元のメンバーが見えないのは仕様?
0438デフォルトの名無しさん
垢版 |
2019/04/29(月) 12:13:25.59ID:TWBg2sM/
>>437
2phase lookupだから
最初のTB解釈時にはTAが型引数一つのtemplate classであるという情報以外使わない
だいたいTAが特殊化される可能性があるだろ
0439デフォルトの名無しさん
垢版 |
2019/04/30(火) 10:16:07.47ID:5viqjSMx
8bitや16bitのintしか使えない環境で、
32bitなどの大きな数を扱うにはどうすれば良いですか?
変数をいくつかつなげて大きな数を表現できないかと思っているのですが、やり方が分りません。
ご存知の方いらっしゃいましたら教えて頂けると嬉しいです。
0440439
垢版 |
2019/04/30(火) 10:20:33.67ID:5viqjSMx
補足させて下さい。
足し算、引き算は出来るようにしたいです。
可能でしたら、掛け算や割り算もできると助かります。
0447 ◆QZaw55cn4c
垢版 |
2019/04/30(火) 13:43:58.68ID:iYYZTFZo
>>446
8bit/16bit CPU で int_least32_t とかはそもそも存在しないのでは?
0448デフォルトの名無しさん
垢版 |
2019/04/30(火) 14:19:40.82ID:44LYo/LT
>>447
「8bitや16bitのintしか使えない」を見て long や long long はもっと大きいんじゃないの?と思ったんだよ。
「整数型」の意味で"int"って書いてたんなら、確かに存在しない環境のことを言ってるのかもしれない。
その場合は ISO C/C++ の LONG_MAX の最低絶対値の要求に準拠できないってことになるんだけど。
0450 ◆QZaw55cn4c
垢版 |
2019/04/30(火) 15:03:05.44ID:iYYZTFZo
>>449
それはそれですごいインプリメンテーションですね…
8 bit PIC で 32bit int がさくさく書けちゃうとは、そのインプリメンターは根性がありますね、それか頭のねじが何本か外れていて「無理を無理と思わない人」とか…
0451デフォルトの名無しさん
垢版 |
2019/04/30(火) 15:29:16.24ID:0LsajAP1
shortは16bit固定でlongは32bit固定でしょ。何言ってんの?
0453 ◆QZaw55cn4c
垢版 |
2019/04/30(火) 16:37:10.66ID:iYYZTFZo
>>451
残念でした、short も long もインプリメンターが好きに実装していいのですっ!きりっ!
0455デフォルトの名無しさん
垢版 |
2019/04/30(火) 17:46:03.06ID:bcA0O1+B
intが16bitならISOの規格は満たしてることになるかな。

32bit以上の長い整数はクラスと演算子オーバーロードで誤魔化すか。
頑張ってもリテラル表記もダメだろうから、使い勝手は悪いよな。
0456デフォルトの名無しさん
垢版 |
2019/04/30(火) 19:51:46.33ID:tnl21ewQ
>>451
うろ覚えだが
VC Win32bit: int 32bit long 32bit pointer 32bit
gcc Linux32bit: int 32bit long 32bit pointer 32bit -ここまでは同じ

VC Win64bit: int 32bit long 32bit pointer 64bit -int64_tで64bit整数
gcc Linux32bit: int 32bit long 64bit pointer 64bit
0461デフォルトの名無しさん
垢版 |
2019/04/30(火) 21:02:03.72ID:tJFiug19
intの配列のラッパーのようなものから再発明すりゃーいい

class Bignumber{
int number[4];

Bignumber(const String num){
for(int i=0; i<4; i++){
number[i] = //考えるのが面倒臭い
}
}

Bignumber operator+(){
//以下、延々とオペレータオーバーロードが続く
}

};
0462 ◆QZaw55cn4c
垢版 |
2019/04/30(火) 21:02:11.05ID:iYYZTFZo
>>459
int64_t とか int32_t とか cstdint の面々を使うしかないでしょうね…私もデフォでそうするようになりました
0463デフォルトの名無しさん
垢版 |
2019/04/30(火) 21:08:03.86ID:0LsajAP1
あ…ありのまま 今 起こった事を話すぜ。
平成の終わりにいろんな奴からshort/longに対する認識の誤りを指摘される恥辱を味わった。
何言ってるかわからねーと思うが(以下略
0465デフォルトの名無しさん
垢版 |
2019/04/30(火) 21:19:14.38ID:l5C1eDEl
制限された環境で使える多倍長整数のライブラリくらいいくらでもありそうだけど
0468デフォルトの名無しさん
垢版 |
2019/05/01(水) 00:05:54.61ID:rGIFhODV
C++の規格上はintは16 bit以上(ターゲットのアーキテクチャで一番自然なサイズ
、longは32 bit以上
だったと思った
0469デフォルトの名無しさん
垢版 |
2019/05/01(水) 06:23:13.87ID:EdGuPz7E
class ClassA
class ClassB: public ClassA
class ClassA::ClassC

のときに、ClassBはClassAのサブクラスと言いますがClassCはなんと呼ぶものですか?
0470 ◆QZaw55cn4c
垢版 |
2019/05/01(水) 06:32:09.33ID:JcO9/TOD
>>469
>class ClassA::ClassC
この意味はなんですか?
0472デフォルトの名無しさん
垢版 |
2019/05/01(水) 06:56:41.43ID:q4ZM9Khf
細かいことを言えば、規格準拠の処理系でも
int32_t (ピッタリ32bit) が定義されるとは限らないのね。
int_fast32_t, int_least32_t なら定義される。

8bit単位じゃないCPUへの配慮らしいから、
普通の(この表現も危険だけど)コンピュータを使う分には
int32_t があると仮定して書いてもたいがい大丈夫だろうけど。
コンパイルエラーが出るから出たら対処、で十分かと。
0473デフォルトの名無しさん
垢版 |
2019/05/01(水) 07:06:00.95ID:EdGuPz7E
>>470
クラス内で定義したクラスです

class ClassA {
public:
...
private:
class ClassC;
ClassC * C;
}

class ClassA::ClassC {
...
}
の場合class ClassA::ClassC からClassA::を取るとコンパイルが通りません
0474デフォルトの名無しさん
垢版 |
2019/05/01(水) 07:25:40.44ID:shCLaGGL
「プログラミング言語C++」だと、入れ子クラス(nested class)とか
メンバクラス(member class)とか呼んでるみたい。
0480デフォルトの名無しさん
垢版 |
2019/05/01(水) 19:23:34.42ID:DLNQH846
以前、「完全さを求めるあまり今存在する良い物を犠牲にしてはならない」という趣旨のことわざをBBCハードトークで仄聞したのだが、原典はなんだろうか?
0481 ◆QZaw55cn4c
垢版 |
2019/05/01(水) 19:59:09.50ID:JcO9/TOD
>>480
ググってヒットしたもののうち、これについてめぐらせています(ことわざとは関係ありません…)
http://www.kt.rim.or.jp/~hisashim/gabriel/WIB.ja.html
この人(原著者)、最後まで間違ったままでいるような気がしてなりませんが、実際のところどうでしょうか
0484デフォルトの名無しさん
垢版 |
2019/05/06(月) 08:44:53.70ID:Omhj+R8I
ストリームの遅さは凄い凄すぎる。
ほとんどの場合、遅くても問題ないということはわかる。
でもあそこ迄遅くする必要があったのだろうか。
0486デフォルトの名無しさん
垢版 |
2019/05/06(月) 12:17:09.96ID:jqdyfBGc
3.5  ストリーム
ttps://sicp.iijlab.net/fulltext/x350.html

これだろう
理想的にはこうなるべきだが、技術的には未だに追いついてないだけであり、将来的には解決される

なのでC++では他のどの言語も真似してない<<や>>がある
逆に言うとストリーム・プログラミングが主流になったらC++が主流の座に返り咲く
0487デフォルトの名無しさん
垢版 |
2019/05/06(月) 15:05:44.09ID:XjarcZ9f
今やどの言語もprintfのような書式付き文字列を指定する方式に回帰した(jsすら!)。
少なくとも書式付き出力に限れば、ストリームはプログラミング言語の中ではもう淘汰されてしまったんだと思うよ。
早いとこ、string::format()とかbasic_ostream::format()とか作ってほしいわ
0488デフォルトの名無しさん
垢版 |
2019/05/06(月) 15:24:11.52ID:ecbY6TsO
多言語対応するためにはC#みたいに %1, %2みたいに引数を番号で指定できる書式じゃないとダメでしょ。
0489デフォルトの名無しさん
垢版 |
2019/05/06(月) 15:30:05.12ID:HRNpJ9Fc
ストリームの精神はrangeに受け継がれて生き残るよ
だから書式はそろそろ負けを認めよう
0492デフォルトの名無しさん
垢版 |
2019/05/06(月) 16:36:53.99ID:oGUqqIoM
<<には<<なりの良さがあると思うので、ストリームというより、stringがoperator <<をサポートすれば良いと思う。
0493デフォルトの名無しさん
垢版 |
2019/05/06(月) 16:40:04.95ID:DF3zK1Xx
文字列操作するためのインターフェイスとしては最悪だよ。
考えた奴は自分では絶対使わないで人に使わせるだけのタイプだろうな。
0494デフォルトの名無しさん
垢版 |
2019/05/06(月) 16:45:40.32ID:Yv9FD/Sb
そもそもだけど、なんで文字って表示されるのに
<< とか %s とかこういうのが必要なの?
どの言語でもprint(a);だけで表示させればよくない?aが文字列でも整数でも小数でもさ。
引数で判断してくれよ。
0495デフォルトの名無しさん
垢版 |
2019/05/06(月) 16:51:17.77ID:oGUqqIoM
>>493
え、そう?
文字列を連結する時に、+=と+を使い分けるより<<だけですむ方が楽だし、連結する順番も自明だし結構良くない?
std::string str;
str << "hoge" << 123 << ".txt";
みたいな。
0496 ◆QZaw55cn4c
垢版 |
2019/05/06(月) 17:27:51.75ID:vu8V8zIe
>>492
それは私も考えていました、cerr に都度吐いているメッセージを、もう一度プログラムの最後にまとめて吐きなおす、とかをやってみたいんです…
0498デフォルトの名無しさん
垢版 |
2019/05/06(月) 17:37:57.33ID:ecbY6TsO
コンストラクタの引数に出力先stringインスタンスを渡すostream派生クラスを作ればいいじゃない。
string str;
hogestream sstr(str);
sstr << "hoge" << 128;
0501デフォルトの名無しさん
垢版 |
2019/05/06(月) 18:13:11.14ID:L6nFhRY+
iostreamの<<はC++の黒歴史の一つだね
0503デフォルトの名無しさん
垢版 |
2019/05/06(月) 18:27:12.43ID:ecbY6TsO
>>499,500,501
ostream派生クラスじゃなくて独自のクラスのほうが軽量でいい。
stringインスタンスへのポインタのほかに、数値書き込み時の進数設定(oct,dec,hexを覚えておく)などをメンバ変数に持てばOK。
0507デフォルトの名無しさん
垢版 |
2019/05/08(水) 21:52:50.27ID:iQQm+nuQ
to_charsというものをみつけました。
0508デフォルトの名無しさん
垢版 |
2019/05/09(木) 18:03:02.17ID:PdPEbd3c
b配列全てをa配列のケツにコピーするとき

std::vector<char> a;
char b[]={0,1,1,3,4};
a.insert(a.begin(),&b[0],&b[sizeof b]);

これでいいの?

&b[sizeof b]
これが死ぬほど気持ち悪いんだけど
0509デフォルトの名無しさん
垢版 |
2019/05/09(木) 18:18:44.76ID:JXKWFyOS
そんな気色悪い書き方しなくてもこれでいいよ
a.insert(a.end(), std::begin(b), std::end(b));
0513デフォルトの名無しさん
垢版 |
2019/05/09(木) 23:40:45.34ID:q7ofaYCv
アルゴリズムよりvector::insertのほうが実装による最適化の余地は大きそうだな
0514デフォルトの名無しさん
垢版 |
2019/05/10(金) 00:47:30.50ID:5C678nxv
ポインタがイテレータとして渡された時点で相手が連続バッファだってわかるからね
0515デフォルトの名無しさん
垢版 |
2019/05/10(金) 11:00:01.95ID:KAkBQh2y
&b[sizeof b]でもstd::end(b)でもやってることは変わらないんだけどな
見映えは重要だな
0517はちみつ餃子 ◆8X2XSCHEME
垢版 |
2019/05/10(金) 12:01:59.87ID:g2QrvVju
>>515
見栄えというか、名前が付いているってのはそれだけで単純にわかりやすいな。
(名前が妥当であれば。)
0521デフォルトの名無しさん
垢版 |
2019/05/10(金) 19:36:57.50ID:tfYAY6pz
こんなもんだろ
SIerが間違ってコンシューマ系のWeb制作を請けてしまうとこんな感じになる
0525デフォルトの名無しさん
垢版 |
2019/05/10(金) 22:59:11.84ID:HK1/2Yro
型に無駄にこだわった結末がstreamと知っとくのは重要。
あの間違いを覚えとけ。
0526デフォルトの名無しさん
垢版 |
2019/05/10(金) 23:25:31.58ID:u3uVdMgu
ゲームのシーンを管理するクラスとシーンクラスがあり、管理するクラスはシーンクラスを保持しています
シーンクラスから管理クラスのシーンチェンジを行う関数を呼び出したいのですがどうやったらいいでしょうか
シーンクラスが管理クラスのインスタンスを持ちたくありません
0530デフォルトの名無しさん
垢版 |
2019/05/11(土) 10:30:07.92ID:f5HniSEP
>a.insert(a.begin(),&b[0],&b[sizeof b]);


これ、添字オーバーしてるけどメモリエラーとかにならないの?
0531デフォルトの名無しさん
垢版 |
2019/05/11(土) 10:54:36.87ID:RjxICFG6
>>530
イテレータ範囲のendは配列の場合最後の要素の次のアドレス
それは普通の実装ではアクセスされることはない
規格的にも最後の次の要素へのポインタだけは未定義じゃない
0534デフォルトの名無しさん
垢版 |
2019/05/11(土) 12:42:52.29ID:DVWj7ai3
&p[N]はp + Nと同じって規格にあったっけ?
0538デフォルトの名無しさん
垢版 |
2019/05/11(土) 18:44:16.82ID:fU686pnk
&*pはデリファレンスなしで単にpと評価するってどっかで特別に決められてなかったっけ?
0539デフォルトの名無しさん
垢版 |
2019/05/12(日) 06:58:46.18ID:x4ccFx6b
>>530
int a[5];
int *p = &a[5];
というコードが有効、つまり
「配列の最終要素の次の要素」(現実には存在しないデータ)のアドレスを取れる、
という仕様から、この場合は許される、というのが >>531 の指摘か。
一般的に >>538 が成り立つなら便利だけど、調べ切れなかった。

流れの元になった >>508 を見返したら、
a.insert(a.begin(),&b[0],&b[sizeof b]);
これだと b[] の内容はベクタ a の先頭に挿入されちゃうね。
0540デフォルトの名無しさん
垢版 |
2019/05/12(日) 07:43:52.68ID:2y1+p9UL
>>530
>>a.insert(a.begin(),&b[0],&b[sizeof b]);
>>

>これ、添字オーバーしてるけどメモリエラーとかにならないの?

508だけど、これは
a.insert(a.begin(),&b[0],&b[sizeof b]);

こっちの間違いです。ごめんなさい。
a.insert(a.end(),&b[0],&b[sizeof b]);

&b[sizeof b]);
この部分は

b+sizeof(b)
これなら問題ない感じ?
どちらでも動くけど、たまたまいてる可能性捨てきれないから不安なんだよね。

実際のソースはsizeof(b)がbに格納されているデータのサイズを示していて、

char b[256];
int s = read( fd, b, sizeof b);

a.insert(a.end(),&b[0],&b[s]);

みたいな感じで書いてます。
んで、b最大数来た場合にちゃんと動くか気になったというわけっす。

int s = read( fd, b, (sizeof b)-1);
無難にこれの方がいいですかね?
0546デフォルトの名無しさん
垢版 |
2019/05/13(月) 01:24:36.27ID:RKe/NLvg
visual studioでC++17にしたけどいまいち並列版の使い方が分からなかった
普通にfor回すのと、OpenMP使ってfor並列化するのと、transform(非並列)使うの比較したら
OpenMP>普通にfor≧transform だった
0549デフォルトの名無しさん
垢版 |
2019/05/16(木) 02:02:33.17ID:1v50lv4I
struct AとAを継承したstruct Bがあって
Aの内容をBの共通部分にコピーする方法ってないですか?
A a;
B b = a;
みたいにしたいんですけど親を派生先にキャストはできないので困ってます
0550デフォルトの名無しさん
垢版 |
2019/05/16(木) 02:06:57.91ID:mZDDPYlt
struct B : public A
{
B* operator=(const A& a){ this->hoge = a.hoge;}
};
これ初期時にも使えるんかな
0551デフォルトの名無しさん
垢版 |
2019/05/16(木) 02:25:05.62ID:1v50lv4I
コピーコンストラクタが実装できたとしてメンバ変数は1個ずつコピーするしかないですかね
0552デフォルトの名無しさん
垢版 |
2019/05/16(木) 02:28:08.55ID:mZDDPYlt
スライシングをさせるとか?
安全に?スライシング起こす方法ってあったっけな?
なんか危ういからやろうともしなかったが
0554デフォルトの名無しさん
垢版 |
2019/05/16(木) 06:31:42.80ID:ebJ8HHSX
>>549
初期化時は普通にコンストラクタ初期化リストで A(a) って書けるでしょ。残りのメンバをどうするのか知らんけど。
代入なら static_cast<A&>(b) = a か b.A::operator=(a) で済みそう。
0555デフォルトの名無しさん
垢版 |
2019/05/16(木) 06:33:37.60ID:C3C4SHXA
普通にコンストラクタかオペレーター作ればいいんじゃね
B::B(const &A)
B::operator =(const &A)
A::operator B()
雑なキャストでよければdynamic_cast<A>でおk
0557デフォルトの名無しさん
垢版 |
2019/05/16(木) 11:40:14.21ID:74mGoL8y
>>551
sturctでまとめればデフォルトコピーコンストラクタが使えるけどね。
あとはintとかPODオブジェクトだけだったらmemcpyしちゃうとかも、俺はたまにやるなw
0558デフォルトの名無しさん
垢版 |
2019/05/16(木) 17:20:00.24ID:PgzYowjZ
549です
解決しましたありがとうございます

以下のように書いたら思っていたことが出来ました
(派生先のコンストラクタで親のデフォルトコピーコンストラクタ呼べるの知りませんでした)
代入は現状使う予定がないので大丈夫です
B::B(const &A a) : A(a) {}
0562デフォルトの名無しさん
垢版 |
2019/05/18(土) 13:00:29.63ID:M54jyEoh
大本営がおるで!!!
0563デフォルトの名無しさん
垢版 |
2019/05/19(日) 21:52:57.08ID:sHpfouee
厳密にはC++の質問になるのかよく分からないんですが……
C++プライマーで勉強しててconstexprの部分にさしかかったんですけどコンパイル時評価、コンパイル時に評価される……みたいなことが書いてあるんですがこれの意味がいまいちよくわかりません
実行時評価という言葉も見られるんですがそれぞれの違いとそもそも評価ってどういう処理のことなんでしょうか
それとそもそもconstexprの使いみちが分かりません

よろしくおねがいします。
0564デフォルトの名無しさん
垢版 |
2019/05/19(日) 22:10:21.84ID:H7yZimvS
>>563
評価=機械語による演算。
コンパイル時評価とは、コンパイラ(PCなど)が演算してその結果を成果物に出力すること。
実行時評価とは実行機(スマホなど)でプログラム実行時に演算して利用すること。
0565デフォルトの名無しさん
垢版 |
2019/05/19(日) 22:21:54.17ID:Jw8g2++w
constexprってのは#defineの置き換えのために生まれたんだよ
C++11以前はenum使ってたんだけどなんかかっこわるいから専用のキーワードが出来たってことさ
0566デフォルトの名無しさん
垢版 |
2019/05/19(日) 22:26:05.40ID:yh9Mbv1R
1+2を計算するアプリ作るとするじゃん?
constexpr int a = 1 + 2;って書くじゃん?
でもこれaが3なの分かりきってるじゃん?
アプリをインストールした世界中のスマホでいちいち1+2=3って計算するの資源の無駄じゃん?
だからそういうコードを書いてコンパイルするとコンパイラが最初から「a=3」って埋め込んで世界資源の浪費を防ぐんだよ
これがコンパイル時評価

実行時評価は普通の電卓アプリがやってること
ユーザーが計算したいのは1+2か5×5かlog123456789かは使われてみるまでわからないので、おとなしくスマホのCPUと電池を使って計算する
これが実行時評価
0570デフォルトの名無しさん
垢版 |
2019/05/19(日) 23:25:27.63ID:L0Ufwo4O
constexprはtemplateと組み合わせたときに真価を発揮する。
templateを実体化するときに、型や非型引数に加えて、変数や関数なども活用して複雑な条件をつけ、
実体化するコードをカスタマイズできるようになるからね。
0572デフォルトの名無しさん
垢版 |
2019/05/19(日) 23:36:46.24ID:oSFlthhy
constexpre定数って配列の要素数に出来るということ以外に本質的な意味ってあるの?
そのへんがよくわからない
0576デフォルトの名無しさん
垢版 |
2019/05/19(日) 23:41:56.16ID:yh9Mbv1R
constexpr int f();

constexpr int a = f(); //OK
const int b = f(); //NG

違いってこれだけでしょ
0579デフォルトの名無しさん
垢版 |
2019/05/20(月) 00:13:59.34ID:osDMULGu
constexpr以前でも定数伝搬とか意識して書いてたところはあったはず、でもそれが本当に定数になっているのかはアセンブリ見ないと分からない
constexpr導入によってconstexpr変数の初期化は確実にコンパイル時に実行される、できなければエラー
同様の理由でconstexpr関数(コンパイル時にも実行可能な関数)が導入される
0582デフォルトの名無しさん
垢版 |
2019/05/20(月) 03:36:27.47ID:68OGLTNB
単なる#define定数の代わりとしても名前空間が使える分価値はあるし
例えばconstexprでCRCを計算すれば文字列switchが可能になるとか難しいけど便利ではある
0583デフォルトの名無しさん
垢版 |
2019/05/20(月) 08:10:49.52ID:lEqHTAQ5
それ普通にヘッダーファイル生成コードでも書いた方がいいだろ。。
そっちのが明らかに可読性、デバッグのしやすさ上だし。
こんなもんありがたがってるのはどうせmakeもまともに書けない連中だろう。
0586デフォルトの名無しさん
垢版 |
2019/05/20(月) 12:47:56.71ID:DC309puZ
同じ記述でソースコード内に式が書け関数が使えるメリットは可読性に大きく影響するだろうに
0588デフォルトの名無しさん
垢版 |
2019/05/20(月) 18:36:37.69ID:a9u60dH4
configure なんて外部ツールを使ったソースファイルやヘッダーファイルを生成しまくりですが、新しい車輪の再発明ですか?
0591デフォルトの名無しさん
垢版 |
2019/05/20(月) 19:35:30.06ID:ZjVO7Mes
CMake使ってるけど、いろいろ使いにくい。
0592デフォルトの名無しさん
垢版 |
2019/05/20(月) 19:47:55.36ID:MZiC0WHg
configureより100億倍マシだとは思うけど
それはそうとしてwindowsでpkgconfig使わせて
0593デフォルトの名無しさん
垢版 |
2019/05/20(月) 20:04:37.87ID:IyGiubcZ
CMakeって使いづらいよね
ターゲットの属性指定するのに
属性が先にくるんだもの
0594デフォルトの名無しさん
垢版 |
2019/05/20(月) 21:22:56.75ID:VWEIYE4F
Visual Studio(C#)のプログラミングに関する質問です。

インクルードする2ファイルが、双方のクラスを互いに必要とするケースにおいて、
コンパイルが通らなくて困っています。(当たり前なのですが…)

【Aファイル】
クラスAの定義{
クラスBの使用(インスタンス作成、メソッド利用)
}

【Bファイル】
クラスBの定義{
クラスAの使用(インスタンス作成、メソッド利用)
}

【全体インクルードファイル】
#include Aファイル
#include Bファイル

【コンパイル結果】
Bクラスが存在しません(Aファイルにて)

【質問】
お互いにクラス定義を必要とする場合、
★具体的に★どのような実装をすれば良いのでしょうか?
0595デフォルトの名無しさん
垢版 |
2019/05/20(月) 21:26:14.46ID:lEqHTAQ5
本当に複雑な計算が必要な定数なんてそんな多くないだろうに。。
やっぱバカしかいねーのな。。
0598デフォルトの名無しさん
垢版 |
2019/05/20(月) 22:43:14.24ID:VWEIYE4F
>>596
前方宣言ありがとうございます。猛烈に調べてみます。
0599デフォルトの名無しさん
垢版 |
2019/05/20(月) 23:58:43.37ID:ZjVO7Mes
indexという構造体を作ってstd::vectorにぶち込んだらgcc8でエラーになるのだが。
ダメなん?
0600デフォルトの名無しさん
垢版 |
2019/05/21(火) 00:00:39.50ID:nvUZjTIz
ideoneでやってみると通るんだけどな。
そのままコピペしてもgcc8だと通らない。
なんやねんこれ。
0604デフォルトの名無しさん
垢版 |
2019/05/21(火) 09:38:36.10ID:0u73mqpq
deleteした後のポインタに0やnullを入れることを「仕様」にしないのは何か理由があるんですかね?
0605デフォルトの名無しさん
垢版 |
2019/05/21(火) 09:42:27.71ID:BlBHQ5S4
たとえばポインタのコンテナを扱ってる場合、
deleteしたポインタをコンテナから消そうと思ったら
その仕様だと逆に不便じゃね
0606デフォルトの名無しさん
垢版 |
2019/05/21(火) 09:45:22.82ID:2HB0EGuO
>>604
・ポインタが右辺値だったら意味ないから
・今どきもうユーザーコード内に new, delete は出てこないから
0607デフォルトの名無しさん
垢版 |
2019/05/21(火) 10:02:39.86ID:/yR1kHAO
>>604,606
そんな貴方にスマポ。具体的には unique_ptr, shared_ptr。
0608デフォルトの名無しさん
垢版 |
2019/05/21(火) 10:26:36.33ID:wU6Ws5fl
>・今どきもうユーザーコード内に new, delete は出てこないから
こういう決めつけはどうかと思うんだよなぁ
とか言ったらまた荒れるんだろうな・・

というか理由は単にゼロオーバーヘッドだろ
0611デフォルトの名無しさん
垢版 |
2019/05/21(火) 12:08:41.91ID:om3WDsPR
ポインタを一時変数に代入していた時点で意味無くなるし
void*とかで持っていたらどうするつもりなんだか
0615デフォルトの名無しさん
垢版 |
2019/05/21(火) 19:18:35.44ID:/yR1kHAO
マ的にはナマポは生ポインタです?
0616デフォルトの名無しさん
垢版 |
2019/05/21(火) 22:20:27.03ID:p9O37jGc
ヌルーポ
0617デフォルトの名無しさん
垢版 |
2019/05/22(水) 00:47:45.78ID:a4QDMpfS
>>602
それが、indexという名前がダメらしくて、アンダースコア一本付け足すだけで通るんだよ。
0626デフォルトの名無しさん
垢版 |
2019/05/22(水) 19:31:09.11ID:HXP4tOE0
今をときめく人工知能のライブラリのほとんどはPythonの皮+C++のコアっていう構成だぞ
0629デフォルトの名無しさん
垢版 |
2019/05/22(水) 21:03:12.50ID:a23nlY2Z
>それが、indexという名前がダメらしくて、アンダースコア一本付け足すだけで通るんだよ。
心当たりがありすぎるw
これは外には出せんなw
0630デフォルトの名無しさん
垢版 |
2019/05/22(水) 21:12:32.67ID:omtGQ9bF
>>627
漠然としすぎでよくわからんのだがw
おれの周りだと、重い演算部分だけc/c++でライブラリ化するのはあるけど、
アプリを作るのはないな
c++使える人少ないし
0632デフォルトの名無しさん
垢版 |
2019/05/22(水) 22:42:45.38ID:u7nmxvF3
金毘羅とコンパイラ、どのくらい互換性あるの?
0636デフォルトの名無しさん
垢版 |
2019/05/23(木) 11:31:22.42ID:6zCIietC
>>635
printfはフォーマット文字列を言語ごとに切り替えればいいけど、streamはハードコーディングになってしまう
0641デフォルトの名無しさん
垢版 |
2019/05/23(木) 13:22:43.81ID:ovhRah7H
「Aさんが所有するBをCしますか?」という文章を多言語対応すると、ABCの並びを各言語に応じて変える必要があるでしょ。
書式指定で引数並びを変えることができないprintf()やiostreamでは対応不能。JavaやC#のような対応が正解。
0642デフォルトの名無しさん
垢版 |
2019/05/23(木) 14:02:03.14ID:PBFS7PSY
>>640
streamだと文字列リソースが細切れになってもとの文字列が何だったかよく分からず翻訳者にそのまま渡せないって問題はあるかも。

いずれにしても、c++の文字列formattingは更新が必要
0643デフォルトの名無しさん
垢版 |
2019/05/23(木) 14:25:55.23ID:Y2p7ALG3
string_view、constexpr、templateを使えば、C#風のフォーマットも実現できそうな気はする。
0645デフォルトの名無しさん
垢版 |
2019/05/23(木) 16:05:52.24ID:ovhRah7H
Do you C B that A owns?
0646デフォルトの名無しさん
垢版 |
2019/05/23(木) 18:20:07.46ID:NhdF0b/F
>>643
それはコンパイル時に決定してしまうからだめだな。
ロケール設定に合わせて動的に変えられる仕組みではない
0647デフォルトの名無しさん
垢版 |
2019/05/23(木) 18:37:21.77ID:NhdF0b/F
型指定文字間違えたら簡単に飛ぶscanf系
飛ばないけど書式文字列と書きたい値の型合わせが必要なprintf

まー、ostreamは数値の精度指定とか面倒っちゃー面倒だが
目くじら立てて本質的に駄目って話と違うからなぁ。
0648デフォルトの名無しさん
垢版 |
2019/05/23(木) 18:39:20.26ID:9reHFHA1
結局、eof までデータを読んで vector に格納する、の正しいやり方が分からない。
リードエラーまで気にするのはやり過ぎだとしても、空行がある場合などにも正しく動くものを作るにはどうするべき?
下のコードでダメな場合ある?
駄目じゃないとしたらもっと洗練されたやり方ある?

vector<double> invec(string filename){
 vector<double> A;
 ifstream fin(filename);
 double temp;
 while(not fin.eof()){
  fin >> temp;
  A.push_back(temp);
 }
 return A;
}
0649デフォルトの名無しさん
垢版 |
2019/05/23(木) 18:45:48.03ID:GRcYBCGD
そのコードじゃむしろどのパターンでもダメじゃね
最後がダブって格納される
while(fin>>temp) {
A.push_back(temp);
}
0650デフォルトの名無しさん
垢版 |
2019/05/23(木) 18:57:16.20ID:9reHFHA1
>>649
そのwhileの条件ってtempにEOFが入ったら抜けるってこと?
double型の変数にEOFを入れたら何になるの?
0653デフォルトの名無しさん
垢版 |
2019/05/23(木) 19:42:12.63ID:GRcYBCGD
>>651
いやdoubleの読み込み失敗するからfailになるだろ
空白読み飛ばすだけならeofしか立たないが
0655デフォルトの名無しさん
垢版 |
2019/05/23(木) 22:36:29.02ID:9reHFHA1
>>653
> そのwhileの条件ってtempにEOFが入ったら抜けるってこと?

ではなくて、doubleが読み込めなかったら false になるのですね
ありがとうございます
0656デフォルトの名無しさん
垢版 |
2019/05/24(金) 00:15:40.41ID:oGkYW18h
質問です。
単純なforループ処理の途中でエンターキーを押したらストップ、もう一度押すとスタートみたいなことをするにはどうしたらいいですか?
0657デフォルトの名無しさん
垢版 |
2019/05/24(金) 01:06:43.34ID:Ph/OCthx
対象がコンソールか、ウィンドウかで違う。

conio.h使える環境で、コンソールだったら、_kbhit()と_getch()使えば実現はできるが、ウィンドウプログラムの場合はウインドウの作法に則る。

コルーチンは言ったら、少し楽になる予定??
0660デフォルトの名無しさん
垢版 |
2019/05/24(金) 10:25:59.77ID:Ph/OCthx
>>659
MITライセンスな〜〜っ。
暇だから書いたけど、自分の環境のVS2017だとこれしかわからない。
環境依存ちょびっとあるからご注意。

#include <iostream>
#include <cstdint>
#include <limits>
#include <thread>
#include <conio.h>

int main() {

for (std::intmax_t i = 0; i < std::numeric_limits<std::intmax_t>::max(); i++) {
std::cout << i << "\r";
if (_kbhit()) {
_getch();//output first key in.
std::cout << "Wait key in."<<"\r";
_getch();//wait next key in.
std::cout << " "<<"\r";
}
}

return 0;
}
0662デフォルトの名無しさん
垢版 |
2019/05/24(金) 10:52:12.22ID:Ph/OCthx
>>660
スレッドスリープするかもと思って、threadのヘッダーはいってるけど。使わなかったのを忘れていた。
0663デフォルトの名無しさん
垢版 |
2019/05/24(金) 14:04:30.69ID:ff7E+a9X
独自定義したクラスAのlistに、プッシュした場合、新しいインスタンスが作られる?それともアドレスの代入??

list<A> List=new.....;
A a();
List.push(a);
0665デフォルトの名無しさん
垢版 |
2019/05/24(金) 14:30:44.82ID:h/Cubnb+
>>649,653,655
俺は個数指定して読み込むということしかやったことないんだが、この方法って他の型でも使えるの?
int だったら
> doubleが読み込めなかったら false になる
というのが成立しないように思えるのだが
0667デフォルトの名無しさん
垢版 |
2019/05/24(金) 14:42:16.00ID:FKmlSCsi
>>665
doubleじゃなかったら、じゃなくてEOFを読んだらfalseになるんだろ
こういうのお洒落なやり方だと思うがなんとなく怖いから俺も個数決めてやってるよ
スタンスの問題
0668デフォルトの名無しさん
垢版 |
2019/05/24(金) 15:28:08.39ID:YkjJvwKv
まあテキストファイルと言っても普通はフォーマットがもっと厳密に決まっているから、一行読み込んでパースしてって感じでやるな
エラー起こったときにこれじゃ行数すら出せないし
0669デフォルトの名無しさん
垢版 |
2019/05/24(金) 15:34:20.96ID:YkjJvwKv
その場合でもgetlineをwhileの中にいれておけば期待した動作になる

最後の行に改行があろうが無かろうがうまくいく
0671デフォルトの名無しさん
垢版 |
2019/05/29(水) 18:18:13.81ID:hag6qvkh
mainより上で

struct test{int x=0};
struct test obj;
obj.x=99;

ってやると三行目がエラーなんだけどなんでダメなん?
技術的になんでダメなのか教えてください
0672 ◆QZaw55cn4c
垢版 |
2019/05/29(水) 18:41:42.94ID:8RGCI467
>>671
関数の外で
a = 2;
とか
a = a + 1;
は書けません
0674デフォルトの名無しさん
垢版 |
2019/05/29(水) 19:17:03.50ID:Rr995jUT
DOUBLEのSACHIKO。
0682デフォルトの名無しさん
垢版 |
2019/05/30(木) 23:16:18.93ID:z7aQRPDh
実数と複素数のジェネリックプログラミングってどうやるの

実パラメータの数が違うから、結局ほとんどの機能を特殊化してるんだが
0684デフォルトの名無しさん
垢版 |
2019/05/30(木) 23:19:32.75ID:s4B+etfT
複素数と実数をジェネリクスでまとめると大抵死ぬぞ。
行列ライブラリなんかも基本別関数だから。
0686デフォルトの名無しさん
垢版 |
2019/05/31(金) 19:07:02.02ID:5tY3IGQl
ジェネリック医薬品。
0689デフォルトの名無しさん
垢版 |
2019/05/31(金) 22:41:35.25ID:8uAssd9+
理由?やる理由がないからだよ
できるからというだけの理由で無駄な汎用性を持たせようとして無駄に複雑で使いづらい糞が生み出されて結局使われないパターンを嫌というほど見てきたわ
0690デフォルトの名無しさん
垢版 |
2019/05/31(金) 22:51:46.17ID:YZ9ZViZw
うーんそういうもんかね

ある型について定義したジェネリック関数群全てを特殊化するはめになって
もうこれ型パラメータの意味ほぼねぇな
ってなったことはあったけど
0691デフォルトの名無しさん
垢版 |
2019/06/01(土) 01:01:06.10ID:jOO/UBvi
パワー系がいて、通り過ぎる人が眼鏡をかけていれば「メガネ、メガネ」、胸の大きい女性なら「オッパイ、オッパイ」と特徴を呟いていたんです。
私は「ヒゲ」と言われたのですが、ひげ生やしていないんですよね。
誰かこの暗号解ける?
0694デフォルトの名無しさん
垢版 |
2019/06/01(土) 01:34:23.92ID:5ncHXmxx
std::complex使えばおおよその計算はdoubleその他と共通化できない?
虚部実部を見に行かない範囲ならなんとか
0695デフォルトの名無しさん
垢版 |
2019/06/01(土) 07:39:23.04ID:gFsX3PNG
そこまで無理に場合分けして共通化させるなら初めから
独立に定義したほうがいい。
しっかり勉強してきた奴ほど無理やり継承ツリーでまとめようとする傾向にある。
それが行き過ぎると無駄なジェネリックの登場となる。
0697デフォルトの名無しさん
垢版 |
2019/06/01(土) 08:43:52.63ID:QzRnFnM6
コルモゴロフ複雑性は計算不能なのだから
プログラムのあるべきコンパクトさについて一般論は存在しない
この点プログラムの記述方法の選択はまさに個々人のセンスに依存したartであり
真に人間らしい営みであると言える
0698デフォルトの名無しさん
垢版 |
2019/06/01(土) 09:38:35.51ID:zEOJGQ26
仮に実数と複素数を継承関係にさせるとして、どっちを親にすべきかで広い合意は取れないからな
円楕円問題と同じ
0699デフォルトの名無しさん
垢版 |
2019/06/01(土) 11:24:10.29ID:x6StDmNU
たとえすべての関数を特殊化することになったとしても、大部分のifを共通化できるはずで、他のクラスのテンプレ引数として区別なく使えるようになるからそれなりに意味はあるでしょ。
0700デフォルトの名無しさん
垢版 |
2019/06/01(土) 13:24:21.51ID:ws//1RZ4
意味はないよ
そもそも複素数なんて仮にそれを多用する分野のタスクだったとしても実数に比べて使用頻度は低いんだから、
タスクで本当に必要なものだけを実装すればよい
0701デフォルトの名無しさん
垢版 |
2019/06/01(土) 14:00:28.34ID:jOO/UBvi
いや、実数が使えたためしがないから、俺の爺ちゃんが量子を考案したのだが。
0703デフォルトの名無しさん
垢版 |
2019/06/01(土) 14:38:11.54ID:jOO/UBvi
高校のとき、心のお兄ちゃんとか心の妹とか流行ってたな。
0704デフォルトの名無しさん
垢版 |
2019/06/01(土) 15:52:18.02ID:gFsX3PNG
29=(5+2i)(5-2i)
こんな風に因数分解して欲しくケースなんてほとんどないだろ。
変にポリモルフィックにやるべきじゃない。
0706デフォルトの名無しさん
垢版 |
2019/06/01(土) 16:28:52.97ID:gFsX3PNG
は?c++でジェネリクスやろうとすればデフォルトで使うことになるだろ?
ボケちゃったのかな?
0707デフォルトの名無しさん
垢版 |
2019/06/01(土) 16:40:59.16ID:vdsZQvk5
えっそうなの?
C++でジェネリクスてtemplate使うから継承とか関係なくね
例えば実数と虚数に対応するplus関数を作るとしてどういう実装を想定してんの
0709デフォルトの名無しさん
垢版 |
2019/06/01(土) 18:35:49.34ID:y869pNJN
conceptはともかく現行のc++のそれを構造的部分型とは言いたくない気持ちがあるのは分からないではない
0710デフォルトの名無しさん
垢版 |
2019/06/01(土) 20:21:39.08ID:HfNJIaau
マルチエージェントシミュレーションをしたいんですけど、環境と個々のエージェントのクラスはどういった関係で持てばいいんでしょうか
現在はエージェント・環境の全部のインスタンスを進行を行うクラスに持たせています
しかし個々のエージェントが相互の情報を知りたいときに相互にアクセスできるようにするにはどうしたらいいでしょうか?

全てのエージェントが全てのエージェントの参照を手にするのはどこで書き換えが起こるか分からなくなるのでしたくありません
0711デフォルトの名無しさん
垢版 |
2019/06/01(土) 20:32:54.41ID:ws//1RZ4
>>710
お前は街にいる人間全員のパンツの柄を知っているのか?
意味のあるシミュレーションをやるからにはエージェントが知ることのできる情報の範囲や内容は明確に定義されていなければならないはずだろう
その定義に従った情報を取得する手段がエージェントに提供されていればよい
0715デフォルトの名無しさん
垢版 |
2019/06/01(土) 21:14:55.91ID:wq+pItFK
>>712
神クラスが更新対象のエージェントと周囲の各エージェントとの距離を予め計算し、更新対象のエージェントに計算結果のセットを渡す
そして更新対象エージェントはその結果セットの内容のみに従った行動をするだけ
それをエージェント毎、ステップ毎に繰り返す
実際に必要とされるまで計算を遅延する等、効率化のための実装の工夫は必要だろうけどね
0716デフォルトの名無しさん
垢版 |
2019/06/01(土) 23:30:04.77ID:vdsZQvk5
あらゆる数値型二つを引数にとるdistance関数を定義しろ
あとは二人の心の位置を表す型で特殊化しろ
0717デフォルトの名無しさん
垢版 |
2019/06/02(日) 10:02:04.84ID:+QRUS/U1
STGの当たり判定やガンパレの頭から伸びるラインだろ
神のような仲介者mediatorを置けばいい
0719デフォルトの名無しさん
垢版 |
2019/06/02(日) 11:44:35.03ID:JfX2j2vB
神クラスが全エージェント間の距離を計算し続けるのはエージェントN個の完全グラフの枝
N*(N-1)/2個の長さを更新し続けるということであっていかにも無駄が大きい少なくともエー
ジェントが置かれる環境のデータ表現と「互い」とは何かが定義されねばならないありがちな
環境表現としては二次元座標のリストとか正方形や六角形のセル表現とかがありがちで「
互い」というのは普通はエージェントの感覚器と環境(遮蔽物とか)とのインタラクションで規
定されるように作るからそういったブツもシミュレートせよ
0721デフォルトの名無しさん
垢版 |
2019/06/02(日) 15:22:27.64ID:aSoefH8n
質問よろしいでしょうか?CORBAってもう古いですか?

CORBAのサンプルをこねくり回して送受信するオブジェクトを2つと一時停止や終了をコントロールする
オブジェクトを作ったのですが、お互いに送受信すると思ったら片方が送信しまくって受信が検出できな
いようで困ってます。送信を止めると前に送ったものを受信します。
送信する時に少しsleepを入れると遅いですが思った通りの動きになります。
出来ればsleepなしで動いてほしいのですが、omniORBって同時に送受信できないのでしょうか?
0723デフォルトの名無しさん
垢版 |
2019/06/03(月) 21:34:05.54ID:76rl+S7D
d1の実部 d1の虚部
d2の実部 d2の虚部
...



d1
d2
...

というフォーマットのファイル(の名前)が与えられたときに、前者なら複素数として、後者なら実数として読んで vector に格納する関数ってどう書くべきでしょうか
0724デフォルトの名無しさん
垢版 |
2019/06/03(月) 22:02:24.30ID:NMMhu3n8
auto f(std::filesystem::path const& n)
{
using T=double;
auto ret=
std::vector<std::complex<T>>{};
std::ifstream in(n);
std::string line;
while(std::getline(in,s)) {
std::istringstream ss(s);
T r{},i{};
ss >> r >> i;
ret.emplace_back(r,i);
}
rerurn ret;
}
0726デフォルトの名無しさん
垢版 |
2019/06/04(火) 11:04:36.97ID:stwnRIgs
【速報】金券五百円分とすかいらーく優侍券をすぐもらえる 
https://pbs.twimg.com/media/D8I_oeBUIAc0a-m.jpg   
   
@ スマホでたいむばんくを入手  
A 会員登録を済ませる   
B マイページへ移動する 
C 招待コード→招待コードを入力する [Rirz Tu](スペース抜き)     
  
今なら更に4日18時までの登録で2倍の600円の紹介金を入手     
クオカードとすかいらーく優待券を両方ゲットできます。   
    
数分で出来ますのでぜひお試し下さい     
0727デフォルトの名無しさん
垢版 |
2019/06/04(火) 12:18:01.44ID:ZmMHo7YV
valgrindって今も使われてますか?
通信にBoost.MPI、ファイル入出力にHDF5を使う並列プログラムをInfinibandなネットワーク環境で走らせてるんですが
valgrindにかけるとアホみたいにエラーが出てうんざりします。
シコシコSuppression Fileを用意するしかないんですかね
0729デフォルトの名無しさん
垢版 |
2019/06/04(火) 16:02:32.14ID:puihIuc4
vectorなりstringなりの各要素をfor文で回すとき何も考えずに例えば
for(int i = 0; i < v.size(); ++i)みたいなコード書いてたんだけどさ
C++プライマーで勉強してたらやっぱsize_typeとかautoとかイテレーターとか使ったほうがいいのかなぁって
signedかunsignedかなんてまず問題にならないようなちょっとしたループでも気をつけるべき?気をつけてます?
0733デフォルトの名無しさん
垢版 |
2019/06/04(火) 19:17:46.45ID:Gdf9cmgA
要素インデックスを表現する変数にはint型を使わずsize_t型を使うようにする、とかかな。
nposによる未検出判定があるから仕方なしにだけど。
0734デフォルトの名無しさん
垢版 |
2019/06/04(火) 20:55:52.96ID:5jXXyAl7
んなくだらんことで悩むくらいならその外側で監視するコードでも組んだ方が100倍生産的だわ。
0735デフォルトの名無しさん
垢版 |
2019/06/04(火) 21:36:28.65ID:u5rIm+gJ
ループ変数にsize_t使うのを徹底しようと思い立ったことも昔あったけど
operator[]とかにsize_t変数入れると「intじゃない!!!ムキー!!!」って警告ほざくクソライブラリがこの世に多すぎて挫折した
0736デフォルトの名無しさん
垢版 |
2019/06/04(火) 21:46:44.91ID:Gdf9cmgA
今や64bitコンパイラが普通だからintよりも暗黙な64bit対応としてsize_tを使うこと増えたんじゃないかな。
intみたいな32bit変数のままだとコンパイル時に警告が大量に出るし、とりあえず無難にsize_tにしとくわ的な感じになってる。
0743デフォルトの名無しさん
垢版 |
2019/06/05(水) 00:02:44.18ID:4AufAgsU
BigInteger書いてるんだけど、補数表現がわけわかめで死にそうになってる。
ウィキペディア頼りで加減算はできたけど、掛け算どうやるねん。

そこで、補数で小学生にもわかるレベルの補数表現の解説プリーズ。
0744デフォルトの名無しさん
垢版 |
2019/06/05(水) 00:24:44.84ID:oecfF/bP
そのままunsigned同士の掛け算すればいいんじゃね?
で長くなったbit数の結果からMSBから変わる直前まで好きなように切り詰める。
0745デフォルトの名無しさん
垢版 |
2019/06/05(水) 01:13:53.17ID:UjRB/6p5
>>743
とりあえず4bitで正数、負数を使った四則演算を手で紙に書いて解いてけば理解できないかな
0750デフォルトの名無しさん
垢版 |
2019/06/05(水) 16:43:40.53ID:gnp+gTKs
>>747
インディーゲームデベロッパでリモートワーク・・年収500万から800万・・・
怪しい匂いしかしない・・
0752デフォルトの名無しさん
垢版 |
2019/06/05(水) 17:22:41.48ID:EHQtou0g
void func(int& n){...}
int main(){int a = 0; func(a)}
こんな感じで関数の引数が参照のとき呼び出す側は変数そのまま突っ込みますよね
これなんで&aにしないんですかね。型がちげーよって怒られそうなもんですが
基本的なことだと思うんですけどどうもググっても大丈夫な理由が見つからないもので

そもそも
int val = 0;
int& refval = val;
みたいな書き方もしますよね。やっぱり左右で型違うよねって
ポインタならint* p pval = &valって&つけるのに。どうなってんでしょ
0756デフォルトの名無しさん
垢版 |
2019/06/05(水) 19:47:28.87ID:vfI9OlW2
template <auto N>とかできるんだな。
0757デフォルトの名無しさん
垢版 |
2019/06/05(水) 23:39:10.84ID:g8AzjXwK
カッコつけずに byref とか予約語作ればよかったんだよ。
同様に関数の後に=0でpure virtualとかバカジャネーノ。
0759デフォルトの名無しさん
垢版 |
2019/06/05(水) 23:55:20.60ID:PbZwo6fr
参照ってもともと演算子オーバーロードのための機能なので
呼び出し側でなんかさせるわけには行かなかったんだよ
0764デフォルトの名無しさん
垢版 |
2019/06/06(木) 06:49:58.29ID:VYs0Fl5K
>>761
= 0 だけならまだしも
= default とかあまり深く考えてなくね?
まあ後付で言うのは容易いよな
って言われたらぐうの根もでないがw
0765デフォルトの名無しさん
垢版 |
2019/06/06(木) 07:01:39.10ID:PF44iNdb
Cの古い文法を(ほぼ)そのまま残した上にC++を作ったから
いきなりC++から勉強すると気色悪いと感じる面もあるかもな。

ポインタと参照が同時期に言語に入ってたら、
int a; // 通常の変数
int &ra = a; // 参照
int *pa = a; // &演算子なしで暗黙にポインタに変換
てな書き方になってたかも知れん。

void func(int n);
void func(int *pn);
void func(int &rn);
これらは曖昧で解決できない、になってたかも。
0766デフォルトの名無しさん
垢版 |
2019/06/06(木) 08:16:40.59ID:YZj7S1bc
>>765
ポインタのポインタやキャストのこと考えたら、その例のような暗黙のポインタ変換とか持ち込むとかえって混乱やミスの元になりそうだし、現状の仕様もしかたないものかなと思うよ
0768デフォルトの名無しさん
垢版 |
2019/06/06(木) 10:41:12.25ID:VbLHIWhF
参照引数に結果を代入とかたまに使うけど呼び出す側から分かりやすいようにC#のout修飾子とかほしい
0769デフォルトの名無しさん
垢版 |
2019/06/06(木) 11:48:51.90ID:CNru8FH6
C#のoutは言われてみれば確かにって感じだけど、そうやって問題提起されるまではそもそも当然すぎて問題だと思われてなかったんだろうね
引数に代入することで呼出元へ値を返すのってfortranとかの時代から続く悪しき伝統だから
0774デフォルトの名無しさん
垢版 |
2019/06/06(木) 13:52:14.20ID:CNru8FH6
>>772
問題はそこじゃない
呼出元のコードだけを見たときにソース上で区別がつかないだろ
C#のoutは呼出元にも付ける必要があるんだよ
C++でも出力引数に参照渡しを使うことは禁止しポインタを使う流派があるが、
あれも呼出元を見たとき書換えの可能性の有無を&の有無だけで判別できるようにするのが目的
0776デフォルトの名無しさん
垢版 |
2019/06/06(木) 17:40:39.24ID:AdzMW0EL
class Person
{
public:
Person& set(int);
private:
int age;
}

Person& Person::set(int num)
{
age = num;
return *this;
}

*thisを返す関数ってことで大雑把にこんな感じのサンプルが本に出てました
メンバーセットするだけならわざわざ本体の参照返す必要無くない?voidで良くない?って思ったんですけど何かメリットってありますか?
0777デフォルトの名無しさん
垢版 |
2019/06/06(木) 17:45:07.81ID:Yj1l17Nf
基本的には複数の値を戻したいならtuple返すべきだし、オブジェクトの状態を書き換える関数はそのオブジェクトのメンバにするべき
データ構造体を一部書き換えるような処理は、書き換えじゃなくて新しいのを作って返した方が読みやすいし効率的なことも多い
全部が全部そうとは言わないけど、参照引数は書き換え分かりにくいってブーブー言う奴のコードって大体汚いイメージある
0778デフォルトの名無しさん
垢版 |
2019/06/06(木) 17:49:48.99ID:Yj1l17Nf
>>776
operator=系は組み込み演算子と挙動合わせるために*thisを返すことが多い
今はあんまり推奨されないけどif(a=foo())とか書けるようにね

その例はif(p.set(40))とか書きたいのか、operator=系の話と混同してよく分からずに適当に書いてるか、そのどっちか
0779デフォルトの名無しさん
垢版 |
2019/06/06(木) 17:52:12.08ID:zzmbMYQ4
>>776
メリットとは言い難いがこんなことが出来る。
a.setx(1).sety(2);

参考書でそれをやるならoperator演算子でやるべきだったな。
0781デフォルトの名無しさん
垢版 |
2019/06/06(木) 18:04:35.29ID:WQTF5R5g
C++の言語仕様にケチつけたところでどうにもならんでしょ。
なにがしたいの。 >>2 にある「すっぱい葡萄」な人?
0782デフォルトの名無しさん
垢版 |
2019/06/06(木) 18:13:42.57ID:BJpCSJfe
呼び出し側の制約がしたいならtemplateでちょこっと書けば出来るし
template<typename T>
struct Out {
T& ref_;
explicit Out(T& ref_):ref_(ref_){}
T& operator()() const{return ref_;}
};
template<typename T>
inline auto out(T& ref_for_out)
{
return Out<T>(ref_for_out);
}

void func(Out<int> const& v)
{
v()=1;
}

int main()
{
int i;
//func(i);
func(out(i));
}
0784デフォルトの名無しさん
垢版 |
2019/06/06(木) 20:12:37.34ID:cbON3Xt8
>>761
専門家の意見は奴がもう少し構文解析勉強してればって意見だがな。
権威だけ気にするバカがほんと増えたね。
0786デフォルトの名無しさん
垢版 |
2019/06/06(木) 21:33:19.25ID:9wGcGWUm
>>777-779
ありがとうございました。本は定評のあるC++プライマーなんで多分私が書いた例がなんかおかしいんだと思います
演算子オーバーロードは今やってるところではまだ出てきてないですね。>>779は実際本にも出ていましたがやはりそれがわかりやすいメリットになりますか
0789デフォルトの名無しさん
垢版 |
2019/06/07(金) 06:54:43.17ID:CBwJTjr/
メソッドチェーンって便利か?
>>779
> a.setx(1).sety(2);

a.setx(1);
a.sety(2);
って書けばいいだけだよね?
0791デフォルトの名無しさん
垢版 |
2019/06/07(金) 07:45:42.22ID:51aJPRpO
2個くらいならいいが
10個くらいつなぐやついて長すぎて改行するから結局同じ
0793デフォルトの名無しさん
垢版 |
2019/06/07(金) 07:59:02.43ID:qUGReS69
メソッドチェーンの利点で調べてみたら名前付き引数みたいなことが可能とあったな。

//メソッドチェーンで設定してない値は初期値を使用
//コンストラクタとは違いチェーンしてるので値の設定の順番は自由

void test(data().year(2019).manth(12).day(24));
void test(data().manth(12).day(24).year(2018));
0796デフォルトの名無しさん
垢版 |
2019/06/07(金) 08:09:00.14ID:qUGReS69
>>795
重複したら後の方が優先されるし、抜けた分は初期値を使用するし...

ただし、それだけのためにクラスを作る手間はデメリットだと思う。

あくまで使い方の一例
0798デフォルトの名無しさん
垢版 |
2019/06/07(金) 10:10:37.57ID:CBwJTjr/
>>796
> 重複したら後の方が優先されるし、抜けた分は初期値を使用するし...
だからいいってか?
抜けた部分はともかく重複をエラーにできないのは名前付引数に比べてデメリットでしかないだろ
0801デフォルトの名無しさん
垢版 |
2019/06/07(金) 10:34:36.93ID:9H5/9dgd
ようするにラムダ式をチェインさせればいいんだろ
かんたんじゃん
Lispの時代に近づいてるだけだ
0802デフォルトの名無しさん
垢版 |
2019/06/07(金) 10:35:22.44ID:aX0Y7AKm
>>798
理想的な名前付き引数が存在するなら「名前付引数に比べてデメリット」といえるんだろうけど、
C++には名前付引数ないよね?
0803デフォルトの名無しさん
垢版 |
2019/06/07(金) 11:29:19.04ID:O2O1gPjv
メソッドチェーンとかいらんわ
リファクタリングしにくいし
Kotlinのapplyがベスト
0804デフォルトの名無しさん
垢版 |
2019/06/07(金) 11:30:58.83ID:dp7q4wQg
横に長いのがいやなんだよな
多少冗長でも縦の方がいい
特になっがいメソッドチェーンで途中から返り値変わってるやつとか殺意わく
0807デフォルトの名無しさん
垢版 |
2019/06/07(金) 12:25:28.59ID:CBwJTjr/
>>799
行数増えるのになんの問題があるんだ?
横に長いとか見辛いし差分も取りにくいしメリットないだろ
0809デフォルトの名無しさん
垢版 |
2019/06/07(金) 14:45:14.80ID:8IyUxlC9
ところで>>776のような return *this; だとコピーが発生しないか?
return this;; として->でメソッドチェーンにするのならわかる
0811デフォルトの名無しさん
垢版 |
2019/06/07(金) 15:25:18.97ID:adznp1U4
>>810
普通はメソッドチェーンとかいらんけど
GUIのライブラリとかはそっちのほうが使いやすそうな気がする
0813デフォルトの名無しさん
垢版 |
2019/06/07(金) 15:59:52.88ID:Qcue35T9
sortの比較関数についてなんですけど
たとえばvector<int> v = {0, 1, 2, 3, 4, 5}があったら
bool compare(const int& num1, const int& num2) { return num1 > num2; }
sort(v.begin(), v.end(), compare)で降順になりますよね

なるほど、0< n < v.size()でどのv[n]とv[n+1]でもcompareがtrueを満たすように
並び替えてくれるんだな、って理解したんです
それで試しに
bool compare(const int& num1, const int& num2) { return num1 == (num2 + 1); }
って書き換えたんですけど降順になってくれないんです
どのv[n]もv[n + 1] + 1に等しい→降順になると思ったんですけど

評価関数ってどう理解したらいいんでしょう?
0814デフォルトの名無しさん
垢版 |
2019/06/07(金) 16:06:41.20ID:adznp1U4
pred内でprintfデバッグでもしてみたら?
n番目ととn+1番目の要素以外でも比較が発生しているのがわかるから。
0815デフォルトの名無しさん
垢版 |
2019/06/07(金) 16:47:23.38ID:StFsiGGy
比較関数の右辺と左辺が入れ替えて比較した結果が矛盾してると、ソートは意図しない挙動になる。当たり前ではあるけど。
0816デフォルトの名無しさん
垢版 |
2019/06/07(金) 16:52:15.04ID:RgT+kAkp
>>813 俺も理解せずに言葉だけ覚えてるんだけど、
比較関数の性質として「狭義の弱順序」を示さなくちゃいけないのだ。

「狭義の弱順序」でネット検索すれば分かると思うよ。
少なくとも俺の場合「自分には(今のところ)理解できない」ことが分かった。

…て言うか、誰か分かりやすい解説サイトなど紹介してください。
0819デフォルトの名無しさん
垢版 |
2019/06/07(金) 20:05:15.50ID:RHh4qcVs
関数チェイン入るんかいな。
任意のコンテナにチェイン出来るフリー関数を書きたいお年頃なオレ。
0824デフォルトの名無しさん
垢版 |
2019/06/07(金) 21:57:41.25ID:PFCjrauz
質問です。

std::remove_ifは実際には要素の削除を行わない。
https://qiita.com/naka4/items/1f207b5d6acf102b0db7
「削除する要素を詰めて、サイズが縮んだコンテナの新しい終端イテレータを返す」
とのことですが

vector<shared_ptr<T>>の場合、その挙動に従わない場合があって困惑しています。
下記のコードで、erase()する前にCのデスタラクタが呼ばれているのは何故ですか。
https://ideone.com/7rp1Os

たぶんムーブの挙動の絡みのナニカだとは思うのですが…


また、この挙動はどう解釈すべきですか?
特に気にせずこのままremove_if→eraseは問題ないのか?
または規格に照らし合わせてNGだったり危険だったりするものでしょうか?
0825デフォルトの名無しさん
垢版 |
2019/06/07(金) 22:07:56.01ID:bSdf4jBS
最初はsp(10)sp(11)sp(12)sp(13)sp(14)
remove_ifするとsp(10)sp(11)sp(13)sp(14*)sp(14*) (*は共有)
sp(12)の参照カウンタがなくなったので破棄される

普通の挙動では?
0828デフォルトの名無しさん
垢版 |
2019/06/07(金) 22:21:39.08ID:RHh4qcVs
参照カウンタ増やさない方法で移動されてるのかな??
インプレースだから、扱いが雑な気がする。
0829デフォルトの名無しさん
垢版 |
2019/06/07(金) 22:25:21.08ID:bSdf4jBS
まあremoveの外側はunspecifiedだからどうするかは実装の勝手
雑に扱われてても文句は言えない
0830824
垢版 |
2019/06/07(金) 22:34:00.62ID:PFCjrauz
各位、どうも
なんとなく分かってきました
cpprefjpでも「有効だが未規定な値」とのこと
実装依存で参照カウントが減ってゼロになるときもあるよ、そういうmoveもされ得るよ
ということですね

とりあえず返却されたイテレータが示す範囲は正常だと思うので
erase()はそのまま使う方向でいってみようと思います
0831デフォルトの名無しさん
垢版 |
2019/06/07(金) 22:56:05.74ID:khSrdsPe
雑とかそう言う話ではなく
remove_ifの実装でremove後の空きshared_ptr部分に後の要素をどうやって詰めているかだけの話
swapじゃないなら、代入にせよmove代入にせよ、その場で参照カウント減ってデストラクタが呼ばれるよ
0832デフォルトの名無しさん
垢版 |
2019/06/07(金) 23:01:56.95ID:RHh4qcVs
実装がとある一つなのだから、変数に持ち直してやるのもオーバヘッドがーという場合もある。
コンテナ上の空き領域の作り方も幾つかあって、
今回は疑似ポインタだからコピーが軽いけど、実態をいじるときは涙目になるきがす。

実装を定義してないはずだから言いようはいくつかあるけど、
インプレースでやるときは面倒だということだけ知っておけばよい気がする。
0833デフォルトの名無しさん
垢版 |
2019/06/08(土) 01:15:29.93ID:B4mMYyrz
整数の事情って結局どうするのが正しいの?
powは遅いだの何だの以前にdoubleとの間で一々キャストするのが姿勢として正しいように思えない

マクロでやってる人が多い?
0836デフォルトの名無しさん
垢版 |
2019/06/08(土) 08:59:01.58ID:JxaHk6L1
>>833
整数値で指数みたいな物を扱う場合、簡単にオーバーフローが起きるので
本気でやるとしたらだいぶ恣意的なサイズ区切りを入れることになる。
そんなことやるくらいなら浮動小数からのキャストのがだいぶ楽だし実装も安定する。
0842デフォルトの名無しさん
垢版 |
2019/06/08(土) 18:23:48.07ID:81RPqzS0
整数の冪は速度云々よりオーバーフローが気になる
100を5乗しただけであっという間にuint32_tをぶっちぎるんだぞこえーよ
0843デフォルトの名無しさん
垢版 |
2019/06/08(土) 20:11:59.83ID:KGab8pqO
n乗してオーバーフローする整数は予め求められるんだからn乗する前に判定するだけだろ
0849デフォルトの名無しさん
垢版 |
2019/06/09(日) 02:20:42.24ID:49FyDaAW
C++知らないことが多すぎてちょっと勉強するだけでもあーあそここれ使って書いてればよかったーってなることばっかりだわ
しばらく前に書いたコード見直したくねぇ
0852デフォルトの名無しさん
垢版 |
2019/06/09(日) 02:57:41.57ID:bDrC2N4p
それはない
コンテナはやっぱり便利
動的ポリモーフィズムは必要ねえなぁ
テンプレートで十分
0853デフォルトの名無しさん
垢版 |
2019/06/09(日) 03:16:06.77ID:/cpSAd8E
>>836
modpowは自分のライブラリとして持ってるので、それ使うことにすれば良いですかね
機能過多な感じもしますが


>>837

普通の挙動ですよね?


>>839
ありがとうございます。読んでみます
結果によっては素直にpowを使うことにします


>>840
今はマクロでそうしてます
0854デフォルトの名無しさん
垢版 |
2019/06/09(日) 09:31:54.10ID:/FZVYwra
テンプレートもそろそろガンだってことが普通に認識されるようになるだろうな。
標準のテンプレートだけ使ってりゃいいんだよ(それでも使いこなせないだろうが。)
バカの作るテンプレートライブラリほどひどいものはない。
0855デフォルトの名無しさん
垢版 |
2019/06/09(日) 10:15:07.88ID:Gi1Jt9cY
そりゃ堂々巡りの言い方だろ
酷い奴の作るテンプレートライブラリは酷い。そりゃそうだ
テンプレートライブラリが酷けりゃ作ったヤツは酷い。こうなるわな
0856デフォルトの名無しさん
垢版 |
2019/06/09(日) 10:55:06.08ID:jMWe1oeX
>>852
>動的ポリモーフィズムは必要ねえなぁ
データの通りにオブジェクト作るような設計一切出来ないぞ
0858デフォルトの名無しさん
垢版 |
2019/06/09(日) 12:52:56.51ID:Oof3fMf0
いやテンプレート「ライブラリ」ともなれば十分な機能と性能と使いやすさを全立させるには必要スキルがダンチになる印象

そうではなくて問題に特化した形でテンプレートを使ってコードの記述量を激減させることは常人のもできる
ただし他人に理解してもらうのが困難になるからそういのうはモジュール内に囲ってテンプレートそのものを外に出さなければ宜しい

もし使いにくいとか理解しがたいだけでなく動作品質に問題があるなら、
その場合は問題のある人物が取り替えられる方向へと管理者のソーシャルスキルの発動の時間である
0860デフォルトの名無しさん
垢版 |
2019/06/09(日) 15:35:10.73ID:oBKk3YD0
正直アプリレイヤーでテンプレートを駆使したライブラリを作ることはあんまない
使う側からすれば便利な仕組みだわ

これがライブラリを提供する側になると途端に言語仕様と環境との闘いが始まる
0864デフォルトの名無しさん
垢版 |
2019/06/09(日) 16:02:49.06ID:P23LzvOV
テンプレートは、コンパイラのエラーや警告が意味不明なのが玉にキズ。
0866デフォルトの名無しさん
垢版 |
2019/06/09(日) 16:17:48.67ID:Q5Gsequk
>>861>>865 は文面は異なれど、意図として
同一の内容を繰り返してるような気がするんだが。
「同じ話を何度も投稿する人に対する敵意」ってくくり。

これは単なる感想(自己言及的で面白い)だけどね。
発言に対しての賛同でも否定でもなく。
0869デフォルトの名無しさん
垢版 |
2019/06/09(日) 19:35:59.29ID:5fLgSAOM
だったら無駄なことしてないで直接乗り込んで二度とライブラリを作れないようにしてこいやゴミ
0870デフォルトの名無しさん
垢版 |
2019/06/09(日) 20:34:56.29ID:Oof3fMf0
1. より優れたライブラリを提供すれば良い

2. 労力の関係で0スタートで新規作成は無理ということであれば
  糞ライブラリをうまくwrapしてせめて使いやすい形にして見せれば良い

3. 2の場合も中身は追って作り直すこと
0871デフォルトの名無しさん
垢版 |
2019/06/09(日) 21:12:37.07ID:Gi1Jt9cY
4. 自身の頭脳がへっぽこだと、高度すぎるライブラリは全く理解できない。
 自分が使いこなせないものはダメである。
 わたしの頭のレヴェルに合わせろ。
0872デフォルトの名無しさん
垢版 |
2019/06/09(日) 21:22:41.55ID:/FZVYwra
俺なら使いこなせるって持ってきたやつが一番使えてないパターンなんだが。。
0874デフォルトの名無しさん
垢版 |
2019/06/10(月) 00:33:49.15ID:3V4oen/z
エモーショナルエンジン搭載。
その日の気分で結果が変わります。
0876デフォルトの名無しさん
垢版 |
2019/06/10(月) 08:57:25.07ID:SLwWwvWV
仕事で無駄に時間かけてテンプレート使ったライブラリ(という名のほぼ何もしないクソコード)書かれたら殺意も湧くだろうな、ネットでもそういうのはたまに見かける

熟練者が長年かけて作った、良くできたフリーのライブラリしか知らんアマチュアの人にはわからんかもしれんが
0879デフォルトの名無しさん
垢版 |
2019/06/10(月) 14:24:51.11ID:MigAkPcZ
テンプレートってそんな身構えるようなものかな?
外部ツールとマクロで武装した旧黒魔術系のコードに比べたら、なんぼかましな気がするがw
0880デフォルトの名無しさん
垢版 |
2019/06/10(月) 14:45:47.43ID:SLwWwvWV
もちろん便利にはなったけど、STL以来むやみにテンプレートを持ち上げる風潮が・・・
初心者が上級者を気取りたくてテンプレート持て囃し、それだけに留まらずオブジェクト指向や昔ながらのテクニックをこき下ろしてるのを良く見かける

実行時、コンパイル時、プリプロセス時でそれぞれメリットデメリットあるんだけどなぁ
0883デフォルトの名無しさん
垢版 |
2019/06/10(月) 16:11:30.07ID:psqZaESW
>>854は「普通に」って書いてるけど、
バカがテンプレートライブラリを書いてそれが仕事に害悪をもたらすなんてことが
普通にあるわけがないだろ。
仕事なら出来る奴に書かせるし、趣味なら仕事には無害。
0884デフォルトの名無しさん
垢版 |
2019/06/10(月) 17:43:59.55ID:sRT+YLgZ
できる奴が書いたテンプレートライブラリを使いこなせない奴が、グダグダ文句言っているだけだろ。

言っている奴ができる奴なら文句言う前に修正しているわ
0885デフォルトの名無しさん
垢版 |
2019/06/10(月) 18:56:35.92ID:OlE51f/u
まあマクロとかテンプレートとかみんな一度はやり過ぎるぐらい作り込んだことあるだろ
多分>>854をそれを経験した直後ぐらいなんだろ
0886デフォルトの名無しさん
垢版 |
2019/06/10(月) 19:08:07.57ID:YayWwtn2
無職がおしごとごっこでつか?w
以下、職業プログラマじゃない者は書き込み禁止
0895デフォルトの名無しさん
垢版 |
2019/06/10(月) 20:48:57.81ID:9ReisgX6
decltype(auto)はあまり使わないなぁ
長いし
面倒だからauto&&で受けちゃうし
戻り値推論もauto&とかで済ましちゃう
0897デフォルトの名無しさん
垢版 |
2019/06/10(月) 21:35:34.30ID:9ReisgX6
クソクソ言うだけで、何がどう悪いとすら具体的に例を上げないのだからもうね
0903デフォルトの名無しさん
垢版 |
2019/06/10(月) 23:51:39.69ID:Ii7tq5Jr
テンプレートの問題なんてもう語り尽くしたわ。
それでもバカがあと立たないのもずっと見てきた。。
0904デフォルトの名無しさん
垢版 |
2019/06/11(火) 00:19:02.01ID:QaZP7mkq
テンプレートの問題について何も聞いてないし、その状態で語り尽くしたというなら何も問題はないな。
0906デフォルトの名無しさん
垢版 |
2019/06/11(火) 00:25:55.32ID:PO+d8+1v
(果たして彼にとってはテンプレートのみが例外的に特殊な問題であって
 テンプレート以外については十分なスキルを有しているのであろうか…
0907デフォルトの名無しさん
垢版 |
2019/06/11(火) 00:53:07.47ID:7MvjruKl
コンパイル時に発見できるような問題はそもそもたいして深刻な問題ではない。
0908デフォルトの名無しさん
垢版 |
2019/06/11(火) 01:02:03.28ID:TJ/Njjhl
>>907
コンパイル時にわかる程度の問題でも、ランタイムでエラー吐かれたらデバッグ大変だよ
Pythonの型違いで嫌と言うほど思い知った
0909デフォルトの名無しさん
垢版 |
2019/06/11(火) 01:13:48.45ID:7MvjruKl
>>908
私は、ランタイムエラーを解決することの困難さに比べればコンパイルエラーなんて大したことない、という意味で言ったんだが。
あなた、読解力がないって遠まわしに指摘されること多くない?
0910デフォルトの名無しさん
垢版 |
2019/06/11(火) 01:26:55.77ID:TJ/Njjhl
そもそも文脈不明な中でそれだけ書かれてもなぁ
コンパイル時の分かるような問題かどうかではなく、エラーをコンパイル時に吐いてくれるとデバッグが捗るみたいに書けば良いのに
実際、assertやstatic_assert
SFINAE使ってのなるべく上位レイヤーでエラー発生させるのは重要でしょ
0911デフォルトの名無しさん
垢版 |
2019/06/11(火) 01:51:30.87ID:GDgSrcmQ
テンプレート駆使したライブラリ使うと最適化ありなしで速度かなり変わるの困る
デバッグビルドだとくそおっそくてデバッグがままならん
なんか良い解決法ないですかね?
0912デフォルトの名無しさん
垢版 |
2019/06/11(火) 02:00:33.22ID:TJ/Njjhl
適当なところで切る
処理の定義を別ヘッダに分けて、特定のソースファイルで定義ヘッダを読み、デバッグが必要ないところは最適化Onで明示的インスタンス化をする
0913デフォルトの名無しさん
垢版 |
2019/06/11(火) 02:07:42.02ID:7MvjruKl
>>911,912
> 処理の定義を別ヘッダに分けて、特定のソースファイルで定義ヘッダを読み

自前の切り替え処理自体が不具合の原因になりかねない。
素直にprintf()するのが一番確実でしょう。
0917デフォルトの名無しさん
垢版 |
2019/06/12(水) 00:12:16.75ID:EuvWtF/E
VSならプロジェクトじゃなくソースのプロパティ選んで最適化変えればそこだけ反映される
まあ、それ用の構成作っておくのが安全

CMakeはわからん
makeなら簡単だけど
0918デフォルトの名無しさん
垢版 |
2019/06/12(水) 09:35:50.45ID:eCiQ25Tx
c++の場合、このコンパイラでは通るけどこっちのコンパイラでは通らないとかが
普通にある方が問題。
静的だとか動的かとかそういう問題とはまた違う。
0920デフォルトの名無しさん
垢版 |
2019/06/12(水) 12:59:45.38ID:pwRz5TOC
>>918
コンパイラごとに違う言語なんだから当然では?
むしろコンパイラが1つしかない言語以外でそういう問題が発生しない言語ある?
0921デフォルトの名無しさん
垢版 |
2019/06/12(水) 16:21:34.99ID:7KGE0Knu
Java、C#は「コンパイラが1つしかない言語」に含む?
どのみち比較の対象が少ないね。
0925デフォルトの名無しさん
垢版 |
2019/06/12(水) 16:40:28.14ID:7KGE0Knu
「コンパイラが通らない問題を解消するためにビルドツールをご用意いたしました。」
で、configureやらcmakeやらantやらといった車輪の再発明が続々生まれてくる。
0927デフォルトの名無しさん
垢版 |
2019/06/12(水) 18:48:39.87ID:eqhLCWed
モダンなC++を学ぶべく右辺値参照について勉強しているのですがさっぱりわかりません
本に右辺値参照は実際は左辺値でstd::moveは実際は何もmoveしない
と書いてありましたが本当に意味がわからない
言葉遊びはいいからわかりやすく教えてくれ
0928デフォルトの名無しさん
垢版 |
2019/06/12(水) 19:07:22.06ID:iR6eT4Op
>>927
正確に言うと右辺値参照が左辺値なんじゃなくて右辺値を参照している「変数」が左辺値なのさ。
それ自体ひとつの変数なんだから当然のことだろう?
0929蟻人間 ◆T6xkBnTXz7B0
垢版 |
2019/06/12(水) 19:12:10.36ID:KzwP9Gzw
>>927
誤解を恐れずに言うと、std::moveを付けると、&&が付いた特殊な型になる。その型のことを右辺値参照という。ムーヴコンストラクターやムーヴ代入などは、その特殊な型に対して行われる。
0930蟻人間 ◆T6xkBnTXz7B0
垢版 |
2019/06/12(水) 19:17:22.52ID:KzwP9Gzw
&&が付いた引数は、中身の所有権を他の場所に譲り渡すことができる。
例えば、文字列クラスだったら、ポインタが指し示す文字列の所有権だ。所有権をコピーせずに、移動するだけなら、処理コストが低くて済む。
0931 ◆QZaw55cn4c
垢版 |
2019/06/12(水) 19:33:55.80ID:1cw0Fvdf
>>930
所有権って何ですか?
私は一つの関数で new/malloc() した領域を、別の関数に渡し、さらに別の関数で delete/free() してますが、効率よくそういうことをする場合には所有権という架空のフレームは邪魔だと思います
0933デフォルトの名無しさん
垢版 |
2019/06/12(水) 19:38:15.23ID:eqhLCWed
>>928
あーなるほど確かに変数に代入してる時点でそうですね
右辺値参照を保持する左辺値ということですね
納得です

>>929
std::moveに渡す型も&&ですよね
&&をもらってさらに特殊な&&を返すんでしょうか?
remove_referenceとかその辺がさっぱりです
なぜこれが必要なのか
さらにその型で所有権が移るというのもよくわからず
0934デフォルトの名無しさん
垢版 |
2019/06/12(水) 19:45:51.10ID:qnyyQkgz
右辺値というのはほっといたら消える。

どうせ消えるんだったら右辺値が確保してるメモリ、こっちでちゃんと解放するからもらうね→所有権の移動

もちろん所有権移動したので右辺値でメモリ解放しちゃダメよ。
0935デフォルトの名無しさん
垢版 |
2019/06/12(水) 19:47:37.87ID:GZDxeRSP
>>933
所有権が移るというか...
T&& x を引数に持つ関数(コンストラクタが多い)は右辺値を受け取るけど、
そこで x の所有するリソースを
分捕っていいという「慣習」「イディオム」があるというだけなんだよ。
0936蟻人間 ◆T6xkBnTXz7B0
垢版 |
2019/06/12(水) 20:10:41.45ID:0iE+TYdc
>>933
そこを厳密に理解するには、lvalue, rvalue, prvalueなどの値カテゴリを理解しないといけない。
https://ja.cppreference.com/w/cpp/language/value_category
要するにlvalueをxvalueにするために、std::moveを使う。

remove_referenceは、type traitsと呼ばれる「型に対する演算」を行っているに過ぎない。
std::moveの実装のremove_referenceは、冗長な参照を削除している。
type traitsは、テンプレートに慣れないと使いどころが分からないだろう。
0937蟻人間 ◆T6xkBnTXz7B0
垢版 |
2019/06/12(水) 20:24:57.03ID:0iE+TYdc
class STRING
{
public:
...
// ムーヴコンストラクタ(一例です)。
STRING(STRING&& s) : m_ptr(nullptr)
{
std::swap(m_ptr, s.m_ptr);
}
// ムーヴ代入(一例です)。
STRING& operator=(STRING&& s)
{
std::swap(m_ptr, s.m_ptr);
return *this;
}
protected: char *m_ptr;
};
...
STRING s("abc123");
STRING t;
t = std::move(s);
0938蟻人間 ◆T6xkBnTXz7B0
垢版 |
2019/06/12(水) 20:34:03.21ID:0iE+TYdc
右辺値参照で挫折したら、Rustに進むがいい。
C++を完全に理解した人間は1%も居ない。
0942デフォルトの名無しさん
垢版 |
2019/06/12(水) 21:07:19.74ID:JHNh+ipy
ムーブセマンティクスは今世紀最大の発明と言われてるからね。
0943デフォルトの名無しさん
垢版 |
2019/06/12(水) 21:11:21.95ID:7TWmWXJk
最近は標準ライブラリも文法も分かりやすくなったなと思ったら
initializer_list絡みの初期化がこのやろう
0944デフォルトの名無しさん
垢版 |
2019/06/12(水) 21:17:48.45ID:hxuK959+
・仮引数が右辺値参照&&なら、そこに渡した変数はぶっ壊される(そのかわり速いかもしれない)
・ただし安全のために使い捨ての一時変数か、std::moveを付けて「壊していいよ」と明示したものしか渡せないようになってる

これだけ理解してればだいたいOK
0945デフォルトの名無しさん
垢版 |
2019/06/12(水) 21:27:52.71ID:7cC3bFV5
ややこしいとか言う奴に限ってパターンの一覧表作っていつでも参照できるようにしないよな
0946デフォルトの名無しさん
垢版 |
2019/06/12(水) 21:52:10.38ID:eqhLCWed
このスレを読んだらだんだんわかってきました

>>937
なるほど
この例で使い方は何となく理解できたかもしれないです
abc123を一切コピーすることなく引き渡しているということですね
コンストラクタに右辺値が渡された時は自動的に&&のコンストラクタがよばれ(これはコンパイラが自動で判断してくれる)
コピーでは明示的に右辺値参照にしないとダメなのでstd::moveを使うと
0949デフォルトの名無しさん
垢版 |
2019/06/12(水) 22:42:16.79ID:JHNh+ipy
【 constexpr の掟】
「ブッ殺す」と心の中で思ったならッ!その時スデに行動は終わっているんだッ!
0950デフォルトの名無しさん
垢版 |
2019/06/12(水) 23:19:39.59ID:zt+60oVn
>>931
所有権というのは権利を連想させるようないかにもお得な感じを醸し出しているネーミングだが
その実体はオブジェクトの開放を最後の一人だけがやる「義務」に他ならない

で、「最後の一人だけに開放させる」というのを>>931のように
>別の関数に渡し、さらに別の関数で delete/free()
というのは大悪手に他ならない
なぜなら呼び出し先で最後かどうかなど(所有権やレキシカルな手法では)管理し切れない
所有権は呼び出し元ががっちり掴んでおくもの
0953デフォルトの名無しさん
垢版 |
2019/06/12(水) 23:51:54.31ID:EuvWtF/E
元の内容について所有権を失っているだけで普通は使える様になっている
スマポならnull相当
vectorみたいなのならemptyもしくは何らかのごみが入っているのでclearか新たに代入すればおk
0954デフォルトの名無しさん
垢版 |
2019/06/13(木) 00:01:02.92ID:GxcaYm6A
>>953
>元の内容について所有権を失っているだけで普通は使える様になっている
moveしたあとの変数について述べているのなら完璧な間違いだ
藻前のプログラムはバグだらけだな
0955デフォルトの名無しさん
垢版 |
2019/06/13(木) 00:16:54.69ID:VunnpS2y
合ってるだろ
ムーブ後のオブジェクトは内容は未規定だけど有効な状態だぞ、少なくとも組み込み型と標準ライブラリはな
褒められたプログラミングスタイルかはともかく、再利用すること自体が即間違いとは言えない
0958デフォルトの名無しさん
垢版 |
2019/06/13(木) 01:25:50.43ID:bj2tv0KH
少なくとも標準ライブラリでこれが出来ないと、メンバ変数の内容一つmoveしただけで親のオブジェクトまで使えなくなる。
メンバ変数再利用する術が無いってことだからね
0959デフォルトの名無しさん
垢版 |
2019/06/13(木) 01:41:54.12ID:/Ra8Vlso
>>957
未初期化の変数をコンパイル時に検出できるんだからmoveした後かどうかも判定できるはずでしょ
0961デフォルトの名無しさん
垢版 |
2019/06/13(木) 03:03:13.46ID:bj2tv0KH
2分木で子のスマポ所有しているような場合、付け替えとかで所有権の移動するときshared_ptrならコピーでokだけど、unique_ptrみたいなのだとmoveする事になるが、メンバ変数で持っていた子の内容をmoveしたあとその変数が再利用可能じゃないと困るだろ
0962デフォルトの名無しさん
垢版 |
2019/06/13(木) 03:21:55.87ID:/TtN03F/
>>961
c++11で導入されたmoveはいわゆる所有権の移動とは違うもなので、その場合はmoveは使えないと思う。
0963デフォルトの名無しさん
垢版 |
2019/06/13(木) 03:33:01.74ID:fPdkPYzy
>>962
unique_ptrのmoveが所有権の移動じゃないと言うなら一体何なら「所有権の移動」だと言うのか。
0965デフォルトの名無しさん
垢版 |
2019/06/13(木) 04:35:02.91ID:qBl/BLKs
ループの中で int a なる整数を使うとき、ループ内で毎回宣言するのとループの外で宣言して使い回すのどっちが結局速いの?
0969デフォルトの名無しさん
垢版 |
2019/06/13(木) 13:18:06.43ID:XHz4etUG
>>967
逆じゃないか?
インスタンスの生成にコストがかかるときはトレードオフだが、そうでないなら可能な限りスコープを狭くなるように変数を宣言した方が良いと思う
0972デフォルトの名無しさん
垢版 |
2019/06/13(木) 15:28:06.57ID:PncfQdvG
cppcheckやVisual Studioのような静的コード解析にかけると「スコープを小さくできるよ?」みたいなアドバイスが出るよね。
実際のところ、どうなんだろうね。typoしにくくなったりスタックサイズが小さくなる利点があるとは思うけど。
0974デフォルトの名無しさん
垢版 |
2019/06/13(木) 16:22:08.63ID:jHLKLHUC
ちょうど今朝cppcheckかけたら
style: The scope of the variable 'c' can be reduced.
「変数 c のスコープを縮小できますよ」って出たわ。
つまり「スコープを狭くできるなら狭くすべき」っていう方針を、
(少なくともcppcheckを作ってる人は)採用してるんだろうな。

どっちが速いかについては、ちょっと最適化オプションつければ
結局同じマシン語になっちゃうんじゃないかしら。
0977デフォルトの名無しさん
垢版 |
2019/06/13(木) 17:32:58.81ID:fC2jn4Im
オブジェクト指向って実はprivate変数のスコープをかなり広く取ってるセミグローバル指向だと思う
0985デフォルトの名無しさん
垢版 |
2019/06/15(土) 19:37:22.36ID:y49ayDRp
グローバル変数と言っているのはオブジェクト指向スレを荒らしてるバカだろ
0986デフォルトの名無しさん
垢版 |
2019/06/16(日) 15:07:40.82ID:TXhOXCMI
任意の型に対応する整数を返すメタ関数ってC++11の標準であったりします?

intなら1
stringなら2
みたいな
上記の技法をなんと呼ぶかわからないので検索ワードも思い付かず…
0989デフォルトの名無しさん
垢版 |
2019/06/16(日) 19:19:35.33ID:PFinGY+5
質問ですがC++のクラスのメソッドは、大別すると、
コンストラクタとデストラクタとsetterとgetterと何になるの?
0991デフォルトの名無しさん
垢版 |
2019/06/16(日) 19:31:47.13ID:Va3vueK+
setterとgetterって何?
Javaじゃあるまいしそんなの言語要素としては用意してないよ
0992デフォルトの名無しさん
垢版 |
2019/06/16(日) 21:57:17.90ID:PFinGY+5
>>991
setterとgetterが何かについてはググった方が良い

Javaは詳しくは知らないが、ググった限りにおいて
Javaでもsetter/getterを定義する専用の言語要素など用意されていない印象
0993デフォルトの名無しさん
垢版 |
2019/06/16(日) 22:03:52.19ID:PFinGY+5
で、C++/Javaどっちも
 { setter } ∪ { getter } ⊂ { メソッド }
であることは明らかだが、では
 Q1. { メソッド } - ( { setter } ∪ { getter } )には何か専用の名前は無いのか?、
というのが>>909の質問の主旨。

ついでに言うと
 Q2. { setter } や{ getter }というのは本当に確定した集合なのか?
と、
 Q3. 「操作」と言ったときそれは{ メソッド }を指すのか { メソッド } - ( { setter } ∪ { getter } ) を指すのかどっちなんじゃ、
とかも知りたい
0995デフォルトの名無しさん
垢版 |
2019/06/16(日) 22:54:20.07ID:PFinGY+5
>>994
シグナルとスロットというのはGUI操作を処理する目的のブツなので、
実行時の時間コストがゼロコストに近いことを気体されているハズ、
よって { メソッド } - ( { setter } ∪ { getter } ) の全て(この中には実行時の時間コストが青天井のブツも含まれる)を
包含しはしないのではないか、

まあここまで書いてオモタが、 { setter } ∪ { getter } こそ実行時時間コスト0を期待されるから、
setterやgetterは次の定義で良いのではないかという気がしてきた…

- 属性を取得する目的の操作であり、かつ実行時時間コスト≒0の実装が今現在も保たれているのがgetter

- 属性を変更する目的の操作であり、かつ実行時時間コスト≒0の実装が今現在も保たれているのがsetter
0996デフォルトの名無しさん
垢版 |
2019/06/16(日) 22:56:35.57ID:PFinGY+5
後ろ2行訂正orz、
正:
- 属性を取得する目的で設けられた操作であり、かつ実行時時間コスト≒0の実装が今現在も保たれているのがgetter

- 属性を変更する目的で設けられた操作であり、かつ実行時時間コスト≒0の実装が今現在も保たれているのがsetter
0997デフォルトの名無しさん
垢版 |
2019/06/16(日) 23:24:38.97ID:PFinGY+5
補足すると、「属性を取得する目的」や「属性を変更する目的」というのは、
インターフェースをクラスの主要な機能とは独立に変更できることを暗に言っている

例えばクラスFooのsetBar()が真にsetterならば、
属性をsetterでセットするのをやめて(Foo::setBar()を廃止して)ファイルから
直接読み込むメソッドFoo::readFromFile()に置き換えても、
クラスの主要な機能Foo::mainFunc()は変更せずに済むハズ

getterについても同様
1000デフォルトの名無しさん
垢版 |
2019/06/17(月) 00:01:28.14ID:7HzfXopw
ずれてるのを承知で書くけど、直接読み込むメソッドってやつも含め setter なんてない方がいいよ
10011001
垢版 |
Over 1000Thread
このスレッドは1000を超えました。
新しいスレッドを立ててください。
life time: 76日 1時間 44分 23秒
10021002
垢版 |
Over 1000Thread
5ちゃんねるの運営はプレミアム会員の皆さまに支えられています。
運営にご協力お願いいたします。


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

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

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

▼ 浪人ログインはこちら ▼
https://login.5ch.net/login.php
レス数が1000を超えています。これ以上書き込みはできません。

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