C++相談室 part154

レス数が1000を超えています。これ以上書き込みはできません。
2021/01/08(金) 17:54:00.55ID:0DW9z0rL
※前スレ
C++相談室 part153
https://mevius.5ch.net/test/read.cgi/tech/1602339500/

テンプレここまで
2デフォルトの名無しさん
垢版 |
2021/01/08(金) 17:56:28.28ID:GG1sOSQC
おつかれー
2021/01/08(金) 19:34:40.54ID:hBRzO/B9
STLつかうと一気に実行ファイルサイズが10倍に?!

環境によるだろ。
俺はBorland-C++5.6.2に -D_RTLDLL オプションを指定して、極力
ランタイムを使用するようにして使っているが、例えばstd::vectorを
使っても使わない時と比べ10Kほどしか増えない

すげえ。ダイナミックリンクしといてファイルサイズが増えないとかいってるよ。この人。

C1010: プリコンパイル済みヘッダーの検索中に予期しない EOF を検出しました。
とかいうエラーが出るんだけどこれってどうすればいいの?

#include <stdafx.h>
後死ね。

言葉が悪いな。それで教えているつもりか。
まぁヒントぐらいにはなったな。
うむごくろう。
2021/01/08(金) 19:38:13.11ID:8XBZO/70
operator->*を好き勝手にオーバーロードするのは
C++厨二病なら誰しもが通る道だと思ってる
2021/01/08(金) 20:05:42.45ID:gKD5AY0L
厨二病以下だね沼二病か幼長病レベル
2021/01/08(金) 20:33:39.47ID:eZ2LT3hD
>>3
お前が死ね
7デフォルトの名無しさん
垢版 |
2021/01/08(金) 20:55:30.03ID:lmjqKHzd
だって演算子オーバーロード楽しいし!
それSpirit作者のジョエルさんにも言えるの?
2021/01/08(金) 21:03:27.15ID:NkKDsd1u
% を三次元ベクトルのクロス積にするのはかつて自分も思いついたけど、勧められないって立場の人も居て
演算子オーバーロードが自然かそうでないかってのは人に拠るなと思った
自分の価値観で言えばiostreamの >> とかってあんまり自然じゃないが
他に何がいいかって言われてもないので仕方ない
2021/01/08(金) 21:08:29.47ID:gKD5AY0L
<filesystem>のディレクトリ区切りがoperator/なのとかオモロイやん
10デフォルトの名無しさん
垢版 |
2021/01/08(金) 21:17:01.55ID:U7HVBqAl
絵文字プログラミングが来る
なので独自オペレータは出来た方がいい
2021/01/08(金) 21:44:49.24ID:gxkYqo9D
>>4
わしは20年ぐらい前にその道を通った
だから若者がその道を通ることについては何もいわない
ほっといて気がつかないならダメ人材だし
使える人材は自分で気がつく
12デフォルトの名無しさん
垢版 |
2021/01/09(土) 00:35:22.39ID:8yDnsj0x
キーワードも再定義可能にしてホスイ
2021/01/09(土) 01:15:10.33ID:CT/R4i5r
#defineでイケるやろ
14デフォルトの名無しさん
垢版 |
2021/01/09(土) 01:39:13.52ID:InkVVK6p
#define private public
ってテクニックのことか。
2021/01/09(土) 04:17:16.54ID:kjQQkk+g
>>14
それコンパイル通っちゃうの?
プリプロセスだからOKなのか・・・
2021/01/09(土) 09:21:23.56ID:c2CH7ey/
キーワードをdefineするのは規格上は未定義動作
でもだいたい通っちゃうな
2021/01/09(土) 09:27:02.27ID:lvRTpcj7
その条文どこだっけ
2021/01/09(土) 10:07:37.60ID:c2CH7ey/
この辺かなC++20ドラフトより
16.5.1.2 Headers [headers]
8 Identifiers that are keywords or operators in C++ shall not be defined as macros in C++ standard library headers.
(標準ライブラリはキーワードをマクロにすんな)
16.5.4.3.2 Macro names [macro.names]
2 A translation unit shall not #define or #undef names lexically identical to keywords, to the identifiers listed in Table 4, or to the attribute-tokens described in 9.12, except that the names likely and unlikely may be defined as function-like macros (15.6).
(キーワード・文脈依存キーワード・予約済み属性トークン(ただしlikelyとunlikelyを除く)をdefineやundefすんな)
2021/01/09(土) 11:17:12.79ID:lvRTpcj7
thx
20デフォルトの名無しさん
垢版 |
2021/01/09(土) 20:30:21.03ID:w9vYk25X
>>13
何言ってんだおめー;;;
2021/01/09(土) 21:18:55.59ID:jpx8Mcv4
C++はプリプロセッサが発展する方向にいかなくて本当に良かった
プリプロセッサを吸収して凄いことになってる気はするが
2021/01/09(土) 21:24:33.16ID:lvRTpcj7
禿の方針だからね
スコープに従わない反逆者の排除は
2021/01/09(土) 21:37:52.40ID:Te5slSqE
(でも楽しいよね
(コンパイル直前のコードが数個のプリミティブにまで還元されちまう楽しい言語もあるしな))
2021/01/09(土) 22:11:02.76ID:w9vYk25X
プリプロセッサはC言語の目的(OSを様々なプラットフォームに移植可能な共通ソースコードとして書く)ための
必要欠く書くべからざるしくみとして導入され、できた時点で仕様としてはほぼ過不足なかった
という印象

そういう目的のブツなので、キーワードの再定義には全く不向き
2021/01/10(日) 07:00:15.18ID:NGSbpihh
プリプロセスおもしろいやん
俺プリプロセス大好き
26デフォルトの名無しさん
垢版 |
2021/01/10(日) 07:04:45.26ID:pzwk9NYM
最近は#includeと#defineしか使ってない。
27デフォルトの名無しさん
垢版 |
2021/01/10(日) 08:03:37.57ID:pzwk9NYM
#defineじゃなくて#pragma onceだった。
2021/01/10(日) 10:29:09.95ID:eq9L0D9i
どうやったらその2つを取り違えできるんだww
ほんとにつかってる??
2021/01/10(日) 10:29:46.47ID:Cbi+hphF
#pragma onceとか#inlude_nextとか標準に入れてほしくはある
2021/01/10(日) 10:45:39.55ID:J1w4FPK7
#pragma onceはもう標準のつもりで使ってるわ
2021/01/10(日) 11:35:58.46ID:MuZPu68S
>>25
そういう時期もあったな…(遠い目)
32デフォルトの名無しさん
垢版 |
2021/01/10(日) 11:49:17.12ID:WbJbdET/
#pragma便利よね ライブラリのリンク指定とかも
2021/01/10(日) 11:50:54.98ID:smlN1G6e
>>8
そう、 iostream は「仕方ない」と思うんだよな。

C++11 で variadic template が導入されるまでは
可変長引数を安全な型システムの中で扱えなかった。
仕方がないから演算子でなんとかそれっぽくしただけ。
演算子の中で比較的それっぽいのが << や >> だっただけ。

>>9
そういう観点から見ると、パスや日付の区切りに / を使うのは
演算子にしなければならない仕方なさは感じられない。
演算子にするなら / は比較的自然な選択ではあると思うけど。
2021/01/10(日) 11:53:18.07ID:5+d8OMjE
シフト演算なんてほとんど使わんしなあ
2021/01/10(日) 11:57:06.83ID:uVXyGOJo
ファイルパスってチェーンしたいものの筆頭格だから演算子にするのは妥当だと思うけど
36デフォルトの名無しさん
垢版 |
2021/01/10(日) 12:20:31.40ID:pzwk9NYM
>>28
使ってるわい。
37デフォルトの名無しさん
垢版 |
2021/01/10(日) 12:20:58.71ID:pzwk9NYM
とはいえレスくれてありがとうw
2021/01/10(日) 12:38:01.52ID:stlWAB5c
>>35
std::path だと operator/= だな。
優先順位とか戻り値の型とか理由はあるんだろうが、やはり無理してる感は拭えない。
39デフォルトの名無しさん
垢版 |
2021/01/10(日) 23:28:34.84ID:9cXVj8qL
mutexって同時だとどうなるの?
40デフォルトの名無しさん
垢版 |
2021/01/10(日) 23:32:27.11ID:9cXVj8qL
信用して使うしかないけど…本当に同時で来たら…どうなるのかなぁ…と思って…。
2021/01/10(日) 23:43:03.84ID:1knBg1rC
同時に入ろうとしたら同時に入るのではない別の世界線に分岐するから
結局同時にならない
2021/01/11(月) 00:43:54.84ID:KM6/Ii6v
posix平行宇宙論
43デフォルトの名無しさん
垢版 |
2021/01/11(月) 00:44:15.09ID:AtO8PUuj
それだと…CPUの負荷や調子によって…同時になるって…事だよ…。
44デフォルトの名無しさん
垢版 |
2021/01/11(月) 00:45:46.62ID:AtO8PUuj
mutex…危ういな…どうしよう…。運に任せて…諦めるか…。
45デフォルトの名無しさん
垢版 |
2021/01/11(月) 00:54:29.81ID:AtO8PUuj
運任せは辛い…。
46デフォルトの名無しさん
垢版 |
2021/01/11(月) 01:30:50.91ID:AtO8PUuj
https://stackoverflow.com/questions/7373202/what-happens-if-two-theads-lock-a-mutex-concurrently
大丈夫だと言っているが…ほんまかいな…と思います…迷信はつきもの。
2021/01/11(月) 01:37:51.07ID:KM6/Ii6v
テストプログラム作ってさっさと検証しろ無能
2021/01/11(月) 01:59:20.31ID:3nmpeNiQ
>>46
信用できないならソースやアセンブリ読めよ。ここで名無しに答えてもらっても、信用できないんだろ?
49デフォルトの名無しさん
垢版 |
2021/01/11(月) 03:08:34.69ID:KSKcxhht
MutexはOSに依存するので絶対に大丈夫ということはないですが、数々のトラブルを引き起こし最も懸念されたLinuxが安定してきてるので、現在では実用上問題がないレベルにあると思います。
2021/01/11(月) 03:36:14.65ID:dLrb5ZQk
マルチCPUでバスリクエストが同時に出た場合の制御なんて明確に定義されてんだろうが
OS依存だハード依存だと逃げているから見えない不安に怯えることになるんだよ
51デフォルトの名無しさん
垢版 |
2021/01/11(月) 06:01:13.69ID:vFi9Z+AQ
LinuxのMutexって使いにくいよね
俺はWindowsから入ったからMutexって名前付きが当たり前だと思ってたんだけどLinuxのMutexには名前がない
どうやって複数のプロセス間で同じMutexを使うんだよ・・・って悩んだ
共有メモリなんかでMutexのアドレスを受け渡しするらしいんだけどさ
面倒くさくなってLinux版の同期制御はファイルロックにしちゃった。。
52デフォルトの名無しさん
垢版 |
2021/01/11(月) 06:47:08.93ID:KSKcxhht
LinuxのファイルロックはNFSで(※私たちにはバグのように見える)仕様通りの動作をするので気を付けたほうが良いですよ。

ユーザーが指定したファイルやディレクトリを不用意に使用すると再現性の無いバグに悩まされます。
53デフォルトの名無しさん
垢版 |
2021/01/11(月) 06:56:23.61ID:vFi9Z+AQ
>>52
アドバイスありがとう
Linuxで共有メモリの使い方もよく分からなくて
共有メモリも書いてる途中で読み取りされたら困るから
「書いたよー」「読み終わったよー」ってプロセス間同期したいんだけどMutex受け渡しの前に同期処理って・・・
それで共有メモリの読み書きをファイルロックで同期してMutexを渡すかなーって考えてるうちに
もうファイルロックだけでいいんじゃないかってなってしまった

一般的にはどうやってやるのがよかったんだろ?
54デフォルトの名無しさん
垢版 |
2021/01/11(月) 07:35:12.79ID:KSKcxhht
>>53
結局、「NFSではバグります」と注意したうえでファイルロックを使うことが一般的に行われてるみたいですよ。

逆に言うと、NFSだけ気を付ければ、問題が起きないみたいです。
2021/01/11(月) 08:06:23.60ID:RSMcM3e3
ちょっとググっただけだけどそんなに難しいかなぁ?
https://www.geekpage.jp/programming/linux-network/book/07/7-41.php
56デフォルトの名無しさん
垢版 |
2021/01/11(月) 08:06:43.86ID:vFi9Z+AQ
>>54
ありがとう ちょと安心した
57デフォルトの名無しさん
垢版 |
2021/01/11(月) 08:16:58.50ID:vFi9Z+AQ
>>55
コード見てみましたけどMutexの作成と共有メモリの書き込みが終わってからforkしてますね
forkした親と子ならそれでもいいんでしょうけど
実際は親子ではないプロセス間でMutex使いたくなったりするじゃないですか
Mutexが作成される前や共有メモリへの書き込み完了前にスレーブがMutexを要求しに来ると困ります
2021/01/11(月) 08:38:54.12ID:WYfXTDe9
>>51
名前付きも普通にある
sem_open
名前はセマフォだが当然mutexとして使える

目的がメッセージのやり取りならmkfifoも使える
2021/01/11(月) 08:48:31.88ID:3OtB0f6U
mutexじゃなくて名前付きセマフォなら普通にプロセス間で使えなかったっけ?
2021/01/11(月) 09:14:02.58ID:RSMcM3e3
>>57
応用力ないの?
>>58-59みたいにセマフォ使うこともできるし、名前付き共有メモリー + Mutexでもいいだろ
61デフォルトの名無しさん
垢版 |
2021/01/11(月) 09:22:15.64ID:KSKcxhht
>>60
Linuxではファイルロックで良いよ。
62デフォルトの名無しさん
垢版 |
2021/01/11(月) 09:28:25.14ID:vFi9Z+AQ
セマフォのほうには名前付きあったんですね見落としてました
ありがとう!
63デフォルトの名無しさん
垢版 |
2021/01/11(月) 09:39:24.93ID:vFi9Z+AQ
あと別のところでソケットを排他リソースで使うというアイデアを教えてもらったことあります
同じポート番号をバインドできるのは1つだけだからこれを排他に使うという案
64デフォルトの名無しさん
垢版 |
2021/01/11(月) 09:52:46.06ID:KSKcxhht
3年ぶりの建設的なスレだな。
2021/01/11(月) 10:09:50.89ID:RSMcM3e3
>>61
ファイルロックはロックしたままプロセス死ぬとリブートしても解消できないのがね
2021/01/11(月) 10:39:47.37ID:sBoV/AFh
>>51
pthread周りはなんであんな仕様なのか謎
CPUのアーキテクチャーを深く知れば合理性を得心できるのかどうか、
67デフォルトの名無しさん
垢版 |
2021/01/11(月) 11:25:14.07ID:vFi9Z+AQ
>>65
それはファイルロック(flock関数)ではなく、単純にファイルの存在チェックをしているだけじゃないですか?
flockを使ったファイルロックならプロセス異常終了時にOSによってロックが解放されます
68デフォルトの名無しさん
垢版 |
2021/01/11(月) 12:46:20.78ID:vpEQZDgx
ミックスジュースよりセックスジュースが好きですね
2021/01/11(月) 14:25:33.73ID:EL34sMb+
唐突に何いいだすねん君は!
(‘д‘⊂彡☆))Д´)パーン <ミックスジュースよりセックスジュースが好きですね
2021/01/11(月) 14:41:16.25ID:dLrb5ZQk
ラブジュースだろ
71デフォルトの名無しさん
垢版 |
2021/01/11(月) 16:14:45.22ID:AtO8PUuj
39です…。
mutexの信頼性をずーと疑ってたら…POSIXスレッド…pthread_mutex_lockに行き着きました…
ブロックもするそうです…ソース見てたら…カーネルの様です…pthread_mutex_lock_fullであれば…atomic_compare_and_exchange_val_acq…などもあります…テストアンドセットです…
アトミック操作です…しかし…普通にmutexを実装してpthread_mutex_lock_fullが呼ばれるかは…
分かりません…どんなmutexライブラリも最終的に…このカーネルを呼んでるだけだと思います…
呼ばれてるのは…fullではなく…弱い方のpthread_mutex_lockだと仮定しても…カーネルを疑うなんて…
本当に…ナンセンスな話なので…一応…信用して使うことにします…。
72デフォルトの名無しさん
垢版 |
2021/01/11(月) 16:55:02.21ID:AtO8PUuj
39です…。
結局…fullでなくても…atomic_exchange_acqが呼ばれているようです…アトミック操作です…。
なので…みなさん…安心して使いましょう…。
73デフォルトの名無しさん
垢版 |
2021/01/11(月) 16:56:14.48ID:KSKcxhht
>>72
そこでやめずに、atomic_exchange_acqの中まで追いかけてみませんか?
74デフォルトの名無しさん
垢版 |
2021/01/11(月) 16:56:26.10ID:AtO8PUuj
https://blog.sakasin.net/pthread-mutex-with-glibc
ソースです…。
2021/01/11(月) 21:32:01.48ID:KM6/Ii6v
Debian woody の頃まで posix thread は使い物にならなかったが Debian etch からようやく使い物になった印象だな
当時から利用している身にしては
76デフォルトの名無しさん
垢版 |
2021/01/12(火) 05:50:41.37ID:pJAexhLb
わりと最近ですね。
77デフォルトの名無しさん
垢版 |
2021/01/12(火) 07:34:00.56ID:V95G+u6D
woodyって20年くらい前だっけ
最初はJavaVMもグリーンスレッドというVM内の仮想スレッド実装だったんだよね
あれもOSネイティブのスレッドが信用されてなかったからなのかな
もちろん、現在のJavaVMはOSのネイティブスレッド使う実装になってるけどね
78デフォルトの名無しさん
垢版 |
2021/01/12(火) 07:44:47.10ID:pJAexhLb
Javaといえばブラック何とかプロジェクトがSUNに文句言ってなかったっけ?
79デフォルトの名無しさん
垢版 |
2021/01/12(火) 07:45:53.88ID:pJAexhLb
Etchが2007年と書いてあるな。
2021/01/12(火) 09:08:57.41ID:e5lAHXYT
設計思想的なことについて質問があります。
クラスの使い方がよく分かりません。

僕が今何かを作ろうと思ったら、関数の集まりが引数や返り値のやり取りを通じて協調するような設計をしてしまいます。
この引数や返り値が多く複雑になったりしてきたらクラスを用いた設計を考える、という理解は正しいでしょうか?
2021/01/12(火) 09:22:47.73ID:XkW3hQXX
>>80
正しいかどうかは知らないし気にしないでいいと思うけど、
そういう場合はただのデータの集まりとして構造体(これもクラスの一種だけど)を使うだけでも簡単になるだろうね。
2021/01/12(火) 13:35:30.39ID:lxco4c0J
個人的には、一度無理にでも概念(ウインドウとか表示とか作ってるソフトの主要な概念)をクラス名にして作ってみるといいとおも
やってるうちに慣れてくる
83デフォルトの名無しさん
垢版 |
2021/01/12(火) 14:01:10.35ID:V95G+u6D
そうだね
なにかを題材にしてオブジェクト指向やってみるのがいいと思う
でもウインドウはどうかなー そもそもUIツールキットをある程度知らないといけないし
GUIってオブジェクト指向らしからぬ部分も多いので

もっとビジネスロジック中心の題材がいいと思うよ たとえば掲示板システムとか
板には複数のスレがあって、各スレの中には複数のレスが並んでて、スレの書き込むメソッドでレスが1つ増えてーみたいな
84デフォルトの名無しさん
垢版 |
2021/01/12(火) 15:56:33.61ID:LUlB/OIG
>>4 >>11
. を再定義したいと思った
2021/01/12(火) 17:32:55.18ID:+0XoTmdG
>>82
初歩的な質問なのですが、クラスってモノじゃなくて概念でも良いのでしょうか
つまり、歩く人のプログラムを作るとき、人というクラスが歩くというメソッドを持っていても良いし、歩くというクラスが一歩進むというメソッドを持っていても良いのでしょうか
言語の仕様上はもちろんどちらでも良いと思いますが、どちらの設計の方が筋が良いということはないと思って良いですか?
2021/01/12(火) 17:34:51.31ID:fQCYjk84
ナントカ系の関数群みたいに相互に関連し合っているものを
暗黙じゃなく明確化するのがクラスだよ
87デフォルトの名無しさん
垢版 |
2021/01/12(火) 17:38:10.34ID:V95G+u6D
>>85
「歩く」をクラスにするよりは「歩ける」をインターフェースにしたらどうかな
人間クラスに「歩ける」インターフェースを実装することで「歩く」メソッドがあることを保証できる

対象ドメインをどのようにモデル化するかは状況や要件次第
2021/01/12(火) 19:05:06.19ID:mPDSlMxM
メタファとして生き物がよく用いられるけどなんだかなあっていつも思う
2021/01/12(火) 19:50:41.34ID:YNFRivpW
>>87
「歩け」インターフェースを定義したらインスタンスが歩ける想定であることは自明なのでは…

ちなメソッドは一般にオブジェクトの状態変化を引き起こすブツなので
命令型プログラミングの範疇であり命令形で命名すうるが正しい

※ 個人の感想です
2021/01/12(火) 19:52:42.41ID:YNFRivpW
しかしインスタンスの生成というプロセスは関数型プログラミングから拝借しており、
命令型と関数型のいいとこ取りしようとして失敗した
classベースのオブジェクト志向は
91デフォルトの名無しさん
垢版 |
2021/01/12(火) 19:58:16.79ID:GTfU1r+6
何ベースのが成功なの?
2021/01/13(水) 09:25:15.89ID:X1FbeZvQ
場合によっては歩くクラスもありだと思うよ。
ゲームで次の行動を一つずつ記憶させたい場合とか。
commandパターン、mementoパターンでググって
93デフォルトの名無しさん
垢版 |
2021/01/13(水) 09:45:27.73ID:D0cZCa+j
歩くということは、位置が変化する。
現在位置は人オブジェクトのプロパティなのか?
それでええのか?
2021/01/13(水) 11:14:57.57ID:XODVGtfI
>>93
良くね?


>>87
インターフェースって継承される前提のものなんですよね?
どのクラスが「歩ける」を継承するんですか?
2021/01/13(水) 12:34:30.18ID:QVnLWQ3q
>>85
数値化できるものなら何でもオーケーだ
歩行を数値化するにはN個の関節を持つM本の脚をパラメータとし時間経過ごとの接地点と関節の位置をジェネレータみたいに連続的に返すような設計が考えられる
96デフォルトの名無しさん
垢版 |
2021/01/13(水) 13:12:01.01ID:D0cZCa+j
>>94
じゃあ将棋の駒オブジェクトはプロパティとして位置を持っているのか?
97デフォルトの名無しさん
垢版 |
2021/01/13(水) 14:09:32.74ID:D0cZCa+j
俺の考えるOOシステムでは、駒オブジェクトは盤面オブジェクトやルールブックオブジェクトへの参照を持っいる。

駒オブジェクトへ前へ3移動とメッセージを送ると、駒オブジェクトはルールブックオブジェクトと盤面オブジェクトを用いて、移動可能であれば盤面オブジェクトへ自身を移動するようメッセージングする。
2021/01/13(水) 15:31:14.00ID:Dg6tKq+M
intを継承してmyintクラスを作ることは可能ですか?
2021/01/13(水) 15:38:23.35ID:CyYDkVRJ
システム次第でしょ。
もしも将棋の駒が自律歩行多脚戦車だったら、GPSシステムがすべての位置情報を管理してるなんておかしいし。
100デフォルトの名無しさん
垢版 |
2021/01/13(水) 15:38:43.61ID:D0cZCa+j
enum class なら可能。
101デフォルトの名無しさん
垢版 |
2021/01/13(水) 20:01:32.91ID:D0cZCa+j
C++はテンプレートがあるので設計の詳細を先送りできる。
その特徴を生かせるように、プッシュ型を流行らせませんか?
プッシュ型は、前提が少ないので、利用者が自由に組み合わせることが出来ます。

これは、インターフェースによって事前に詳細を設計してしまう方式と真逆かもしれないが、組み合わせによって機能を作ることが出来まっする。
2021/01/13(水) 21:14:51.93ID:XHABqTxh
プッシュ型って何?
103デフォルトの名無しさん
垢版 |
2021/01/14(木) 06:54:42.42ID:mrWYZ3Pm
Caper や Bison でプッシュ型を調べてみるとわかると思います。
104デフォルトの名無しさん
垢版 |
2021/01/14(木) 06:59:25.06ID:mrWYZ3Pm
あらゆるソフトウェアで使いまわされるライブラリにおいて、詳細が既に決まっているのは不自由なことです。
2021/01/14(木) 07:12:21.89ID:FFXK54Rt
templateと比べてプッシュ型の利点が分からん。
106デフォルトの名無しさん
垢版 |
2021/01/14(木) 07:23:48.43ID:mrWYZ3Pm
>>105
プッシュ型はパーサーでよく使われます。
ユーザーが柔軟性を求めるからです。

Caperはプッシュ型、Bisonはパーサー側が文字を読む方式ですが、オプションとしてプッシュ型を選べます。
パーサにおいてプッシュ型とは、(パーサではなく)パーサを呼び出す側が文字を送り込みます。

それによって何が起きるでしょうか?
従来のパーサーは状態と共に行番号を保存します。
プッシュ型の場合、行番号を保存するのは呼び出し側です。

パーサーが読む文字とは何でしょうか?
プッシュ型において、Cではint、C++ではユニコード。コードポイントです。
文字デコードを行うのは、呼び出し側です。

では従来のパーサでは?
行番号を管理するためには、文字デコードもパーサーの仕事です。
つまりパーサーは大きな塊でアリ、組み合わせる部品ではありません。
107デフォルトの名無しさん
垢版 |
2021/01/14(木) 07:27:04.63ID:mrWYZ3Pm
プッシュ型はUNIXに通じるものがありますが、UNIXでは実現されませんでした。
108デフォルトの名無しさん
垢版 |
2021/01/14(木) 07:47:44.25ID:mrWYZ3Pm
パーサーは本来、構文解析が仕事です。
しかし、現状多くのパーサーは、構文解析以外の機能を密に結合している。

本来の仕事以外は分離して、小さな部品にすることで再利用性が高まる。
という感じですかね。

これはテンプレートと同じでもろ刃の剣でもあるんですよ。
詳細を設計しないんですから。

しかし、STLの寿命の長さを見て分かる通り、詳細が設計されていないという事は利用者が自由に設計できるという事で、使い出があるんです。
109デフォルトの名無しさん
垢版 |
2021/01/14(木) 07:48:23.53ID:mrWYZ3Pm
もちろん、パーサーに限った話ではないですよ。
例です。
110デフォルトの名無しさん
垢版 |
2021/01/14(木) 09:22:59.17ID:EIDQMz1r
みんながみんなパーサーを開発する側じゃないからなー
もっと身近な例はないですか?
このようなデザインパターンがプッシュ型だとこうなる、みたいな
111デフォルトの名無しさん
垢版 |
2021/01/14(木) 09:29:21.76ID:mrWYZ3Pm
>>110
使う側にとって良いことなんですよ。

それと、プッシュ型は万能ではないんですよ。
一部のコンポーネントの部品化に対して利益があるのです。
2021/01/14(木) 10:01:10.49ID:mp+NLhBe
>>111
身近な例はないかという問いに対しその回答は意味不明では?
113デフォルトの名無しさん
垢版 |
2021/01/14(木) 10:15:16.01ID:mrWYZ3Pm
まあそうですね。
すいませんでした。
114デフォルトの名無しさん
垢版 |
2021/01/14(木) 10:22:13.84ID:FFXK54Rt
身近な例で利点があるなら広めるのに協力するのもいいが今の時点で利点が分からん。
115デフォルトの名無しさん
垢版 |
2021/01/14(木) 15:40:36.18ID:qrpkNJTC
別にC++だけの問題じゃないんだけど…質問…例えば…エクスプローラのようにファイル一覧出すじゃん…
画像や動画は…サムネイルを出すじゃん…このサムネイルは非同期で更新になるじゃん…
一度開いたら…キャッシュから読み込みたいじゃん…このキャッシュの保存ってさぁ…一意にするのに…
ファイルパス・更新日時・サイズである程度一意になるけど…完璧な一意ではないじゃん…
同じ名前・同じ更新日時・同じサイズで上書きされたら、前の画像がサムネイルに出るじゃん…
どうすんの?
116デフォルトの名無しさん
垢版 |
2021/01/14(木) 15:42:53.95ID:qrpkNJTC
キャッシュなんてそんなものだから…それでいいのかなぁ…
2021/01/14(木) 15:53:35.11ID:mp+NLhBe
その気持ち悪い「...」をやめてくれ
118デフォルトの名無しさん
垢版 |
2021/01/14(木) 15:55:13.17ID:EIDQMz1r
ファイルパスと更新日時で一意になると考えていいでしょ
コンテンツが変更されれば更新日時が進むという前提で
それさえも許せないクリティカルなシステムならファイルの全バイト列から衝突率の低いハッシュ作るとかファイル読むのと変わらんことになる
クリティカルなシステムではキャッシュ使わんな
119デフォルトの名無しさん
垢版 |
2021/01/14(木) 16:05:02.51ID:qrpkNJTC
なるほど…。
2021/01/14(木) 16:09:33.34ID:9qLPLWCT
https://martinfowler.com/bliki/TwoHardThings.html
> There are only two hard things in Computer Science: cache invalidation and naming things.

計算機科学においては二つの難しいことがあります。
キャッシュの無効化と名前の付け方です。
2021/01/14(木) 16:16:29.09ID:9qLPLWCT
ファイルシステムによるけど iノード番号だったり
それに近い管理機構で一意に特定できる場合もあるんじゃないの。
サムネイルくらいなら雑でいいやという割り切りもあると思うけど、
ある程度は不整合がないようにする努力もしてると思う。
2021/01/14(木) 23:16:54.98ID:9gUF6PTW
特徴的な文体はblogでも見た!
2021/01/14(木) 23:49:25.09ID:9gUF6PTW
スヌープとLRUでおk
この2つでダメだという香具師は、
スヌーピングのロジック設計をサボっているか、
メモリをケチって必要量に未達なだけ
2021/01/16(土) 08:13:56.08ID:dLwYQ6PK
おはようございますみなさま、質問させてください

ユーザー定義クラスを作成し、循環参照を防止するためweak_ptrをメンバに持たせています。
そして任意の処理でshared_ptrをweak_ptrに代入し使用したいと思っておりました。
しかし、メンバ関数内部でweak_ptrを使用すると、式にはポインタ型が必要です、旨のエラーが出てしまいます。
調べてみたところ、lock()でshared_ptrに再度権利委譲するとshared_ptr側から動くのですが、私が初心者な事もあり何か釈然としません(我が儘でしょうか……)
一度weak_ptrに落とし込んだものを再度shared_ptrに戻す部分が引っかかっているのだと思います(気にしすぎですかね)

そこでお聞きしたいのですが、クラス内部で動的に定めたいと思っているweak_ptrを使う際に、これ以外の方法はありますでしょうか?
それとも上記の通りlock()で一時的なshared_ptrに束縛した方がいいのでしょうか?

朝から長文失礼しました
2021/01/16(土) 08:49:06.94ID:ld2GCDwz
ロックしないと知らない間に参照先のshared_ptrで持ってるオブジェクトが破壊されてても文句言えないけどそれでもいいの?
weak_ptrってそういうものだぞ
2021/01/16(土) 09:17:41.99ID:dLwYQ6PK
>>125
ありがとうございます。
おっしゃる通りだと思います。
納得いたしマスター!
2021/01/19(火) 02:35:16.36ID:y82ZfCrD
移譲って要は継承せずにオブジェクトとして使うってことですよね?
なぜ「移譲」なんてわけわからない名前がついてるんですか?
2021/01/19(火) 04:45:45.04ID:KGVX5wki
移譲じゃなくて委譲な。
転送でもいいと思うよ
2021/01/19(火) 07:52:05.16ID:Uy0+fZqK
代理、丸投げ
2021/01/19(火) 09:18:39.64ID:xem4SJ/U
日本語の問題だけど移譲は同じレベルに権限等を移すこと、委譲は下のレベルに移すことらしい
委譲は継承より権限の制限があるという含みがあるんだと思う
あくまで人間の組織での比喩なんだろうけど
2021/01/19(火) 09:54:48.36ID:QmODXpTw
名前付けるほどのことか?と問われればたしかにそう思う
クラス内で他のクラスオブジェクトを使ってるだけw
2021/01/19(火) 11:29:25.06ID:Bl6CuSRR
移譲コンストラクタってC++11まで存在しなかったの?
2021/01/19(火) 11:40:18.61ID:Zp03eKCw
>>132
はい。 C++11 で導入された機能です。
それまで存在しませんでした。
2021/01/19(火) 16:38:03.96ID:8JRMUdmW
C++03の頃のプログラミングめちゃくちゃ大変そうだね・・・
2021/01/19(火) 20:00:27.80ID:rn87bDt4
「オブジェクト指向?じゃあ継承しなきゃ!共通実装はみんな継承でポリモにしろ!」みたいなノリのクソ設計が溢れかえった時期があって
カウンターとして無理に継承せんでもオブジェクト持って使えばええんやでっていう事に名前付けたのが委譲とかコンポジションとか
しょうもないんだけど継承教に対抗するには名前が必要だったんよ
2021/01/19(火) 21:06:03.25ID:Zp03eKCw
>>134
そのとおりだよ!
前スレで C++11 (以降) に否定的な意見も出てるが、
使える状況であえて C++03 (以前) を選択したがる感覚はわかんね。
2021/01/19(火) 22:52:29.91ID:Bl6CuSRR
テンプレート使わなければC++03でもいける(かも)
2021/01/19(火) 23:09:23.44ID:7+t4BBWY
なんか、ここはどこ私はだあれなやついるなw
なんでテンプレートが出てくるのか
2021/01/19(火) 23:29:07.70ID:LToFUUAC
C++03にはテンプレート無いしな
2021/01/19(火) 23:43:32.07ID:7+t4BBWY
何を狙ってボケてんのかわからん
解説求む
2021/01/20(水) 19:27:35.22ID:kPiTytYK
C++スゲー=俺スゲーしたいだけの学生が増えたんだろ

>>134, >>136
エアプ乙
便利にはなったが、メタプログラミングやってても委譲コンストラクタ無くてもそんなに困らんかったぞ
メンバの初期化には関数の戻り値だって使えただろ、どこで困るんだ?
2021/01/20(水) 19:33:42.85ID:kPiTytYK
あ、委譲コンストラクタが無くても、の話であって03と11がどうこうじゃないよ
2021/01/20(水) 21:35:54.62ID:UBOdXm83
constメンバの初期化をしたいとき
初期化リストで初期化すれば良いっていやー良いが
コンストラクタ毎に初期化リストを書かねばならない
メドイ…
2021/01/20(水) 21:36:27.27ID:UBOdXm83
あと参照メンバも…!
2021/01/20(水) 21:47:26.52ID:MvJ8v0/f
>>141
C++03で何が困るって、<system_error>や<filesystem>や<execution>みたいのがなかったことだよ
新機能を乱発してプログラマを喜ばせるのを慎むというハゲの主張はわかるが
あまりにも保守的すぎて現実から乖離し始めていた
2021/01/20(水) 21:48:56.40ID:MvJ8v0/f
<valarray>の立場がなくなるから<execution>をためらうとか本末転倒だろうが
2021/01/20(水) 21:57:51.96ID:kPiTytYK
>>143-144
え、そんな場面滅多に無いと思うが・・・
委譲するときは他のコンストラクタしか初期化子使えないはず・・

と思ったが非constなものは全部コンストラクタ本体で初期化、ならいけるか
2021/01/20(水) 23:00:47.64ID:UBOdXm83
>>146
同じことをするのに複数のやり方があったらプログラミング言語界のPerlになってしまう
お禿様の気持ちはワカル
2021/01/21(木) 02:42:42.14ID:/P5UVCOb
まるで Perl はプログラミング言語界の外に居るような言い方ね。
2021/01/21(木) 06:07:35.61ID:lL8gSm1b
なんだろう、スクリプト言語とかコンパイラ言語とかいうのかね
2021/01/21(木) 07:17:30.26ID:/ZdL1i9k
厄介者のperl
2021/01/21(木) 07:40:13.27ID:Z8coO7Zb
perlは遊び道具としては面白いのかもしれないけど本番で使うにはちょっと…
2021/01/21(木) 08:36:52.78ID:RnFvGHUF
Git for windowsと一緒にインストールされる遊び道具、という世界観ですね。大切にしなさい。
2021/01/21(木) 08:52:53.32ID:2LdLfW0X
へー、findやopensslは便利に使ってたけどperlまで入ってたのか。
まぁ、もう使うことはないだろうけど。
2021/01/21(木) 09:35:52.84ID:RnFvGHUF
Perlを厄介と考えるPGのほうがPerlよりも先に厄介払いされる。若いくせに向学心がないことが垣間見える。
2021/01/21(木) 10:09:36.15ID:rjSQv0Wq
向学心とかw
むしろperl使ったことあるからこその意見だろ
2021/01/21(木) 10:25:31.85ID:RnFvGHUF
Perlを難しいと思うようだとあまり伸びしろがないね。職業変えたほうがいいかもね。正直でごめんね。
2021/01/21(木) 10:51:23.68ID:/0jxrBnU
>>155はマジで言ってるのか
10年くらい眠ってたのか?
2021/01/21(木) 11:09:21.23ID:rjSQv0Wq
最近のモダン(この言い方自体が既に古いがw)な言語使ったことないんじゃね?
あとそれなりの規模の開発したことないんだろうね
perlは書捨てのツール作ったりするには便利だったけど今更新規で使うことはないわ
160デフォルトの名無しさん
垢版 |
2021/01/21(木) 15:15:36.61ID:upjC6TmF
Perlの開発者ってタッチタイピングできなかったのかな?
なんであんなに1文字の特殊変数だらけの言語作っちゃったの?キーボード入力が楽になるとか思っちゃったのかな?
結果は可読性の低いクソースコードが量産されただけだったよね
2021/01/21(木) 16:04:26.02ID:eIfq2EBT
>>160
gnu-makeやshell scriptも同じ。
emacsも、キーバインドを丸覚え出来る人しか使えない。
作者が記憶力が桁違いにいい人だったりしてな。
162デフォルトの名無しさん
垢版 |
2021/01/21(木) 16:22:10.60ID:jCImDRpq
>16 :デフォルトの名無しさん:2006/03/10(金) 22:15:19
>>>10
>> こんな変数名があちこちに散らばっているのがPerl
>
>大学の研究室のボスは、特殊変数の表をふ〜んと2分ほど眺めて完全に暗記した。
>
>そういうレベルの人たちのための言語なんだなと思って、トイレで血の涙を流した。
2021/01/21(木) 16:57:53.30ID:eIfq2EBT
表を見た直後なら、俺も暗記してるぞ。
しばらくたったら忘れる。
短期記憶と長期記憶の違いだ。
2021/01/21(木) 18:03:23.48ID:ukSw99eK
Perlはglobが使えるようになったらuse strictの下でも参照渡しとかできてC++的に組めるようになるからおk
しかしglobを使うことと理解することは別宇宙の話なのであった
2021/01/21(木) 18:10:26.51ID:ukSw99eK
正確には型グロブ、
2021/01/21(木) 18:24:32.27ID:RnFvGHUF
このスレ、初心者多すぎ。丸暗記なんて誰もしないぞ。何のためにオンラインヘルプあると思ってんだろう。
辞書持ち込み禁止に慣れた学生の気分なのかな。
2021/01/21(木) 18:26:55.41ID:RnFvGHUF
自身の理解力のなさを胡麻化すために大げさな言い回ししているように見える。マジでPGむいてないから転職したほうがいいよ。
2021/01/21(木) 18:30:55.76ID:RnFvGHUF
>>160 みたいな己の能力のなさを棚に上げておおげさな物言いをする人には調査の仕事を振ることすらできないんだが。
2021/01/21(木) 19:06:10.15ID:/ZdL1i9k
https://descartes-search.com/media/5-programming-languages-you-wont-use-2030/

Perlファンたちはその堅牢なパフォーマンスとスケーラビリティを主張するが、すでにPythonのような他の言語に代替され始めている。10年後にはその信者の数も減り、永久に消え去ることだろうw
2021/01/21(木) 19:17:51.03ID:RnFvGHUF
ちょっとしたことをやるのに適しているのがスクリプト言語なのに、そのスクリプト言語の初歩にさえつまづいてしまう人はPGに向いてないんだよ。
正直でごめんね。Perlだけの話してるわけじゃないんだわ。
2021/01/21(木) 21:03:47.74ID:ukSw99eK
>>169
Perl 6が出るまで無限に待たされそうな気がするから
バージョン5系の消滅は無限の未来なんじゃないかな…
2021/01/21(木) 21:28:48.83ID:cjnTDlz3
人って第一印象が重要でしょ。
言語もそうだと思うの。
Perlだけの話をするけど、Perlは第一印象で損してる感じ。
PG経験あれば直感的に避けようとする人も少なくないのでは?
2021/01/21(木) 21:30:02.98ID:ooF1treM
>>171
Perl 6 は 2015 年に安定板がリリースされたぞ。
ただし、旧来の Perl と互換性は全然ないので後に Raku と改称された。
要するに別言語になってしもうた。
2021/01/21(木) 21:40:40.11ID:RnFvGHUF
>>172
ドルマークを多用するPerlはシェルスクリプトに慣れた人にはむしろ入りやすいはずだけどね。
175デフォルトの名無しさん
垢版 |
2021/01/21(木) 21:46:06.32ID:6tk1Snw3
あわしろ氏はJavaはオワコンこれからはPerlと言ってるけどな。
2021/01/21(木) 22:21:06.42ID:rjSQv0Wq
なんでこの人自分以外はperl使えない前提なんだろ…
177デフォルトの名無しさん
垢版 |
2021/01/21(木) 22:23:21.95ID:RnFvGHUF
知っている人も多いと思うけど、bash/zsh向けに便利な入力補完ツール fzf が存在する。
そのGitHubにはfzfにPerlを併用するサンプルコードが散見される。
https://github.com/junegunn/fzf/wiki/Examples

今やPerlは、sedやawkより多機能なちょっとしたテキスト改変ツールとして、Perl本来の役割に回帰している。
PerlをCGIを書くための言語と思っている人にはPerlがオワコンに見えるかもしれないが、現実は違う。
2021/01/21(木) 22:35:21.87ID:RnFvGHUF
python3が入っていない環境はわりとあるけどperlが入っていない環境はまずない。
2021/01/21(木) 22:35:36.69ID:Z9MWAls1
なんでC++スレでPerl, Perlと連呼するんだろう
おおかた、その心理を察することができるので草生えるwww
180デフォルトの名無しさん
垢版 |
2021/01/21(木) 22:41:15.38ID:RnFvGHUF
本スレテーマであるC++やJavaなどのコンパイル言語のコーディングの生産性を高めるにはスクリプト言語の有効活用が欠かせない。
makeやantではかゆい所に手が届かないもどかしさは今も昔も同じなんだよ。
2021/01/21(木) 22:54:28.47ID:H50jUx0j
>>168
Perl狂信者かよ
2021/01/21(木) 22:59:11.40ID:/ZdL1i9k
うかつにもPerl厨の秘口を突いてしまった
2021/01/21(木) 23:06:26.51ID:rjSQv0Wq
>>177
> PerlをCGIを書くための言語
いつの時代の人よw
184デフォルトの名無しさん
垢版 |
2021/01/22(金) 00:49:01.09ID:di1fs6eX
たしかルビーの素となった言語がペールでは?
185デフォルトの名無しさん
垢版 |
2021/01/22(金) 01:19:07.37ID:55qwSi9o
macOSのソフトウェア更新ツールHomebrewはRuby製。マカーがいる限りRubyは不滅。
186デフォルトの名無しさん
垢版 |
2021/01/22(金) 13:19:25.84ID:pJ+Dy7HC
>>157
PerlもPHPも難しいとは思わないけど
だからこそ排除すべき
187デフォルトの名無しさん
垢版 |
2021/01/22(金) 13:20:41.30ID:pJ+Dy7HC
>>160
>1文字の特殊変数だらけの言語

Rubyのことですね判ります
2021/01/22(金) 14:12:04.30ID:aLDuncuZ
>>187
Rubyはそれはない。
Perlと間違ってないか?
2021/01/22(金) 14:18:28.68ID:WLGQ46hZ
C++のところで延々と続けるのもなんだけど、TECOってのは相当複雑怪奇だったみたいね
2021/01/22(金) 22:15:36.76ID:HHqIRAh/
C++が今後関数型プログラミングを言語としてサポートしていくことはありますか?
2021/01/22(金) 22:18:18.81ID:3W/g7okM
<functinal>で足りるんじゃね?
2021/01/22(金) 22:50:10.68ID:LtnZZu+T
こちらでどうぞ
https://mevius.5ch.net/test/read.cgi/tech/1427572389/
2021/01/22(金) 23:49:36.96ID:LcAiXyQN
>>192
C++の「マルチパラダイム」の中に関数型が今後入ることはあるか (あるいはもう入ってるか) という質問なんですが、変なことを聞いていますか?
2021/01/23(土) 00:00:03.65ID:rMuiLyZn
ぅえ?
2021/01/23(土) 01:38:03.71ID:PXGkLjAZ
もう入ってるでしょ?
2021/01/23(土) 04:37:52.61ID:Vx6mcd5N
Perlのソース汚いイメージしかないけどな
2021/01/23(土) 07:19:17.61ID:E7+6hgZm
std::functionとラムダ式で関数はほぼ第一級オブジェクトとして扱えるからC++はとっくに関数型言語ですよ
モナドだってやろうと思えば作れるよ
2021/01/23(土) 13:50:31.25ID:1/fAmr9E
じゃーHaskellにできることはC++でもできるし、同じように書けるって言うのかい
2021/01/23(土) 13:52:40.96ID:Q+Wu8A2P
>>198
なんでそうなるのかようわからんが。
2021/01/23(土) 14:06:29.89ID:pKYkJfCY
>>160
>1文字の特殊変数だらけの言語
APL記号?
2021/01/23(土) 14:54:28.68ID:Q+Wu8A2P
>>188
https://docs.ruby-lang.org/ja/latest/class/Kernel.html#V_--21
2021/01/23(土) 16:26:10.57ID:LPDMRZtK
>>200
懐かしいな
俺アンペールのいじってたよ
2021/01/23(土) 18:58:05.34ID:C4WlxIYr
>>198
そんなクソみたいなこと言うんだったら、まず「関数型言語」の定義から言えよ。
Lispが関数型言語じゃないとか言い始めそうだな。
204デフォルトの名無しさん
垢版 |
2021/01/24(日) 11:36:54.35ID:wSlEv8S7
Rubyは関数型ωωω
2021/01/24(日) 12:17:53.22ID:/MPXRGah
カオスコードって意味ならc++とperlが双璧だわな。rubyは別の意味で糞だが。
2021/01/24(日) 14:46:51.42ID:bXJjYU1w
rubyの糞とrailsの糞がかけ合わさって悪臭漂う糞になる
207デフォルトの名無しさん
垢版 |
2021/01/24(日) 21:13:47.08ID:hPeuQsPP
肛門を保護するために出る粘液はイイ匂いがするので、化学的に類似品が合成され、香水の原料になっています。
ウンコは臭いですが、ウンコの周りには良いものがあるかもしれない。
2021/01/24(日) 23:17:47.88ID:bXJjYU1w
Co-mon++
2021/01/25(月) 00:51:35.02ID:h/LmkNzq
>>207
腸液は質感、匂いともに精液に酷似してるっていうのはよく言われてるけど、それのことじゃないよね?
良い匂いの分泌液なんて聞いたことがない
2021/01/25(月) 09:53:48.54ID:RU5Fvovq
やだこのスレホモ臭い
211デフォルトの名無しさん
垢版 |
2021/01/25(月) 10:13:42.80ID:uSgkqdKl
と言いつつ嬉しそうな吉宗であった。
212デフォルトの名無しさん
垢版 |
2021/01/25(月) 13:06:55.63ID:sPc2eBUP
PerlとC++は、見づらいソースコードに慣れる能力を鍛えてくれる。
Perlをオワコン扱いする人は情弱である。
2021/01/25(月) 13:11:37.73ID:54hHF458
厄介者のperl厨
2021/01/25(月) 13:34:11.10ID:lM5Uli0g
糞コードに触れるとアンチパターンがわかるというのは確かにあるが、それを人に勧めるのは気がひける。
215デフォルトの名無しさん
垢版 |
2021/01/25(月) 13:48:32.46ID:sPc2eBUP
まずい酒の味を知らない者には、うまい酒の味を見分けることはできない。
2021/01/25(月) 21:12:20.67ID:bQwFUjl3
美味い酒の味を知ったら不味い酒は飲めん
2021/01/25(月) 22:13:56.33ID:IR169uBT
酒は飲まんからようわからん
218デフォルトの名無しさん
垢版 |
2021/01/25(月) 22:56:10.85ID:sPc2eBUP
まずい酒を飲めなくなることは、プログラミングに置きかえればクソコードのメンテナンスができなくなることを意味しており、スキル低下でしかない。
2021/01/25(月) 23:11:18.97ID:bBvI6B4m
まずい酒はわかるけどうまい酒はマジわからん…
220デフォルトの名無しさん
垢版 |
2021/01/25(月) 23:57:21.75ID:sPc2eBUP
うまい酒については「水のように飲みやすい」というほめ表現もあるが、なら水飲んどけよという話でもある。
2021/01/25(月) 23:57:36.36ID:t4dFVxvz
<body>
!unti {nuritakuri}
<body/>
2021/01/26(火) 00:02:06.39ID:Qnn6Y+tc
<head>
<bukkake> seisi <bukkake/>
<strong> naaaaaaaaa!!!<strong/>
<head/>
2021/01/26(火) 02:05:34.14ID:wg8lZWjJ
>>220
ほんまこれ
前にカエルの肉を食ったやつが「ほんと鶏肉とおんなじようなもんだから!食べてみて!」
ってしつこいんだが、だったら鶏肉でいいだろなんでわざわざゲテモノ食わにゃならんのか??となる
224デフォルトの名無しさん
垢版 |
2021/01/26(火) 03:51:19.13ID:uiGtA95I
寄生虫が良い風味出すから。
225デフォルトの名無しさん
垢版 |
2021/01/26(火) 06:09:38.08ID:ZRZozNwf
macOSのHomebrewいいね。Perlが最新の5.32.1に即対応。人柱上等なところに惚れる。
2021/01/26(火) 07:49:52.25ID:ZI8ZD6Xl
安めの食材や有り合わせでうまいもん作れる腕があっても
腐ったものはどうにもできない

例えるなら、これだろ
2021/01/26(火) 07:59:37.62ID:xVPuSdRM
>>220
酔える水なら。
2021/01/26(火) 11:52:17.15ID:XuLptVzr
>>223
今ジビエなどとおしゃれに言ってるがゲテモノ食いが今の事態を招いてる

中途半端な科学信仰が何もかも迷信にしてしまって自然を正しく畏れなくなった
229デフォルトの名無しさん
垢版 |
2021/01/26(火) 13:45:24.16ID:uiGtA95I
ちょっと腐ったほうが柔らかくなってアミノ酸も多いよ。
熟成させたと言えばグルメも安心だし。
230デフォルトの名無しさん
垢版 |
2021/01/26(火) 13:48:13.24ID:uiGtA95I
野菜は立てておくと腐らないんだけど、その代わり成長するからね。
光合成できるかも?と思ってなけなしの養分使って葉を伸ばすんだろうけど、光合成は出来ません。
231デフォルトの名無しさん
垢版 |
2021/01/26(火) 13:54:11.58ID:uiGtA95I
野菜の活〆を発明したら儲かるだろな。
放射線以外で。
2021/01/26(火) 21:06:31.25ID:Du8Hqhh0
いいかげんスレ違い。
233デフォルトの名無しさん
垢版 |
2021/01/26(火) 21:46:24.92ID:ZRZozNwf
プリプロセッサマクロだらけの“汚い”コードを否定したらC/C++の強みを失うことになる。
JavaやC#はプリプロセッサマクロが貧弱なのが玉にキズだ。
2021/01/26(火) 21:51:10.66ID:ZRZozNwf
pybind11スレがないこんな世の中じゃ〜Python〜
まぁマクロの塊のような代物だが。
2021/01/27(水) 06:03:44.65ID:yQalyIAE
C++はコミュニティで発言力のある人が大抵率直にものを言い過ぎる、悪く言えば口が悪いので忌み嫌われてるとこある
2021/01/27(水) 07:30:48.85ID:eLUquqZ0
>>229
カダベリンやムスカリンが発生してたり
セレウス菌が大量にいるのは
そういう問題じゃねえぜ
237デフォルトの名無しさん
垢版 |
2021/01/27(水) 07:48:28.28ID:4l9V085Z
でも、Linux板なんか失敗したボランティアの住所載せて、放火しろとは言ってませんよ??言ってませんよ??・・・などの書き込みあるからな。
それに比べれはだいぶ良識的では?
238デフォルトの名無しさん
垢版 |
2021/01/27(水) 11:26:52.94ID:cJSBZXf9
C/C++のプリプロセッサも貧弱すぎ
239デフォルトの名無しさん
垢版 |
2021/01/27(水) 17:43:27.13ID:nPuTGnvU
C++例外のスタック情報がとれないのはC++の欠点。
例外でスタック情報を使えるJava/C#/Python/Perlはエライ。
2021/01/27(水) 21:51:38.91ID:NT655YPf
おまえは二度とC++使うな
2021/01/27(水) 23:04:53.57ID:TqcnYSNG
>>239
スタックフレーム作ればイケるってば
2021/01/28(木) 09:07:27.76ID:dmDIUcy2
>>235
例えば誰?
2021/01/28(木) 10:23:46.51ID:vBYpvnJx
>>239
gdb にアタッチしたことないんか?

C++23 には stacktrace が入るから
デバッガを使いこなせなくても少し楽にトレースできるかもな。
244デフォルトの名無しさん
垢版 |
2021/01/28(木) 10:52:39.05ID:dNWrUHbO
>>223
フグは豚肉に触感似てるけどフグの方が美味い
245デフォルトの名無しさん
垢版 |
2021/01/28(木) 10:54:00.53ID:dNWrUHbO
>>228
日本で感染爆発が起きてないのは以前からジビエが流行してたからか
246デフォルトの名無しさん
垢版 |
2021/01/28(木) 10:55:14.42ID:dNWrUHbO
>>230-231
白菜は外の皮じゃなくて中の芯から先に食べろと言われている
2021/01/28(木) 11:40:01.79ID:eLxqvNeX
>>200
ユニコ時代だからAPLよりずっと先行ってるぞ
組み込み演算子で∩∉とか集合論の記号採用してたりアトミックな演算子は⚛++とか洒落効いてたりする
一方で古代perlのプレフィックスは緩和されてる
2021/01/28(木) 11:51:37.25ID:eLxqvNeX
∅∘∩ ⊍∪ ⊖ ⊎ ∖≅ ∈ ∉ ∋ ∌ ≡
≢ ⊂ ⊄ ⊃ ⊅ ⊆ ⊈ ⊇ ⊉ ≼ ≽.«»≠␤
他組み込みではこんな感じか
>= やらよりmずっと可読性高いと思う、エディタもvimとか高機能なのなら問題なかろう
␤文字を表示してくれるのは特に便利
2021/01/28(木) 11:58:59.45ID:kskG1wa2
>>245
さすがにコウモリはどこの地方でも食わんだろ
2021/01/28(木) 17:23:15.04ID:8Al9oSyF
なんでプリミティブ型って継承できんの?
2021/01/28(木) 17:29:22.44ID:vBYpvnJx
>>250
やりたいときってあるか?
2021/01/28(木) 17:41:41.73ID:GsoT0xyU
クラスAのオブジェクトをクラスBのメンバにするときってどうやってAのコンストラクタ呼ぶの?

class B{
 A a;

public:
 B(){
  // この辺でAのコンストラクタを呼びたい
 }
};
2021/01/28(木) 17:48:00.82ID:WrE+/6so
>>252
メンバのコンストラクタの方が先に呼ばれる。だからそこでは既にAは構築済み。
どうしてもBのコンストラクタ内でAのコンストラクタ呼びたいなら、メンバ変数はポインタで持つ
254デフォルトの名無しさん
垢版 |
2021/01/28(木) 18:07:20.07ID:IHrlZHr2
>>243
gdbはおいとくとして、Visual StudioってC++例外のスロー位置を追跡できたっけ?
2021/01/28(木) 18:50:38.47ID:Hqj+H5f7
>>252
初期化リストを使う
B() : a(hoge, piyo)
2021/01/28(木) 18:54:30.61ID:IHrlZHr2
あとで再初期化したくなること多いから、結局コンストラクタの実装を別の関数に分離すること多いよね。
コンストラクタの種類が増えたら使いまわしたくなるし。
2021/01/28(木) 19:24:37.48ID:q3mIN91/
>>243
デバッガ使いこなせないとか話にならんだろ・・
258デフォルトの名無しさん
垢版 |
2021/01/28(木) 19:28:49.13ID:IHrlZHr2
デバッガやシンボルがない環境でもスタックトレースできたほうが良いと思うけどね。
後発言語の生産性の高さはこの辺の充実ぶりにあるでしょ。
259デフォルトの名無しさん
垢版 |
2021/01/28(木) 19:42:24.27ID:IHrlZHr2
他プロセスと連携するシステムにはデバッガを当てにくい事が多い。
タイミング依存の不具合を追跡する場合、デバッガがまったく役に立たない。
2021/01/28(木) 20:25:47.81ID:eBfsAdOM
>>258
その手の生産性と成果物の効率はトレードオフでどっちを重視するかが違うだけでしょ
2021/01/28(木) 20:36:13.14ID:IHrlZHr2
デバッガ使いこなすとか言って悦に入ってる人と会話が噛み合わないんだが。
262デフォルトの名無しさん
垢版 |
2021/01/28(木) 20:36:14.66ID:yp+dwtvR
>>258
だよね
むしろデバッガをアタッチできる環境ならスタックトレースはなくてもなんとかなる
ユーザー環境でスタックトレースがテキストファイルに落ちるようになってるとトラブルシューティングがしやすい
2021/01/28(木) 21:29:31.41ID:oPlwADge
>>261
ここほとんどアマチュアの人だから許してやろうやw
2021/01/28(木) 21:48:11.74ID:q3mIN91/
>>261, >>263
悪いがプロだよ
IDEの機能を使いこなせてない初心者が、先に学ぶべきことから逃げて言語だけでどうにかさせようとするような
(いつものことだが)はちみつのミスリードに釘を刺しただけだ
2021/01/28(木) 21:51:13.66ID:q3mIN91/
>>261
あと、流れを読む限り俺の発言が気に入らなくてファビョってるのは君の方だよね、俺1行しか書いてなかったし(しかも大した内容じゃない)w
何が気に障ったんだ?
2021/01/28(木) 21:51:23.69ID:oPlwADge
いやごめん、俺は流れは一切追ってなくて他意はないよ
茶化したかっただけ
気にしないで
2021/01/28(木) 23:50:09.41ID:g6qVZG7L
発狂やないかw
Perlの人かな
2021/01/28(木) 23:53:15.94ID:RfcrpqT0
>>253,255
じゃあ、Bを構築してしばらく経ってからわかる情報を使ってAを構築したいとき、Aのインスタンスをメンバとして持つのは不可能ということですか?
ポインタで持つ以外の方法はない (想定されてない?) のでしょうか

constなメンバ変数を初期化するときも近いことを思います
269デフォルトの名無しさん
垢版 |
2021/01/29(金) 00:10:27.15ID:ZIYbfTXe
>>268
そういうコンストラクタ制約を持つクラスはけっこう多い。
WindowsのC++向けGDI+ライブラリのクラス群はまさにこれが当てはまる。
広範に存在している以上は受け入れるしかない。
今時は標準でshared_ptrなどの共有ポインタクラスを使えるので、さほど問題にならないでしょ。
2021/01/29(金) 00:19:48.35ID:SRnp44iw
>>268
Aに引数なしのコンストラクタ、コピーorムーブ代入演算子があるなら、後で作って代入でもいいけど
まぁ特に理由なければ(スマート)ポインタで持った方が無難だし楽

constはどうしようもない
2021/01/29(金) 00:22:16.89ID:MWSZTtHp
>>268
「Bを構築してしばらく経ってからわかる情報」を返すヘルパー関数を作って初期化リストの中で呼べばいいじゃない
2021/01/29(金) 07:49:13.10ID:/axUqcOX
データメンバをconstってあんまりやらないな
publicに晒すとかじゃなきゃメンバ関数を
constにするだけで足りるから

あ、staticメンバのconstはよくやるけどね
2021/01/29(金) 08:02:53.38ID:1V7SRlCX
>>251
ある
実装は同じunsigned longでも意味が違うから別クラスとして扱いたいときとか
private継承できたらナア……
現状(C++03)はプリミティブ型と同じ演算子(のうちの当座のアプリケーションで使うやつ)をいちいち実装したクラスを作って
NDEBUGマクロで実装を切り替えるみたいな涙ぐましい努力が要る
2021/01/29(金) 08:05:13.74ID:1V7SRlCX
訂正orz
誤: private継承
正: public継承かつoperator unsigned long()はprivateかつunsigned longからの構築はexplicit
2021/01/29(金) 08:08:37.91ID:1V7SRlCX
メンバをconstにして代入演算子を定義せずにいるとデフォルトの代入演算子をが定義できないとコンパイラに文句を言われる俺環、
2021/01/29(金) 09:20:50.39ID:koPyq8om
>>273
それ、継承できたとして式の中で混在しても区別されないんじゃね?
テンプレートの型引数で区別するような使い方くらいしか思いつかないが。
2021/01/29(金) 12:20:22.74ID:c2S2Mocm
メンバ変数のconstはポインタ型ならすることあるけど、値で持つメンバ変数はあんまり意味なくない?
constなくても勝手に外部から書き換えられないように、ちゃんと隠蔽しとけばいいだけでしょ
2021/01/29(金) 12:35:16.78ID:2DekME/2
>>277
class内の処理においても変更しないつもりだ、変更されることはない、と明示することで意識しておかなければならないことを少し軽減できるのだから、無駄ではないと思う。
手間をかけずにconstにできるならしておけばいいし、逆に無理して複雑なことをしてまでconstにする必要はないという程度のことかと思う。
2021/01/29(金) 12:55:03.34ID:c2S2Mocm
>>278
たしかにconst付いてればコンストラクタで設定した値がずっと変わらないことが
明示的になるから無意味ではないか
2021/01/29(金) 14:10:30.45ID:heeNhc25
>>273
そういう用途なら opaque alias という提案だけは出てるけど
どう見てもグダグダなんで、場当たり的な方法のほうがマシだと思うよ。
281デフォルトの名無しさん
垢版 |
2021/01/29(金) 16:04:20.47ID:5pIDnM+S
>>251
3値のboolean作るときってboolean継承すべき?
282デフォルトの名無しさん
垢版 |
2021/01/29(金) 16:07:44.73ID:5pIDnM+S
>>256
言いたいことは判るが
コピーコンストラクタやムーブコンストラクタが勝手に使われるから
デフォルトに任せてると何が起こるかは判ってた方が良い
283デフォルトの名無しさん
垢版 |
2021/01/29(金) 16:10:21.66ID:5pIDnM+S
>>259
COMサーバーというかDX用にフィルタ書いてると訳判らなくなった
284デフォルトの名無しさん
垢版 |
2021/01/29(金) 16:56:37.48ID:RxAp4EkX
>>281
3値のbooleanを作って何するの?
boolへのポインタにしてtrue / false / nullptr の3値でなんとかならんか?
2021/01/29(金) 17:20:59.69ID:ADFs+h5F
boostにtriboolってのがあるな
2021/01/29(金) 17:23:22.91ID:t7wU8l8M
>>281
仮に真偽値型を継承可能であったとして、三値型が真偽値型を継承するのはおかしいだろう。
場合によって柔軟な判断が必要な場合はあるものの、
継承は is-a 関係を表したいときに限ったほうがよろしいというのが一般的な設計原則だと思うが。
2021/01/29(金) 17:25:47.23ID:GtDK4kd8
nullableか、DBのフィールド値?
2021/01/29(金) 18:57:54.24ID:ZIYbfTXe
はちみつ餃子「スタックトレースできないならデバッガ当てればいいじゃない」
2021/01/29(金) 19:41:08.91ID:rAmh2V0K
典型的な円楕円問題だな
2021/01/29(金) 19:56:26.71ID:ZIYbfTXe
テンプレートを使えば、クラス継承に依存しない記述が可能。
iostreamが黒歴史扱いである現実を踏まえての話。
2021/01/29(金) 21:24:08.77ID:WFMo+mcm
とりあえずiostream批判しとけば訳知り顔ができた気に浸れる浅はかなやつ
2021/01/29(金) 21:35:39.96ID:nnAlz0gZ
c++ニワカあるあるだよなw
iostreamとりあえず批判奴w
2021/01/29(金) 21:39:11.47ID:ZIYbfTXe
iostreamは使いもしないメンバ変数を継承することを強要される悪い手本でしょ。
2021/01/29(金) 22:16:38.63ID:WFMo+mcm
何も説得力を示さずに突然「悪い」と言い出す
2021/01/30(土) 01:56:51.26ID:SJAC6oP5
iostreamはクソなのは正解だが別に批判するようなことでもない
なぜなら使わなければいいだけの話だからだ
2021/01/30(土) 02:06:50.03ID:OHt9F1SU
無理にクラス継承を使わずオーバーライド関数とそれを使うテンプレート関数を充実させたほうが幸せになれる。
2021/01/30(土) 02:41:04.49ID:PJvUkb6d
別に無理して継承を使っているわけではない
どっかの馬の骨が気に入らんからといって
あれを使うなこれを使うなと言われるほうが無理そのものだ
2021/01/30(土) 02:53:37.72ID:OHt9F1SU
例えば、ファイルに書き込む処理があったとする。
ファイルハンドルとして有名な型としては、int型、FILE*型、iostream型、Win32APIのHANDLE型などがあげられる。
これらを派生クラスに閉じ込めて抽象化するよりも、関数名が同じになるオーバーライド関数を作ってテンプレート関数から呼んだ方がはるかに楽。

int WriteBuffer(int fp, const char* buffer);
int WriteBuffer(FILE* fp, const char* buffer);
int WriteBuffer(ostream& fp, const char* buffer);
int WriteBuffer(HANDLE fp, const char* buffer);

template<typename FILE_OBJECT>
void WriteContent(FILE_OBJECT o)
{
WriteBuffer(o, "write test1");
WriteBuffer(o, "write test2");
}
2021/01/30(土) 03:53:39.52ID:ULcRPxme
ドヤってるところすまんがそれオーバーライドじゃない
2021/01/30(土) 04:01:05.04ID:PJvUkb6d
プゲラ
301デフォルトの名無しさん
垢版 |
2021/01/30(土) 05:45:11.84ID:SLqQC90z
フリー関数とクラスメンバでは、インテリセンスが効くか効かないかの違いもある。
2021/01/30(土) 05:52:17.44ID:OHt9F1SU
そんなあなたに名前空間
303デフォルトの名無しさん
垢版 |
2021/01/30(土) 06:06:53.60ID:SLqQC90z
クラスの場合、名前空間を書かなくても、インテリセンスが効く。
2021/01/30(土) 06:47:43.00ID:budoESfZ
コンストラクタの初期化リストで
class A{
 int x;

public:
 A(int x) : x(x) {}
};
みたいにしたとき、ちゃんとメンバのxがコンストラクタの引数のxで初期化されますよね?
メンバの x と同名の引数の x が同一のスコープに同居しているようで紛らわしいかなと思ったのですが、こういう書き方を避ける慣習はありますか
2021/01/30(土) 07:04:07.72ID:ULcRPxme
自分は普通にその書き方してる
避ける人も居るっぽいけど好きなようにすればいい
2021/01/30(土) 09:09:49.20ID:PHKUCpSE
iostreamマンセーバカってのは型安全ならどんな仕様でも良いと思ってるカスが多いからな。
型安全は評価する一項目に過ぎないってのに。
2021/01/30(土) 09:29:38.23ID:vDjChjwr
iostreamは整形のための情報をわざわざ状態として持たされるのがクソ
当時は状態が邪悪だっていう考え方が一般的じゃなかったからしょうがないけど
2021/01/30(土) 09:38:20.91ID:2pTx0la6
でも状態もってなかったら記述が煩雑になりすぎない?
HTMLのマークアップとまでは言わんまでも
2021/01/30(土) 09:59:20.80ID:OHt9F1SU
整形設定を記憶する変数インスタンスをiostreamインスタンスと分離すべきって話でしょ。
必要に応じて差し替えできるように参照渡しするか、逆にiostreamを参照渡しするとか色々やれたはず。
2021/01/30(土) 10:06:40.70ID:OHt9F1SU
というか他のオブジェクト指向言語だと整形情報がFormatterクラスとかに分離されているのが普通だし。
2021/01/30(土) 10:32:05.24ID:PJvUkb6d
FORTRANのFORMAT文が好きな人をどうこうしようとは思わない
2021/01/30(土) 10:40:52.47ID:hVJYorL3
初歩的な質問なのですが、stringクラスの内部バッファはデストラクタで破棄されるため自分では一切管理しなくていいという認識で良いのでしょうか?
313デフォルトの名無しさん
垢版 |
2021/01/30(土) 11:17:24.76ID:SLqQC90z
アロケータによるけど、普通は管理しなくて良いのでは?
314デフォルトの名無しさん
垢版 |
2021/01/30(土) 12:47:13.80ID:EWZvTk3z
>>308
状態持ってても無駄に煩雑(複雑ではない)
2021/01/30(土) 12:57:10.51ID:8FYOnD7D
iostream 型安全なのはいいけど、char/signed char/unsigned char ぜんぶ文字扱いするのはやめて欲しかった。
316デフォルトの名無しさん
垢版 |
2021/01/30(土) 13:18:35.30ID:SLqQC90z
単項プラスで。
2021/01/30(土) 13:18:38.04ID:4OMKN/Z4
>>309
入出力を直接的に司るバッファクラス (basic_streambuf) と
書式制御を司るストリームクラスを分離したデザインになっているし、
必要に応じて差し替えることも出来るよ。

iostream においてそれがわかりやすいか、良いデザインであるかは別として、
ちゃんと分離したデザインになってる。
2021/01/30(土) 14:53:52.50ID:L1O2TNoD
>>304
私は馬鹿なのでメンバ変数とコンストラクタ引数を x, _x というふうに書き分けています、馬鹿が感染るかもしれないのでお勧めはしません
2021/01/30(土) 15:08:20.24ID:S5wIZr5N
C++でのメンバ変数は、標準的には m_xと書く。
2021/01/30(土) 16:04:40.96ID:0ahE8ZR3
>>319
何処信者だよ
ダッサw
321デフォルトの名無しさん
垢版 |
2021/01/30(土) 16:41:05.48ID:SLqQC90z
MicrosoftとAdobeがその書き方多いですね。
2021/01/30(土) 17:13:12.28ID:S5wIZr5N
なお、_x は、命名規約上、禁止。先頭が _ の名前はコンパイラなどの
システム予約なため。
2021/01/30(土) 17:14:26.98ID:2r/QlSUC
そうだったっけ?
2021/01/30(土) 17:19:55.79ID:4OMKN/Z4
>>304
>>318-319
命名規約の方法論は色々なのでプレフィクスを付けるルールが定めてある場合もあるし、
むしろ一致させていくようにしているものもある。
私自身は、少なくともメンバに値を設定するだけの単純なコンストラクタである場合には
名前を一致させていくスタイルで書く。

C++ を使う上でのガイドラインとしてよく参照されているのはグーグルのスタイルガイドで、
データメンバの名前は最後にアンダースコアを付けるようにルールを定めている。
https://google.github.io/styleguide/cppguide.html#Variable_Names

その一方では C++ の設計者である Stroustrup は型やスコープを変数名に含めるのは好ましくない
(しかし部分的に便利な場合もあることは認めている) と書いている。
https://stroustrup.com/bs_faq2.html#Hungarian

どちらの習慣が圧倒的優勢ということはないと思う。

>>322
グローバル変数としてはアンダースコアで始まる名前は予約されているけど、
そうでない場合には問題ない。

ただし、

・ アンダースコアで始まって大文字が続く名前
・ アンダースコアが連続 (名前の先頭部分以外でも) する名前

は名前の種類やスコープにかかわらずどこでも予約されている。
2021/01/30(土) 17:30:01.20ID:2r/QlSUC
互いの信仰を侵害してはならないがチーム内では統一されている必要がある
規約の背景は明確である必要がある
326デフォルトの名無しさん
垢版 |
2021/01/30(土) 18:08:50.99ID:OHt9F1SU
>>317
まず、FILE*とostreamが一対一対応していないのがダメ。
せっかくC言語でファイル、パイプ、標準IOがFILE*型としてで統合化・抽象化されていたのに、
C++でostreamとfstreamで分離される劣化が起きた。
2021/01/30(土) 18:30:25.89ID:PJvUkb6d
ios_baseで統一する形に変わっただけ
それをFILE*がどうたらと駄々こねるのは
頭が堅すぎる実年齢に無関係の老害だ
328デフォルトの名無しさん
垢版 |
2021/01/30(土) 18:36:35.02ID:OHt9F1SU
パイプ処理をostream系で書く奇特な人ってどのくらいいるの?
329デフォルトの名無しさん
垢版 |
2021/01/30(土) 18:41:09.24ID:OHt9F1SU
pythonは定数がないから全部大文字の変数は定数のようにみなしましょう的な談合がある。
2021/01/30(土) 19:00:34.72ID:0ahE8ZR3
定数というか型もない
2021/01/30(土) 19:09:23.04ID:L1O2TNoD
>>322
束縛領域が狭いローカル変数とかには、_x を使ってもいいのではないか?と考えていますが‥‥
2021/01/30(土) 20:32:34.21ID:PJvUkb6d
data_
size_
2021/01/31(日) 03:18:57.87ID:6QCY/vGM
>>331
実は#defineマクロの中で使われるケースがあってね。
_xが、アプリの中で使われてない事を前提にしないとマクロが作れない
場合とか。
334デフォルトの名無しさん
垢版 |
2021/01/31(日) 06:52:18.40ID:gXTMTlGe
HTTPサーバーのサンプルで、関数型言語がCを凌駕して、C実装の作者が??になってるやり取りをどこかで見たのですが、わかる方いらっしゃいませんか?

おそらくC++は簡単に勝てるはずなんですが。
2021/01/31(日) 07:27:56.74ID:fCVb5Gn/
dmrが?
2021/01/31(日) 09:14:46.77ID:bSEeGU13
>>333
c++実装者がユーザから参照可能な形でそれやってるの見たことあるの?
2021/01/31(日) 09:22:03.74ID:fCVb5Gn/
>>333
#define A(_x) (std::cout << #_x)

int main()
{
int _x = 5;
A(_x);
std::cout << _x;
}
何か問題でも?
338デフォルトの名無しさん
垢版 |
2021/01/31(日) 10:19:42.43ID:BqL9JwJS
ひどいな
https://qiita.com/threecups/items/75a4b9ca1298270c5c62
339デフォルトの名無しさん
垢版 |
2021/01/31(日) 10:23:16.43ID:BqL9JwJS
>>331
_で始めると激しくコンパイラ依存になる
340デフォルトの名無しさん
垢版 |
2021/01/31(日) 10:50:22.50ID:BqL9JwJS
>>334
Erlang?
2021/01/31(日) 10:57:57.30ID:+XHxoAeu
>>339
繰り返すが言語仕様上はグローバル変数ではない名前の頭がアンダースコアで始まるだけなら問題ない。

現実に出来が悪いコンパイラがたくさんあるのであれば仕方がないが、
少なくとも俺はそんなのに遭遇したことはない。
2021/01/31(日) 11:04:21.78ID:fCVb5Gn/
>>338
DLLのビルドに使ったコンパイラと
そのDLLを使うアプリをビルドするコンパイラが違っても動くんだぞ
ABIの指定は仕方ねえだろ
2021/01/31(日) 11:29:10.73ID:2WBeknRq
>>334
これか?
サーバーじゃなくてパーサー部分だけだけど
https://blog.8arrow.org/entry/2014/10/23/063044
344デフォルトの名無しさん
垢版 |
2021/01/31(日) 12:10:02.04ID:gXTMTlGe
>>343
それです。
ありがとうございます。
2021/01/31(日) 13:12:26.22ID:ZnRwde8F
>>341
英語サイトでも、説明の仕方が誤解を招くようなものがありまして、もしかしたらそれは誤解かも知れません。
https://stackoverflow.com/questions/25090635/use-and-in-c-programs
「Here's what the C standard says (section 7.1.3):
 1. All identifiers that begin with an underscore and either an uppercase letter or another underscore are always reserved for any use.
 2. All identifiers that begin with an underscore are always reserved for use as identifiers with file scope in both the ordinary and tag name spaces.」
訳:
1. アンダースコアで始まって直後に英大文字が続くか、または、アンダースコアが連続して
 続く識別子は、いかなる使用も予約されている。

2. アンダースコアで始まる全ての識別子は、通常または、タグ名前空間における
 ファイルスコープの識別子として常に予約されている。

1. の方は、_XXX か、__xxx は予約されていると言うことですが、
2. の方は、_xxx の形式は、例え xxx の部分の先頭が小文字であっても、ファイルスコープにおける
識別子として予約されており、ローカル変数名としては使うべきではないということだと思われます。

また、C++の方では、
https://stackoverflow.com/questions/228783/what-are-the-rules-about-using-an-underscore-in-a-c-identifier
*Reserved in any scope, including for use as implementation macros:
10. identifiers beginning with an underscore followed immediately by an uppercase letter
11. identifiers containing adjacent underscores (or "double underscore")
*Reserved in the global namespace:
12. identifiers beginning with an underscore

この12.の書き方が(あなたに)誤解を招いた気がします。
また、11.によれば、xxx__yyy のように _ が連続するものは、識別子の中間であっても予約されている
とのことです。
2021/01/31(日) 13:18:09.37ID:ZnRwde8F
>>337
それは問題ではないんだけど、
#define a(x) { int _x = 1; _x = x * 2; printf("%d",_x);}
のようなマクロが有ったとすれば、
int y = 5;
a(y); // 10 と表示される。

int _x = 5;
a(_x); // 2 と表示される。
2021/01/31(日) 13:42:32.29ID:Rr91L/mp
int と自作クラス A の pair を priority_queue に入れようと思ったら pair<int, A> に対する less の定義(?)が要るって言われました
int だけに基づいてソートしてくれたら結構なんですが、最も簡単な書き方はどんなですか

また、自作クラス A は array を継承しているのですが、less の定義も引き継ぐ方法はないのでしょうか
2021/01/31(日) 14:05:10.94ID:WjHCKOmN
いろんな見解があってややこしいから、安全側に倒して「_で始まる名前は一切使うな」でいいと思ってる
コンパイラ実装するような奴以外はそれで困らんやろ
349デフォルトの名無しさん
垢版 |
2021/01/31(日) 14:10:22.05ID:gXTMTlGe
【HOW】予約済みの席に座る方法【TO】
2021/01/31(日) 14:15:41.43ID:WjHCKOmN
>>347
using Aitem = std::pair<int, A>;
using Aqueue = std::priority_queue<Aitem>, std::vector<Aitem>, [](const Aitem& lhs, const Aitem& rhs){ return lhs.first < rhs.first; }>
Aqueue your_queue;
2021/01/31(日) 14:54:17.91ID:bSEeGU13
>>345
ファイルスコープとローカルスコープは違うよ。
あと、今議論中なのはアンダースコアひとつで始まるメンバ変数についてなんで、アンダースコアの連続がアウトなのは誰でも知ってるし、餃子も324で書いてる
352デフォルトの名無しさん
垢版 |
2021/01/31(日) 15:06:11.72ID:gXTMTlGe
盛 り 上 が っ て ま い り ま し た ↑
353デフォルトの名無しさん
垢版 |
2021/01/31(日) 15:07:16.87ID:gXTMTlGe
SRELLって知ってますか?
2021/01/31(日) 15:15:54.45ID:ZnRwde8F
>>351
undersocre で始まる識別子は、Cの仕様ではこうなっています:
「All identifiers that begin with an underscore are always reserved for use as identifiers with file scope in both the ordinary and tag name spaces.」

「undersocre で始まる識別子はfile scopeでは使用してはいけない」
とは言っておらず。
「undersocre で始まる識別子はfile scopeの識別子として使用される
ことが予約されている」
と言っています。

with file scope

の前置詞がなぜ in ではなく with になっているかは私には分かりかねますが、
その直後にも in が使われているので in が二重に使われるのを避けたのかも
知れません。
355デフォルトの名無しさん
垢版 |
2021/01/31(日) 15:18:08.68ID:gXTMTlGe
inを踏むとか言ってみたくなるじゃないか。
責任とれ。
2021/01/31(日) 15:18:17.21ID:ZnRwde8F
どうやら、
「identifiers with file scope」は、「ファイルスコープを持つ識別子」
であり、with は、「持つ」の意味で使われているようです、。
2021/01/31(日) 15:41:47.21ID:bSEeGU13
>>354
予約されてるとはつまり使うなってことだけど、いずれにせよファイルスコープの話であって、ローカル変数の話じゃないよ。
2021/01/31(日) 16:03:58.33ID:fCVb5Gn/
>>346
#define a(x) { int z = 1; z = x * 2; printf("%d",z);}
int y = 5; a(y);
int z = 5; a(z);
これと何が違うの?
下線で始まることとは無関係だろ
2021/01/31(日) 16:08:45.08ID:q0ry4PhJ
STLコンテナの継承ってしない方が良いんですかね?

たとえばarrayに機能を追加 ([i][j] で i 行 j 列の要素を取得する等) して行列クラスを作りたいとき、
・arrayを継承する
・行列クラス内で要素を格納するメンバを array として持つ
の2パターンが考えられますが、皆さん的にはどっちが好ましいですか?

行列 is an array なので今こそ継承の使いどころだと思ったのですがいかがでしょうか
2021/01/31(日) 16:16:47.40ID:WjHCKOmN
arrayは仮想デストラクタ持ってないからポリモは出来ない
データ構造使うだけなら必要ない
やめとけ
2021/01/31(日) 16:20:57.91ID:NgKJGEE4
かか関数型マクロなら不用意に定義されていても
 int y = (a)(x)
という書き方おすれば問題無くマクロじゃない関数a()の方が呼ばれるので問題無い!
事前に
 typedef double a;
とかされていた場合は知らんが、
2021/01/31(日) 16:21:36.60ID:2wqasnUt
好きにしたら?
C++なんて自己流全開で俺スゲーしてなんぼ、他人の顔色伺ってたらダメ
行列なんてプロダクションではどうせ出来合いのライブラリ使うんだし
2021/01/31(日) 16:22:25.80ID:q0ry4PhJ
>>360
じゃあメンバとして要素(array)を持てば良いってことですよね?
[]の定義の仕方はわかるのですが、[][]ってどうやって定義するんでしたっけ?
2021/01/31(日) 16:27:00.30ID:+XHxoAeu
>>363
直接には出来ない。 (二引数を受け取れるようにしようという提案はある。)
operator[] を持つ別のクラス (のオブジェクト) を返すという形で実装する。
365デフォルトの名無しさん
垢版 |
2021/01/31(日) 16:27:38.50ID:X7lGC0go
case by case だろうけど
Array と Matrix に関してなら
直観的に考えると後者かな
継承する意味が無い
366デフォルトの名無しさん
垢版 |
2021/01/31(日) 16:30:29.11ID:X7lGC0go
[][][]だと3引数になるの?
[][][][]だと4引数になるの?
って疑問が出るので
operator[] を持つ自分自身のクラス (のオブジェクト)が正解だと思う
2021/01/31(日) 16:31:13.60ID:NgKJGEE4
std::array<std::vector<double> > x;
みたいな
2021/01/31(日) 16:32:01.22ID:NgKJGEE4
ジャグ配列になってしまう…orz
2021/01/31(日) 16:32:06.68ID:fCVb5Gn/
継承といえば
type_infoは仮想デストラクタ持ってるけど
派生クラス作ったやついる? 実験でなく
2021/01/31(日) 16:34:24.04ID:ZnRwde8F
>>358
命名規約に従って変数名をつけていれば、>>346のマクロはバグらない。
一方、>>358のマクロは、命名規約に従って合法的に定義されたローカル
変数zに対して使ってもバグる。
その違い。
2021/01/31(日) 16:34:43.94ID:+XHxoAeu
>>366
operator{] にこだわらずに要素にアクセスするメンバ関数を用意するのでもそんなに困らない。
見栄えだけの問題。

まあ見栄えも大事なんだけど。
2021/01/31(日) 16:36:28.41ID:ZnRwde8F
>>357
そうではなく、_xxx は、グローバル変数で使うことが予約されているので、
ローカル変数では使ってはならない、と読み取れるように思う。
2021/01/31(日) 16:38:11.57ID:q0ry4PhJ
>>366
すみません。どう書いたら良いのか分かりません
[]は
int& operator [] (int i) {return elem[i];}
みたいな感じですよね?
2021/01/31(日) 16:43:15.04ID:fCVb5Gn/
>>370
そのためにinlineとconstexprが用意されてるわけだが
なぜマクロで作らなければならないんだ?

どこぞのOS屋がmaxなんてクソマクロ作ってたせいで
みんな迷惑してたよな
2021/01/31(日) 16:45:04.61ID:+XHxoAeu
>>372
ファイルスコープで予約されている名前とローカル変数で名前がかぶっても
単にシャドウされるだけなので衝突しない。

ローカル変数名として使うべきでないという理由にならない。
2021/01/31(日) 16:51:19.01ID:ZnRwde8F
>>370
[補足]
マクロ引数が二重に評価されてしまうのを防ぐため、マクロ作者が
気を利かせたつもりで次のようなマクロを書いたとする:
#define b(x,y) {int _x=x; int _y=y; f(_x,_y); g(_x,_y); }
作者の意図としては、
char *ptr1, *ptr2;
b(*ptr1++, *ptr2++);
のような場合にも正しく動作するようにしたいということで、
この場合は、*ptr1++, *ptr2++ は、それぞれ1回ずつ評価されるので、
ptr1, ptr2 は、それぞれ 1ずつ前に進むので、アプリ作者の意図を
組むことが出来る。

一方、使う側が命名規約に従わず、アプリのローカル変数で_x,_yを定義し、
int _x=1;
int _y=2;
b(_y,_x);
とすると、このマクロは誤動作し、
int x=1;
int y=2;
b(y,x);
と書いたときと結果が変わってくる。
2021/01/31(日) 16:55:15.98ID:wwbd/Qx2
こういうクソしょーもない話って馬鹿でも理解できるから盛り上がるよね
378デフォルトの名無しさん
垢版 |
2021/01/31(日) 16:57:55.61ID:ZnRwde8F
>>375
まあ、そうなんだけども、多分、英語の意味をそのまま素直に汲み取れば、
単純に>>372の意味のはず。
またそれは>>376のような状況を防ぐことが出来る。

>>374
まあ実際それはそういうこともあることは有るが、マクロでしか書けないような
例もあるわけで、>>376のようなマクロ作者のせっかくの配慮が、命名規約
を破って書かれたアプリでは逆効果になってしまうことがある。
2021/01/31(日) 17:00:34.53ID:ZnRwde8F
[補足]
なお、Cの伝統だと、
#define b(x,y) {int _x=x; int _y=y; f(_x,_y); g(_x,_y); }
ではなく、
#define b(x,y) do {int _x=x; int _y=y; f(_x,_y); g(_x,_y); } while(0)
と書く。
こうしておくと、このマクロを{}ブロックを伴わないif文に書いたときに異常動作
をしない。
2021/01/31(日) 17:08:36.84ID:+XHxoAeu
>>378
素直に読めばグローバルスコープで予約されているものは
グローバルスコープで予約されているという意外の意味を読み取ることは出来ない。

そこからローカル変数も制約されるという主張が出てくる理由が不在なんで、
何を言うてんのやろ……? ってなるわけ。
2021/01/31(日) 17:11:34.77ID:ziXVeJXQ
>>350
in instantiation of function template specialization ... requested here
というエラーが出ます
2021/01/31(日) 17:14:33.59ID:fCVb5Gn/
>>376
だから二重評価が問題になるようなことをマクロでやるなって
その例だってinlineで書けるだろ

邪道なやり方を保護するために
本筋が迷惑を被るのは本末転倒だ
2021/01/31(日) 17:15:05.39ID:ZnRwde8F
>>380
「All identifiers that begin with an underscore are always reserved
 for use as identifiers with file scope in both the ordinary and
 tag name spaces.」
「file scopeを持つ識別子として使用されるために予約されている」
だべ?
block scopeを持つ識別子として使用されたら、話がおかしいと思うが。

「この自動車は、仕事で使うために予約されています」
の場合、その自動車を私用で使えば、規則違反だよね。
2021/01/31(日) 17:15:45.54ID:fCVb5Gn/
int _x; //こんなのがあっても
#define b(x,y) {int _x=x; int _y=y; f(_x,_y); g(_x,_y); } //ブロックスコープで保護されるだろうが
2021/01/31(日) 17:19:07.49ID:ZnRwde8F
>>382
でも、_ が最初に来る名前をアプリが使っちゃいけない、というのは伝統的にそういう
ことが一番の目的だと思うぞ。
もう一つは、コンパイラの内部でこっそり使う場合があって、それと知らないうちに
衝突する可能性が僅かにあるため。
なぜこっそり使うかと言うと、絶対に衝突しないようにコンパイラ側を
書こうとするとコンパイラ作りに手間がかかるから。
もし、アプリ側が命名規約を守ってくれていれば、コンパイラ作りが楽になる
ことがある。
2021/01/31(日) 17:20:06.45ID:ZnRwde8F
>>384
b(_y,_x)
と書いたらどうなるか考えてみたらしだんご。
2021/01/31(日) 17:25:17.52ID:fCVb5Gn/
>>385
おまえさんはコンパイラ屋か?
そうだとして同業者は__builtin_va_argのように注意深くやってるぞ
自分らのエゴのために客に制限をかけるようなことを
でかい声で叫びまくるのはやめてくれ
2021/01/31(日) 17:30:48.87ID:ZnRwde8F
>>387
まあ、本当はコンパイラ内部でこっそり使う場合、絶対に衝突しないような
もっと変な名前を使っているから大丈夫なんだ。
起動時の TickCounter の値を変数名の一部に入れたりとかね。
2021/01/31(日) 17:37:15.73ID:2WBeknRq
>>383
ローカルスコープで同じ名前の別変数を定義するのは「その自動車を私用で使う」ことには当たらないって言ってるの
390デフォルトの名無しさん
垢版 |
2021/01/31(日) 17:42:24.07ID:/1NNOLNs
ヘッダーファイルに書くか、ソースファイルに書くかの違いも大きい。
ヘッダーファイルに書くときは名前衝突に対する細心の注意が必要。
2021/01/31(日) 17:45:15.36ID:fCVb5Gn/
>>386
{int _x=_y; int _y=_x; f(_x,_y); g(_x,_y); }
どうなるって言いたいんだ?
392デフォルトの名無しさん
垢版 |
2021/01/31(日) 17:51:16.48ID:/1NNOLNs
C/C++の場合、スコープだけ意識するのは不十分で、ヘッダーかソースかで厳格さを変える柔軟性が必要。
ヘッダーに書くと影響範囲が大きいから。
2021/01/31(日) 17:57:13.23ID:fCVb5Gn/
テンプレートなんか普通にヘッダに内容全部を書くが
マクロでバカやるやつがいなければ平和だよ
2021/01/31(日) 17:58:49.95ID:A8yllSCF
ローカルスコープでも _x が禁止だというなら >>346 のマクロ a 定義内で _x を使っていい理屈もわからんよな。
395デフォルトの名無しさん
垢版 |
2021/01/31(日) 18:55:26.91ID:gXTMTlGe
std::pair<>を継承してquadを作る場合どうなりますか?
396デフォルトの名無しさん
垢版 |
2021/01/31(日) 18:58:05.19ID:gXTMTlGe
std::regexが意外と使える子に成長してますが、標準化委員会では捨て去る提案まで出てるそうで。
397デフォルトの名無しさん
垢版 |
2021/01/31(日) 19:37:14.68ID:/1NNOLNs
std::regexはプロパティが貧弱なので結局、従来の正規表現ライブラリ使う羽目になる。
std::regexと互換性のあるインターフェースを持つ正規表現クラスを提供するよう呼びかけるのが現実的。
2021/01/31(日) 19:51:04.44ID:vFnk+kXo
順序付き pair って自分で順番に格納するのと2要素のsetにするのどっちが良いですか
399デフォルトの名無しさん
垢版 |
2021/01/31(日) 20:39:53.24ID:/1NNOLNs
pairはSTLのアルゴリズムの恩恵を得るための物。
自宅の郵便受けを豪華にしたところで、郵便事業には何の関係もない。ただの趣味の世界。
2021/01/31(日) 21:08:09.18ID:vFnk+kXo
set< pear<int, int> > で、ある数を含む pear を高速に検索する方法ってある?
401デフォルトの名無しさん
垢版 |
2021/01/31(日) 21:47:36.00ID:jyYnHelr
set<int, vector<pair<int,int>*>>
元の集合に1億個程度のペアが入ってるとすると、住所録めいたものをあらかじめ生成しておく

配列でやっても速そう
list[m].empty()
こういうリストで空っぽかどうかわかればいいわけだ
vector<vector<pair<int,int>*>>>;

それならドでかい二次元配列に入れた方がラクかもしれない

連想配列でも出来る
map<int ,vector<pair<int,int>*>>>

静的な話だったが動的つまり追加と検索が交互に起こるとおそらく話は違ってくる

全部試して早かったモンが高速である、程度の他愛ない結論に落ち着く
2021/01/31(日) 22:01:19.63ID:gvpDZJRs
構造体にしろよバカども
読みにくいだろ
2021/01/31(日) 22:54:08.94ID:wKQ2AmTw
>>333
>>339
では _x ではなく x_ にしようっかな‥‥
2021/01/31(日) 23:01:41.96ID:eyFvwlDf
googleスタイルガイドはそちらを推してるな
2021/02/01(月) 01:17:42.16ID:FSry25xS
>>391
int _x=_y;
int _y=_x;
ここの二行目の右辺の_xは、b(_y,_x)の第二引数の_xではなく、一行目
で宣言した_xになっているので、b(_y,_x)の第一引数の_yになる。つまり、
int _x=引数の_y;
int _y=引数の_y;
となるので、{}の中の_x, _yは、どちらも引数の_yの値に等しくなってしまう。
これではマクロ作者が意図したことではなくなってしまう。
2021/02/01(月) 01:19:32.38ID:FSry25xS
>>394
まあ、それはもっともな指摘なのだが、アプリ本体では使用禁止で、
マクロでは使用可能と勝手に解釈してしまうのが一つの流儀。
2021/02/01(月) 01:22:56.68ID:FSry25xS
>>389
そうではなくて、ローカルスコープで使うことそのものが、file scope
で使ってないことに当たるので、規約違反と言うことになると解釈できる
気がするんだ。

なぜそんなルールにしたのかは分からんがな。
2021/02/01(月) 03:22:30.15ID:fw9rYrIy
>>405
残念だったね。インライン関数使おうね。

>>406
あなたの流儀を規格の定めであるかのように話すのは迷惑なのでやめてくださいね。

>>407
file scope で予約されてる名前を file scope で使ってないなら問題ないね。
規約違反などという解釈にはならない。気のせい。そんなルールになってない。ってことで終われよ。
2021/02/01(月) 07:01:58.51ID:v6ebtUL1
>>400
unordered_map<int, int>
2021/02/01(月) 07:30:17.18ID:LhepLs74
>>406
マクロ定義内の仮引数名は当のマクロ定義外の何者とも関係しないのでは…
いわゆる束縛変数
2021/02/01(月) 07:38:30.21ID:LhepLs74
として安全に取り扱われる

一方>>346の_xはa(x)が展開された結果が他のプリプロセッサ定義で再置換され得るなら危険
これが起きるかはプリプロセッサの仕様(規格)を見たら白黒付くが
個人的には君子なので危うきには近づかないことに死体、
2021/02/01(月) 08:09:47.67ID:v6ebtUL1
うちの若いのがあんなアホマクロ書いてたら張っ倒す
まあ、やらかしそうなのはいないけど
2021/02/01(月) 09:26:53.82ID:5yr9aQzL
>>346
そもそもそのマクロで生成される変数はファイルスコープでないから、そもそも問題外では?

仮にファイルスコープな変数を宣言するようなマクロでも、ユーザが意図せず
2021/02/01(月) 11:43:32.41ID:xFB8fPis
仕事に情熱が持てなくなった
2021/02/01(月) 11:43:38.91ID:VhfMLcQM
>>346
アホだ
416デフォルトの名無しさん
垢版 |
2021/02/01(月) 12:06:54.06ID:ZelzH3+k
>>414
コロナの影響だろな。
福島大爆発の影響も計り知れない。
「原爆ぶらぶら病」で検索してください。
417デフォルトの名無しさん
垢版 |
2021/02/01(月) 12:30:15.68ID:jyRtFT93
>>408
>file scope で予約されてる名前を file scope で使ってないなら問題ないね。
そうじゃない。
英語原文を読めば、file scopeで予約されているのではなく、file scopeで
使用するために予約されているのだ。
だから、file scope以外で使用することが禁止されている。
2021/02/01(月) 12:32:18.30ID:jyRtFT93
>>417
日本語で言うなら、「file scope 専用」。
2021/02/01(月) 12:46:40.95ID:/T40sBmV
>>414
ちゃんと飯を食え。
週末はちゃんち休め。

年10日は連続した休暇をとれ
2021/02/01(月) 12:55:04.41ID:ioMwojjO
>>417
その一文ばっかりやたらこだわるけど
これが属しているセクションの名前って「17.4.3.1.2 Global names」なんだわ
グローバル名前空間の名前以外については言及してないの
ドラフトならインターネットで無料で見られるんだからこの辺の全容見てきな?
2021/02/01(月) 13:14:13.18ID:Z79JHlVc
>>417
あらゆる場所で使ってはいけないのなら、7.1.3でわざわざ1つ目と対比させるように使用用途を限定して記載した理由を説明してよ。
普通はコンパイラ実装者のために予約されている、だけで十分でしょ
422デフォルトの名無しさん
垢版 |
2021/02/01(月) 13:45:48.95ID:fos4FOVO
仕事に情熱が持てなくなった
2021/02/01(月) 13:50:50.97ID:jyRtFT93
https://www.learncpp.com/cpp-tutorial/keywords-and-naming-identifiers/comment-page-2/

Second, you should avoid naming your identifiers starting with an underscore, as these names are typically reserved for OS, library, and/or compiler use.
424デフォルトの名無しさん
垢版 |
2021/02/01(月) 14:08:01.06ID:fos4FOVO
>>373
obj& operator [] (int i) {return elem[i];}
もちろんelem[]の定義はobj elem[];
obj.shape() も実装すると便利
425デフォルトの名無しさん
垢版 |
2021/02/01(月) 14:13:00.08ID:fos4FOVO
>>416
「コロナでゴロゴロ病」
2021/02/01(月) 15:47:43.70ID:Z79JHlVc
>>423
そのサイトを紹介して何の証明になるの?
427デフォルトの名無しさん
垢版 |
2021/02/01(月) 16:16:30.24ID:ZelzH3+k
>>426
https://isocpp.org/
428デフォルトの名無しさん
垢版 |
2021/02/01(月) 16:22:14.79ID:ZelzH3+k
C++ is the only real language for expert developers.
429デフォルトの名無しさん
垢版 |
2021/02/01(月) 16:55:19.50ID:fos4FOVO
C/C++は好きだし比較的最強の部類だと思うけど
夢未過ぎは判断を誤るから色んな言語を適材適所に使えるようになるのが理想
2021/02/01(月) 17:40:26.58ID:LhepLs74
システム記述言語はアセンブラを除けばこの世にCとC++とRustしか、
431デフォルトの名無しさん
垢版 |
2021/02/01(月) 17:46:42.82ID:ZelzH3+k
中国人のありがたいお言葉ですぞ。
2021/02/01(月) 18:02:36.06ID:jyRtFT93
大体、この板には中国人や韓国人はほとんど来ず、来ているのはアメリカ人
やヨーロッパやアフリカが多いらしい。
2021/02/01(月) 18:44:36.44ID:+21BJdPm
いやrustが最強でしょww
2021/02/01(月) 18:47:23.23ID:CDWd/LQ7
Goは駄目なん?
2021/02/01(月) 18:57:50.94ID:0s4gr52A
自作の構造体をsetに入れたいときって operator < さえ定義しとけば良いの?
eraseとかは全部のメンバが同じものを見つけて消してくれると思って良い?
436デフォルトの名無しさん
垢版 |
2021/02/01(月) 21:08:59.66ID:ZelzH3+k
検索するとひろみをお勧めしてくる時点で無理だった。
437デフォルトの名無しさん
垢版 |
2021/02/01(月) 21:34:17.50ID:ZelzH3+k
しかもチップも取るんかーい!
2021/02/01(月) 22:43:42.23ID:CtNYZU7D
>>435
erase含め、同値性は!(a<b)&&!(b<a)で判定される
全メンバ一致で同値とみなしたいなら辞書順比較する比較関数を定義すればよし
2021/02/01(月) 22:46:24.33ID:FbSt8IWH
演算子オーバーロードは地雷度高い。
2021/02/01(月) 22:53:14.56ID:CtNYZU7D
まあ、setに入れるためだけなら演算子オーバーロードするより関数オブジェクト使う方がいいかね
2021/02/01(月) 23:03:45.93ID:f9q1oLiO
C++の質問じゃないとは思うんですが、上位数ビットを0で埋めたいといった場合は
「0埋めしたいビットを0、他を1にしたもので&演算する」
であってますか?
442デフォルトの名無しさん
垢版 |
2021/02/01(月) 23:11:37.27ID:ZelzH3+k
合ってます。
2021/02/01(月) 23:17:45.03ID:f9q1oLiO
>>442
ありがとうございます
今までは例えばQWORDの上位3バイトを0埋めしたいってとき(value << 3*8) >> 3*8って言う2命令使う馬鹿な方法でやっていました・・・
444デフォルトの名無しさん
垢版 |
2021/02/02(火) 02:08:00.00ID:DmcXRB7X
へ椅子ブックが少し綺麗になってます。
445デフォルトの名無しさん
垢版 |
2021/02/02(火) 02:10:27.05ID:DmcXRB7X
RedditのC++コミュは17万人、オンラインが500人以上。
凄いね。
2021/02/02(火) 10:17:10.33ID:uFATDe77
ビット演算の中で最速なのってシフトじゃなかったっけ?
だから下手したら>>443の方がフェムト秒レベルでは微妙に早いんじゃない?
2021/02/02(火) 10:29:21.33ID:kGc73xZq
命令語長がマスク分だけでもQWORDに対して、シフトなら1バイト程度か
2021/02/02(火) 12:37:23.36ID:vWAdhQ36
>>446
CPUの世代やアーキテクチャによって違うが、
Latencyが、Shiftの方がandより少し遅いことがある。
2021/02/02(火) 12:49:48.88ID:+MtixY9O
>>434
Go は GC が前提にあるから少し制約が強いけども、
OS のカーネルを書くのでもない限り思ったより足かせにならないという評価はあるみたいだね。
2021/02/02(火) 13:08:50.07ID:aIAA0dxH
Goはクソすぎるから駄目だ
何が駄目といってまず名前が駄目
2021/02/02(火) 13:45:57.34ID:8HFbTrXI
GoはPC初心者用
昔でいういわばBASIC
2021/02/02(火) 18:03:08.15ID:FSwj4KRK
バレルシフタと単純ゲート
レイテンシも糞もねえだろ
2021/02/02(火) 18:11:36.53ID:8HFbTrXI
でもその縛りプレイが大好きな変人も居る
2021/02/02(火) 22:23:15.74ID:likaPPB8
operator ==も定義しておくとなお良い
==のために<が2回呼ばれるのもアホらしいと感じるはず…
結局std::rel_opsを使って全部定義するという結論に落ち着く
2021/02/02(火) 22:25:04.30ID:likaPPB8
インテルのやつはバレルシフタじゃない気配がする…
シフト結果をテーブル化した方が速かったことg
2021/02/02(火) 22:28:35.48ID:likaPPB8
あるいは最大限バレルシフタにしようとしているがパイプライン1段に収まっていないだけかもしれん…
2021/02/03(水) 00:25:34.21ID:p0NvFN6a
>>443
gcc, clang, msvc で最適化最大で試してみたら and をとるように最適化されたぞ。
主要コンパイラがそのように最適化するということは (前後の状況によるかもしれないけど)
たぶん and のほうが効率的ってことなんだろう。
458デフォルトの名無しさん
垢版 |
2021/02/03(水) 00:38:50.10ID:53EFMpkm
ビットシフトは64bit整数でのコンパイラ解釈が信用できないからAND演算子使うのが確実だと思うけどどうかな。
2021/02/03(水) 00:51:08.70ID:5b6XJ+8s
>>458
落ち着いてよく考えてみよう
お前がC++で作った成果物のうち、お前自身が書いたコードの割合なんてごくごく僅かに過ぎない
仮にそんなレベルで互換性が当てにならないような環境があったとして、お前が直接書いていない他の99%のコードがまともに動くと本気で思うか?
2021/02/03(水) 00:54:51.58ID:p0NvFN6a
0xffffffffff とか書いてたら桁数を正しく書けてるか不安になる……

今の C++ だと桁区切りも入れられるけど、
どう入れたら意図がわかりやすいかようわからんし、
シフトで表現するのもありな選択だと思う。
2021/02/03(水) 01:01:02.57ID:+m9V7fCu
>>458
具体例をお願いできますか?
462デフォルトの名無しさん
垢版 |
2021/02/03(水) 01:20:23.24ID:53EFMpkm
コンパイラがちゃんと32bit整数への丸め警告を出してくれるならいいが、しれっとコンパイルされたらお手上げ。
2021/02/03(水) 02:47:38.99ID:+m9V7fCu
>>462
丸めって暗黙の型変換のことですか?
シフト演算は特に関係しないと思いますが……
2021/02/03(水) 06:01:31.58ID:QcjMAifW
>>460
0x0000'ffffull
2021/02/03(水) 06:29:42.77ID:y3dS6mbz
unsigned long long x = (0x1ULL << 32) - 1ULL;
ならちゃんと動く(と思う)が
unsigned long long x = (0x1 << 32) - 1;
とかだとイマイチ不安が…
2021/02/03(水) 06:38:54.06ID:Nl+WsQpo
>>465
下の方はイコールの右辺にintしか出てこないのだから、intが32bitの環境なら32bitでしか計算されないだろう
467デフォルトの名無しさん
垢版 |
2021/02/03(水) 10:23:38.02ID:q8Ed7guF
丸めと暗黙の型変換は違うものでは?
2021/02/03(水) 11:47:09.95ID:HtH84Poo
丸めや打ち切りは浮動小数点数の概念やね
469デフォルトの名無しさん
垢版 |
2021/02/03(水) 13:02:19.58ID:53EFMpkm
ビットシフト記述は自然すぎてソースコードに埋もれてしまう。
64ビットマスクのAND記述は見た目がどぎついので、かえって人間の注意を引くことができる。
2021/02/03(水) 14:45:43.48ID:J722wycU
なにいってんだこいつ
2021/02/03(水) 15:50:32.48ID:pE1foWCw
>>465
やっぱり、32BITの時が一番プログラミングし易かったな。
64BITになると、64BITと32BITを区別して書く必要が出てきて、
書くのが面倒になった。
2021/02/03(水) 19:12:23.88ID:XaYGR0Wv
そう?ポインタサイズくらいしか違いなくない?
473デフォルトの名無しさん
垢版 |
2021/02/03(水) 21:29:02.90ID:53EFMpkm
まじめにC/C++標準型size_tを使っている人には32bitと64bitの処理切り分けが地味に辛い。
2021/02/03(水) 22:36:28.54ID:y3dS6mbz
>>465の下の方のやつは符号拡張されたりする気がするorz
2021/02/03(水) 22:40:25.83ID:Ea4RwHR/
>>424
> obj& operator [] (int i) {return elem[i];}
> もちろんelem[]の定義はobj elem[];

objは行列クラスで、elemはobjのメンバで行列要素を格納する一次元配列、で合ってますよね?
class obj{
 array<int, ?> elem;
public:
 obj& operator [] (int i) {return elem[i];}
};
ということですか?
2021/02/04(木) 03:22:45.38ID:R0EDVzG0
>>473
size_t は、型名が長いし _ も含んでいるし、打つのが辛い。
それにコードに締める長さも長くなるので画面が狭くなるし。
2021/02/04(木) 04:17:06.60ID:SkZt7jTc
>>473
まじめに、て別にsize_t使ってたら偉いわけじゃない
サイズを表したいけどいちいち考えたくない場合の選択肢だぞ
2021/02/04(木) 11:32:06.33ID:sIhIIpMX
size_t型はSTLを使う人なら避けて通れない。
479デフォルトの名無しさん
垢版 |
2021/02/04(木) 11:40:48.70ID:ZzRKCYY/
>>471
それ本来そこにあった問題に気付いていないだけだったと思うぞ
480デフォルトの名無しさん
垢版 |
2021/02/04(木) 11:44:02.03ID:ZzRKCYY/
>>475
class obj{
 array<obj, ?> elem;
public:
 obj& operator [] (int i) {return elem[i];}
};
2021/02/04(木) 12:06:17.02ID:DWE1XJjK
>>480
それってarrayのarrayとかvectorのvectorとか配列の配列として行列を作るのと同じですよね?
一次元配列に要素を格納しておいて[][]でアクセスするのは不可能なんでしょうか
row majorやcolumn majorを自由にできる、等の理由でそちらの方が好ましいのですが
2021/02/04(木) 12:29:12.61ID:waKgX41w
一次元配列を内包しているクラスのoperator[](int y)が、下記のようなクラスを返すようにすればできる。

class Row {
vector<int>& 一次元配列への参照
int 列数
int y
int& operator[](int x){ return 一次元配列への参照[列数*y+x]; }
};


でも自分ならoperator[]は使わずもとのクラスにindex(x, y)みたいな関数を用意して対処すると思う。
2021/02/04(木) 13:10:42.29ID:g2cSm/y9
malloc とか new で確保したメモリ領域を使うように
vector ( または array ) をインスタンス化するにはどうすればよいですか?
2021/02/04(木) 13:13:43.37ID:ttCVH4wp
>>481
こういう雰囲気で他のクラスをひとつ間に入れることでなんとかなる。

https://wandbox.org/permlink/ZXI1nkkCLRJQPtAJ

だけど俺も >>482 の言う通り operator[] にこだわらずに適当なメンバ関数でやる方法を推すわ。
実態として二引数なのだし、記法のためだけに余計な定義をするの馬鹿らしいと思う。

提案としては hoge[i, j] みたいな感じで二引数のインデックスを受け取れるようにする案は出てるんだが、
現状ではこのときのカンマは普通にカンマ演算子として解釈される。
前準備として、 C++20 からはブラケット内でのカンマは非推奨にするという変更が入っている。
https://timsong-cpp.github.io/cppwp/n4861/depr.comma.subscript
2021/02/04(木) 13:20:29.03ID:ttCVH4wp
>>483
ある時点で確保済みのメモリの上にオブジェクトを構築するには
std::uninitialized_default_construct を使う。

でも std::vector 自体を適当なメモリの上に構築できても
std::vector 内で使うメモリは std::allocator で確保しようとするから、
必要ならアロケータを定義する必要がある。
2021/02/04(木) 15:40:11.75ID:R0EDVzG0
>>479
いや、全て32BITは、それに全て統一することで速度とメモリ効率と実用性の
バランスが取れていた。
ところが64BITだと実用上、表せる値の範囲はオーバースペックで
変数のメモリに占めるバイト数が8バイトと余りにも効率が悪い。
なので、多くの数値は32BITとし、必要な部分だけ64BITにするという
面倒な選択を強いられる様になった。
アドレスが64BITなので、それを整数型に入れるためには32BITの整数では
不足するので引きつられて整数も64BITを必要としがちになり、大混乱
が生じている。
(また、メモリーもアドレスを32BITより多くを必要とするアプリは非常に稀。)
2021/02/04(木) 16:48:02.49ID:DWE1XJjK
>>482
ありがとうございます
ストラウストラップの「プログラミング言語C++」に「行列クラスの設計」なるセクションがあったのを覚えてるので、そちらではどうしていたかも見てみます
2021/02/04(木) 17:07:22.68ID:dB2jWvbu
unique_ptr<Hoge[]> p(new Hoge[4]{a, b, c, d});
みたいな定義と同時に代入は出来るのですが
(各要素毎に Hoge(a), Hoge(b), Hoge(c), Hoge(d) になりました)

unique_ptr<Hoge[]> p = make_unique<Hoge[]>(4);
だと引数無しのデフォルトコンストラクタが無いといけないし
(そもそも引数無しのデフォルトコンストラクタ作りたくない)

unique_ptr<Hoge[]> p = make_unique<Hoge[]>({a, b, c, d});
とか
unique_ptr<Hoge[]> p = make_unique<Hoge[]>(4){a, b, c, d};
とかはコンパイル出来ませんでした

引数無しのデフォルトコンストラクタがあれば
unique_ptr<Hoge[]> p = make_unique<Hoge[]>(4);
p.reset(new Hoge[4]{a, b, c, d});
だとうまく逝きますが効率が悪い気がします
make_unique は使ってはいけないのでしょうか?
2021/02/04(木) 17:51:26.68ID:b9gCdorg
>>487
485も見てねー
2021/02/04(木) 17:52:07.72ID:b9gCdorg
まちがえた。484
2021/02/04(木) 20:56:33.92ID:ZyzsEROR
配列のunique_ptrは色々と中途半端で使いづらいからオススメしない
2021/02/04(木) 22:14:32.91ID:b9gCdorg
>>488
unique_ptr<Hoge[]> p;
p.reset(new Hoge[4]{a, b, c, d});
でよいのでは?
2021/02/04(木) 22:20:26.07ID:un3OWVjy
>>486
32bitアプリでも今どきなら64bit整数を使える処理系は多いだろ
そもそもアドレスを整数型に入れるっていつの時代の人よw
2021/02/04(木) 22:47:34.63ID:/RiZUiBF
>>493
アドレスを整数に入れるのは過去の話じゃないぞ
2021/02/04(木) 22:51:09.67ID:sIhIIpMX
intptr_t整数型を使ってたのっていつの時代?
2021/02/04(木) 23:24:48.23ID:hMfhfQWp
uintptr_tならいつもお世話になっております
2021/02/05(金) 00:01:41.63ID:NIkVqohR
この手合いのボケを量産するのはC++の害だな
2021/02/05(金) 01:35:15.82ID:EB7VAtvO
むしろCの害
2021/02/05(金) 01:52:47.05ID:xbM9VFWh
Rubyって結局勉強しないままPythonの時代になってしまったな
2021/02/05(金) 04:42:48.12ID:ZuGfyZDY
同様にC++を勉強しないままRustの時代になる
501デフォルトの名無しさん
垢版 |
2021/02/05(金) 09:51:39.70ID:U76qOqQA
>>488
https://www.it-swarm.jp.net/ja/c%2B%2B/new演算子よりもstd-makeuniqueを使用する利点/826350881/amp/
https://ja.stackoverflow.com/questions/24876/make-uniqueの利点
2021/02/05(金) 13:28:24.98ID:ou/gU5gH
c++やらずにrustとか馬鹿量産するだけにしか思えんな。
2021/02/05(金) 14:10:32.07ID:Xzu/prlh
それ言ったらノーコードがどうたら言ってる奴らはもっとやばそう
2021/02/05(金) 14:17:08.86ID:M7C1cdPI
ノーコードていってノードツリーみたいなのでフロー管理するやつ
よくゲーム系ツールにありがちだけど、サンプルみたいな単純な処理ならともかく
こみいったフローになってくるとノード間の接続線がものすごいことになって
とても管理しようという気になれない、まさに見た目どおりのスパゲティプログラムに
2021/02/05(金) 14:18:44.73ID:ou/gU5gH
>>503
それはもう50年くらいずっとそうだろ。
ノーコードとか逆に俺様言語作ってるのとほぼ変わらん状態にしかならんという
しょーもない展開しか見たことない。
506デフォルトの名無しさん
垢版 |
2021/02/05(金) 15:14:07.00ID:zImWQG8r
VCPKGのupdate、upgradeが常に失敗するんだけど、使えてる人いますか?
小まめにupdateしないからだろか?
507デフォルトの名無しさん
垢版 |
2021/02/05(金) 15:14:37.91ID:zImWQG8r
Goは標準ライブラリが圧倒してる。
508デフォルトの名無しさん
垢版 |
2021/02/05(金) 15:18:44.78ID:zImWQG8r
半年に一度フルビルドみたいになってしまう。
2021/02/05(金) 16:12:02.35ID:A9cGRDK5
Goは何がクソといってまず名前がクソ
510デフォルトの名無しさん
垢版 |
2021/02/05(金) 16:36:26.85ID:zImWQG8r
C++は基本だから、義務教育で習得するべき。
2021/02/05(金) 16:50:43.11ID:/MNAnFTn
言語仕様がでかすぎるからC言語で精一杯
オマケで紹介される程度かな
2021/02/05(金) 18:21:14.28ID:7P5D6x+s
>>505
昔はアセンブラすら触れない奴がC言語とか笑わせるなとか真顔で言う人がいたんだぜ。

別に仕事ができるのならRustでもPythonでも何でもいいと思うぞ。
2021/02/05(金) 19:09:46.26ID:AjJLCZml
仕事ができるのならw
2021/02/05(金) 20:48:06.29ID:ou/gU5gH
>>512
仕事ができるならなw
できないカスがクソみたいなもん押し付けてくるから文句が出るんだよ。
rustでもpythonでもまともなコード書いてりゃ文句はないわ。
まともじゃないから文句が出る。
515デフォルトの名無しさん
垢版 |
2021/02/05(金) 21:49:13.85ID:a81hUa+F
というか、プログラマとしてrust(鉄さび、腐食)になるというダブルミーニングを狙ったんだと思うけど。
2021/02/05(金) 21:59:53.11ID:kFtfKVND
お前らってド素人のくせになんでいっちょまえの口利くん?
それって不思議だわ
2021/02/05(金) 22:34:33.49ID:EB7VAtvO
Rustの名前は金属の錆じゃなくてサビ菌が由来
2021/02/05(金) 22:36:07.20ID:NIkVqohR
Rottenでいい
2021/02/05(金) 22:48:47.57ID:a81hUa+F
Perl6はRakuになってしまったし、Rustもいずれ「わびさび」の境地でSabiに改名されるでしょ。
2021/02/06(土) 03:04:22.39ID:kQVOjfvp
「まともなコードが書けるなら」じゃなくて、まともなコードを強制するのがRustという言語の方針だと思うが
2021/02/06(土) 04:45:05.79ID:oQfB5lBJ
>>284
昔からのプログラミング/電気界隈の慣習だから仕方ないけど、2要素のミニマルなブール代数しか扱わないにも関わらずboolean型を称するのがそもそもキモい
プログラミングで使うような半順序関係は、9割booleanで書くのが一番スッキリする
一般のbool型をプリミティブにして、そこからt/fやら三要素やらに派生するのが合理的に思う
522デフォルトの名無しさん
垢版 |
2021/02/06(土) 04:50:47.70ID:GfZyzG1j
ブーリアン革命。
2021/02/06(土) 05:13:59.88ID:oQfB5lBJ
革命というか、クラスシステムでブール代数をエミュレートしてるのが現状のOOPじゃないかと
まあ言語によって可補性はマチマチだけど、全てについてスーパークラス/サブクラスなクラスを設けるのは、メインストリームの言語では大体そうだろ
2021/02/06(土) 07:27:56.30ID:S9Y30hRK
>>520
だとしたら胡散臭さ200%のカルトだな
2021/02/06(土) 09:31:12.13ID:rZdEmaWa
>>524
Java、Kotlin、Scala、C#、Ruby、Python、PHP
あたりのどれかを触ってみれば、危険な記述を言語仕様レベルで封印することのありがたさが分かる

他言語も触ってみることをオススメする
2021/02/06(土) 09:34:34.84ID:5Ze23T9D
よくわからんが安全カミソリみたいなものかね?
2021/02/06(土) 10:10:31.61ID:rZdEmaWa
>>526
そんな感じ

まぁ、C++もマスターすれば危険な記述を避けることはできるんだけど...
プログラマーが悪意を持ってプログラムを記述しない限り安全なコードになるようにしようという試みは大切だと思う
2021/02/06(土) 10:11:15.51ID:S9Y30hRK
>>525
ありがとう、おまえさんのレベルの低さがよくわかった
文法や動作がよくわかってなくてマシンに警告してもらわなきゃ自分では判断できないんだな
アプリの内容として良からぬ事を企むという次元には程遠いわけか
2021/02/06(土) 10:12:54.42ID:rZdEmaWa
>>528
投稿した瞬間の不意打ちレスワロス
2021/02/06(土) 10:17:55.71ID:u/OM7jGY
>>527
> プログラマーが悪vログラマーが悪意を持ってプログラムを記述しない限り安全なコードになるようにしようという試みは大切だと思う

>>528
> 文法や動作がよくわかってなくてマシンに警告してもらわなきゃ自分では判断できないんだな

この流れは大草原不可避
531デフォルトの名無しさん
垢版 |
2021/02/06(土) 11:01:19.43ID:PohEB++t
>>504
Unity とか UE はきらい?
532デフォルトの名無しさん
垢版 |
2021/02/06(土) 11:07:09.44ID:PohEB++t
>>509
めっちゃわかります
https://blog.golang.org/gopher
http://write.kogus.org/articles/S78LHt
2021/02/06(土) 11:09:03.81ID:gLiOOG5V
rustの縛りプレイはマルチスレッドでのメモリ管理のクソ面倒さが原因だろう
2021/02/06(土) 12:19:39.89ID:S9Y30hRK
>>527
いーや、くだらねえ
プログラマを信頼しない方針はあれもダメこれもダメの制限だらけになるだけだ
おまえさん自身も実社会で職場の誰よりも制限だらけなんだろう
重責を担ったことのないやつは人のせいにすることしか考えねえ
2021/02/06(土) 12:25:16.36ID:UXUwo66G
それだけ無責任で信頼出来ない人間が多いって事だろ
2021/02/06(土) 12:31:39.86ID:58EQLFGq
信頼はタダではないからな
バグを流出させたら銃殺ぐらいが妥当
2021/02/06(土) 12:53:16.04ID:DutNpJ49
>>528
お前のレベルが極めて高いのは分かったが、お前の共同の開発者もお前のようにハイレベルだとは限らない
2021/02/06(土) 13:19:02.89ID:Hu1Z4B3S
>>534
負け犬の遠吠え
2021/02/06(土) 13:29:55.66ID:EjDQT0l8
>>460
「(type)~0」でどう?
2021/02/06(土) 13:32:30.22ID:TGsCRbLO
>>536
ハゲを流出させたら〜と空目した
2021/02/06(土) 13:33:33.54ID:rZdEmaWa
>>538
しー!余計なことを言うんじゃないっ!
2021/02/06(土) 13:38:49.17ID:Hu1Z4B3S
>>528はスマートポインタを知らなさそう
文章から溢れ出る無能感
2021/02/06(土) 13:44:48.20ID:S9Y30hRK
構ってちゃんは、スマポ憶えたてらしいなw
2021/02/06(土) 13:46:38.15ID:gYQHLnIz
天才の俺が書くプログラムは絶対正しいから無駄なバカよけ機能はいらないしテストのような下等なことはしない
って豪語してたいつぞやの天才くんが帰ってきたのかな
2021/02/06(土) 13:50:19.96ID:kbrcRlAn
>>544
私は馬鹿なので天才のコードというのがどんなのか凄く興味があります…
2021/02/06(土) 13:53:43.56ID:ROiZJzWf
コテハンでこの程度の文章も読めないのは
2021/02/06(土) 13:55:54.96ID:kbrcRlAn
>>546
そりゃ馬鹿だからでしょう…
2021/02/06(土) 13:59:04.79ID:aJ9IYVGP
どう考えても誰かさんに対する皮肉なんだよなぁ...
まぁ、荒れるから誰とは言わないけど
2021/02/06(土) 14:05:03.59ID:fN0CSTPN
傲慢かましすぎもへりくだりすぎも良くない
2021/02/06(土) 14:06:38.65ID:zTEH7215
>>548
すでに荒れる種をまいてるきみが一番有害
2021/02/06(土) 14:12:51.02ID:aJ9IYVGP
>>550
いや、俺は別にS9Y30hRKは天才だと思ってるぞ!誰もS9Y30hRKの事をゲロカス老害だとか、バグを減らす上での有害な存在だとか、人を見下すだけの無能だとか、自分にとって都合のいい妄想を口に出す病人だとか、構ってちゃんだとか、そんなこと全然思っていないから!!S9Y30hRKは天才!!疑う余地もなく天才!!ハイレベルなバカで誰もついていけないとか、そんなこと思っていないから!!!
だから!それ以上この話はやめろぉおおおお!!!
2021/02/06(土) 14:21:36.41ID:rZdEmaWa
>>545
馬鹿でも扱えるくらい綺麗なコードが天才のコードだと思う
C++は表現豊かな言語だから...他の言語も触ると、綺麗な記述方法を学ぶ良い機会になるよ
2021/02/06(土) 14:56:25.58ID:58EQLFGq
>>552が扱えるかどうかが天才か否かの基準か!
2021/02/06(土) 15:01:56.11ID:S9Y30hRK
綺麗かどうかじゃない
何を実現したのかだ
綺麗に書くのはエチケットだが一番大事なことではない
2021/02/06(土) 15:11:21.64ID:f5ipo2xA
>>553
銃殺は銃刀法違反及び殺人罪に接触することすら理解できないお前でも分かるコードが存在したら私はそのコードを書いた天才を尊敬する
2021/02/06(土) 15:21:29.14ID:58EQLFGq
行政が法律に基づき行うなら問題無い
人が作った法律なら人が改正することができる
2021/02/06(土) 15:22:17.24ID:S9Y30hRK
スレ違い板違い失せろ
2021/02/06(土) 15:28:25.66ID:58EQLFGq
>>557
>>555に対するレス
2021/02/06(土) 15:30:29.13ID:f5ipo2xA
自作自演?
2021/02/06(土) 16:36:26.06ID:oR/8CbQ7
やらかしちゃいましたねー
人を見下しておきながら、人を見下す側もウッカリミスはするという事が証明されました

こういうウッカリ屋はプログラミングでも不具合を引き起こします
馬鹿でも天才でもウッカリ屋でも保守できるコードは記述するように心がけましょう
2021/02/06(土) 16:38:50.88ID:oR/8CbQ7
>>560
他にもテストの自動化、バージョン管理ツールの導入等もして不具合が流出しない仕組みを揃えておきましょう
以上
2021/02/06(土) 16:54:20.22ID:bwIKlxQ8
std::stringにUTF-8のコードを入れてプログラムを書いていますが、これを正しく編集する
にはUTF-8での文字の境界を正しく認識しないと駄目ですよね?
それは一般的にはどう処理するものなのでしょうか。

UTF-8のビットパターンとバイト数のことは知っていますが、それを自分で処理すべきか、
さらには絵文字とか複数のユニコードが組み合わさったものはどうするのか、とか。
2021/02/06(土) 17:05:10.96ID:N9CbrPsc
>>562
コードポイント単位での処理で良いのであれば自分で適当に書いてしまってもいいと思う。

高度なものになると ICU などのライブラリを使う。
書記素クラスタ単位での処理が必要だったり正規化だったりといった場合では
コードを書けば済むというものでもなくて巨大な表が必要だし歴史的な変な規則が盛りだくさんだから
よほどの根性がないと自分ではどうにもならないと思う。
2021/02/06(土) 17:07:58.83ID:gG6zzvvp
>>562 Windowsだったら
#include <windows.h>
MultiByteToWideChar(CP_UTF8, 0, ...);
MultiByteToWideChar(CP_UTF8, MB_ERR_INVALID_CHARS, ...);
WideCharToMultiByte(CP_UTF8, 0, ...);
IsTextUnicode(...);
などが使えると思われます。
565デフォルトの名無しさん
垢版 |
2021/02/06(土) 17:41:00.54ID:GfZyzG1j
スカラー値が一文字を表現するとは限りませんが、ユニコードスカラー値を基本にするのが現実的な妥協点だと思います。
きちんと処理するのは、データベースとアルゴリズムが必要なので、少人数では無理です。
ICUが有力な選択肢となりますが、これも気難しいライブラリなので、用途に合わないかもしれません。

事実上、世界中の様々な民族の文字を統一的に扱う目論見は破綻していると思います。
2021/02/06(土) 17:44:16.27ID:+KPQZs33
https://youtu.be/wN0x9eZLix4
2021/02/06(土) 17:50:18.63ID:gG6zzvvp
https://ja.wikipedia.org/wiki/UTF-8

>任意のバイトの先頭ビットが "0" なら1バイト文字、"10" なら2バイト以上の文字の2番目以降のバイト、...(中略)...であると判定できる。
2021/02/06(土) 17:55:50.63ID:gG6zzvvp
つまり、

uint8_t utf8_byte = ...;
if (!(utf8_byte & 0x80)) {
// 1バイト文字。
} else if ((utf8_byte & 0xC0) == 0xC0) {
// マルチバイト文字の先頭バイト。
} else {
// マルチバイト文字の非先頭バイト。
}
2021/02/06(土) 18:11:29.66ID:6eQmSTNr
プログラミングのお題スレ Part18
https://mevius.5ch.net/test/read.cgi/tech/1594702426/453

UTF-8 は、先頭ニブル・4ビットで、1〜4バイト文字を判別しています

こういう規則か?
2021/02/06(土) 19:16:40.60ID:S9Y30hRK
>>561
殺虫剤のパラドックスって知ってる?
2021/02/06(土) 20:33:00.74ID:zn5WrP4C
>>570
恥の上塗り?w

ただし、自動化されたリグレッションテストの場合は、同じテストを繰り返すことでリグレッションが低減しているという有益な結果を示すことができる。
https://note.com/akiyama924/n/nc006015de2d2
572デフォルトの名無しさん
垢版 |
2021/02/06(土) 21:07:07.97ID:GfZyzG1j
テストロボットだぞ、ガシャーン!ガシャーン!
573デフォルトの名無しさん
垢版 |
2021/02/06(土) 21:08:55.93ID:GfZyzG1j
片山さんの自動パズルとか、ウェブだったら☆1万くらいついてそうだけど。
なんでWindowsにこだわるんだろ。
2021/02/06(土) 22:54:31.87ID:gG6zzvvp
>>573 JavaScriptで動くものはすでにある。
https://katahiromz.github.io/xword.js/
あるが、ビジネスとして展開する能力がない。
2021/02/06(土) 23:50:48.27ID:58EQLFGq
クレブナー基底で解くやつ!
2021/02/07(日) 06:07:42.85ID:HYoiJUgB
>>571
質問に答えてねw
2021/02/07(日) 06:47:27.09ID:jX/y7Db/
>>576
ん?
どの質問?
>>570ならリンク先読めばいいだけだろ
恥ずかしくて読めないのかもしれないけどw
2021/02/07(日) 08:26:36.56ID:HYoiJUgB
>>576
俺の質問にアンカーつけといてどの質問はねえだろ
恥ずかしくてとぼけてんのおまえさんだろ
2021/02/07(日) 08:29:49.52ID:p49/UnNX
テストはやらないよりもやったほうがはるかに良い
前の版通ったテストが最新版でも通るという品質は担保される
殺虫剤のパラドックスよりも恐れなければならないのは
いっぱい作ったテストコードが事実上同じテストでしかないという事態になることの方
※ 個人の感想です
2021/02/07(日) 08:49:47.79ID:m5BD34IK
>>578
別に完璧になくせるなんて誰も言っていないのに勝手にツッコんでるの何?としか思ってないよ
2021/02/07(日) 08:57:32.70ID:HYoiJUgB
>>580
おまえさん、こう言ったんだぜ

> 不具合が流出しない仕組みを揃えておきましょう

流出しなくなんかならねえ
不具合はポカミスばかりとは限らない
おまえさんのような浅はかな思想で突っ走った先に
碌でもない結末が待っていることだってある

揃えられるものなら揃えてみな
自分ができねえことを他人に言うな
2021/02/07(日) 09:11:28.01ID:p49/UnNX
人は思い込みを反証することで生きていける
だが完璧に反証できないこともある
ユニットテストはそのかけがえのないものを教えてくれた
2021/02/07(日) 09:41:41.73ID:m5BD34IK
>>581
え?それ俺じゃないけど
テストやればバグが無いといえるわけじゃないから安心するなってだけで、テストするなって話じゃないよね
主旨は同じだよね
何が気に入らないの?
2021/02/07(日) 10:00:05.54ID:HYoiJUgB
ああ、俺じゃないで逃げるのか
情けねえやつだな
2021/02/07(日) 10:07:20.85ID:jX/y7Db/
>>578
アンカーつけてると言うなら
> >>570ならリンク先読めばいいだけだろ
って書いてあるだろ
よほどアホでもない限りそんなアホなこと言うわけ無いと思ったからどれ?
って聞いたんだけど、想像以上のアホだったってことかな?w
2021/02/07(日) 10:10:29.25ID:jX/y7Db/
>>581
不具合はなくせないから仕組みも努力もいらんと言うならそれでいいんじゃね?
お・ま・え・ん・と・ろ・こ・で・は w
2021/02/07(日) 10:13:42.72ID:2AGAGJ05
マスクも手洗いもコロナを100%防げるわけじゃないから
マスク付ける必要も手を洗う必要もないね
2021/02/07(日) 10:20:21.65ID:HYoiJUgB
テストツールいらねえなんて言ってねえぜ
テストツール万能論はアホの考えだと言っている
2021/02/07(日) 10:21:25.49ID:HYoiJUgB
で、身に覚えのあるやつが返事してるから
ニヤニヤ笑ってるのさ
2021/02/07(日) 10:48:37.66ID:2AGAGJ05
「テストツール万能論」を主張したレスなんて一つも見えないんだけど
存在しないものを見てニヤニヤしてる変態こわい
2021/02/07(日) 10:56:59.83ID:HYoiJUgB
それを>>587がぬかすとは笑止な
2021/02/07(日) 11:11:45.24ID:0QEz1MW7
構い過ぎじゃね?
2021/02/07(日) 11:52:54.07ID:jX/y7Db/
>>591
まさかと思うけど>>587がマジで言ってるとか思ってないよね?w
2021/02/07(日) 12:03:05.54ID:2AGAGJ05
ああ・・・そういうことね・・・すまん触るべきじゃなかった
2021/02/07(日) 13:47:28.22ID:p49/UnNX
すまんで済んだらユニットテストは要らんわ!
2021/02/07(日) 14:09:34.56ID:qbLU6RFF
野菜食えで馬鹿みたいにブチギレるホリエと一緒やな
2021/02/07(日) 15:05:54.73ID:HYoiJUgB
>>593
奴は「必要ないね」とぬかしたんだ
別に武漢熱に話をすり替えようとすり替えまいとそこは関係ない
2021/02/07(日) 15:41:29.20ID:yi1XmM9H
>>597
文章を字面通りにしか解釈できない人?
2021/02/07(日) 16:31:48.90ID:jcLu/xd9
vectorを参照渡しするときの方法について教えてくください
class sansyo
{
private:
std::vector<short> _stdSansyo;
public:
void setSansyo(std::vector<short>& sansyo);
}
;void sansyo::setSansyo(std::vector<short>& sansyo)
{
_stdSansyo = sansyo;
_stdSansyo[5] = 500;
}
int main()
{
std::vector<short> moto;
sansyo cSansyo;
for (int i = 0; i < 10; i++) {
short tmp = i * 2;
moto.push_back(tmp);
}
cSansyo.setSansyo(moto);//ここで参照渡しのはず
for (int i = 0; i < 10; i++) {
std::cout << "値=" << moto[i] << "\n"; //値が変わっていない
}
}
こんなふうに、参照渡しにしてみたのですがどうも参照渡しになっていないでそのまま新しいvectorが作られちゃったぽいのですが
これだとメモリを倍使っちゃってるし、時間も掛かってますよね
どういうふうにしたら、喚ばれた側の関数で参照渡しに出来るのでしょう
2021/02/07(日) 16:37:08.22ID:sfdJNFTq
>>599
右辺値参照かstd::swap
2021/02/07(日) 17:13:26.18ID:8CWTHaUD
>>600
サンプル貼ってよ
2021/02/07(日) 17:21:04.63ID:jcLu/xd9
std::swapも右辺値参照も全然上手く行きそうになかっのたで

宣言をポインタにして
private:
std::vector<short> *_stdSansyo;

void sansyo::setSansyo(std::vector<short>& sansyo)
{
_stdSansyo = &sansyo;
sansyo[6] = 100;
_stdSansyo->data()[5] = 50;
}

関数をこんなふうに書き換えたら、ちゃんと参照だけで動いたのでもういいや

けど右辺値参照とstd::swapの例も出してくれたらこれから色々いたスカリマス
2021/02/07(日) 17:24:59.07ID:8CWTHaUD
>>600
ほれほれ
貼れんのか
2021/02/07(日) 17:28:56.01ID:yi1XmM9H
>>599
参照渡し自体はできてるはず。
ただ参照渡ししたvectorをクラスのメンバに代入して、代入されたクラスメンバの方を更新しているからvectorを渡した元の方にはまったく影響が無いというだけ。
2021/02/07(日) 17:29:10.92ID:jX/y7Db/
>>598
もうそう言うことにしないと自我が保てないんだろw
2021/02/07(日) 17:59:39.88ID:p49/UnNX
sansyo::_stdSanshoをどうしても参照にしたいならこうするしか、
class sansho {
private:
std::vector<short> _stdSansyo;
public:
sansho(std::vector<short>& src) : _stdSansyo(src) { }
void setSansyo(std::vector<short>& sansyo);
};
void sansyo::setSansyo(std::vector<short>& sansyo) {
_stdSansyo[5] = 500;
}
int main() {
std::vector<short> moto;
sansyo cSansyo(moto); //ここで参照渡し
for (int i = 0; i < 10; i++) {
short tmp = i * 2;
moto.push_back(tmp);
}
cSansyo.setSansyo(moto); // moto[5]に500が入りまくり
for (int i = 0; i < 10; i++) {
std::cout << "値=" << moto[i] << "\n"; //値が変わった!(予定
}
};
2021/02/07(日) 18:00:52.99ID:HYoiJUgB
>>598
だったら何だとぬかす気だ?
> 存在しないものを見てニヤニヤしてる変態こわい
> 文章を字面通りにしか解釈できない人?

要するに話になんない奴ってことだろ
言ったことにも裏の意味にもコメントされたくない
じゃあ相手しねえでやるから黙ってろゴミ
2021/02/07(日) 18:02:35.24ID:p49/UnNX
訂正orz
誤: private: std::vector<short> _stdSansyo;
正: private: std::vector<short>& _stdSansyo;

もしcSansyo.setSansyo(moto)の呼び出し時に参照を渡したいんじゃああ!
という向きにはsansyo::_stdSansyoはstd::vector<short>* _stdSanshoにして
ポインタを持つようにすべき
2021/02/07(日) 18:10:05.07ID:p49/UnNX
ちゅかもっと大きな一般原則としてつぎのどっちかにすべき
(1) std::vector<short>の実体の所有権をmain()(で定義いているmoto)に固定してcSanshoクラスにmotoのアドレスを記憶させない
(2) std::vector<short>の実体の所有権をcSanshoクラスのインスタンス(_stdSansyo;)に固定してmain()でmotoを定義するのをやめる
※ 個人の感想です

つまり出題が悪い。出し直し
2021/02/07(日) 18:10:05.98ID:hHDgzHUe
>>602
元の考え方を変えずに動作させるにはその方法は十分に妥当だと思うよ。

ただ、もっと複雑なプログラムになったときにうっかりデータよりポインタのほうが
長生きすることになっても発見しづらいデザインになっている。

可能なら全体のデザインを見直すべきという話で、
いっそ所有権を渡してしまったほうが間違いにくいかもねという意味で右辺値参照や swap の話題が出ているので、
>>599 をベースにして右辺値参照や swap を使う例に書き換えるのは難しい。
別物になってしまう。
2021/02/07(日) 18:11:12.01ID:yi1XmM9H
>>607
自分以外の複数の人を同一人物だと思っちゃう人?
2021/02/07(日) 18:14:03.86ID:p49/UnNX
>>611
ネットの総意とか言い出しちゃう人?
2021/02/07(日) 18:16:20.19ID:p49/UnNX
検証不能な事物を錦の御旗にするような人間が
ソフトウェアのテスト推しなのは
大いなる矛盾である氏ね
2021/02/07(日) 18:18:25.00ID:HYoiJUgB
>>611
あの流れで
> 文章を字面通りにしか解釈できない人?
なんてぬかすやつは複数ID自演厨と見なされて当然だ
疑われたくなければ口の利き方に気をつけな

疑いは晴れてない
この後の発言にも気をつけるんだな
615デフォルトの名無しさん
垢版 |
2021/02/07(日) 18:24:44.17ID:4v/nAOdw
>>566
なにこれ
616デフォルトの名無しさん
垢版 |
2021/02/07(日) 18:29:05.24ID:U/6f7Qk0
参照をフィールドに保持するのは、一部のパーサーくらいでは?

しかも、状態を関数に切り分けないとデバッグが辛いので、仕方なくそうするだけで、バッド何とかの類だし。
617デフォルトの名無しさん
垢版 |
2021/02/07(日) 18:31:34.10ID:U/6f7Qk0
むかし5chで誰かが、プログラムを書くときは必ずテストしてるはずなんだって言ってましたが。
それを単体テストとして書いておけばずっと使えて便利だよと。

その書き込みを見て世界中の人がテストフレームワークを書き始めたんですよ。
2021/02/07(日) 19:06:50.71ID:n+epGkV9
>>616
想像力が足りなすぎ
>>617
想像力が豊かすぎ
619デフォルトの名無しさん
垢版 |
2021/02/07(日) 20:53:42.20ID:U/6f7Qk0
バッドエンディングですね。
2021/02/07(日) 21:03:56.50ID:ZOvCZ0cx
グローバル変数使うなとは言わないけどコメントもないのはキツい
grep掛けて検索しても訳分からん
ポインタで飛び火してるときなんてもう…
2021/02/07(日) 22:09:55.11ID:IiZq+u+t
演算子オーバーロードの厄介さはキーワード検索で拾いにくいこと。
反復子もそうだが。ま、言い出したらきりないが。
2021/02/07(日) 22:57:26.65ID:HI2f2oIL
>>561を書いたのは私なんだけどなぁ...
面倒くさそうな人がいるし、一般論だけ言って立ち去ろって思っただけ
2021/02/07(日) 23:02:22.83ID:HI2f2oIL
ちなみに、>>561以降は何も述べてない。
私は一般論を語っただけだから、他の人が私と似た考えでツッコミを入れただけに過ぎない。

殺虫剤のパラドックス?それがどうした?
私はテストコードを書いて不具合を激的に抑えているが?

殺虫剤のパラドックスを説明したところで、不具合を限りなくゼロに近づける試みが無駄であることの証明にはならない。
2021/02/07(日) 23:09:32.25ID:sfdJNFTq
>>622-623
自我の芽生え、おめでとう!
では、かえるの歌を歌います。

【...JASRAC権利関係の為、自主検閲...】

♪パパーン
(全員でクラッカーを鳴らす)
625デフォルトの名無しさん
垢版 |
2021/02/07(日) 23:20:12.91ID:IiZq+u+t
殺虫剤のパラドックスなんてものは存在しない。
ただの退行テスト不足だ。
2021/02/08(月) 06:24:22.18ID:PnrMZIJR
殺虫剤のパラドックスって言いたかっただけやろw
そもそもテストで発覚したバグを修正したら同じテストで摘出できないのは当たり前
摘出できたら単なる修正漏れだしw
JSTQBの関係者か信奉者が言い出したんだろうけどあまり意味のない用語だと思う
2021/02/08(月) 06:42:41.05ID:HwnOmmQF
蒸し返さなくていいから……
628デフォルトの名無しさん
垢版 |
2021/02/08(月) 07:03:25.17ID:nKLqWVxG
虫返さないですと!?
2021/02/08(月) 11:05:43.31ID:NGjwD54G
>>610
そもそも>>600は的外れだと思うんだが
メンバの方を参照かポインタで持つ、で終わりだろ
3行目以降完全に蛇足
2021/02/08(月) 11:20:50.36ID:VJ9lplXi
>>627,628
そういうのは無視しろ
2021/02/08(月) 12:00:56.57ID:zDqHH6LK
スルーの法則
2021/02/08(月) 12:43:41.70ID:DuebuhTc
>>602
>>599
誰か
永続的に使用するなら shared_ptrで受け取れ。今のままだとsetSansyoを呼び出す側が所有権手放していいのかわからなくて困るだろ。
て指摘した?
今や生ポインタなんて性能優先のときに内部的に使用するもんで、インターフェイスで使用するもんじゃない。

あと、参照も関数内だけで使用する引数に使うもんで、永続的に所有する引数に使うもんじゃない。
633デフォルトの名無しさん
垢版 |
2021/02/08(月) 14:04:18.90ID:VJ9lplXi
コンストラクタでなら参照型のメンバ変数に保存できる。ほとんどの人はやらないけど。
2021/02/08(月) 18:54:29.18ID:DuebuhTc
>>633
できるのと実際に実装するのは別の話だわな。
所有権の無いオブジェクトの参照を保存するなんて狂気の沙汰だ。
635デフォルトの名無しさん
垢版 |
2021/02/08(月) 19:12:34.60ID:nKLqWVxG
アイキャンユーキャン。
2021/02/08(月) 20:51:28.21ID:U8Md53kE
>>633
クラス間に親子関係のようなものがあって、子の生存期間が常に親の生存期間内にあるような場合は、親への参照をメンバ変数とすることは普通にあると思うけど。例えば>>484とか
2021/02/08(月) 21:15:43.14ID:NGjwD54G
shared_ptr(またはスマポ)至上主義の変なやつ以前から居るんだよな
相手にするな
2021/02/08(月) 21:37:27.20ID:UsSsiWeS
ナマポ使ったほうが良い場面なんて皆無でしょう
2021/02/08(月) 21:48:31.75ID:2GJiXyxS
出たwナマポ完全否定奴w
640デフォルトの名無しさん
垢版 |
2021/02/08(月) 21:58:57.06ID:VJ9lplXi
参照型のメンバ変数は参照オブジェクトの生存期間を保証できないからweak_ptrで保存しておいて使う時だけshared_ptrを取得するのがC++的な解決なんじゃないの。
2021/02/08(月) 22:08:09.48ID:FKp3giDs
スマポにしたら所有権の問題を考えなくてよい
というわけではないからスマポ使えというのは妥当ではない
逆に所有権に矛盾が無ければインスタンスは生成元が与えた参照を持って良い

ていうかスコープを抜けたら自動的に解放される系のクラスを書いたら
エラー処理上エラー通知先としての生成元オブジェクトの参照保持はほとんど不可避
2021/02/08(月) 22:11:14.29ID:NgGwlfwa
コピー禁止のshared_ptr欲しい
2021/02/08(月) 22:25:23.27ID:bp+4mh0R
すべてスマポで書くスタイルも悪くないと思うけど、メイヤーズ神もツリー構造で子が親のポインタを持つときはナマポで十分と書いている
2021/02/08(月) 22:27:43.60ID:34Jom8HU
木のノードは子へのポインタじゃなくて子のノードIDを持て😡
2021/02/08(月) 22:48:15.38ID:NgGwlfwa
自分よりポインタの方が寿命が長いことが保証されているなら確かに生ポで問題ないが
それが成り立つ状況ってなかなかないよな。
646デフォルトの名無しさん
垢版 |
2021/02/08(月) 23:02:19.81ID:VJ9lplXi
参照先の実体がまだ生存しているかどうか知るにはweak_ptr::expired()を使うしかないのが現状でしょ。
647デフォルトの名無しさん
垢版 |
2021/02/08(月) 23:07:56.19ID:nKLqWVxG
Chromiumはstd::unique_ptrを全面的に使ってるけど、ポインタを使う設計そのものが古いような気がする。
2021/02/08(月) 23:13:28.50ID:BwguerZK
まあcコードを全く使わないってのならいいんでないの。
ただc++のポータビリティーは君が思ってるより低いけどね。
2021/02/08(月) 23:23:15.47ID:cR8ppl+C
露骨すぎるマウント取りたがりダッセーwww
650デフォルトの名無しさん
垢版 |
2021/02/09(火) 01:58:29.04ID:qUmf+U4D
マウントじゃなくてポインタでは?
651デフォルトの名無しさん
垢版 |
2021/02/09(火) 02:46:23.52ID:jPnyP+Vp
C++に特化したAPIなんてどこのOSでも提供されないから、結局、Cの配列と互換性のあるstd::vectorやstd::arrayを使わざるを得なくなる。
652デフォルトの名無しさん
垢版 |
2021/02/09(火) 04:01:45.22ID:qUmf+U4D
>>644
木もコンテナで良いですよね。
所有権がハッキリしてて。
2021/02/09(火) 07:34:27.86ID:nSJhwzEU
>>651
data()を必ず使う手合いか?
2021/02/09(火) 07:39:10.06ID:s3p3GZ7R
木は木全体を収める領域ごと一気に解放する場合もあるから別に
655デフォルトの名無しさん
垢版 |
2021/02/09(火) 17:49:12.66ID:KrtnTLUi
>Cの配列と互換性のある

doubt
656デフォルトの名無しさん
垢版 |
2021/02/09(火) 17:53:30.91ID:LEWRJrN2
ダウトとデビューって似てるよね
657デフォルトの名無しさん
垢版 |
2021/02/09(火) 18:35:55.16ID:qUmf+U4D
親が子のポインタを所有する木は、親を消すとネストして子孫のデストラクタを呼ぶので、スタックが枯渇します。

したがって、子から順番に消さなくてはなりません。
658デフォルトの名無しさん
垢版 |
2021/02/09(火) 18:56:53.48ID:qUmf+U4D
その様はまるで摩天楼がドミノ倒しのように連鎖倒壊するようでもあり、DOMINOというピザにもなっています・
2021/02/09(火) 19:07:16.84ID:IPYpL0sA
なんと後味の悪い話
2021/02/09(火) 20:39:36.84ID:zHOwdh/n
意味が分からない
2021/02/09(火) 21:07:48.14ID:Rh87rJZX
>>657
それで枯渇するようじゃ木の探索すらできない。
2021/02/09(火) 21:13:02.23ID:5Ac7csWH
探索はループでもできるんで、たとえば数万個の要素を持つツリーを子から消せというのは真理なのかも
2021/02/09(火) 21:27:40.55ID:AojZLEiV
消すのは独立して実行できるので別スレッドに送れば実質コスト0
2021/02/09(火) 21:38:09.75ID:s3p3GZ7R
>>662
DFAとPDAではやれることの範囲の違いがちげう

つかこの場合は安易にスマポとかコンテナを使うから破棄ごときにトラバースの手間がかかるんである
2021/02/09(火) 21:44:42.72ID:5Ac7csWH
それもそうであるな
2021/02/09(火) 21:50:17.60ID:s3p3GZ7R
ちゅか垂直探索なら木をメモリに持っておく必要が無い
水平探索ならメモリ上に世代1、世代2、....と木を育てていく(らしい)が
兄弟ノードを全部見終えたのでいざ従妹ノードに移ろうとするときに
親ノードへの参照は欲しい木がするがするとshared_ptrなら即循環参照になり、
子の情報で親(子孫がいっぱいぶら下がっている)を生成できるわけもないから、
ウィークポインタの出番でもない
667デフォルトの名無しさん
垢版 |
2021/02/10(水) 01:37:49.58ID:XIZePh+h
子から消さなかったばかりに。
2000人を乗せた航空機が洋上で消えた。
ってなるかも?
2021/02/10(水) 01:48:13.89ID:ZYaksnCf
A380でさえ853席だが2000人なんてどうやって載せるんだろう
2021/02/10(水) 01:51:41.17ID:2ozOIzIF
く、空中で衝突するとか…
670デフォルトの名無しさん
垢版 |
2021/02/10(水) 01:53:08.99ID:XIZePh+h
インドでは屋根の上にも乗ります。
671デフォルトの名無しさん
垢版 |
2021/02/10(水) 01:55:11.55ID:XIZePh+h
https://trafficnews.jp/post/80031

証拠写真みつけてきた。
2021/02/10(水) 01:55:17.84ID:uF0JvJPV
GTA5のMOD作成者みたいな会話だな
2021/02/10(水) 02:01:19.54ID:uF0JvJPV
>>653
昔はdata()がなかった。(遠い目)
2021/02/10(水) 06:40:17.61ID:ZYaksnCf
アントノフの貨物室にすし詰めでどんくらい乗れるかな
675デフォルトの名無しさん
垢版 |
2021/02/10(水) 06:40:27.16ID:XIZePh+h
東京: TK
京都: KT
大阪: OSK
淡路: AWG
2021/02/10(水) 07:59:22.76ID:FGGGEnfF
航空機や原発みたいなクリティカルなシステムでは
全部固定長の配列で書いてあるんじゃないの
2021/02/10(水) 08:06:21.27ID:uF0JvJPV
釣れますか。
ヒープのほうが少し安全です。
2021/02/10(水) 10:25:11.13ID:4XPmMtZj
>>671
どこが証拠やねん!
せいぜり100人やないかヽ(`Д´)ノ
2021/02/10(水) 14:32:04.65ID:TFzLuCg0
すみません、std::for_each を使っていて continue したくなりましたが、サポートしてないです
よね? これって:
1. for_each は continue する必要がないような処理に限ってに使うべき。
2. ループの中で大きい if ブロックを作って空の処理にすればよい。
3. その他
2021/02/10(水) 15:13:45.18ID:ZYaksnCf
returnすれば?
for_each(begin(foo), end(foo), []{ if(bar) return; });
681デフォルトの名無しさん
垢版 |
2021/02/10(水) 16:06:00.49ID:HSfvjOUE
return は continue ではなく break じゃないの?
質問者の2.大きなif分で実質何もしないでいいと思う
2021/02/10(水) 16:20:11.24ID:ZYaksnCf
for_eachをbreakするにはthrowかlongjmpがいるぞ
2021/02/10(水) 16:35:39.62ID:S47HOUGT
きったねぇジャンプだ
684デフォルトの名無しさん
垢版 |
2021/02/10(水) 16:51:31.94ID:HSfvjOUE
あ、ラムダ式になってたのか
2021/02/10(水) 17:51:08.81ID:tNqysU9n
>>679
for 文で書いた方が短く書けそうだけど、
あえて for_each を使いたい理由が何かあったりするの?
2021/02/10(水) 18:41:41.17ID:FGGGEnfF
Perlなら問題無くできる(continue→next、だが
C++規格委員会がfor_eachのcontinueを許可しないのは最後の一線なのかもしれん…
2021/02/10(水) 19:51:57.06ID:teDb7k99
何の一線よ
2021/02/10(水) 20:18:41.39ID:ln/pLvjf
いやreturnでいいだろ…
許可しないってなんのことだよ
689デフォルトの名無しさん
垢版 |
2021/02/10(水) 21:21:18.68ID:+e+FbMSY
vectorで一億件ほどで、飛ばしたいのが100〜1000件程度なんだろう
2021/02/10(水) 21:51:25.56ID:QYfnOwKH
>>679
for_eachをrange based forに変更は出来ないの?
2021/02/10(水) 21:59:01.21ID:ZYaksnCf
>>690
おまえのスキルのためにか?
2021/02/10(水) 22:17:23.69ID:qtVJ0qYe
range based forなら普通にcontinueできるぞ
2021/02/10(水) 22:18:26.21ID:ln/pLvjf
>>689
飛ばす手段があったとして、飛ばすかどうかどこでどう判断するの?
2021/02/11(木) 04:16:42.30ID:nrDdTgaQ
early returnは正義
695デフォルトの名無しさん
垢版 |
2021/02/11(木) 11:22:44.35ID:n0GRjtoR
>>685
テンプレのときとか
2021/02/11(木) 17:53:02.68ID:Iq2aKjep
679がなぜfor_eachを使うのかを無視するのは
他人の領分を侵すお節介だ

for_eachの使い方をアドバイスできんやつは
しゃしゃり出てくるな
2021/02/11(木) 18:00:13.22ID:hRfccug1
よくよく話を聞いてみたらまるで異なる解決策が見つかるなんてよくあることじゃん。そんな経験ないの?
何をしたかったか確認するのは重要
2021/02/11(木) 18:15:41.21ID:Iq2aKjep
流れをよく読んでみろよ
for_eachをロクに使ってないやつなのモロバレだろ
質問者が尋ねていないことを答えたいから協力しろなんてぬかすのは
回答者の資格ねえんだよ
2021/02/11(木) 18:18:25.32ID:Iq2aKjep
自分が何か尋ねているときに
質問内容に付き合ってやれる懐のねえやつは
うぜえだけだろが
2021/02/11(木) 18:23:57.31ID:Iq2aKjep
質問内容において自分より下なやつに教えを請いたいかよ
2021/02/11(木) 18:34:11.92ID:hRfccug1
for_eachを使う場合の答えはとっくに出てるのに何言ってんの?
2021/02/11(木) 19:17:08.97ID:15xoUz1R
3のその他で答えただけ。
2021/02/11(木) 20:01:29.92ID:veopzNW6
他人の領分なんて侵してナンボ
2021/02/11(木) 20:03:18.37ID:qccRsQET
>>702
はあ?returnではいけない理由は?
2021/02/11(木) 20:19:00.69ID:a/CQbB/Z
>>679はループしたいだけだろ
std::for_eachを何が何でも使わなければならない特殊な事情があるなら仕方ないけどそんなこと言ってないし
2021/02/11(木) 20:23:31.36ID:nDjPJyoP
>>704
returnで良いと思うよ。
2021/02/11(木) 20:50:06.93ID:Iq2aKjep
>>701
680は俺だが何言ってんの?
2021/02/11(木) 21:58:36.08ID:bviF/sLG
Visual Studio 2010(MSVC2010)で
 template<class T>
 void foo(T x) {
  printf("%d: %d\n", targetEntity, x);
 }
という関数テンプレートが定義されているときに、
 namespace bar { const int targetEntity = 1; }
 using bar::targetEntity;
 void baz() { foo(100); }
はコンパイルが通るのに、
 namespace bar { const int targetEntity = 1; }
 void baz() {
  using bar::targetEntity;
  foo(100);
 }
だと
 error C2065: 'targetEntity': 定義されていない識別子です。
と言われるorz
2021/02/11(木) 22:06:56.76ID:bviF/sLG
>>688
for_eachを勘違いいてたわサーセン、
確かにfor_each<bgn, end, Function>のFunction(*it)からならreturnするで良さげ
710デフォルトの名無しさん
垢版 |
2021/02/11(木) 23:28:48.49ID:Ooe4jkn9
>>707
アンパンマンはキミだ。
2021/02/12(金) 01:36:02.90ID:2OOQ6m86
>>708
宣言の有効範囲は宣言された場所からその宣言を含むブロックの終わりまでというのが原則
(クラススコープなどの例外はあるのでその他にも関連するルールはあるかもしれんけど)
なのでどちらもエラーになるのが筋だと思うし、 gcc や clang で試したらどっちもエラーだった。

逆にどういう理屈で前者が通るのかは気になる。
2021/02/12(金) 06:02:20.64ID:45Tu3B4L
>>708
当たり前だね
最初の例ではtargetEntryをグローバル空間に導入しているからbaz()とfoo()の両方から見える
2番目の例ではtargetEntryをbaz()のブロック内に導入しているから、そこに包含されないfoo()のブロックからは見えない

ただし、これはfoo()を関数原型と関数定義に分けて関数定義をbarよりも後方に置いた場合の話だ
原文のままでは>>711が言うとおり通るわけがない
2021/02/12(金) 06:03:16.30ID:45Tu3B4L
- barよりも後方
+ usingよりも後方
2021/02/12(金) 07:01:12.63ID:3x5iWh5q
確かにideoneでもVS2019でも両方エラーになるのですだが、
1番目の例はVS2010ではビルドも通って動くもーん

ソース:
https://ideone.com/DC8fMv

実行結果(※ VS2010限定):
1: 100
続行するには何かキーを押してください . . .
2021/02/12(金) 07:04:11.00ID:3x5iWh5q
ちな関数テンプレートfoo()の定義をusingよりも後方にしたら全てでビルドが通って動く
まそりゃーそうならないとおかしいが
2021/02/12(金) 07:12:42.48ID:45Tu3B4L
>>714
通ってねえじゃん
何が言いたいんだ?
2021/02/12(金) 07:17:08.75ID:3x5iWh5q
>>716
> >>714
> 通ってねえじゃん
> 何が言いたいんだ?
※ VS2010限定
2021/02/12(金) 07:24:49.77ID:45Tu3B4L
だから何?
ill-formedなのがわかっても自分が正しいと強弁したいのか?
2021/02/12(金) 07:27:26.57ID:3x5iWh5q
全員の主張を再検証しただけでつよ?
>原文のままでは>>711が言うとおり通るわけがない (>>712)
が覆されてご機嫌ななめ??
2021/02/12(金) 07:32:07.63ID:45Tu3B4L
覆った?
おまえVS2010限定で逃げただろ
ill-formedはill-formed
これを覆せたら出直して来な
2021/02/12(金) 07:34:53.80ID:45Tu3B4L
俺も昔のバージョンのコンパイラは使うがバグ技は使わないし
そういうことをする厨二病とは組みたくない
2021/02/12(金) 07:38:38.54ID:3x5iWh5q
>おまえVS2010限定で逃げただろ
VS2010ではビルドが通るというのが話の発端なので…
1番目の例がill-formedであろう点は同意
2021/02/12(金) 07:51:23.22ID:45Tu3B4L
orzなんだろ
何が誰が悪いのかわかったら素直になれよ
居直る態度が気に入らねえ
2021/02/12(金) 08:12:22.74ID:3x5iWh5q
何が悪いのか、はともかく
誰が悪いのかとは一体…
つか現象(事実)の提示に対してそれを反発と解釈して勝手に炎上しないでいただきたい;;;

個人的にはVS2010のバグである可能性でほぼ確定とは思いつつ、
例1と例2で動きが違うことから、MSVC2010は、グローバルなシンボルについて
template foo()や関数baz()の中の解釈に入る前に名前空間を確定させる実装なのだと感じる
(template foo()の解釈ロジック自体にバグがあるなら例1、2とも同じ結果になるのが自然

再発防止のためには、C++規格のどこをどう読めば良いんじゃorz
2021/02/12(金) 08:57:55.62ID:45Tu3B4L
>>719は明らかに煽り口調だろうが
和解したいなら、あの態度を撤回しろ

俺は和解なんかできなくて構わんが
2021/02/12(金) 10:26:37.15ID:1W1GlA05
匿名掲示板で誰が何を言ったのどうのとみっともないぞデフォルトの名無しさんよ
2021/02/12(金) 11:29:35.12ID:jxDcSv/l
どう見ても>>716がイミフな言いがかりつけてるだけにしか見えんが…

> 確かにideoneでもVS2019でも両方エラーになるのですだが、
> 1番目の例はVS2010ではビルドも通って動くもーん
728デフォルトの名無しさん
垢版 |
2021/02/12(金) 13:22:44.45ID:x9NfpsA7
匿名でも江副とかQZとか片山やはちみつが糞なのは伝わってくるω
2021/02/12(金) 18:24:14.30ID:45Tu3B4L
単発IDになりやがった
どこまでも腐ってやがるな
2021/02/12(金) 19:12:56.39ID:fTOQtm+W
どこでも動くように標準化しましょうねって話だよね。
2021/02/12(金) 19:29:19.43ID:WC9JZZt5
G++とかclang++などの複数のコンパイラで警告最大にして自動ビルドすれば再発防止できると思われます。
2021/02/12(金) 19:37:54.63ID:3abO7oQ0
流れをぶった切って質問です。

あるクラスで生成、削除を一切合切プライベートにしたい(ファクトリメソッドでスマートポインタを渡す)んだけど、
::deleteを対象クラスだけプライベート、あるいはコンパイルエラーにする
ことって可能かしらん?
2021/02/12(金) 19:46:11.11ID:WC9JZZt5
>>732
private dtor使え、だとよ。
https://stackoverflow.com/questions/631783/what-is-the-use-of-having-destructor-as-private
2021/02/12(金) 19:55:37.68ID:fTOQtm+W
dtorはデストラクターの略ね。
死のトラクターじゃないよ。
735デフォルトの名無しさん
垢版 |
2021/02/13(土) 02:57:21.77ID:ZCgeuP6g
映画化決定。
2021/02/15(月) 00:20:32.87ID:M7Hs01/T
>>728
私が馬鹿なのは私自身が認めていることですが、片山さんはすごいと思いますよ、何よりも片山さんは多産ですし、私は片山さんを尊敬しています‥‥
2021/02/15(月) 12:30:59.56ID:tZ1nblID
>>733
ありがとう。参考になりました。

流石にグローバルdtorの直接呼び出しを気にしている人は居なさそうですね。
通常の使い方じゃないから気にするな、が正解かしらん。
2021/02/16(火) 18:45:49.14ID:zTH+X1Xm
画像
https://genkibox.com/linepic/wp-content/uploads/2017/10/line0049.jpg
2021/02/16(火) 18:59:33.07ID:zTH+X1Xm
つかprivate dtorって何の解決にもなって
なくね?
クラスFooのデストラがprivateな時点で
Fooのfirendでも何でもないstd::shared_ptr<Foo>はビルドエラーになる宿命なのでは…
あとp.get()->Delete()とされるのも恐ろしいすぐる………
2021/02/16(火) 19:15:28.82ID:Pme6j5oX
>>739
そのあたりは回避策ある。
どのwebページに解説あったか覚えてないけど……
2021/02/17(水) 08:24:04.17ID:Pn/OWNHb
operator <=>を定義しても
==と!=が使えるようにならないのは、なんで?
2021/02/17(水) 11:29:34.99ID:u6Au0MiC
https://cpprefjp.github.io/lang/cpp20/consistent_comparison.html
のoperator==節で仕様とその理由についても説明してあります
2021/02/17(水) 12:05:07.17ID:8kTif7Fu
relops
2021/02/17(水) 12:07:48.78ID:ZhVk2C4b
relops
2021/02/17(水) 12:14:57.71ID:7xS0C1vs
なるほどわからん。弱順序って何よ?
2021/02/17(水) 13:36:33.88ID:peDNmUYI
>>745
二項関係で、反射律、推移律、比較可能性を満たすもの
2021/02/17(水) 21:10:31.90ID:n4obO1jB
>>746
擬順序とか半順序と呼ぶ本もありますね、
ただ、その「比較可能性を満たす」とはなんでしょうか?私の教科書では、擬順序には反射律・推移律だけしか要請されていなかったと記憶しているのですが?
2021/02/17(水) 23:46:57.44ID:ZhVk2C4b
普通に言葉通り任意の2つの元を比較できるということなのでは…

木構造で「親は子より大きい」という順序を定義しただけ
(全順序集合(例えば整数)で全ノードをラベル付けしてしまうというチート手段に訴えことなく、
 文字通り「if (aはbの親) { a > b; }」という規則と(a, b)の反射律、推移律を導入しただけ
では兄弟間の大小が定まらない、
みたいな
2021/02/17(水) 23:47:32.54ID:ZhVk2C4b
のは半順序で、
整数みたいなやつが全順序
2021/02/17(水) 23:59:39.55ID:ZhVk2C4b
なお{ 全順序集合 }⊂{ 半順序集合 }なのは確定的に明らかなので、
反射律・推移律だけしか要請されていなかったらそれは全順序集合の集合を含む半順序集合の集合の意味となりぬ
つまり全順序集合の集合と半順序集合の集合が区別できん
両社を区別したい議論のときは比較可能性の有無を宣明せねばならんぬ、
2021/02/18(木) 00:34:07.44ID:48a8FzyN
a≦b または b≦aが成り立つ時、比較可能
弱順序ってしらなかったけど、半順序とは違うようだ
「半順序?弱順序?二項関係・順序関係まとめ」って記事
2021/02/18(木) 03:35:31.61ID:sRdwF113
束論やってるけど弱順序とか初めて聞いた…
マ界用語?
753741
垢版 |
2021/02/18(木) 06:50:20.77ID:brZHVFLx
>>742
まだ何とも言えないが
thx!
2021/02/18(木) 10:08:01.17ID:48a8FzyN
弱順序は、半順序よりは制限強いが全順序より弱いもので、
ある種のソートアルゴリズムでは全順序よりは制限緩められるけど
半順序までは緩められない、ってのがあるみたいね
2021/02/18(木) 13:16:30.49ID:9Yl3mCZH
>>752
束って何で勉強すればいいん?
2021/02/18(木) 14:43:05.98ID:48a8FzyN
アルゴリズムとの関連はちょっとわからんけど

数学としての束論って単独の本は少なくて、代数学の本に載ってるんじゃないかな
もしくは順序集合の話として集合論の本
2021/02/19(金) 04:42:11.06ID:3tFNJrqv
>>748
>普通に言葉通り任意の2つの元を比較できるということなのでは…

いや、それは全順序ですよ
・擬順序
・順序
これらの演算子を≦としたとき、かならずしも任意の二元 a, b について a ≦ b の真偽が定まらなくてもいいと思います

擬順序に対して「a ≦ b かつ b ≦ a ならば a = b」という縛りが追加されるのが順序、
順序に対して、任意の二元 a, b について「a ≦ b」または「b ≦ a」のどちらかである、という縛りが要請されるのが全順序
だったかと
2021/02/19(金) 20:38:08.11ID:mpGE+xsF
wikipediaの「推移関係」の項目より

半順序 - 反対称的な擬順序
擬順序 - 推移的であると同時に反射的
全擬順序 - 完全的な擬順序
同値関係 - 対称的な擬順序
厳密弱順序 - 強半順序関係で等価関係での比較が不可能な場合
全順序 - 推移的で反対称的な完全関係

全順序、半順序くらいしか知らんかった
2021/02/19(金) 20:51:11.65ID:gWMDVcMR
OOPの本だとサブクラス関係は前順序って書いてるよな?擬順序ともいうのか
推移的、A→B∧B→C |- A→C 、サブクラスのサブクラスはサブクラス
かつ反射的、AはAのサブクラス
2021/02/19(金) 20:55:11.79ID:fAhRarpN
>>757
>いや、それは全順序ですよ
は? その条件が共通なだけだろ
2021/02/19(金) 21:23:56.68ID:3tFNJrqv
>>760
一番弱い順序、推移的かつ反射的であるのみの順序関係は、実は任意の二項間においてかならずしも順序関係の真偽が定まらなくてもいいのですよ
すべての二項間で順序の真偽が定まるのは、順序の中でも一番強いものである全順序で初めて導入される、と私は解釈しています
2021/02/19(金) 21:44:53.04ID:gWMDVcMR
ブール代数 型システムで検索しても出てこないけど>>523
可補分配束の定義見てると確かにそんな気はしてくる

インスタンス関係かサブクラス関係なのか?どっちでも成り立ちそうだけど、取り敢えず静的チェックをパスすることを考える

要素が無いと言う意味でCのvoidを冪集合ブール代数の最小元、空集合とみなす
void *は何でも指せるという意味で最大元
まともな型システムなら(少なくとも)上記の擬順序以上は要求る
演算は多重継承とvirtual 定義が∨/∧に対応?クラス図書いてみたら成り立ちそうに思える
型チェック通らない全ての型を考えられるし、それが¬
型述語で定義してればそのまま!演算子になる
2021/02/19(金) 21:55:14.25ID:gWMDVcMR
確証が持てなくてもどかしい…数学できる人ツッコミ待ち

とりあえずダイヤモンド継承を許さない言語だと、常に∧/∨は定義されないからブール代数にはならない事には気付いた
2021/02/19(金) 21:55:34.53ID:hHLb88jw
ググってる時点で、というかそのことを隠しもしないニワカ
2021/02/19(金) 21:56:36.22ID:gWMDVcMR
>>764
隠して5chなんかで偉ぶってどうすんのさ
2021/02/19(金) 22:01:35.27ID:aORwmd7L
質問ですがムーブコンストラクタを有する基底クラスの
派生クラスでムーブコンストラクタを
派生クラスがムーブコンストラクトされる際に基底クラスにアクセスしようとする場合であっても
安全に書く方法って何かあるんでしたっけ
767デフォルトの名無しさん
垢版 |
2021/02/19(金) 22:03:03.40ID:6z9jMlRH
作ったクラスをmapにいれるときoperator<を書かなきゃいけないのがめんどい
2021/02/19(金) 22:08:24.37ID:aORwmd7L
あとムーブコンストラクタを有するクラスを
詳細を隠ぺいする目的でインターフェースを設けたとき
インターフェース経由でムーブコンストラクトする方法って何かあるんでしたっけ
アブストラクトファクトリイーを作るしか無い?
2021/02/19(金) 22:11:39.72ID:aORwmd7L
この場合アブストラクトファクトリイーといっても、元のクラスFooに対して
IFoo IFoo::move() { ... } が定義してあって
 IFoo x = (適当な生成手段)
ののち、
 IFoo y = x.move()
でxが破壊されるやつ!
2021/02/19(金) 22:36:29.47ID:F7SsNRLa
それインターフェースとして使えてないよ
2021/02/20(土) 00:40:16.16ID:iK8Sr3o/
領域が連続しているコンテナなら何でも良いんですが、たとえば array<T> a を vector< vector<T> > b に n 要素分コピーしたいときって
memcpy(b.data(), a.data(), n*sezeof(T))
で良いんですかね?

UNIXコマンドと順番が違ったりして間違えそうなのですが、他に良いやり方ありますか
2021/02/20(土) 01:38:00.62ID:YJV0xwOV
>>771
ド素人かよ
2021/02/20(土) 01:42:23.87ID:upzAgg50
>>771
領域確保されてるならたぶんそれが最速だけど、普通はstd::copyかな
2021/02/20(土) 08:11:48.90ID:BRyl48dG
>>761
その「一番弱い」とか言ってるのは前順序だろ。

ククク... 前順序は順序四天王の中でも最弱...
ウィキペディアにも書いてあるのに間違うとは面汚しよ...
2021/02/20(土) 11:17:36.76ID:ZF+WEG2v
半順序とかいう訳が悪い
英語のpartial orderの方が分かりやすい
2021/02/20(土) 11:27:39.73ID:mkFIMg3t
>>774
本によって用語にブレがあるのは数学では常識でしょう?だから>>761 では定義もあわせて書いておきました
777デフォルトの名無しさん
垢版 |
2021/02/20(土) 11:30:33.89ID:ec7b4JGn
あとは裁判で争うしかないでしょうね。

我々には判決が出せませんから。
2021/02/20(土) 11:52:10.16ID:N5IkYQZo
>>771
前提条件として

・ T の型が trivially copyable である
・ vector の大きさが必要な大きさ分に出来ている

ならそれでもいいよ。
でも、 C の関数を C++ でも使えるのはほとんどが互換性のためでしかなく、
作法的にはあまり使わないに越したことは無いって感じ。
2021/02/20(土) 11:56:56.24ID:N5IkYQZo
>>771
>>778
と思ったけど、 vector<T> ではなくて vector< vector<T> > なのか。
それだと領域が連続するという前提が成り立たないんじゃないんですかね。
2021/02/20(土) 12:51:28.34ID:K0wy5MAI
>>770
どういう意味じゃ…
ムーブコンストラクトする手段をインターフェースとして公開したい需要は論理的に有り得る
それともIFoo::move()に実装が伴うからという意味?
2021/02/20(土) 14:23:36.69ID:XZPJJfWU
>>779
なぜ?
行優先か列優先かは置いといて、vectorの要素は連続するのだからvectorのvectorも連続するのでは?
サイズやキャパシティが変わったときに不連続になりうるということ?
2021/02/20(土) 14:39:27.43ID:ZF+WEG2v
vectorのvectorの中身はサイズ値とバッファポインタが連続で並んでるだろうな
2021/02/20(土) 14:57:30.99ID:upzAgg50
>>781
正しくコピーしたければ、
memcpy(b[0].data(), ...)
みたいにしないと。
このとき当然b[1]のデータ領域はb[0]の後ろに連続していない
2021/02/20(土) 15:27:01.55ID:N5IkYQZo
>>781
vector 型のオブジェクトが連続して並んでいることは保証されるよ。
でも vector 型のオブジェクトのメモリレイアウトがどうなってるかは保証されない。

常識的な実装は >>782 が言う通りヒープから持ってきたメモリのポインタなどを持ってるだけ。
データそのものを内包しているわけではない。
2021/02/20(土) 16:22:37.93ID:UDAFNKrx
ほらCと同じ基本の部分を教えずにいきなりSTLとか勧めるからこういう初心者が出てくる・・
2021/02/20(土) 17:06:29.35ID:1TZxH4Mg
ある程度出てきても問題ないだろ。ちゃんとドキュメント読んで理解してくれる人も多いんだろうし、
「Cと同じ基本の部分」を教えたところでちゃんと理解してくれない人も居るだろうし。
2021/02/20(土) 17:09:29.42ID:UDAFNKrx
ちょっと何言ってるかわかんない
2021/02/20(土) 17:54:39.09ID:ZF+WEG2v
相談室に初心者が来て何の問題があるのか
2021/02/20(土) 18:06:15.32ID:N5IkYQZo
>>788
程度による。
2021/02/20(土) 19:27:14.79ID:VmESNyRi
>>771

> array<T> a を vector< vector<T> > b に n 要素分コピーしたいときって
> memcpy(b.data(), a.data(), n*sezeof(T))
> で良いんですかね?

待てよ、b.data()って&b[0]だから型はvector<T>*だろ。書き換えたらいけないアドレスじゃん。

ダメです。
2021/02/20(土) 19:49:01.06ID:HfYkFRCd
C++のvectorでは、演算子[ ]がオーバーロードされてるから、C言語の常識が通用しないんだよ。

memcpyは危険な関数だから簡単にメモリー破壊できるんだよね。

std::vector v;
int a = 5;
memcpy(&v, &a, sizeof(a)); // vのメモリー破壊。
2021/02/20(土) 20:38:26.44ID:PUIofNKd
>>791
流石にそれは質問者のレベルにも達してないんで問題外
2021/02/20(土) 20:44:29.23ID:Rkd/h2tQ
別にここで何が正しいかを結論できなくてもいいのだが

>>776
そう言うなら「推移的かつ反射的であるのみの順序関係」が「弱順序」と書いてある本を
教えてくれる?
手元になかったらうろ覚えでもいいけど。〇〇の××先生がそう言ってたみたいのでもいいw
知識として一応確認しておきたいかなと。
2021/02/20(土) 21:19:47.30ID:mkFIMg3t
>>793

>>761 では「推移的かつ反射的であるのみの順序関係が『弱順序』」とはいっていませんよ、よく読んでくださいね
>>761 で言っているのは「一番弱い順序、推移的かつ反射的であるのみの順序関係は、実は任意の二項間においてかならずしも順序関係の真偽が定まらなくてもいい」としかいっていませんですよね‥‥
曲解もはなはだしいと思いますね

ちなみに私の教科書ではこれを「擬順序」と定義しています、大熊正氏の本ですが、私には一生かかっても私には読めないでしょうから、あとはググってください
2021/02/20(土) 21:44:52.70ID:K0wy5MAI
std::vector v(sizeof(int));
int a = 5;
memcpy(&(v[0]), &a, sizeof(a)); // おk
2021/02/20(土) 21:47:14.25ID:K0wy5MAI
つかこうかorz
std::vector<int> v((size_t)1);
const int a = 5;
memcpy_s(&(v[0]), sizeof(v[0]) * v.size(), &a, sizeof(a));
2021/02/20(土) 21:58:40.54ID:HfYkFRCd
この場合は素直にループを書くか、それとも格好良くstd::copy使うのが楽かな。
2021/02/21(日) 01:26:13.27ID:G4m9GHw4
for文回したら死ぬ病気にでもかかってんのか?
2021/02/21(日) 01:29:00.28ID:oO8KGr2m
条件を満たすならmemcpyのほうが圧倒的に早いからな
2021/02/21(日) 01:32:42.66ID:jd0qgVVy
それほど速くならない・速くなくていい場合のほうが圧倒的に多いってのもあるけどな。
2021/02/21(日) 03:13:29.79ID:ZrTKdY4P
そもそもそんなクソみたいなコードはふつう書かない
802770
垢版 |
2021/02/21(日) 03:54:49.57ID:HYHVDYIS
>>780
IFooっていう名前からしてインターフェースってJava/C#的な意味でのそれだと思ってたけど
それならポインタなり参照なりじゃないと機能してないよっていうかコンパイルエラーでしょってツッコミ
2021/02/21(日) 03:58:42.63ID:0HHdBuLy
メモリコピーを最適化する前に、他にすべきこと沢山あるだろ的な答えになるよな、確かに。
PG界の真理情報だわ。
2021/02/21(日) 05:11:43.88ID:L28MHLBD
valarrayでxorとか
2021/02/21(日) 07:43:27.01ID:F92hI73d
>>802
オブジェクトAがconstメンバとして保持しているブツの所有権を移してオブジェクトBを構築することは
ムーブコンストラクタでないと_なのでムーブコンストラクタである必要があり
この要請はオブジェクト全体が直接アクセスかポインタや参照経由の間接アクセスかとは独立愚連隊、

>>803
真に高速化を求められる内側のループでstd::vector<int> xとかしないから
>>796はひとつながりの省略のないコードとして読んだら判断を誤りうる
2021/02/21(日) 07:51:19.71ID:F92hI73d
じゃなかったorz
 Foo::Foo(const Foo& src) { (srcを変更して新しいインスタンスを初期化) }
はconst_cast<Foo>的な危険手段でないとやれないが
 Foo::Foo(Foo& src) { (srcを変更して新しいインスタンスを初期化) }
とするとなんかコンパイラが警告を出すから
 Foo::Foo(Foo&& src) { (srcを変更して新しいインスタンスを初期化) }
にせざるおえないという、
2021/02/21(日) 13:21:42.30ID:Dqlg3tSu
関数と関数オブジェクトってどう使い分けるの?
2021/02/21(日) 13:30:17.46ID:YxY+Ievf
こういう馬鹿にはちゃんとベンチマークとれって言ってやるのが正しい行い。
2021/02/21(日) 14:32:16.15ID:HYHVDYIS
>>805
そんなこと聞いてるんじゃなくて
提示されたコード片じゃどう考えても動かないから何したいか分からんのよ

https://wandbox.org/permalink/ancQey3IkQKyWsu1

こっから始めてどこをどうしたいか教えてくれ
810デフォルトの名無しさん
垢版 |
2021/02/21(日) 14:47:26.80ID:9WgNecVw
404 Not Found
2021/02/21(日) 15:33:36.83ID:HYHVDYIS
すまん
https://wandbox.org/permlink/ancQey3IkQKyWsu1
812デフォルトの名無しさん
垢版 |
2021/02/21(日) 16:21:41.69ID:u2qGdVDT
過疎ってるし、初心者どころかJavaの質問でもOKでは?
2021/02/21(日) 19:01:13.83ID:3Ebck9FU
>>807
この質問に対して回答をつける用意がありますが、しばしお待ちを
2021/02/21(日) 19:27:36.57ID:3Ebck9FU
>>807,813
昔のコードを今読んでみたんですが、実のところ関数オブジェクトにする必要性があったかどうか、今の価値観のもとでは首をかしげています
数値計算のプログラムって、無自覚にバンバン書いてると例えばルンゲ食ったをやっているとこと他とかが混ざり合って収拾がつかなくなる、と思って関数オブジェクトにアイソレートした記憶があって、それを思い出して読んでみたんですけれども、今読んでみても、なんだか、ねえ‥‥
https://mevius.5ch.net/test/read.cgi/tech/1434079972/72
2021/02/21(日) 20:07:12.76ID:F92hI73d
>>809
Fooはこんなやつ、
https://ideone.com/mPPH8I

IFooは、C++ではよく考えたらIFooのオブジェクトを直接生成できないので(>>802の仰せの通り
std::shared_ptr<IFoo>とかで生成することを考えたのだがエラーになるorz
(上のリンク先のコードでコメントアウトしてあるgenerate_IFoo()
思いのほか闇が深かった\(^o^)/

std::shared_ptr<IFoo>が生成できた暁には、
std::shared_ptr<IFoo> pがリソースの所有権を握ったFooを保持しているとき、
std::shared_ptr<IFoo> qというのがいるとして、
 *q = *p
で所有権を*pから*qに渡したり、
 return *p
で呼び出し元が所有権を有するFooを受け取れるようにしたいワケ
2021/02/21(日) 20:09:12.28ID:F92hI73d
ちなみにWandboxでソースコードをフォークする方法は
初心者なので
わかり
ません
2021/02/21(日) 20:14:47.49ID:LxNhpnKU
generate_Foo()がコケてるのはnewのところでFooのコピコンがないだけだろ
コピコン書くか、ムーコン使いたいならnew Foo(std::move(foo3))にすればいいだけ

後半も意味不明
*q = *pってそれスライシングだぞ
2021/02/21(日) 20:23:47.49ID:F92hI73d
>>817
普通の(ムーブでない)コピコンは書けないなぜなら>>806の理由により

>*q = *pってそれスライシングだぞ
どゆこと?
Foo foo1とFoo foo2だと
foo1 = foo2
とできるのに、
2021/02/21(日) 20:26:48.03ID:F92hI73d
ちょっと補足すると、IFooには現状代入手段が無いから、
*q = *pはそもそもコンパイルが通ることはなく、目的とする機能を形而上的に表す仮想コード
のつもり
2021/02/21(日) 21:03:58.63ID:+My/Unlg
>>814
処理を意味でまとめるようなことなら積極的にやるべきだと思いますが、それは関数オブジェクトじゃなくて関数でもできますよね?
2021/02/21(日) 21:05:03.53ID:HYHVDYIS
>>815
コピー代入演算子とムーブコンストラクタだけ定義するとか意味分からんし
インターフェースによる隠蔽より先にそっち解決しなさい
何がしたいのか自分で本当にわかってる?
2021/02/21(日) 21:07:32.53ID:3Ebck9FU
>>820
まあ、そのとおりであり、そうなんですよね…
>>814 は関数オブジェクトである必然性はありません、関数オブジェクトを積極的に使う例としては STL にご登場願うしかないのかもしれませんね
2021/02/21(日) 22:29:56.45ID:LxNhpnKU
>>818
shared_ptrは関係ないから普通のポインタで話するぞ(同じ事だ)
IFoo* p = new Foo();
IFoo* q = new Foo();
というのがあったとして*q = *p;ってのは何だと思う?
pとqはIFoo*型だ
だからもちろん*pと*qというのはIFoo型だ
すなわち*q = *p;というのはIFoo::operator=(const Foo&)の呼び出しだ
operator=()はvirtualにできないから、pとqが本当はFoo型オブジェクトを指してることなんか知りもしないし考慮もしない
よってIFoo部分の代入だけが行われて、要はqのIFoo部分だけが首チョンパされてpのIFoo部分が代入される
これをスライシングという
2021/02/21(日) 23:00:12.09ID:jd0qgVVy
>>822
関数オブジェクトに「関数」とついているのは関数と同じ記法で呼び出せるということに意味があって、インターフェイスの問題。
状態を持った関数 (関数オブジェクト) も状態を持たない関数 (関数ポインタ) も統一的に扱えたらうれしいねって話なので、
状態を持たず、高階関数に渡すこともない場合は関数オブジェクトにする意味はないな。
(普通の関数も static 変数への参照を持ってたりする場合もあるので必ずしも状態を持たないわけではないけど。)
2021/02/21(日) 23:42:46.53ID:3Ebck9FU
>>824,820,(>>813,814,822)
結局、どーでもいい一発芸で、ああ動くね‥‥、と思ったまま放置してましたね<関数オブジェクト
https://mevius.5ch.net/test/read.cgi/tech/1434079972/21
https://ideone.com/9KIuSD
あとはラムダ式の理解のための存在という認識、か
2021/02/22(月) 00:10:55.10ID:oiAqsUn6
「ラムダ式が関数オブジェクト (型の定義と生成) の構文糖」というのは
既存のプログラムとの整合性を壊さない上手いアイデアだと思うけど、
しばらくしたら「関数オブジェクトはラムダ式の実体」という説明のほうが
通りがよくなったりするかもしれないね。
827デフォルトの名無しさん
垢版 |
2021/02/22(月) 04:39:33.19ID:7qATnC1I
関数オブジェクトで状態を渡せるのは結構なんだが、コピーコンストラクタ渡しなので、
手の込んだ状態管理だった場合は結局、C言語と同じくユーザー定義変数を介して状態を読み書きすることになる。
2021/02/22(月) 08:23:10.03ID:Dz0hZ3aS
>>827
shared_ptr使えば、大抵の場合は問題ないんじゃない?
2021/02/22(月) 09:54:32.23ID:Y0MZ31oO
>>807,820ですけどQZで始まる人あまりにもレベル低いというか回答者として不適格だと思うのでNGします
2021/02/22(月) 10:22:59.45ID:1euWwsnd
>>829
答えてもらってる立場で偉そうに。常識ないの?
831デフォルトの名無しさん
垢版 |
2021/02/22(月) 11:11:29.17ID:M+ptXBNl
いやでも実際・・・QZはね・・・
50過ぎのおっさんが無理して絡みにいってるけど空回りしてる感じなんだよね
ほんと残念だけども
2021/02/22(月) 11:36:36.23ID:7qATnC1I
関数オブジェクトに対するラムダ式の優位性は、ローカル変数を比較的安全かつ手軽に参照渡しできることだろう。
833デフォルトの名無しさん
垢版 |
2021/02/22(月) 12:08:03.12ID:5Ezd+ZoO
あわしろ氏がQzはアカン言うてたけど、ターゲット変えたのかな?

急にその手の書き込みが増えてあからさますぎる。
2021/02/22(月) 16:15:54.50ID:rpJl6SNk
>>831
QZの回答は糞だとして、回答者に対して>>829みたいな態度をとることがどう正当化されるわけ?
835デフォルトの名無しさん
垢版 |
2021/02/22(月) 17:04:18.35ID:M+ptXBNl
回答者には無条件で感謝しないといかんのか?
気持ち悪いな
2021/02/22(月) 17:39:33.90ID:rpJl6SNk
>>835
感謝しろなんて言ってないぞアホ
2021/02/22(月) 19:14:24.66ID:SaDkzfTf
>>835
回答を得るのに適切な行動を取りゃいいよ。
変にヘイトを吐くとつっかかる奴がいるから回答から遠くなる。
>>829は感情を制御する訓練をしないとな。
838デフォルトの名無しさん
垢版 |
2021/02/22(月) 19:28:11.36ID:M+ptXBNl
たしかに
勝手にNGしとけば十分で煽るように宣言するは意味はまったくないね
擁護した俺が悪かったごめん
2021/02/22(月) 19:57:55.16ID:R3R68rti
>>831
認めましょう

>>838
私の意見に一番近いですね
私は、馬鹿な私の意見を見たくない人も多いと想定しており、馬鹿な私が発言するときは馬鹿の印としてトリップをつけるようにしています、それだけは確約しますので、後は好きなように NG に入れていただいて結構ですよ
私はそういう人に干渉するつもりはありません
840デフォルトの名無しさん
垢版 |
2021/02/22(月) 20:02:59.96ID:5Ezd+ZoO
そういう書き込みを見ると、あわしろ氏よりQzのほうが大人に見えるなあ。
まあでも、あわしろ氏には技術評論社がついてるからね。
謝っといたほうが良いんじゃないの?
2021/02/22(月) 20:52:21.84ID:jfkpe4Eh
>>834
俺も以前質問したら、明らかに見当違いなマウント取りたいだけの回答が来て、言い返した時
君みたいな事言われたよ
回答くれるのは有難いが・・・ねぇ。
まぁそういうのはスルーしろ、ってんならまだわかるけど

ちなまともな回答くれた人には礼言ってるからね
2021/02/22(月) 21:08:29.88ID:51epSMYu
知らんがな。キミの意見だけ聞いてその時どっちに問題があったかどうやって判断すればいいんだよ
2021/02/22(月) 21:18:11.70ID:jfkpe4Eh
そういう話じゃねーよ
2021/02/23(火) 00:38:10.30ID:6MWC7t1x
あるクラスのメソッドを他所で借りたいというか使いたいときって移譲(インスタンス化)するかコピペするしかないの?
2021/02/23(火) 00:41:49.01ID:Z5ZYenTn
>>844
メソッドをクラスから分離してテンプレート関数にすれば、クラスの継承関係がなくても使えるので便利。
2021/02/23(火) 01:01:30.38ID:48JMuLBY
>>844
メンバアクセスしていないならstatic関数にしてクラス名::メソッド名()で呼べる
ただメンバアクセスしていない時点でその関数は本当にそのクラスに属すべきなのか再考したほうがいいけど

あと継承する手もあるけど「借りたいから」程度の理由で場当たり的にやると確実に泥沼化する
2021/02/23(火) 04:11:59.35ID:kBU50DXM
>>846
> ただメンバアクセスしていない時点でその関数は本当にそのクラスに属すべきなのか再考したほうがいいけど
極論、引数をとって返り値を返す関数だけで全てのことが実現できますよね?
そう思ったらクラスのメソッドにするよりも何でもクラス外の関数にする方がお得というか楽な気がしてしまいます
2021/02/23(火) 07:21:43.52ID:7kgSemXY
そのとおりで極力フリー関数にするべき
(非静的)メンバ関数というのはデータメンバーの一貫性を保つためだけに使うもんだよ
2021/02/23(火) 07:27:00.90ID:ex5XjLGm
>>847
"メンバアクセスしてない"てのが重要だと思うよ
実際、非staticではなくstaticなメンバ関数にしたい場面てあんまり無い(外の関数と大して変わらんから)

>>848みたいなのはオブジェクト指向も理解出来てないド素人が玄人ぶってよく言うんだよなぁ・・一応釘だけ刺しとく
2021/02/23(火) 08:19:26.69ID:kBU50DXM
なんかOOPの行き着く先みたいな話してるな

俺も関数が引数と返り値としてメッセージを渡し合って協働していく方が洗練されてると思う
必然、その方が副作用も少ない
851デフォルトの名無しさん
垢版 |
2021/02/23(火) 08:29:56.96ID:Z5ZYenTn
staticなメンバ関数には、名前衝突しにくい、msvcのインテリセンスのような入力支援を得やすい、という恩恵はある。
2021/02/23(火) 08:30:00.72ID:u3MMsI1X
メッセージ・・?
何の言語の話してんだ
853デフォルトの名無しさん
垢版 |
2021/02/23(火) 09:47:50.72ID:DwnxTU4/
オブジェクト指向の概念の話をするときにメッセージって言葉使いませんか?
C++ならメッセージ=メンバ関数
Javaならメッセージ=メソッド
言語によって呼び方が違うから概念的な話のときはメッセージといったほうが通りがよい
2021/02/23(火) 10:07:32.09ID:B3ih21Pc
>>849
「オブジェクト指向も理解出来てないド素人が玄人ぶってよく言う」
の意味がさっぱりわからん
>>848の表現に一切ケチつけられる要素ないと思うけど
2021/02/23(火) 10:15:54.38ID:gTQJYaBt
> データメンバーの一貫性を保つためだけに使う

いったい何が言いたいんだろう
他人に分かり易く言えないのは自分が解ってないからというケースがある
2021/02/23(火) 10:18:06.26ID:B3ih21Pc
> データメンバーの一貫性を保つためだけに使う

この表現で普通に分かるけど
分からん人もいるのね了解
2021/02/23(火) 10:20:33.46ID:NIjAanwq
メッセージが何のことかわからないのはワロス
2021/02/23(火) 10:21:51.05ID:gTQJYaBt
>>856
でか口は具体的に説明できてからぬかせ
このハッタリ野郎
2021/02/23(火) 10:22:34.65ID:7kgSemXY
データメンバに対して想定した扱い方だけをさせるようにして予期しない状態の発生を防ぐため、って言えばお気に召したかしら
普通はそれを短く「一貫性を保つ」って言うのだけど
2021/02/23(火) 10:31:05.01ID:u3MMsI1X
>>853
使わない、というか使うな誤解を招くから
SmalltalkとかObjective-Cならわかるけど
C++やJavaのそれはメッセージングではないと考えるのが普通(そう見做せないわけではないが
2021/02/23(火) 10:33:09.34ID:B3ih21Pc
>>858
2021/02/23(火) 10:34:51.99ID:gTQJYaBt
>>859
1行目は納得
2行目の主観論には付き合ってらんね
2021/02/23(火) 10:37:31.33ID:B3ih21Pc
>>860さんに同意で
C++やJava界隈だと明確に避けてると見てる
メッセージってのは
2021/02/23(火) 10:49:29.89ID:7kgSemXY
ごめんねおじいちゃん知らない表現を使われただけでそんなに拗ねるなんて思わなかったんだ
2021/02/23(火) 11:07:54.70ID:u3MMsI1X
いや、悪いけど>>859を以って
>データメンバーの一貫性を保つためだけに使うもんだよ
などと言い切れるのは経験不足と見られても仕方ないと思うよ学生ちゃん
2021/02/23(火) 11:13:43.78ID:j4L8+y6t
おじいちゃんとか学生ちゃんとか、おまえらマウンティングしながらじゃないと会話できないのかw
2021/02/23(火) 11:54:07.11ID:oVEFpcof
このスレは特にそういうの多いよね
2021/02/23(火) 12:46:58.74ID:HLi0yp23
昔からこのスレは特に酷いよね
なぜマウントの必要があるのかは少しだけ興味深いけど
869デフォルトの名無しさん
垢版 |
2021/02/23(火) 13:21:23.20ID:+0nZ2NLW
Linuxを使う以上、C++を嫌わないとダメだろ。
2021/02/23(火) 13:45:38.11ID:iu17pC6m
>>857,864
いや、メッセージはわかってるけどなんでC++スレで?
って話だろ
>>860の言うようにC++界隈ではあまり使わんし
単にイキってるだけにしか見えんw
2021/02/23(火) 13:46:51.42ID:iu17pC6m
>>865
どういう理由で経験不足と判断したか言ってみ
2021/02/23(火) 13:47:30.93ID:alqL+AST
オブジェクト指向に関しては、今の人は、昔はメモリが高価だったとでも思っておけば良いよ。
2021/02/23(火) 13:53:26.39ID:UMWafFvJ
>>823
レスdクス大儀であった
自己解決しますた、
https://ideone.com/k76kj5
2021/02/23(火) 13:59:21.85ID:UMWafFvJ
一貫性というのはオブジェクト内部の整合性のこ
とを言いたい
のでは…
※ 個人の感想です
2021/02/23(火) 14:03:58.66ID:UMWafFvJ
C++のメソッドの呼び出しをメッセージと言い出すとウィンドウメッセージと紛らわしい(小並感
ていうかC++においてメッセージと言えるのはメソッドの「呼び出し」であってメソッドそのものではない
(例えば)メッセージ自体は継承メカニズムとは独立の概念なのだから
※ 個人の感想です
2021/02/23(火) 14:10:51.07ID:HLi0yp23
Smalltalkはほぼ知らんけど
メッセージ式ってのは
セレクタ+引数のことだったはず
いやこれどうでもいいか
2021/02/23(火) 14:18:47.72ID:UMWafFvJ
ていうか今にして思えばstd::shared_ptr<IFoo>がIFooのインスタンスに対する所有権を適切に移譲したり管理するので
std::shared_ptr<T>に持たせることにした時点でIFoo自体がリソースに対する所有権を管理する必要はなさげorz
878デフォルトの名無しさん
垢版 |
2021/02/23(火) 14:29:34.84ID:+0nZ2NLW
smalltalkなんて誰も使わないのだから、アジソンウェスレイのオブジェクト指向プログラミング入門にそう書かれていたからという理解で良いのでは?

若者もいるので説明しておくと、書店で書籍を買う時代があって、書店に並ばなければ書籍の存在自体わからなかったのですよ。
この本は何処の書店にも並んでいたので、スレの高齢者全員が読んでいます。
この本しかなかったんですよ。
良い本だとは思いませんが、30年たった今でも古書に値が付くはずです。

全員が読んでるので、全員が知っているかのように錯覚する人もいるって事です。
2021/02/23(火) 16:09:16.56ID:CS53pw6I
C++のオブジェクト指向でメッセージングのワード出してくるのは
継承を説明するサンプルコードで動物の階層もちだしてくるのと同じ功罪がある
理解のとっかかりにはいいが、リアルな実装の段階ではそういうポエムみたいな話は忘れたほうがいい
2021/02/23(火) 16:11:25.59ID:feF5fzNV
メッセージ(笑)とか頭おかしい奴が言いそう
881デフォルトの名無しさん
垢版 |
2021/02/23(火) 16:16:12.25ID:+0nZ2NLW
>>879
功もあると御自分で書かれているのでは?
2021/02/23(火) 19:10:57.35ID:48JMuLBY
>>873
これで本当にいいのか?
コピー代入演算子でムーブさせるのが本当にあなたのやりたかったこと?
std::auto_ptrはこの問題があったからdeprecatedになったんだけど
2021/02/23(火) 21:53:45.68ID:tPF8d5Rx
>>878
>書店で書籍を買う時代があって、書店に並ばなければ書籍の存在自体わからなかったのですよ。

私の若い頃を思い出します。
当時、神戸の一番大きな本屋さんでは、どうしたわけだかコンピューター関連書籍の部分だけは黒山の人だかりで、いつも二十人くらいがみんな立ち読みしまくっていて、そういう人ごみを押しのけて本を探さなければならなかったくらいでした
最近右翼になった数学者・藤原正彦氏によれば、もっと古い時代には町の小さな本屋さんであっても普通にそんな状態だった、ときいています、とても信じられませんが‥‥

そういうわけで、アマゾン・ウェルカム!
2021/02/23(火) 21:57:00.55ID:tPF8d5Rx
>>875
私は例のペゾルド教本を何とか C++ に適応させたくて、ペゾルド本の WM 処理・巨大 switch 文を C++ に適合させようと未だに四苦八苦していますが、やっぱり MFC に移っちゃったほうが楽チンなんでしょうか?
2021/02/23(火) 22:05:53.75ID:u3MMsI1X
>>871
あまりに一面的な見方やろ
>>848はカプセル化も多態も、上で話してた関数オブジェクトさえ否定する暴論
よほど拒否反応があるんだろうなー、と
2021/02/23(火) 22:07:42.70ID:HLi0yp23
否定したように見えちゃってるんだな
いろんな人がおるな
2021/02/23(火) 22:15:00.14ID:iu17pC6m
>>885
まあ
> (非静的)メンバ関数というのはデータメンバーの一貫性を保つため「だけ」に使うもんだよ
の「だけ」に引っかかってると思うんだけどそっちの方がどちらかと言うと暴論に見えるよ
2021/02/23(火) 22:20:52.65ID:u3MMsI1X
まぁ関数オブジェクトはある意味当てはまってるかもしれんと思うが
>>887
そっちも根拠書いてね
2021/02/23(火) 22:28:42.45ID:iu17pC6m
>>888
>>886が言うように「否定」はしてないと思うよ
ってことね
890デフォルトの名無しさん
垢版 |
2021/02/23(火) 22:44:54.86ID:H7IAWcv9
[selector message]

Objective-Cが良かったな。
2021/02/24(水) 06:48:21.60ID:Vo6CI9FQ
>>884
やってみるとわかるけど、MFCと同じものを自分で作ってる感じになるね
ARM C++時代に作るとああなるんだけど、
今どきのC++20で作るとどうなるのかは興味深い
2021/02/24(水) 15:54:28.46ID:EZ8EgbLC
現代的な Windows のフレームワークとしては C++/WinRT に力が入ってるみたいなんで、
今からはこれを使った方がよさげ
2021/02/24(水) 17:47:00.67ID:T43vsud+
P/Invokeともこれでおさらば、
と言いたいところだがネイティブC++をwrapするC++/WinRT自体はCLR上の言語なんじゃなかったっけ…
違ったっけ…
2021/02/24(水) 20:59:30.49ID:T43vsud+
C++/CXと混同すた、orz
2021/02/25(木) 00:40:25.02ID:hxonNlh3
C++/CLIだよ(小声
2021/02/25(木) 12:27:48.18ID:Kp+Bp4Dl
int (int)型のコールバック関数ポインタにて、一応呼ばれるのでnullはマズイけど不要なので空にしたいという場合に
int () { return 0; }という引数が一致しない空関数へのポインタを渡すとまずい事になるんでしょうか?
低レベルの知識がないのでよく分からないんですが、スタックの巻き戻しとかでズレが生じるとかありそうな気がしています
2021/02/25(木) 14:45:58.57ID:ziL/azOs
>>896
使われている ABI による。
x64 環境なら Unix (系の多くの OS) でも Windows でも引数は整数4個分までは
レジスタで渡されるんで、スタックの整合性は壊れないはず。
2021/02/25(木) 15:12:23.79ID:bxBNuN1v
>>896
スタックは呼ぶ側で処理するからズレないよ
でないと可変長引数とか実現できないし

>>897
そんなもんは処理系やオプション次第
899デフォルトの名無しさん
垢版 |
2021/02/25(木) 15:36:41.54ID:SLTnVXDN
静的解析ツールやコード分析で警告が出るだろうから直したほうがいいと思うけどね
2021/02/25(木) 15:44:39.43ID:ziL/azOs
x64 の一般的な ABI ではもう様々な呼出し規約を使い分けないようになってる。
(cdecl と stdcall が混在していた Windows が例外的で
他は 32bit 時代からかなり統一されていたみたいだけど。)

まあそれはともかくとして、
実際には不要でも適当な値が渡るようにして型を併せるほうが良いとは思う。
不整合を残しておくと強い最適化をかけたときにわけのわからないことになりがち。
901デフォルトの名無しさん
垢版 |
2021/02/25(木) 16:08:57.78ID:0Aa2beUH
はちみつは見所がある弟子にしてやっても良いと、あわしろ氏が褒めてた。
2021/02/25(木) 16:57:46.00ID:2x/2jVQO
>>896
古いCから新しいC++まで含め、素朴な観点では原則的には大丈夫では有るが、
あなたが言っているように例外処理が入ってくるとどうなるかは不明。
C/C++では型を厳しくしているのは、そういうことを避けるため。
あなたのやろうとしていることは、関数アドレスをキャストしなくては
関数ポインタへの代入できない。
このようにキャストすることによって、アーキテクチャ依存となり、不具合が起きる
確率が0でなくなる。
2021/02/25(木) 17:00:32.01ID:2x/2jVQO
>>902
[補足]
例外処理はとても複雑なことが行なわれることがある。
関数ポインタに代入する際に関数シグネチャが異なるものをキャストして入れると
どうなるかは処理系依存となる。
関数アドレスを同じビット数の整数型の変数との間で相互にキャストするのは構わない。
関数なのに、異なるシグネチャのものを代入しあうのは問題。
2021/02/25(木) 19:04:36.48ID:FipxGJhu
>>891
そうですか‥‥
いまどき MFC の教科書が存在するかどうかは疑問ですが、やっぱり MFC に戻るしかないのですか!
でも、あのドキュメント=ビュー構造はいまだによく理解できないですね‥‥
2021/02/25(木) 19:52:59.02ID:0YuzuhSG
c/c++で型が厳しい?何言ってんだろ
2021/02/25(木) 22:34:17.62ID:GHceiqHX
C++は一応明示的に破ろうとしなければ結構ちゃんとチェックしてくれる
C? 知らんな
2021/02/25(木) 23:10:04.64ID:NZmV0r2o
>>902-903
「引数が一致しない」という素朴な観点でアウトだろうし例外処理関係ないだろ。
2021/02/26(金) 02:06:22.71ID:uELWbBar
>>907
でも、引数を関数内で参照して無い場合、素朴な呼び出し規約的には問題ない。
例外処理の unwinding は仕様が難しいので良くわからないと言うこと。
実際は大丈夫かも知れない。
2021/02/26(金) 07:24:52.91ID:gCkWSKrb
int (int) { return 0; }で埋めて何が嫌なのかが分からないからな
特別な事情があるなら動かすハードとかの仕様調べろ
そんなのないなら素直に安全に書いとけ、でいいじゃん
2021/02/26(金) 07:52:48.02ID:M2eccXrm
>>904
一つのデータを複数のウインドウで見るって考え方だよ
テキストエディタでもスプリットバーやマルチビューは普通に使うだろ
2021/02/26(金) 07:57:36.04ID:M2eccXrm
>>909と同意見だ
[](int){return 0;}では何がダメなのか
説明がないとこれ以上何とも言い様がない
2021/02/26(金) 12:52:04.91ID:X0njcRoR
cは互換型の概念がガバガバだからなあ…
typedefは当然互換だけど、structは中身のpodが同じでも(typedefしなければ!)タグ名で弾けるので、一々structに包めば論理ミスを防ぐこともできなくもない
913デフォルトの名無しさん
垢版 |
2021/03/01(月) 02:34:24.68ID:sakgt9rY
規格書を読んでみんなC++覚えてたの?
入門用のドキュメント読んだら規格書読むべきですか?
2021/03/01(月) 06:09:14.80ID:N/bll+Sf
趣味のC++オタクでいいんならそれでいいと思うよ
C++を実用したいならそういうのはやめとけ、というかまず手を動かせ
その上で疑問が出てきたら調べるのはアリ
2021/03/01(月) 09:15:36.61ID:770X86Bb
問題に遭遇したときに疑問として感じ取れる人ならいいんだが、
謎理論を自分の中に構築して邁進してしまうやつも
少なからずいるので安易に手を動かせとは言いにくい。
916デフォルトの名無しさん
垢版 |
2021/03/01(月) 09:31:54.75ID:Qi7MAN5S
各コンパイラに固有の実装依存があるから、結局は試すしかない。
PGが規格と違った動きをしているコンパイラをなじったところで、勝利するのはPGではなくコンパイラ。
2021/03/01(月) 09:41:00.95ID:770X86Bb
商用コンパイラがその商用コンパイラがサポートしているはずの規格と違う挙動だったらそれは文句言ってもいいだろ。
2021/03/01(月) 09:44:14.28ID:kUoELfRz
文句を言うのはいいけど、規格書を盾に納期は延びないのよ。
919デフォルトの名無しさん
垢版 |
2021/03/01(月) 09:46:40.02ID:Qi7MAN5S
>>918
それな
2021/03/01(月) 09:52:30.22ID:nOTghizW
まあその通りなんだけど、誰かが言ってるからコンパイラ改良されるわけで
921デフォルトの名無しさん
垢版 |
2021/03/01(月) 09:52:48.41ID:Qi7MAN5S
PGは、コンパイラが規格準拠してくれる日のために #if #endif で区切ってすぐに切り替えできるようにしておくことしかできない。
dirent周りのカオスを知っているなら、規格準拠をうるさく言う虚しさを理解しているはず。
2021/03/01(月) 10:34:18.93ID:770X86Bb
商用コンパイラを商売で使うならサポート契約とセットじゃねーの?
使い倒さないと契約料丸損やないけ。
2021/03/01(月) 10:42:44.99ID:N/bll+Sf
>>922
いつも思うけど、お前仕事で書いたことねーのに何でそんな偉そうなん?

ちな俺はVCのバグ報告(テンプレート周りとか気付かれにくい部分)何度かしてるが、直るのは早くても半年後だよ
仕事でなくともとりあえず何とか回避するしか無いし、報告するにも再現性あるコード提供しないと迷惑かける
皆お前みたいに暇じゃねーんだよ
2021/03/01(月) 10:52:02.51ID:f1Pg/hcl
>>923
こういうのって結構な割合で最適化の不具合だったりするよね
特に組み込み系だとしょっちゅうそういうのあるから、該当箇所だけ最適化レベル下げて通したりしてるわ
もちろん不具合の報告もしてるけど修正まで時間かかるからね
2021/03/01(月) 11:11:13.26ID:770X86Bb
すぐにとはいかない現実があるのはわかるが、サポート契約の内容を本当に把握して言ってる?

商品の瑕疵に対応するのはあたりまえだからサポート契約ってのはそれ以上のものだよ。
契約内容によるけど、コンパイラのバグである証明とか全部してやる必要はかならずしもなかったりするぞ。

VC のバグ対応がよくないならそれは VC のサポートチームが良くないってだけだ。
2021/03/01(月) 11:12:35.72ID:Qi7MAN5S
#if #endif マクロがない言語は無駄にネストするのが欠点だと思う。
2021/03/01(月) 11:38:15.03ID:770X86Bb
#if での切り分けだってネストはありうるけど、
それが見た目に分かりづらかったりするし、
いいことばかりじゃないよ。
2021/03/01(月) 14:12:42.88ID:CPl5J/qU
一昔前なら effective c++ くらいは読もうってとこだったが、
今はどうだろうな。efective modern c++ でも足りない感じがする。
てかc++やるなら自分であれくらいのポイント抑えるくらいの準備が必要かもしれんという地獄。
2021/03/01(月) 14:23:24.82ID:Qi7MAN5S
スマートポインタが標準規格に採用されたC++11とそれ以前では、作法が随分違ってくる気がするよ。
2021/03/01(月) 17:34:12.59ID:oQ7wqd0O
>>917
「文句」みたいな感情的なものじゃなく
ドライにバグレポだ
再現コードだけじゃなく回避方法もつけて
2021/03/01(月) 20:24:36.67ID:YhH9VVk1
>>923
> いつも思うけど、お前仕事で書いたことねーのに何でそんな偉そうなん?

やめたれw
2021/03/01(月) 21:14:48.91ID:Dkl+jirL
>>925
> 契約内容によるけど、コンパイラのバグである証明とか全部してやる必要はかならずしもなかったりするぞ。
無いかも知れんが、「なんかおかしいんです~」でバグの特定がめっちゃ困難なことはプログラマーは身を持って知ってるから
そもそもバグの解決が遠のいたら苦しむのは自分だし
2021/03/01(月) 21:56:02.87ID:N/bll+Sf
>>931
いや、純粋な言語仕様の話なら別に偉そうでもいいのよ正しい事書いてくれてるなら
2021/03/01(月) 23:56:40.27ID:770X86Bb
>>932
雑な報告でいいというわけではないが、
サポート契約の利用率が非常に低い (値段は高いのに!) というのはよく聞く話なんで、
報告して対応待ちというだけじゃなくてもっとプロジェクトに巻き込んでいいはずなのになという感じ。

C++ の話じゃないけど、 LispWorks (Common Lisp の処理系) のバグ報告をしたら数日中に暫定パッチが
出てきたりとかワークアラウンドの提案とかもしてくれるという事例を利用者のブログで
見たことがあって商用処理系ってすげーなーと思ってたんだが、
そういう対応のほうが例外的に良すぎるだけなんかね?
2021/03/02(火) 00:07:05.02ID:n7F7EI9c
>>934
そういう対応はマイナーメーカーの方がいいことが多いよ
MSの対応が悪いとは言わないけどユーザーがアホほど多いから処理系のバグにぶち当たる可能性も低いし
2021/03/02(火) 00:37:21.45ID:wbC9damv
スケジュールきついだけかもよ
バグがあるのわかってたけど数日かかりそうだから放置
バグ報告が出たから優先度上げて修正
2021/03/02(火) 02:03:18.16ID:+qoPTldB
そもそもユーザー数がアホみたいに多くてあらゆる層で利用されてるようなコンパイラだと
バグ報告あがってきてもまずそれほんとにバグなの??
ていうかまたコイツのリポートか!!!もしかしてただのいやがらせとかじゃないの??とか
色々まず疑ってかからないケースも半端なく多いだろうしな
938デフォルトの名無しさん
垢版 |
2021/03/02(火) 05:18:47.46ID:+XzLrHKh
>>923
あわしろ氏は、はちみつのことを褒めてたけどな。
見どころがあるから弟子にしてやっても良いと。
月一万で弟子にしてやるぞ。
2021/03/02(火) 05:46:06.48ID:eqvY2Z+d
>>934
サポート契約はどんなに使い倒しても契約料が戻ってくるわけじゃない
自分が頑張ってインカムを増やすのが「元を取る」ということだ
2021/03/02(火) 06:15:09.36ID:1/ifTUd4
>>934
VSのサブスク(旧MSDN)入ってる企業なら優先的に対応してくれるかもしれんけどね
ただVS2019の更新は数日とかのスパンでは来てないやろ(しかもベータを経てからじゃなかったか?
Xcodeのclangなんかはもっと遅い
そのLispWorksとかいうのは例外的だろうね

で、みんな回避方法くらいは自分で見つけるし直るまでの間何もしないわけにはいかんからな
2021/03/02(火) 06:43:01.65ID:auUulvn4
コンパイラを作っている人は他の誰よりも標準規格に詳しい。
コンパイラが規格準拠できないのはなんらかの事情がある。釈迦に説法はカッコ悪い。
2021/03/02(火) 11:52:24.56ID:K6P+Ktrz
cl書くけどlispworksは資料もすごいのでお世話になる、中の人がlisp界隈で愛称で呼ばれるくらい精力的なんで、ただそうなだけだと思う
まあフリーな処理系使うけどな
しかしニッチ過ぎるlispのどこで儲けてるのやら全く謎
2021/03/02(火) 22:42:51.15ID:NRNfCe84
言語としての機能はともかく、lispはマスコットがきもすぎ
2021/03/02(火) 22:45:21.36ID:NT1aj9pH
言語を作った人の本を読むのが一番良い
2021/03/02(火) 22:50:53.20ID:NT1aj9pH
ていうか言語を作った人の本に載っているサンプルコードが
言語の思想を一番正確に表現しているはず……
2021/03/03(水) 04:56:27.42ID:W4jJ9FhP
禿の思想はC++03までだろ
頑なにラムダ式とrange-based-for-statementを拒み続けたところまで
4th editionでasyncを持ち上げてたけどその後の展開がアレだし
2021/03/03(水) 06:51:09.01ID:gVMBPcTA
>>943
googleさんのImage for ...サジェストに
caution: made with alien technologyって標語の例の生物のロゴが出てきやがるのは風評被害
rplacd、dpb、fmakunboundとかほぼほぼ英語だし明らかにエイリアン語ではない
cも大概だしな
2021/03/03(水) 14:59:21.41ID:ymUPAFSA
>>943
C++ も似たようなもんだろ
https://www.pixiv.net/artworks/31803602
2021/03/03(水) 16:32:38.43ID:wyPUKIrf
うわ下品な絵
2021/03/03(水) 19:08:40.13ID:7D0nPsrG
>>948
これは・・意外と嫌いではない・・w
951デフォルトの名無しさん
垢版 |
2021/03/03(水) 19:15:48.54ID:zRjA/+hm
オライリー表紙絵みたいな動物の絵じゃないと、しっくりこない。
952デフォルトの名無しさん
垢版 |
2021/03/03(水) 22:54:00.65ID:on2XNxxF
オイリー禿山。
953デフォルトの名無しさん
垢版 |
2021/03/04(木) 11:11:37.69ID:J6mhpq5t
禿と禿(かむろ)の違いが判らない
954デフォルトの名無しさん
垢版 |
2021/03/04(木) 13:03:17.03ID:K63vSywh
カムロは半グレ
2021/03/04(木) 13:36:37.45ID:Ep7EXP13
c++は仕事で書いてない人ほど好きな言語
2021/03/04(木) 14:22:00.04ID:qn7RQ+4J
と、仕事で書いてないやつが言う
2021/03/04(木) 15:32:17.13ID:9GqbczPP
二人以上でやるとOOPの思想的違いがぶつかって最悪破綻するんだよな
2021/03/04(木) 15:33:34.57ID:9GqbczPP
で、仕事でやるときは、最下層にレベル合わせないとモノが出来上がらないしね
2021/03/04(木) 17:35:44.00ID:Ep7EXP13
自分一人ならさぞかしすごいソフトウェアが書けると思ってるんですね。すごいですね。
2021/03/04(木) 19:51:50.17ID:cqTSJRKn
>>955
それあると思う
アマチュアにこそ好かれる言語だと思う(;^ω^)
2021/03/04(木) 20:33:50.17ID:Xyn3qjeu
constexpr制限きつすぎ
2021/03/04(木) 20:47:45.23ID:FQXwH3J2
C++11の頃ならともかく今そんなにきついか?
2021/03/05(金) 05:58:33.51ID:BcBZQBoi
C++20、情報過多でしんどい
2021/03/05(金) 06:14:45.51ID:ddot6YlQ
std::variant を使い始めたのですが、例えば variant の中身が4種類あって、そのうちの
2種類とか3種類だけに対し共通なコードを実行したい、ときにはどんな書き方がありますかね?
全部に同じコードを適用するなら std::visit() でいいわけですが。
965デフォルトの名無しさん
垢版 |
2021/03/06(土) 13:33:27.36ID:bGzUu7RI
apply
2021/03/06(土) 20:35:43.51ID:aLQdimbx
>>964
共通処理を別の関数にまとめたうえで、visitする時に各型のオーバーロードでそれを呼び出す
visit時にジェネリックラムダを使って内部でif constexprで分岐
visit時にオーバーロードされた関数オブジェクトを用いて、共通処理が必要な型について呼び出されるところをテンプレートにして、他は型を指定しておく
visit時にオーバーロードされた関数オブジェクトを用いて、コンセプトで分岐
.index()とif文で書き分ける
2021/03/07(日) 23:48:37.36ID:B2szmBNH
>>962
msvcのバージョン古くて。
c++14に対応してない。c++11でやってるイメージ。再帰でどんどんソースが汚れる。
2021/03/10(水) 13:31:16.40ID:b6BdhXEV
int getX() const { return mX; }
みたいな関数があるクラスのメンバ関数内でmXを参照するときに
mX と getX() のどっち使うのが一般的な書き方?
2021/03/10(水) 14:04:43.65ID:8PvVb8hX
>>968
確かにこれはいつも悩むなー
きっとアクセサ使うべきなんだろうけどね
頻繁にアクセスするならローカル変数に代入した方が早くなったりするし、一般的にクラス宣言に書いてるのもはインライン展開されてコスト的には変わらないだろうしね

むしろ他の言語のときにインライン展開なんてされないからめちゃくちゃ悩む
2021/03/10(水) 14:10:23.61ID:mzPrKkeu
プロパティがないからな
2021/03/10(水) 15:16:37.41ID:ZK+TZHvn
なんでもかんでもgetterとかはJAVAから来たのかとか思ってしまう
取得時に演算しないならそもそもgetterなんか作らない方が分かりやすいと思うのだが
972デフォルトの名無しさん
垢版 |
2021/03/10(水) 15:36:26.11ID:pTnyTINd
>>971
C#みたいなのはそれはそれでわかりにくいから、getterも関数がいい。
2021/03/10(水) 15:47:37.68ID:qvIOwUBa
無理にgetter作れってのはアホだなと思うけど、まあgetterくらいならそこまで問題になることもないかなとは思う。
やたらめったらsetter作ってたら死ねとは思うが。
974デフォルトの名無しさん
垢版 |
2021/03/10(水) 15:50:25.97ID:pTnyTINd
const 属性をうまく使えば、getterを減らしても安全にコーディングできる。
975デフォルトの名無しさん
垢版 |
2021/03/10(水) 15:55:29.61ID:SA6nop04
オブジェクト指向に侵されてるとプロパティが欲しくなるだろう。

しかし、本物のC++は知っている。

それは間違いだと。
976デフォルトの名無しさん
垢版 |
2021/03/10(水) 19:38:24.39ID:pTnyTINd
クラス外からは以下のようにconst 属性をつけてアクセスさせれば心持ち安全になる。
const MyClass& getInstance() const { return *this; }
2021/03/10(水) 19:39:09.45ID:pDjVp4Qi
>>968
フックを残すかどうかだな
abortとterminateみたいに
2021/03/10(水) 20:37:43.62ID:wDDQFNF0
JavaBeans方式のプロパティはリフレクションあってこそのものなのにC++で真似してもなー。
979デフォルトの名無しさん
垢版 |
2021/03/10(水) 21:11:42.58ID:98wPPrPT
JavaFXのプロパティは観測可能になってたすごかった
データバインディングとかリアクティブとかプログラムの書き方もずいぶん変わったよね
2021/03/11(木) 01:07:59.93ID:6JW0gImZ
そうだね流石Oracleだね
2021/03/12(金) 00:57:21.49ID:9IOLdfat
https://ideone.com/0FptIo
だれか、剰余の符号関係を教えてくれ。
2021/03/12(金) 01:32:57.35ID:I1KnPozY
たぶんCから変わってないよな?
(a/b) * b + a%b == a
以上に説明できることはないと思うけど
他になにかあるの?
2021/03/12(金) 03:04:36.84ID:ByeOJ4Y7
符号の向きは C++11 から仕様に入った。
(それはでは処理系定義)
C では C99 から。
2021/03/12(金) 08:30:25.58ID:GKbHXc3G
プロパティーは継承できたりインターフェースとして定めたりできるのが強み
だがそれしか強みが無i

しいて言えばリフレクションが使える言語なら、getterとsetterを同一の識別子で紐付いた形で列挙できる
というのわある鴨、(関数型のシグネチャでgetterとsetterを与えたらそうはいかん
2021/03/12(金) 08:36:14.31ID:GKbHXc3G
P=Q・X+R (0≦R<Q)
ので除数が負の%とか定義不能
被除数が負の場合はしらそん
多分Rが非負でなければならないから多分XはPより負の側に振れねばならないのではないか
2021/03/12(金) 14:00:09.40ID:9IOLdfat
未定義っぽいですね。ありがとう。
987デフォルトの名無しさん
垢版 |
2021/03/12(金) 16:14:00.58ID:EbD8nxkK
C/C++に限らず界隈では「負数の剰余をとるべからず」という伝承がある
2021/03/12(金) 20:35:32.66ID:IXuMqCK3
>>985
剰余の定義は、その定義だけではないですね
「最小正剰余」のほかには「絶対的最小剰余」もあります
https://ja.wikisource.org/wiki/%E5%88%9D%E7%AD%89%E6%95%B4%E6%95%B0%E8%AB%96%E8%AC%9B%E7%BE%A9/%E7%AC%AC1%E7%AB%A0/%E6%95%B4%E6%95%B0%E3%81%AE%E6%95%B4%E9%99%A4

自分で適当な剰余を定義したっていいのですよ
2021/03/13(土) 14:10:18.80ID:9o031KiD
0へ丸めるtruncate算だったかと
mod算するときに結構困るのでユークリッド算関数は常にヘッダに入れてる
a % 2 == 1 // -1かもしれない
まあ偶奇判定くらいなら!=0で取り繕えるけど
ネットで見かける拡張ユークリッドのトイプログラムは大体間違ってるね
負の除数を想定してないgcdならそれでいいけど、ベズー係数求める時に負の被除数を扱えないと一般解の公式で他の解出してお茶は濁せるけど
有限体やら他の体とテンプレート共有できない
2021/03/17(水) 23:25:02.49ID:H7rJK4fS
ttp://open-std.org/jtc1/sc22/wg21/docs/papers/2021/n4885.pdf
2021/03/22(月) 08:32:15.77ID:j6rur0Vp
静的ライブラリを作るときに-fPICを指定する必要はないよね?
2021/03/22(月) 09:41:25.38ID:mzxuOn07
OSによるのでは
2021/03/22(月) 23:28:52.74ID:iFQHROzx
PICマイコン用のバイナリが吐かれる
2021/03/24(水) 07:52:17.23ID:PNXF+EC1
struct a{};
struct b:private a{};
b c;
(a*)&c; //ok

この下痢糞仕様は何?
こう決まった理由が知りたい
2021/03/24(水) 08:46:44.63ID:QJMmjFss
>>994
C形式のキャストを使ってるからではなくて?
どんなポインタにもキャストできると思うけど
2021/03/24(水) 09:11:00.00ID:PNXF+EC1
reinterpret_castとちゃうで
2021/03/24(水) 09:17:53.26ID:R+oM8cup
たとえ(int*)&c;でも通るでしょ
2021/03/24(水) 09:40:19.90ID:PNXF+EC1
仮想継承にするとダウンキャストはできなくなるんで
型を無視しているのでもなさそう
2021/03/24(水) 10:03:59.75ID:FhOgWspo
ポインタは任意のポインタに変換出来る
未定義動作になる可能性があるのはデリファレンスするコードを書いた場合
2021/03/24(水) 10:41:19.80ID:uPqg/PBu
64bitアプリで32bit整数値をvoid*にキャストしようとするとエラーになる場合があるね。
それを親切と感じることが出来れば玄人。
10011001
垢版 |
Over 1000Thread
このスレッドは1000を超えました。
新しいスレッドを立ててください。
life time: 74日 16時間 47分 20秒
10021002
垢版 |
Over 1000Thread
5ちゃんねるの運営はプレミアム会員の皆さまに支えられています。
運営にご協力お願いいたします。


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

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

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

▼ 浪人ログインはこちら ▼
https://login.5ch.net/login.php
レス数が1000を超えています。これ以上書き込みはできません。
5ちゃんねるの広告が気に入らない場合は、こちらをクリックしてください。

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