1 名前:デフォルトの名無しさん mailto:sage [2021/11/15(月) 18:49:18.44 ID:I69rZ/Of.net] 前スレ C++相談室 part157 https://mevius.5ch.net/test/read.cgi/tech/1628474251/
562 名前:デフォルトの名無しさん mailto:sage [2021/12/26(日) 02:08:50.44 ID:rFpP4pcL.net] しらそん アウトプロセスサーバが生成する COMオブジェクトの中で異なるバージョンのCRTの混在が起きたら 同じことなんじゃないの なので
563 名前:デフォルトの名無しさん mailto:sage [2021/12/26(日) 02:10:54.75 ID:P9feSsDc.net] 自演って見苦しいな
564 名前:デフォルトの名無しさん mailto:sage [2021/12/26(日) 05:25:00.76 ID:0FjCQ3kx.net] >>549 そういうのをスマポでやれって話? ヘッダで提供されるライブラリだからスマポもダメだと思うんだけど
565 名前:デフォルトの名無しさん mailto:sage [2021/12/26(日) 05:43:12.94 ID:a8PAglQ+.net] >>552 急にCOM持ち出すのはおかしいだろ >>553 ふつーCoTaskMemAllocじゃねえかな
566 名前:デフォルトの名無しさん mailto:sage [2021/12/26(日) 07:28:31.98 ID:z66Mwoku.net] sin関数に入れる時間変数の値が大きくなるにつれ誤差が増えていって困ってます fmod関数を使ってもあまり効果が見られませんでした 処理時間をそれほどかけずに解決出来る良い案何かありますか? sin関数に入れる値の目安は100万くらいです
567 名前:デフォルトの名無しさん mailto:sage [2021/12/26(日) 09:18:24.17 ID:6eMF2SNy.net] 100万をsin()しても、sin()は2π周期 doubleの精度15桁中の5桁以上を無駄にしている sin()する用変数で毎回fmod(,2π)してもそこで誤差が貯まりそう boost::multiprecisionとか?
568 名前:デフォルトの名無しさん mailto:sage [2021/12/26(日) 09:35:40.45 ID:/woV9P1D.net] 出来るなら入れる数を作る時点で[0,2pi)に収まるように工夫する それが無理なら多倍長浮動小数点数のライブラリ使うか自作するか
569 名前:デフォルトの名無しさん mailto:sage [2021/12/26(日) 10:28:27.14 ID:a8PAglQ+.net] >>559 sinの引数に入れる値を浮動小数点数で少しずつ足しこむような処理をしているなら、やめて別の方法を考えろ
570 名前:デフォルトの名無しさん mailto:sage [2021/12/26(日) 11:32:37.05 ID:SV9DgXqP.net] sinに時間を入れるのは次元がおかしい っていうのは冗談で、質問者が何を問うてるのかわからん sinにdoubleに収まるどんなデカい数を入れても精度は15桁くらい保証されるでしょ >>560 > 100万をsin()しても、sin()は2π周期 > doubleの精度15桁中の5桁以上を無駄にしている これもわけわかんねー 100万近いある数 x をsin()に入れるんでしょ? x も sin(x) も上から15桁全部有効な桁でしょ 何が無駄になってるん? >>562 こういう話ならわかる
571 名前:デフォルトの名無しさん mailto:sage [2021/12/26(日) 12:03:23.64 ID:/woV9P1D.net] sinのテイラー展開にxの大きな累乗が現れるからだよ 100万をバンバン累乗した級数で値域[-1,1]の関数計算してたら誤差まみれになるのは直感的に分かるだろ
572 名前:デフォルトの名無しさん mailto:sage [2021/12/26(日) 12:47:17.91 ID:6eMF2SNy.net] >>563 318310 * pi が100万に近い2piの倍数 https://keisan.casio.jp/calculator で、14桁で計算する 2 * pi = 6.2831853071796 sin(6.2831853071796) = 1.3523E-14 318310 * pi = 1000000.3575642 sin(1000000.3575642) = 3.291426496E-8 わかった? 桁数同じだから、でかい数は細かい所が消えるのよ
573 名前:デフォルトの名無しさん [2021/12/26(日) 15:05:31.07 ID:N3NYq5+A.net] わかんない。
574 名前:デフォルトの名無しさん mailto:sage [2021/12/26(日) 15:55:33.50 ID:SV9DgXqP.net] >>565 現象としては確認できたが、理屈が分からない >>564 の言ってるようにテイラー展開の各項が激しくキャンセルし合って桁落ちするってこと?
575 名前:デフォルトの名無しさん mailto:sage [2021/12/26(日) 16:03:55.94 ID:6s7ujcJo.net] >>564 のテイラー展開は疑問なんだけど 関数が[0,pi/2.)への押し込みもやってくれるんじゃないの
576 名前:デフォルトの名無しさん mailto:sage [2021/12/26(日) 17:28:50.32 ID:6eMF2SNy.net] 「桁数同じだから、でかい数は細かい所が消える」が理屈のつもりなんだけど… sin(6.2831853) = -7.179586477E-9 だし、 sin(1000000.3575641670857) = -3.5E-14 だよ
577 名前:デフォルトの名無しさん mailto:sage [2021/12/26(日) 17:52:52.66 ID:6eMF2SNy.net] sin()の結果に13桁の精度が欲しいなら、入力値に小数点以下13桁の精度が要るのよ sin()は2piの周期関数だから 1000000の所に7桁も使っちゃうのはもったいないのよ
578 名前:デフォルトの名無しさん mailto:sage [2021/12/26(日) 19:17:02.92 ID:P9feSsDc.net] まだ小学校の算数で分かる誤差の話してんの? >>560 で話終わらん奴は小学校からやり直せよ
579 名前:デフォルトの名無しさん mailto:sage [2021/12/26(日) 19:41:54.46 ID:qnixUQRF.net] 桁に関する誤差とかどこの世界の小学校で習うんだよ
580 名前:デフォルトの名無しさん mailto:sage [2021/12/26(日) 22:29:03.39 ID:Ep2AbKxF.net] お前は小学校の国語からやり直せw >> まだ「小学校の算数で分かる」誤差の話してんの? 誰も小学校で習うなんて言ってないぞ
581 名前:デフォルトの名無しさん mailto:sage [2021/12/26(日) 22:43:40.78 ID:RjefXsAR.net] log1pの存在理由も似たような話だね
582 名前:デフォルトの名無しさん mailto:sage [2021/12/26(日) 23:16:02.57 ID:P9feSsDc.net] 俺小学4年生で級数展開したπの計算してたけど・・・ 6年生でアセンブラと実数使ってたけど・・・
583 名前:デフォルトの名無しさん mailto:sage [2021/12/27(月) 08:46:39.54 ID:B/I2o19O.net] 教える奴もよく分かってないからめちゃくちゃになってる 基本的には大きい数についても>>563 の考え「x も sin(x) も上から15桁全部有効な桁」で合ってる sin() が 0 になるケースを考えてるからややこしいんだよ sin() が 1 になるケース、つまり pi/2 の奇数倍で 100 万に近い数を入れてみろ そしたらちゃんと 15 桁くらい 1 になるから 0 がややこしい理由は、仮数部が何であっても良いから 例えば 1e-20 は仮数部には1桁目からゴミが入っているが、倍精度ではゼロと見なす
584 名前:デフォルトの名無しさん mailto:sage [2021/12/27(月) 10:35:52.12 ID:wn+BpFxZ.net] >>576 お前は>>560 様の爪の垢を煎じて飲んでから、小学校をやり直せ
585 名前:デフォルトの名無しさん mailto:sage [2021/12/27(月) 18:35:09.36 ID:osgcVgi4.net] uniform_real_distribution の範囲を可変にしたいときってどうしたら良いでしょうか 0 から 1 までの実数を生成するようにしてそれを変数変換するべきですか
586 名前:デフォルトの名無しさん mailto:sage [2021/12/27(月) 19:02:31.64 ID:DQqD3vMw.net] っparam
587 名前:デフォルトの名無しさん mailto:sage [2021/12/27(月) 20:26:27.31 ID:7ufKNB24.net] >>576 1になるケースでほぼ1になるのは、そこでの微分が0だからだよ 入力値がちょっとずれても結果への影響が小さいのよ
588 名前:デフォルトの名無しさん mailto:sage [2021/12/27(月) 20:45:16.64 ID:7ufKNB24.net] 「x も上から15桁全部有効な桁」だからこそ、 1000000の所に7桁も使っちゃうのはもったいないのよ sin(x)=0の所は微分が1または-1、入力のずれがそのまま出力に出る所
589 名前:デフォルトの名無しさん mailto:sage [2021/12/28(火) 01:04:16.62 ID:OVEU2JJm.net] 厳密な2πnと、doubleで表した有効桁数15桁の大体2πnに近い数字の差を計算すると、nが大きくなるほど差がデカくなってくるってだけの話じゃないの? 浮動小数点数は0から離れれば離れるほど目盛りが大きくなっていくのだから。 sinの実装がマクローリン級数展開でなくても起こる問題だと思うが。
590 名前:デフォルトの名無しさん mailto:sage [2021/12/28(火) 01:43:08.31 ID:NIM0c1vY.net] 小学生多すぎじゃないか?
591 名前:デフォルトの名無しさん mailto:sage [2021/12/28(火) 09:17:10.46 ID:p+qHklGW.net] おまえさん1人だろ 中学以後、いつ何を習うか知らないようだが
592 名前:デフォルトの名無しさん mailto:sage [2021/12/29(水) 21:49:37.03 ID:+eZ32Uo6.net] >1e-20 は仮数部には1桁目からゴミが入っているが、倍精度ではゼロと見なす mjk、 IEEE754の2進数形式の倍精度浮動小数点表示は 仮数部がケチ表現の52 bit(実質53 bit)で 指数部は-1022〜+1023なのやぞ 1e-20とか1×2^(-60)かそこらなので無問題で53 bit(=15.9桁)の精度ェ、
593 名前:デフォルトの名無しさん mailto:sage [2021/12/29(水) 21:55:43.45 ID:+eZ32Uo6.net] >sin(x)=0の所は微分が1または-1、入力のずれがそのまま出力に出る所 x << 1のとき sin(x) ≒ x であることの見事な工学的応用、
594 名前:デフォルトの名無しさん mailto:sage [2021/12/29(水) 21:57:34.77 ID:+eZ32Uo6.net] まつがえた |x| << 1 やったorz
595 名前:デフォルトの名無しさん mailto:sage [2021/12/30(木) 01:48:03.91 ID:L6Vpkxay.net] よっしゃ、よっしゃ、おっちゃんがいいもん作ったろう https://ideone.com/fjxKtS n=0,10000, 20000, 30000, ...,1000000 (とりあえず10000刻み)として、 2分探索でsin(x)=0となるxを、2π*n付近について調べてやった そうやって求めたxをM_PIで割った結果はきっちり2*nになるから sin(x)がxの周期関数だからといって必ずしもxの増大につれ誤差が増えるわけではないことがワカル sin_valの値(=sin(x))が0に対して増えたり減ったりするのはマクローリン展開の近似多項式の係数を 結果があたりさわりのない誤差範囲でうろうろするように調整してあるんだろJK、
596 名前:デフォルトの名無しさん mailto:sage [2021/12/30(木) 01:51:27.40 ID:L6Vpkxay.net] やっぱ>>562 というものが>>559 の誤差の真相なのではな いか
597 名前:デフォルトの名無しさん mailto:sage [2021/12/30(木) 02:32:05.49 ID:7UdZ08Kf.net] >>588 結果見たけど、sin_valの値は、きっちり0から10000になったときに5桁精度悪化してるし、100000で6桁精度悪化してるのでは…?
598 名前:デフォルトの名無しさん mailto:sage [2021/12/30(木) 07:31:31.40 ID:xtSEOuqd.net] >>589 パッと見だけど>>565 が答えじゃねえの 浮動小数点てのは文字通り小数点位置が異なる 数値が1付近と100万付近じゃ精度が異なるのは当たり前 精度を保つなら固定小数点使わないと
599 名前:デフォルトの名無しさん mailto:sage [2021/12/30(木) 11:37:53.79 ID:ZhVAaRAF.net] まだやってたのか小学生・・・ID変えてご苦労様
600 名前:デフォルトの名無しさん mailto:sage [2021/12/30(木) 11:39:17.39 ID:ZhVAaRAF.net] 何度も言ってるが>>560 でこの話は終了している
601 名前:デフォルトの名無しさん mailto:sage [2021/12/30(木) 12:38:33.70 ID:A3EHubzP.net] 質問主が現れないからもう何議論しても無駄な気がする ソースコードがあるわけでもないし 100万程度で誤差ヤバい言うぐらいだからfloatで計算してないか疑たくもなる
602 名前:デフォルトの名無しさん mailto:sage [2021/12/30(木) 14:43:33.58 ID:Wt/MKF34.net] 誰も計算機上のゼロについて理解できてない
603 名前:デフォルトの名無しさん mailto:sage [2021/12/30(木) 16:49:59.36 ID:uaiyfMI5.net] もまいら、浮動小数点のゼロ判定どうしてる?
604 名前:デフォルトの名無しさん mailto:sage [2021/12/31(金) 00:22:01.38 ID:kcosmPcn.net] vectorでクラスへのポインタを持ってて、それを参照で受け取る関数を作るとき、クラスの変更を禁止したいんですが、どうすればいいですか? 例えば、 struct testclass{ int member; }; というクラスがあって、 vector<testclass*> を参照渡しで受け取る関数を作るとき、引数をconst vector<testclass*>& vecとしてもvec[0]->member =0みたいなクラスのメンバ変数の変更は関数の中で出来てしまうと思うのですが、そういうのをできないようにしたいです(testclassの変更が無いことを関数宣言で保証したいです) 何か良い方法ありますか? vectorが1重であればtestclass const*const*を引数にすればいいとは思うのですが、vector<vector<testclass*>>のように多重vectorみたいな場合も作りたくて、そのときは関数を呼ぶ側で多重vectorから多重配列に変換するのは面倒なので、できればvectorではなく配列を使うというのはしたくないです
605 名前:デフォルトの名無しさん mailto:sage [2021/12/31(金) 00:36:47.69 ID:ysmsTKqS.net] >>597 禁止しない もしくはメンバ変数を非publicにしてgetter/setter
606 名前:デフォルトの名無しさん mailto:sage [2021/12/31(金) 05:02:18.38 ID:zF3P5q1E.net] だから絶対値が1e-14とかより小さいかどうかだって >>585 なんかは全く理解してないようだが
607 名前:デフォルトの名無しさん mailto:sage [2021/12/31(金) 05:10:34.66 ID:zF3P5q1E.net] ちなみにsinがゼロのとこは微分が1か-1でsinが1のとこは微分がゼロだから違うってのは、事実だが今回の事象の説明としては感覚的に過ぎるね なぜならf(x) = xなる関数は微分は1だが f(1000000.3575642) は14桁正しいw sinの挙動について理解したいなら実装に踏み込むしかないよ あるいは>>576 あたりで思考停止しとくか
608 名前:デフォルトの名無しさん mailto:sage [2021/12/31(金) 06:37:46.15 ID:qJZ2APUI.net] >>597 アクセスを厳密に禁止したいなら、配列操作のみ定義したラッパークラスを用意して渡したほうが良い。
609 名前:デフォルトの名無しさん mailto:sage [2021/12/31(金) 08:06:29.68 ID:FnYy2lty.net] んだね
610 名前:デフォルトの名無しさん mailto:sage [2021/12/31(金) 08:45:47.76 ID:FPee+d5o.net] クラス T のメンバ関数で自身のコピーを返す(つまり返り値の型が T)ものを考える メンバ関数の修飾が && のときは std::move(*this) とかしたいけどこれはいちいち書かないとダメ? 普通は std::forward で統一できるが
611 名前:デフォルトの名無しさん mailto:sage [2021/12/31(金) 09:05:22.16 ID:FnYy2lty.net] *thisはxvalueではないからムブコンに渡したければstd::move()か(T&&)がいるね
612 名前:デフォルトの名無しさん mailto:sage [2021/12/31(金) 11:52:30.35 ID:kcosmPcn.net] >>598 ありがとうございます ただ、 >メンバ変数を非publicにしてgetter/setter これだと結局setterでメンバ変数を変更できてしまいますよね? >>601 ありがとうございます、検討してみます
613 名前:デフォルトの名無しさん mailto:sage [2021/12/31(金) 14:47:55.66 ID:fEOKhR13.net] instance.field; が暗黙のうちに書き変わらないだけでも効果あるんだよ void f(T&t){ t.clear();} f(instance.field); うっかりこんなことしたらヤバいし const T& get_field() const; を使っとけばコンパイル時エラーにしてくれる >>597 冒頭の質問なら、参照渡し引数に void f(const T&); のようにconstつけとけばいい
614 名前:デフォルトの名無しさん mailto:sage [2021/12/31(金) 15:16:00.18 ID:7kXupeFa.net] >>597 まだ標準に入ってないけど、propagate_const使うとか https://ideone.com/O8a0hn
615 名前:デフォルトの名無しさん [2022/01/04(火) 07:21:58.04 ID:5hvio7Nh.net] Packtpubが不安定になってるんだけど。 見れますか?
616 名前:デフォルトの名無しさん mailto:sage [2022/01/05(水) 21:49:37.99 ID:2R8vvmqQ.net] クラステンプレートについて、明示的実体化しておけば実装を.cppでもできるというのを知ったのですが、その場合、テンプレートでない普通のクラスと同じように 部分的にヘッダに実装を書いて、残りを.cppに書く、というのは正式な書き方として許されるでしょうか?
617 名前:デフォルトの名無しさん mailto:sage [2022/01/05(水) 22:24:10.67 ID:tiBxT68+.net] 許される。
618 名前:デフォルトの名無しさん mailto:sage [2022/01/05(水) 22:48:02.56 ID:2R8vvmqQ.net] >>610 ありがとうございます!
619 名前:デフォルトの名無しさん mailto:sage [2022/01/06(木) 15:12:35.27 ID:C9LB+2SX.net] その昔、exportテンプレートというのがあってだな
620 名前:デフォルトの名無しさん mailto:sage [2022/01/07(金) 00:07:55.52 ID:UgPywUlD.net] class T; class C { public: T t; }; とあったとき C c{T()}; と集成体初期化を行うと T のコンストラクタが1回だけ呼ばれます メンバ t をカプセル化してコンストラクタを自分で用意するとどうやっても T のムーヴコンストラクタが余計に1回呼ばれてしまうと思ったのですが回避する方法はありますか?
621 名前:デフォルトの名無しさん mailto:sage [2022/01/07(金) 02:01:17.79 ID:uUhimsKL.net] >>613 直接的にはないけど optionalとかvariantにあるin_placeコンストラクタと同じことをすればTのコンストラクタ呼び出しは一回で済みそう
622 名前:デフォルトの名無しさん mailto:sage [2022/01/07(金) 20:51:50.26 ID:UgPywUlD.net] >>614 ありがとうございます!
623 名前:デフォルトの名無しさん mailto:sage [2022/01/09(日) 10:55:01.80 ID:7BGFeByJ.net] >>597 配列の定義を vector<const testclass*> にすればよくない?
624 名前:デフォルトの名無しさん mailto:sage [2022/01/09(日) 11:30:20.08 ID:BcvcYHng.net] 外では変更するけど関数内では変更しないことを明示したいんでしょ
625 名前:デフォルトの名無しさん mailto:sage [2022/01/12(水) 09:32:50.44 ID:kvnPCGqB.net] 関数の定義で auto foo() -> void{} みたいに書くの見かけたけどこのやり方何かメリットありますか?
626 名前:デフォルトの名無しさん mailto:sage [2022/01/12(水) 12:16:01.64 ID:SK9+pElf.net] あるね auto s = std::string{"test"}; みたいな宣言とかも
627 名前:デフォルトの名無しさん [2022/01/12(水) 12:26:17.78 ID:Z0p/7uhd.net] >>618 は型推論効いてないやん
628 名前:デフォルトの名無しさん mailto:sage [2022/01/12(水) 12:28:40.33 ID:VUzGdiiG.net] 戻り値の型を->の先に書いてあるだけだよ。 だからこれはvoid型の戻り値ね。 利点は引数からdecltype使って戻り値の型を指定できるくらいじゃない?
629 名前:デフォルトの名無しさん mailto:sage [2022/01/12(水) 13:45:01.07 ID:uq5/9jO3.net] https://www.fluentcpp.com/2018/09/28/auto-stick-changing-style/ この記事で論じられているね
630 名前:はちみつ餃子 mailto:sage [2022/01/12(水) 13:59:43.98 ID:7Sv8jpqL.net] ラムダ式で返却値の型をどう書くかというのが後置スタイルを導入した直接の動機だと思う。 普通の関数で後置にするメリットがない場合であっても、 メリットがある場合とない場合で区別して使い分けるよりは全部を後置で一貫させたほうが綺麗だと思うこともあるだろ。
631 名前:デフォルトの名無しさん [2022/01/12(水) 17:10:39.04 ID:VRtGvzgV.net] みずほが復旧をあきらめるとかどうみてもfukkyu
632 名前:デフォルトの名無しさん mailto:sage [2022/01/12(水) 18:43:03.08 ID:NICGWYWs.net] 人がつくったものネットから持ってきて何個も組み合わせて合体させるとみずほみたいになるんだろうな 自分で作ってない部分はメンテしようがないからな
633 名前:デフォルトの名無しさん [2022/01/12(水) 19:53:35.19 ID:UH3nST5b.net] Windows serverにしたのが最大の間違い。
634 名前:デフォルトの名無しさん mailto:sage [2022/01/12(水) 20:51:55.49 ID:VUzGdiiG.net] std::stringの大文字を全て小文字に変換するのってstd::transformより良いものあるの?
635 名前:デフォルトの名無しさん [2022/01/12(水) 22:50:55.12 ID:VRtGvzgV.net] Windowsで文字列中の大文字を小文字に変換する_mbslwr()って今やランタイムで使えなくなってんだね、知らんかったわ
636 名前:蟻人間 mailto:sage [2022/01/12(水) 23:14:22.56 ID:htST1fFk.net] CharLower CharLowerBuff
637 名前:デフォルトの名無しさん mailto:sage [2022/01/13(木) 21:50:13.52 ID:bN4t5i1e.net] c++のexe → ライブラリA(c++のdll) と c++のcリンケージのdll → ライブラリA(c++のdll) で 同じライブラリの同じ関数を呼び出してるのに 呼び出し元の形態によって挙動が変わるなんてこと有り得ますか?
638 名前:デフォルトの名無しさん mailto:sage [2022/01/13(木) 22:14:06.74 ID:+PFReeTS.net] ライブラリも呼び出し元も外部の同名のdllをリンクしているけれども 呼び出し元が参照しているdllの実体が別だったとか。
639 名前:デフォルトの名無しさん mailto:sage [2022/01/14(金) 09:16:33.28 ID:ovvIshUS.net] struct Vector2 { float x, y; };のような64bitで済んでしまうものの計算にSSE命令を使っても高速化は見込めないのでしょうか? 上記に対して_mm_mul_psを行うと上位2float分を余計に計算させることになってしまいますよね
640 名前:デフォルトの名無しさん mailto:sage [2022/01/15(土) 05:56:06.60 ID:ps658RNN.net] >>603 deducing thisがC++23で入るね
641 名前:デフォルトの名無しさん mailto:sage [2022/01/15(土) 16:29:52.27 ID:fx8S/FAM.net] >>632 余計に計算させるけど一命令で済むよ ただし速度以外のデメリット出てくるけど
642 名前:デフォルトの名無しさん mailto:sage [2022/01/16(日) 12:31:04.34 ID:20f7Ghpo.net] >>630 同じ関数というのが関数名と引数の数が同じというだけなら extern "C" double sqrt(double x); extern float sqrt(float x); とから有り得る
643 名前:デフォルトの名無しさん mailto:sage [2022/01/17(月) 15:18:31.08 ID:sD13NBSV.net] pair<int, int> の first と second に、例えば座標と向きのような意味をもたせてるとします このとき、using なんかを使って pair<int, int> x の第一要素と第二要素に x.pos、x.dir のようにアクセスする方法ってありますか?
644 名前:はちみつ餃子 mailto:sage [2022/01/17(月) 15:34:47.07 ID:jU2WrI4n.net] >>636 C++ ではメンバ (のように見えるもの) を後から生やすことは出来ない。
645 名前:デフォルトの名無しさん mailto:sage [2022/01/17(月) 16:04:32.58 ID:+6BKuldY.net] auto& [x, y] = obj; x = 100; y = 100; 動くかは試してない
646 名前:デフォルトの名無しさん mailto:sage [2022/01/17(月) 16:07:55.78 ID:h5bglXe3.net] >>636 そういうあちこちで使う用途の、はっきり意味が決まった構造体は pairやtupleに頼らない方が(大抵の場面では)便利だよ その一箇所でしか使わないならpairでいいと思うけど
647 名前:はちみつ餃子 mailto:sage [2022/01/17(月) 16:18:00.13 ID:jU2WrI4n.net] いくつかの要件を満たして "Tuple-like" であるようなクラスはタプルのように扱える仕組みがある。 タプルを多用途に使うよりは個別のクラスを作った上でタプルのインターフェイスを持たせるほうが 使いやすくなると思う。
648 名前:デフォルトの名無しさん mailto:sage [2022/01/17(月) 16:55:14.33 ID:aOF99LGB.net] >>636 まず構造体を勉強しよう
649 名前:デフォルトの名無しさん mailto:sage [2022/01/17(月) 17:09:52.53 ID:bBHBfELI.net] struct だと困るんですか?
650 名前:デフォルトの名無しさん mailto:sage [2022/01/17(月) 17:35:43.45 ID:AdXHrviP.net] みなさん御機嫌よう このスレには何度も助けられているものです 再度お知恵を拝借したいです 任意のユーザー定義型のインスタンスhogeが、基底クラスbaseを継承しているか調べたいです。 この一例のみならtypeidで合致させればいいと思うのですが、実際は派生クラスが200くらいある予定です。 type-traitでインクルード出来るstd::is_base_ofで、RTTIを使い判定しようとしたのですが、typeidで取得できる型で合致させようとしたところ型情報が合いません……orz どんな方法でもいいので何かいい方法がございましたらご教授いただければと思います。 class base{}; class driv:public base{}; class foo{}; //もしhogeがfoo型のインスタンスなら偽を、drivのインスタンスなら真を返したい関数 bool exHantei(){}
651 名前:はちみつ餃子 mailto:sage [2022/01/17(月) 17:43:03.78 ID:jU2WrI4n.net] 老眼なので Hantei が Hentai に見えた。
652 名前:はちみつ餃子 mailto:sage [2022/01/17(月) 17:49:59.30 ID:jU2WrI4n.net] >>643 静的な型を判定するならこういうのでいけると思うが、 RTTI が出てくるってことは状況が違うのかな? #include <iostream> #include <type_traits> class base{}; class driv : public base{}; class foo{}; template<class T> bool exHantei(const T&){ return std::is_base_of<base, T>::value; } int main(void) { driv hoge; foo huga; std::cout << exHantei(hoge) << std::endl; std::cout << exHantei(huga) << std::endl; }
653 名前:デフォルトの名無しさん mailto:sage [2022/01/17(月) 20:3
] [ここ壊れてます]
654 名前:6:31.89 ID:PMmhhAT1.net mailto: dynamic_cast<base*>(hoge)がnullptrかどうかを見ろ [] [ここ壊れてます]
655 名前:デフォルトの名無しさん mailto:sage [2022/01/17(月) 20:47:22.64 ID:6BYLlYWJ.net] >>643 bool exHentai(){ return std::is_base_of_v<base, std::remove_reference_t<decltype(hoge)>>; }
656 名前:デフォルトの名無しさん mailto:sage [2022/01/17(月) 20:49:09.31 ID:AdXHrviP.net] >>645 ありがとうございます。 ただ今これで動作確認はしました。 が本来は基底クラスのポインタに格納されているのです…… 書き込む時に蛇足と思って省いてしまったのですが、実際は class base{}; class driv:public base{}; class WantToFind:public driv{} std::vector<base*> VecBasePtr; void pusbak() { WantToFind f1; VecBasePtr.push_back(&f1); } というようにベースポインタに押し込んで使っていて、exHantei()を使用する時にはベースとこのポインタを比較することになります。 今はちみつ餃子様のコードで動作確認をした後、自分のコード用に書き直したところ、ポインタから型を取得させる動作ができません(泣) てっきりtypeidと同じ様に、exHantei(*VecBasePtr[0]);と*を付けてポインタの中身を外に出せば生のWantToFind型が出てくるかと思ったのですが…… 思い通りの動作が出来ませんでした。 どうしてなんですかね、、、 デバッグモードで確認してもわからない もちろんbaseに仮想関数は置いてあるので、RTTIで動作してくれるものと思っていましたが。 Templateの機序が違うのかな……?
657 名前:デフォルトの名無しさん mailto:sage [2022/01/17(月) 21:03:17.46 ID:PMmhhAT1.net] だからdynamic_castで調べろって そのための機能だから
658 名前:デフォルトの名無しさん mailto:sage [2022/01/17(月) 21:36:21.92 ID:AdXHrviP.net] >>649 ありがとうございます!!! 確認しましたところ自分の思っている動作が得られました☆*:.。. o(≧▽≦)o .。.:*☆ こんなに簡単に出来るとは、is_base_ofの使い所さんはどうなってしまうんだ。。。 レスへの返信を書きながら、自分でもコード確認やリファレンスを検索していたため、スレの確認が遅くなってしまい、多くの型と行き違いになってまいました。 返信をくださった方々には重ね重ねお礼申し上
659 名前:げます。 まだまだ弱輩者ですが、これからも生暖かい目で返信くださると幸いです。 皆さんありがとうございます! [] [ここ壊れてます]
660 名前:はちみつ餃子 mailto:sage [2022/01/17(月) 21:36:54.84 ID:jU2WrI4n.net] >>648 動的型で継承関係を確かめるなら >>646 が述べている通り dynamic_cast で実際に変換してみるのは手っ取り早い方法だと思う。 > 生のWantToFind型が出てくるかと思ったのですが…… 「生の」ってなんやねん。 その場合の *VecBasePtr[0] の静的型はあくまで base だよ。 オブジェクトの base である部分 (サブオブジェクト) が取り出される。 いわゆるスライシング。
661 名前:デフォルトの名無しさん mailto:sage [2022/01/17(月) 21:37:50.95 ID:AdXHrviP.net] dynamic_castは知ってたはずなのに思い出さなかったというか思いつかなかった……
662 名前:デフォルトの名無しさん mailto:sage [2022/01/17(月) 21:46:56.12 ID:AdXHrviP.net] >>651 ありがとうございます。 自分はスライシングもちゃんと理解してないですね…… ポインタのメモリ確保サイズが一様に8バイト(4バイト)なので、基底型が派生型の型を丸ごと格納している(派生型のポインタを確保している)と理解していました。。。(*を付けると派生型が出てくる) 悪魔でも基底型なのですね? キャストで受けるまでは基底型として扱われるので、型情報が合致しなかったのかな。 type_infoは、全く別の型を型合致に使うから*baseが有効なのかな。
663 名前:デフォルトの名無しさん mailto:sage [2022/01/17(月) 21:55:40.15 ID:h5bglXe3.net] dynamic_castって仮想関数テーブル必要じゃなかったっけ? まぁいずれにせよ仮想関数テーブルでぐぐればそこらへんの理解が進むと思う 多分
664 名前:デフォルトの名無しさん mailto:sage [2022/01/19(水) 17:29:06.73 ID:u/w202Yd.net] スライシングとか知らない単語使わないで
665 名前:デフォルトの名無しさん mailto:sage [2022/01/19(水) 18:16:17.94 ID:oZ05fVjC.net] 用語って大事だよな 言葉遣いがおかしいの指摘されると逆ギレする DQN気質なやつが残念ながら後を経たない
666 名前:デフォルトの名無しさん mailto:sage [2022/01/20(木) 05:34:44.25 ID:tJtJ60TC.net] https://cpplover.blogspot.com/2018/07/c20.html?m=1 汎用エイリアス宣言の提案ってどうなったんだろう
667 名前:デフォルトの名無しさん mailto:sage [2022/01/20(木) 09:07:39.69 ID:PFfSIkf2.net] #include <cctype> //#include <string> template <typename F> void test(F&& f){} int main(){ test(std::isprint); } これ<string>を有効にするとcouldn't deduceになるんだけど なんで? コンパイラはMSYS2 g++ 10.3.0
668 名前:デフォルトの名無しさん [2022/01/20(木) 09:24:47.83 ID:MuVW7weO.net] 名前衝突してんじゃないの?
669 名前:デフォルトの名無しさん mailto:sage [2022/01/20(木) 09:37:40.24 ID:PFfSIkf2.net] <locale>のテンプレートが干渉してるっぽいことはわかった これ、俺の落ち度なの?
670 名前:デフォルトの名無しさん mailto:sage [2022/01/20(木) 13:32:22.34 ID:NzUGMacM.net] >>660 オーバーロードやデフォルト引数が追加される可能性があるから、 一般的に標準ライブラリ関数のアドレスは取れないと思ったほうがいい。 https://isocpp.org/std/standing-documents/sd-8-standard-library-compatibility
671 名前:デフォルトの名無しさん mailto:sage [2022/01/20(木) 18:29:19.36 ID:PFfSIkf2.net] ぐぶー・・・
672 名前:デフォルトの名無しさん mailto:sage [2022/01/20(木) 22:37:24.73 ID:Df2OyNH0.net] ランタイムサポートが必要なC++言語機能ってRTTIやdynamic_cast、例外くらい?
673 名前:デフォルトの名無しさん mailto:sage [2022/01/20(木) 23:29:32.85 ID:a5eQ4sV9.net] そもそもランタイムサポートの定義をちゃんとしないとな・・・
674 名前:デフォルトの名無しさん mailto:sage [2022/01/21(金) 00:00:01.47 ID:/d5tBos9.net] RTTIも例外も標準C++の一部 それが使えないような設定は厳密には規格違反だし、それで高速化や効率化しますってのは各コンパイラの独自機能に過ぎない
675 名前:デフォルトの名無しさん mailto:sage [2022/01/21(金) 01:04:31.52 ID:VVQk5y8F.net] アホすぎるw
676 名前:デフォルトの名無しさん mailto:sage [2022/01/21(金) 07:18:18.80 ID:j/G12RQ8.net] dynamic initializationも裏で色々やってるね
677 名前:デフォルトの名無しさん mailto:sage [2022/01/21(金) 07:28:47.34 ID:VVQk5y8F.net] とりあえずOSないところか、簡単な仕組みしかないところでC++で何か書いてみればいいよ 処理系が何をしてくれているのか分かる
678 名前:デフォルトの名無しさん mailto:sage [2022/01/21(金) 07:43:11.40 ID:j/G12RQ8.net] ベアメタルはオモロイ
679 名前:デフォルトの名無しさん mailto:sage [2022/01/21(金) 07:59:33.55 ID:j/G12RQ8.net] 658だけど、自己解決の報告。 テンプレートにしないで void test(int(*f)(int)){} にしたら<locale>のisprintが干渉しなくなった 最初の発想がいかんかった
680 名前:デフォルトの名無しさん mailto:sage [2022/01/21(金) 08:26:30.46 ID:VVQk5y8F.net] isprintのテンプレート引数が決まらないからだろ test(std::isprint<int>); とかなら通ると思う
681 名前:デフォルトの名無しさん mailto:sage [2022/01/21(金) 08:32:03.82 ID:VVQk5y8F.net] compiler explorerのarm g++ 10.3で確認した。ヘッダはlocaleにした。 #include <locale> template <typename F> void test(F&& f){} int main(){ //test(std::isprint); test(std::isprint<int>); }
682 名前:デフォルトの名無しさん mailto:sage [2022/01/21(金) 08:47:07.93 ID:VVQk5y8F.net] 元のコードをなるべく変えずにだと #include <string> #include <cctype> template <typename F> void test(F&& f){} int main(){ test(static_cast<int (*)(int)>(std::isprint)); } ※オーバーロードを選択させるべくキャストする
683 名前:デフォルトの名無しさん mailto:sage [2022/01/21(金) 09:54:53.25 ID:j/G12RQ8.net] conceptでテンプレートテンプレート引数を弾いたりできないかとも思ったけど SFINAEは関数の除外なので引数の候補を絞るのは無理だった
684 名前:デフォルトの名無しさん mailto:sage [2022/01/22(土) 10:28:58.52 ID:om6KWGu4.net] class A { static inline struct SubStruct { int value; } Field1; } //通常の構造体のスタティックメンバ変数はヘッダファイル、cppファイル共に実体は同じ class A { static inline struct { int value; } Field1; } //無名構造体のスタティックメンバ変数はヘッダファイルとcppファイルとでそれぞれ別の実体が生成されアドレスが異なる この挙動は仕様なのでしょうか?
685 名前:デフォルトの名無しさん mailto:sage [2022/01/22(土) 10:57:07.60 ID:OQdcFc3P.net] 名前書き忘れて0点取ったことないのか
686 名前:デフォルトの名無しさん mailto:sage [2022/01/22(土) 11:38:04.16 ID:+VFNw8nk.net] 今だと仮想関数とvariantとどっち使うのが主流ですか?
687 名前:デフォルトの名無しさん mailto:sage [2022/01/22(土) 11:49:22.43 ID:XNgWTOyh.net] >>675 名前のない構造体には実体がなく外部リンケージを持たないのでそこに対するinline指定は無視されるってことでは? 分かりにくいけど仕様として矛盾してはいないと思う
688 名前:デフォルトの名無しさん mailto:sage [2022/01/22(土) 13:06:33.51 ID:BllOBQpy.net] >>675 「ヘッダファイルとcppファイルとでそれぞれ別の実体が生成されアドレスが異なる」という状態をどうやって観測しているの? そんな挙動しないと思うんで、観測方法に間違いがありそう。 >>678 名前のない構造体もクラス型としては存在するし、それとは別に変数 A::Field1 は外部リンケージを持つよ。 https://timsong-cpp.github.io/cppwp/n4861/basic.link#5 > In addition, a member function, static data member, ..., has the same linkage, if any, as the name of the class of which it is a member.
689 名前:デフォルトの名無しさん mailto:sage [2022/01/22(土) 13:08:52.36 ID:BllOBQpy.net] >>678 あと仮にinline指定が無視されたとしても「別の実体が生成される」というような動作には繋がらないね。
690 名前:デフォルトの名無しさん mailto:sage [2022/01/22(土) 13:59:06.18 ID:0LC8SyT+.net] >>599 アーハン? doubleで表現可能な最小の数と1e-14の大小関係もわかんない人なんですかね、、、
691 名前:デフォルトの名無しさん mailto:sage [2022/01/22(土) 14:05:40.45 ID:0LC8SyT+.net] >>593 その2π周期というのが厳密に2*M_PI周期であることの根拠は? >>560 の時点ではそれは示されていなかった >>588 で2*M_PI周期と言う実験結果がデタ
692 名前:デフォルトの名無しさん mailto:sage [2022/01/22(土) 14:11:22.71 ID:0LC8SyT+.net] >>596 万能の一般論は無い(キリ なぜなら、f(x)が0かどうかの判定をしたいとして、±|處を0とみなすべきなのかは f(x)の精度に依存するから ただし、>>560 式に f(x1) と f(x2) の等値判定なら >>560 式にやりうる これは f(x1) - f(x2) のゼロ判定として>>560 式にやればよろっし
693 名前:デフォルトの名無しさん mailto:sage [2022/01/22(土) 14:15:01.32 ID:0LC8SyT+.net] アンカーミスった;;;orz s/>>560 />>588 /g
694 名前:デフォルトの名無しさん mailto:sage [2022/01/22(土) 16:12:55.51 ID:13b+4FON.net] >>681 O(1) の数値を使って計算してたら例えば 1e-15 以下の数値をゼロと見なすとかするより他ないでしょ バカ?
695 名前:デフォルトの名無しさん mailto:sage [2022/01/22(土) 16:30:03.25 ID:OQdcFc3P.net] sedかよ
696 名前:デフォルトの名無しさん mailto:sage [2022/01/22(土) 16:59:40.11 ID:gWLf+Bka.net] 知らなくて驚くかもしれないけどdoubleは1e-324も表せちまうんだ
697 名前:デフォルトの名無しさん mailto:sage [2022/01/22(土) 17:34:26.32 ID:UJcbhjLZ.net] >>681-687 まだやってたのか小学生・・・ID変えてご苦労様 何度も言ってるが>>560 でこの話は終了している
698 名前:デフォルトの名無しさん mailto:sage [2022/01/22(土) 17:48:02.61 ID:vZsc1PCZ.net] >>687 そこまで拗らせてる事に驚いたわw
699 名前:デフォルトの名無しさん mailto:sage [2022/01/22(土) 19:34:50.12 ID:DSkywrpw.net] >>560 >100万をsin()しても、sin()は2π周期 >doubleの精度15桁中の5桁以上を無駄にしている これよくわからん。
700 名前:デフォルトの名無しさん mailto:sage [2022/01/22(土) 20:03:51.19 ID:0LC8SyT+.net] 言ってる当人もわかってないんだろJK
701 名前:デフォルトの名無しさん mailto:sage [2022/01/22(土) 20:37:14.45 ID:0LC8SyT+.net] double sin(double x)の精度が±10E-10程度らしいことは>>588 の結果が示しているが こっれはxが100万かどうかによらないことも結果が示してゐる 実装を見ないとわからんが、多分マクローリン展開の打ち切りによる誤差とみるべき
702 名前:デフォルトの名無しさん mailto:sage [2022/01/22(土) 21:05:23.18 ID:yfbq4hUz.net] >>692 実装見てから言った方がいいよ。マクローリン展開というが、0を基準にマクローリン展開してるわけないだろ。
703 名前:デフォルトの名無しさん mailto:sage [2022/01/22(土) 21:18:55.93 ID:0LC8SyT+.net] >>685 その方法は等値判定として一貫性が無いからNG double x = 2.0; double y = 2.0 + (10E-15) / 2.0; assert(fabs(x - y) <= 10E-15); // pass. 10E-15基準で x == y とみなされる assert(fabs(100 * x - 100.0 * y) <= 10E-15); // fail。 10E-15基準の下で 100 * x と 100.0 * y はイコールにならにあ
704 名前:デフォルトの名無しさん mailto:sage [2022/01/22(土) 21:22:04.30 ID:0LC8SyT+.net] >>693 sin(x)の場合は|x|<<1においてsin(x) ≒ xなのでsin(x+a)を展開をする際のaを0にするのが妥当に思えまっする、
705 名前:デフォルトの名無しさん mailto:sage [2022/01/23(日) 04:16:28.14 ID:QgynSmAQ.net] >>689-695 まだやってたのか小学生・・・ID変えてご苦労様 何度も言ってるが>>560 でこの話は終了している
706 名前:デフォルトの名無しさん mailto:sage [2022/01/23(日) 09:39:04.54 ID:CWW/bMN0.net] >>678 挙動としては正にそんな感じですね >>679 test.hにあるinline void 内でprintf("%p\n", Field1)、test.cppのvoid Func1内で同様の事をして確認しました 出力のみならず、そもそもヘッダのinline void内でField1に値をセットしたはずなのにソース内ではデフォルト値のままで動作が狂ったので上記のテストをして発覚した次第です structを名前付きにするかしないかの一点だけで上記の結果が変わります
707 名前:デフォルトの名無しさん mailto:sage [2022/01/23(日) 09:40:35.92 ID:CWW/bMN0.net] >>697 printf("%p\n", Field1)はレス間違いでprintf("%p\n", &Field1)で実験しています
708 名前:デフォルトの名無しさん mailto:sage [2022/01/23(日) 10:41:30.96 ID:QgynSmAQ.net] #include<iostream> struct A{static struct SubStruct{int value;} Field1;}; A::SubStruct A::Field1; int main() { std::cout << std::hex << &A::Field1 << std::endl; return 0; } 無名で実体の定義なんてできんのか?
709 名前:デフォルトの名無しさん mailto:sage [2022/01/23(日) 10:43:19.72 ID:vZkrAotW.net] キャストやconst&でできるな
710 名前:デフォルトの名無しさん mailto:sage [2022/01/23(日) 10:47:03.39 ID:QgynSmAQ.net] >>700 どうやんの?上の例でやってみてよ
711 名前:デフォルトの名無しさん mailto:sage [2022/01/23(日) 10:48:14.26 ID:QgynSmAQ.net] ちなみに上の例は無名でない構造体で、実体の定義は A::SubStruct A::Field1; な
712 名前:デフォルトの名無しさん mailto:sage [2022/01/23(日) 10:51:00.92 ID:CWW/bMN0.net] >>699 C++20だか17だかからはinlineをつける事で出来ます
713 名前:デフォルトの名無しさん mailto:sage [2022/01/23(日) 10:51:47.13 ID:QgynSmAQ.net] #include<iostream> struct A{static struct {int value;} Field1;}; decltype(A::Field1) A::Field1; int main() { std::cout << std::hex << &A::Field1 << std::endl; return 0; } 意外とやってみたら出来たw
714 名前:デフォルトの名無しさん mailto:sage [2022/01/23(日) 10:55:02.08 ID:vZkrAotW.net] >>700 A::SubStruct{} で実体の「定義」ができる &A::SubStruct{} は実体がprvalueという理由でエラーだが 実体を定義できるか否かとは別問題だ
715 名前:デフォルトの名無しさん mailto:sage [2022/01/23(日) 10:57:42.35 ID:QgynSmAQ.net] >>705 根本的に意思疎通できてないみたいだな staticメンバA::Field1の実体定義だって
716 名前:デフォルトの名無しさん mailto:sage [2022/01/23(日) 10:59:48.93 ID:vZkrAotW.net] >>706 そのようだな なぜstaticメンバが出てくるのか不明だ
717 名前:デフォルトの名無しさん mailto:sage [2022/01/23(日) 11:04:13.16 ID:QgynSmAQ.net] >>703 確かに出来た -std=c++17 付けたら実体定義なくても通った
718 名前:デフォルトの名無しさん mailto:sage [2022/01/23(日) 11:05:12.08 ID:QgynSmAQ.net] コードはこんなのね(with -std=c++17) #include<iostream> struct A{static inline struct {int value;} Field1;}; int main() { std::cout << std::hex << &A::Field1 << std::endl; return 0; }
719 名前:デフォルトの名無しさん mailto:sage [2022/01/23(日) 11:25:38.49 ID:QgynSmAQ.net] 実体は同じのを指すようで再現しなかったな。MakefileはちゃんとTAB入れてな。 cat >Makefile <<EOF CXXFLAGS += -std=c++17 sample: main.o sub1.o sub2.o \$(LINK.cc) \$? -o \$@ EOF cat >main.cpp <<EOF void sub1(); void sub2(); int main() { sub1(); sub2(); return 0; } EOF cat >sub1.cpp <<EOF #include<iostream> struct A{static inline struct {int value;} Field1;}; void sub1() { std::cout << std::hex << &A::Field1 << std::endl; } EOF cat >sub2.cpp <<EOF #include<iostream> struct A{static inline struct {int value;} Field1;}; void sub2() { std::cout << std::hex << &A::Field1 << std::endl; } EOF make
720 名前:デフォルトの名無しさん mailto:sage [2022/01/23(日) 15:40:28.67 ID:K/S7vg9Z.net] >>697-698 wandbox の gcc 11.1.0 でもやってみたけど、再現せず同じアドレスが出た。 https://wandbox.org/permlink/SSg6OZD97wmgR8kq コンパイラやバージョンやコンパイルオプションを合わせれば再現するのかね?
721 名前:デフォルトの名無しさん mailto:sage [2022/01/23(日) 15:53:41.49 ID:QgynSmAQ.net] >>711 複数のオブジェクトファイルにしないと検証できないと思うよ
722 名前:デフォルトの名無しさん mailto:sage [2022/01/23(日) 16:09:46.74 ID:K/S7vg9Z.net] >>712 >>697 の説明にあるtest.cppはtest.hをインクルードしてるんだろうからこの形でいいだろうと思った。 まぁやってみたけど、変わらないね。 https://wandbox.org/permlink/hfbakWmCF1i5stqr
723 名前:デフォルトの名無しさん mailto:sage [2022/01/23(日) 16:31:20.27 ID:QgynSmAQ.net] >>713 流石にヘッダファイルから何かが生成されることはないw wandboxで複数オブジェクトファイルって処理系内部の作り次第になるし、>>710 でもやってみようかと思ったけど、3つは無理そうだね
724 名前:デフォルトの名無しさん mailto:sage [2022/01/23(日) 17:20:50.76 ID:hHkcGLX7.net] ヘッダに実装書くと管理が楽だよね
725 名前:デフォルトの名無しさん mailto:sage [2022/01/23(日) 17:32:20.44 ID:CWW/bMN0.net] >>711 検証頂いてるところ環境を明記しておらず申し訳ありません Visual Studio 2022、C++20で発生している現象です #include "test.h" int main() //main.cpp { A::Initialize(); //printf("%p\n", &A::Field1);をするだけのstatic inline関数 A::Func1(); //printf("%p\n", &A::Field1);をするだけのstatic関数(__declspec(noinline)をし実装はtest.cpp) } struct名をつければInitializeの出力とFunc1の出力は一致、無名structにしたら不一致 本当に他は一切いじらずに名前の有無だけで変わります
726 名前:デフォルトの名無しさん mailto:sage [2022/01/23(日) 17:54:11.09 ID:QgynSmAQ.net] 現象を再現させる最小限のコードを全セット載せないと先には進まんて 始めからそうしてればこんなにいろいろ書かずに済んでいる
727 名前:デフォルトの名無しさん mailto:sage [2022/01/23(日) 18:17:03.90 ID:K/S7vg9Z.net] >>714 wandbox でも -v 追加で as が2つ test.cpp と prog.cc と別で走ってるのまでは見た。
728 名前:デフォルトの名無しさん mailto:sage [2022/01/23(日) 18:18:38.46 ID:K/S7vg9Z.net] >>716 MSVC のバグっぽいね。おとなしく名前つけて回避しつつ、できればバグ報告しとくのがいいんじゃない。
729 名前:デフォルトの名無しさん mailto:sage [2022/01/23(日) 20:02:54.49 ID:QgynSmAQ.net] >>715 >>675 で「無名構造体のスタティックメンバ変数はヘッダファイルとcppファイルとでそれぞれ別の実体が生成されアドレスが異なる」 と書いてあるが、ヘッダファイルから直接実体は生成されないよってこと .cppなどのソースファイルからincludeされないとコンパイルしないから (もちろんただのファイル名なのでコンパイラに
730 名前:直接ヘッダファイルをコンパイルせよと指定する事はできる) つまりA::Field1に該当するシンボルが複数の.objに含まれた場合、同じになっているか=アドレスが同じになるか? の検証でないと意味がない [] [ここ壊れてます]
731 名前:デフォルトの名無しさん mailto:sage [2022/01/23(日) 20:09:37.28 ID:QgynSmAQ.net] >>718 それは昔からgccを使ってる人は知ってるけど、そういう話じゃない 明らかに不自然な位置にソースファイルを指定して無理矢理2個同時にコンパイルする上に、引用されて3個はできない つまり想定された使い方ではないということ おまけに処理系やそのバージョンを複数変えられることが比較的便利なwandboxで、処理系を変えると確認が必要になるやり方はどうかと言っただけ まあ、分かってるとは思うんだが
732 名前:デフォルトの名無しさん mailto:sage [2022/01/23(日) 20:24:03.88 ID:QgynSmAQ.net] とりあえず、710のコードでVS2019を調べた結果、再現は確認できた。 ただし、コンパイルオプション次第で現象が出たり出なかったりする。 VS2022でもないし、VSはコンパイルリンクオプションがデフォルトで大量に指定されてて確認が面倒なのでそれ以上は放棄した。 以下のコードではpermissive-オプションの有無で現象が再現したりしなかったりするが、デフォルト時だとその切替えで現象は変わらないので、一次原因ではないと思う。
733 名前:デフォルトの名無しさん mailto:sage [2022/01/23(日) 20:24:36.31 ID:hHkcGLX7.net] 保守できないような書き方して自分の仕事を守る。PGの当然の権利ですよね。
734 名前:デフォルトの名無しさん mailto:sage [2022/01/23(日) 20:25:06.27 ID:QgynSmAQ.net] > main.cpp ( @echo void sub1^(^); @echo void sub2^(^); @echo int main^(^) { @echo sub1^(^); @echo sub2^(^); @echo return 0; @echo } ) > sub1.cpp ( @echo #include^<iostream^> @echo struct A { static inline struct { int value; } Field1; }; @echo void sub1^(^) { @echo std::cout ^<^< std::hex ^<^< ^&A::Field1 ^<^< std::endl; @echo } ) > sub2.cpp ( @echo #include^<iostream^> @echo struct A { static inline struct { int value; } Field1; }; @echo void sub2^(^) { @echo std::cout ^<^< std::hex ^<^< ^&A::Field1 ^<^< std::endl; @echo } ) > sample.mak ( @echo CXXFLAGS = /MDd /EHsc /std:c^+^+17 /permissive- @echo .cpp.obj: @echo $^(CXX^) $^(CXXFLAGS^) /c $^< @echo sample.exe: main.obj sub1.obj sub2.obj @echo link /OUT:$@ $^*^* ) nmake /f sample.mak rem バッチファイルもnmakeもよく知りません。
735 名前:デフォルトの名無しさん mailto:sage [2022/01/23(日) 20:34:19.55 ID:K/S7vg9Z.net] >>721 ソース3つ以上もできるよ。 https://wandbox.org/permlink/UgIc9mFrs59059jq
736 名前:デフォルトの名無しさん mailto:sage [2022/01/23(日) 20:40:05.18 ID:QgynSmAQ.net] >>723 そういうのはプロジェクトの方針だと思うので、ここで話す内容ではないと思うよ
737 名前:デフォルトの名無しさん mailto:sage [2022/01/23(日) 20:45:20.80 ID:QgynSmAQ.net] >>725 改行と空白で違うのかよw b烽、知るかってャ激xルだけど、bりがと bニりあえず>>710 を載っけとく https://wandbox.org/permlink/e8khwggKe00rtekJ
738 名前:デフォルトの名無しさん mailto:sage [2022/01/23(日) 20:49:22.51 ID:QgynSmAQ.net] >>723 >>727 は何故だか文字が化けてたので一応書き直しとく。 改行と空白で違うのかよw もう知るかってレベルだけど、ありがと とりあえず>>710 を載っけとく https://wandbox.org/permlink/e8khwggKe00rtekJ
739 名前:デフォルトの名無しさん [2022/01/24(月) 19:27:55.24 ID:WxnVLAIm.net] C++11から、C++20までの変更点を解説した入門書を年末に買ったのだが(C++は書けるよ)、まだ読む気になれないw 「今更C++か、pythonでいいだろ」と悪魔が囁くw
740 名前:デフォルトの名無しさん mailto:sage [2022/01/24(月) 19:42:15.63 ID:nLfFXIoN.net] c++cliについてネットに解説している情報あまり無いですが、まとまってるサイトとかないですかね。
741 名前:デフォルトの名無しさん mailto:sage [2022/01/24(月) 20:29:40.39 ID:kghIRcG8.net] https://docs.microsoft.com/ja-jp/cpp/dotnet/dotnet-programming-with-cpp-cli-visual-cpp?view=msvc-170
742 名前:デフォルトの名無しさん mailto:sage [2022/01/25(火) 08:07:34.25 ID:m+e4/QVD.net] めずらしい 変態に興味あるとは VisualJ++とかワケ
743 名前:ワカだったぜw [] [ここ壊れてます]
744 名前:デフォルトの名無しさん mailto:sage [2022/01/26(水) 05:15:43.56 ID:DGJ/MazB.net] 1秒おきのタイマーでtmDraw()を呼んで右に伸びる四角を描くプログラムです。VSCでMFC未使用。 LRESULT CALLBACK WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam) { switch (message) { case WM_PAINT: OnPaint(hWnd); break; case WM_CREATE: SetTimer(hWnd,1,1000,(TIMERPROC)NULL); //タイマー定義 break; case WM_TIMER: //タイマー { PAINTSTRUCT ps; HDC hdc = BeginPaint(hWnd, &ps); tmDraw(hdc); //これを呼んで描画 EndPaint(hWnd, &ps); } break; return 0; } static VOID tmDraw(HDC hDC) { SetDCPenColor(hDC, RGB(0x99, 0x66, 0x00)); //ここが呼ばれてるのは確認 SetDCBrushColor(hDC, RGB(0xFF, 0xCC, 0x00)); Rectangle(hDC, SIZE16(0, 0, cx++, 6)); //伸びる描画 } 最初の1回の描画はされます。タイマーでtmDraw()が呼ばれてるのは確認しています。 呼ばれて描画されてるはずなのですが、実際の画面は更新されず四角は伸びません。 windowサイズを手動で変えていくと四角は右に伸びていき更新されます。 タイマーでtmDraw()が呼ばれた時に描画だけでなく画面の更新もされるようにするにはどうすればよいですか?
745 名前:デフォルトの名無しさん mailto:sage [2022/01/26(水) 06:35:00.77 ID:R08bxH5q.net] WM_TIMERでBeginPaintはおかしいぞ WM_PAINT専用なんだから 無効領域ないのにBeginPaintしたらあかん [誘導] 続きはこっちでな Win32API質問箱 Build127 https://mevius.5ch.net/test/read.cgi/tech/1639053176/
746 名前:デフォルトの名無しさん mailto:sage [2022/01/26(水) 07:17:52.16 ID:T9eKedNN.net] InvalidateRectとかGetDC〜ReleaseDCだっけ?
747 名前:デフォルトの名無しさん mailto:sage [2022/01/26(水) 07:50:18.18 ID:td9ayUMw.net] アップデートはマイクロソフトがやりたい時にやる という基本理念を理解していないようだね
748 名前:デフォルトの名無しさん [2022/01/26(水) 09:14:18.23 ID:m89Xdimf.net] WM_TIMERでInvalidateRectしておくとWindowsがWM_PAINT呼んでくれるからそこで描画するんだっけ
749 名前:デフォルトの名無しさん mailto:sage [2022/01/26(水) 09:17:55.57 ID:qvNTvCwo.net] そもそもこれCだろ… WinMainから書く超基礎的コードをここで聞く頭がもうね
750 名前:デフォルトの名無しさん mailto:sage [2022/01/26(水) 09:26:13.12 ID:WR8doP3S.net] べつにアイドルループで描画してもいいんだよ メッセージの処理さえ忘れずにピークしてこなせば
751 名前:デフォルトの名無しさん mailto:sage [2022/01/26(水) 09:32:54.79 ID:g/1zEXcm.net] >>738 スレチなのは確かだが、いちいち見下して何がしたいんだお前
752 名前:デフォルトの名無しさん mailto:sage [2022/01/26(水) 09:36:18.65 ID:dkXO6/An.net] どこにでもいるんだよ 自分より下の者をいたぶることで 安心しようとするチンピラ気質なやつは
753 名前:デフォルトの名無しさん mailto:sage [2022/01/26(水) 10:21:44.17 ID:qvNTvCwo.net] だってココ定期的に湧くじゃん Windows使っててWin32APIの使い方聞いてくるC++ほとんど知らない自称天才のバカ 同じやつだよきっと 毎回Win32APIに誘導されてるってのにな
754 名前:デフォルトの名無しさん mailto:sage [2022/01/26(水) 10:46:25.17 ID:g/1zEXcm.net] あー、言われれば確かにそんなの居たっけ・・ でもまぁ同一人物とは限らないんだし誘導して終わりでいんじゃね たまに見当違いの初心者は入ってくるし(DirectXスレにDirectXランタイムのインスコの仕方聞きにきた猛者が居た
755 名前:デフォルトの名無しさん mailto:sage [2022/01/26(水) 10:59:27.08 ID:vhiSf69I.net] 733 すいません、そっちのスレは知りませんでした そちらで聞き直します
756 名前:デフォルトの名無しさん mailto:sage [2022/01/26(水) 11:06:01.05 ID:qvNTvCwo.net] DirectXスレにDirectXランタイムのインスコの仕方聞くのはまだ仕方ない話 ドライバ固有の問題に当たっているなら専門家に聞いた方がいいだろう 自称天才のバカである確率の方が高いと思うし、高確率で単発IDで荒らすバカも同じだろうし、わざわざレスしてくるやつも同じだろうから、バカにはバカと言ってあげた方が親切
757 名前:デフォルトの名無しさん mailto:sage [2022/01/26(水) 12:02:29.99 ID:dkXO6/An.net] 誘導ももう済んでるのに どうしても喧嘩言葉を使いたくて沸いてくる 三下のそのまた下の家畜はいいのか
758 名前:デフォルトの名無しさん [2022/01/26(水) 13:23:53.73 ID:m89Xdimf.net] DirectXランタイムが許されるならWin32 APIだって許してあげなよ 製品名はVisual C++だし、既定の拡張子 .cpp なんだから Win32はC++ではなくCだって言ってもしょうがない
759 名前:デフォルトの名無しさん mailto:sage [2022/01/26(水) 23:06:08.50 ID:UuxYD5f6.net] いかにも漏れは天才だが さすがにWinMain()から書くようなバリバリWindowsアプリの質問はしないかなあ、、、 漏れの言ってることがまるで理解できない低レヴェル凡人の反発を招くことはあってもな
760 名前:デフォルトの名無しさん mailto:sage [2022/01/27(木) 10:59:27.25 ID:Z+Vqme3O.net] 天才でも質問することあるんですね 回答者は超天才?
761 名前:デフォルトの名無しさん mailto:sage [2022/01/27(木) 11:49:44.22 ID:avZQ9Wm7.net] いかにも 私が超天才だが ってどっかのハンコ貰いにいく人事のCMみたい
762 名前:デフォルトの名無しさん mailto:sage [2022/01/29(土) 15:04:46.13 ID:mo0R2qbj.net] 大学の課題でコンパイルエラーになるので教えてもらいないでしょうか main.cppで、B<A> b; b.display(); のようにAを使っています。 g++ -Wall -std=c++17 -g -o test a.cpp main.cpp undefined reference to `operator<<(ostream&, A const&)' ※コンストラクタなどの関数定義は省略してます。 ■ a.h class A { public: string m_str; friend ostream & operator << (ostream &os, const A &a); }; ■ a.cpp ostream & operator << (ostream &os, const A &a) { os << a.m_str << endl; return os; } ■ b.h template <typename T> class B { public: void display(ostream &os = cout) const; T m_dummy; }; template <typename T> void B<T>::display(ostream &os) const { os << m_dummy << endl; // ここが undefined referenceエラー }
763 名前:751 mailto:sage [2022/01/29(土) 15:50:41.96 ID:mo0R2qbj.net] 失礼、自己解決しました。 namespaceをa.hだけ括って、a.cppに入れ忘れましたw
764 名前:デフォルトの名無しさん mailto:sage [2022/01/31(月) 02:23:38.98 ID:iz74n4+D.net] 下の★1を★2のように書きたいんだけど、どうやって書けばいいのか 教えてぇ #include <iostream> template <typename T> auto Sum(T h) { return h; } template <typename Head,typename... Rests> auto Sum(Head head,Rests... rests) { return head + Sum(rests...); } template<class F,class... Args> auto foo(F&& f,Args... args) { return f(args...); } int main( int argc, char *argv[] ) { std::cout << foo(Sum<int,int,int>,1,2,3) << "\n";//★1 //std::cout << foo(Sum,1,2,3) << "\n"; //★2 }
765 名前:はちみつ餃子 mailto:sage [2022/01/31(月) 04:05:32.34 ID:y6tOo2ii.net] >>753 そのようには書けない。 C++ では高階多相を許していない。
766 名前:デフォルトの名無しさん mailto:sage [2022/01/31(月) 04:18:19.49 ID:o5RGUewZ.net] なんでも適当に済ますクセ 高級言語に慣れすぎの弊害
767 名前:デフォルトの名無しさん mailto:sage [2022/01/31(月) 14:49:02.61 ID:y2HjUy1l.net] >>753 ・まず、Sumを多重定義にする必要性は特にないはず ・次に、fooが関数でSumが関数テンプレートの場合、 関数の実引数として具現しないテンプレートは渡せない だからfooの代わりにstd::bindを使っても解決しない ・テンプレートテンプレート仮引数を使っても クラステンプレートしか渡せず関数テンプレートは不可 こうなるとマクロくらいしか手がない #define foo(func, ...) func(__VA_ARGS__)
768 名前:デフォルトの名無しさん mailto:sage [2022/01/31(月) 16:24:09.60 ID:4mzN2AL1.net] 戻り値のautoが決まらないってことでしょ?autoをdouble固定にしてReturnをなくせば通る #include <iostream> auto sum() {return 0;} template<typename Head> auto sum(Head head) {return head;} template<typename Head, typename... Tails> auto sum(Head head, Tails ...tails) {return head + sum(tails...);} template<typename Return, typename... Args> Return wrap(Return (*f)(Args...), Args ...args) {return f(args...);} int main( int argc, char *argv[] ) { std::cout << sum(1,2.1) << std::endl; std::cout << wrap(static_cast<double(*)(int,double)>(sum), 1,2.1) << std::endl; std::cout << wrap(sum<int,double>, 1,2.1) << std::endl; std::cout << wrap(sum, 1,2.1) << std::endl; return 0; } // /usr/bin/g++ -fdiagnostics-color=always -g /home/user/cpp/autoreturn/sample.cpp -o /home/user/cpp/autoreturn/sample // /home/user/cpp/autoreturn/sample.cpp: In function ‘int main(int, char**)’: // /home/user/cpp/autoreturn/sample.cpp:10:29: error: no matching function for call to ‘wrap(<unresolved overloaded function type>, int, double)’ // 10 | std::cout << wrap(sum, 1,2.1) << std::endl; // | ^ // /home/user/cpp/autoreturn/sample.cpp:5:52: note: candidate: ‘template<class Return, class ... Args> Return wrap(Return (*)(Args ...), Args ...)’ // 5 | template<typename Return, typename... Args> Return wrap(Return (*f)(Args...), Args ...args) {return f(args...);} // | ^~~~ // /home/user/cpp/autoreturn/sample.cpp:5:52: note: template argument deduction/substitution failed: // /home/user/cpp/autoreturn/sample.cpp:10:29: note: couldn’t deduce template parameter ‘Return’ // 10 | std::cout << wrap(sum, 1,2.1) << std::endl; // | ^
769 名前:デフォルトの名無しさん mailto:sage [2022/01/31(月) 20:55:29.83 ID:ExACmeMg.net] >>753 auto Sum = [](auto head, auto... rests) { return (head + ... + rests); };
770 名前:デフォルトの名無しさん mailto:sage [2022/01/31(月) 22:50:37.06 ID:67CF9RIT.net] ラッパークラスを通せば似たようなことはできそう。 struct Wrapper_ { constexpr static auto doit = [](auto... args) { return Sum(args...); }; } wrapper; int main( int, char ** ) { std::cout << foo(wrapper.doit,1,2,3) << "\n"; }
771 名前:デフォルトの名無しさん mailto:sage [2022/02/01(火) 04:38:50.89 ID:X9o0BiPI.net] クラスは不要だった。 ラムダなら通るみたいだから、 >>758 みたいに元の関数をラムダで書くか、 auto wrapper = [](auto... args) { return Sum(args...); }; みたいなラッパー関数オブジェクト通すかってあたりで足りそう。 // 最初実験してたとき、ラムダ式にしただけだとエラー出てた気がしたんだけど、今やると問題なく通る…
772 名前:デフォルトの名無しさん mailto:sage [2022/02/01(火) 05:38:09.33 ID:wGiSz27Y.net] おお、auto... なんてできたのか
773 名前:デフォルトの名無しさん mailto:sage [2022/02/01(火) 07:53:40.48 ID:vPA4cgbg.net] >>757 にラムダ入れた。 ラムダはオーバーロードできずC++17の畳み込み式が必須で引数なしが表現できないが、選択の手間がない。 #include <iostream> auto sum() {return 0;} template<typename Head> auto sum(Head head) {return head;} template<typename Head, typename... Tails> auto sum(Head head, Tails ...tails) {return head + sum(tails...);} template<typename Return, typename... Args> Return wrap(Return (*f)(Args...), Args ...args) {return f(args...);} auto lambda_sum = [](auto head, auto ...tails) {return (head + ... + tails);}; // 追加 auto lambda_wrap = [](auto f, auto ...args) {return f(args...);}; // 追加 int main( int argc, char *argv[] ) { std::cout << sum() << std::endl; // 追加 std::cout << sum(1) << std::endl; // 追加 std::cout << sum(1,2.1) << std::endl; std::cout << wrap(static_cast<double(*)(int,double)>(sum), 1,2.1) << std::endl; std::cout << wrap(sum<int,double>, 1,2.1) << std::endl; // std::cout << wrap(sum, 1,2.1) << std::endl; // エラー // lambda版追加 // std::cout << lambda_sum() << std::endl; // エラー std::cout << lambda_sum(1) << std::endl; // 追加 std::cout << lambda_sum(1,2.1) << std::endl; std::cout << lambda_wrap(static_cast<double(*)(int,double)>(sum), 1,2.1) << std::endl; std::cout << lambda_wrap(static_cast<double(*)(int,double)>(lambda_sum), 1,2.1) << std::endl; std::cout << lambda_wrap(sum<int,double>, 1,2.1) << std::endl; // std::cout << lambda_wrap(lambda_sum<int,double>, 1,2.1) << std::endl; // not template // std::cout << lambda_wrap(sum, 1,2.1) << std::endl; // エラー std::cout << lambda_wrap(lambda_sum, 1,2.1) << std::endl; return 0; }
774 名前:デフォルトの名無しさん mailto:sage [2022/02/01(火) 22:23:26.64 ID:rdLB3H0G.net] c++では sz=120; char dt[sz]; このように配列のサイズを変数の可変サイズで指定することはできないんですか? これを実現する方法は何かありませんか?
775 名前:デフォルトの名無しさん mailto:sage [2022/02/01(火) 22:43:02.67 ID:rdLB3H0G.net] 自己解決しました しかし dt[10][d] のように2次元以上はjavaのような動的変動はできないんですね
776 名前:デフォルトの名無しさん mailto:sage [2022/02/01(火) 23:27:31.22 ID:fhOfpvRh.net] vector使わんの?
777 名前:デフォルトの名無しさん mailto:sage [2022/02/01(火) 23:28:28.99 ID:hJiWfYJV.net] 配列使わんし
778 名前:デフォルトの名無しさん mailto:sage [2022/02/01(火) 23:30:45.06 ID:Sh1zYLGa.net] >>763 arrayという似たようなやつはあるが 基本的に作法が違う
779 名前:デフォルトの名無しさん mailto:sage [2022/02/02(水) 10:03:42.12 ID:pPu7Tazo.net] コンストラクタ・テンプレートでテンプレート実引数を推定させず明示的に与えるのはどう書く? struct some_class { template <class A> some_class(int) {} }; int main() { some_class obj<void>(1); //error }
780 名前:デフォルトの名無しさん mailto:sage [2022/02/02(水) 12:11:02.47 ID:ryNE78sg.net] >>768 コンストラクタには明示的に型引数を渡せない
781 名前:デフォルトの名無しさん mailto:sage [2022/02/02(水) 12:36:54.65 ID:pPu7Tazo.net] そっか。。。残念 thx >>769
782 名前:デフォルトの名無しさん mailto:sage [2022/02/02(水) 12:56:51.10 ID:X/91R13x.net] ファイルサイズを取得しようとしていろいろサイトを参考にして次のようにしたのですが std::filesystem::file_size(path) filesystemのところに赤線が出て使用できません これらは記述しています #include <iostream> #include <fstream> #include <filesystem> 使っているのはCommunity 2019です filesystemが使えないのはなぜでしょう?
783 名前:デフォルトの名無しさん mailto:sage [2022/02/02(水) 13:02:34.63 ID:ryNE78sg.net] >>771 filesystemが使えるのはC++17以降 プロジェクトの設定から言語バージョンをC++14(既定)->C++17に
784 名前:デフォルトの名無しさん mailto:sage [2022/02/02(水) 13:34:32.24 ID:pPu7Tazo.net] >>771 /std:c++17は指定してる?
785 名前:デフォルトの名無しさん mailto:sage [2022/02/02(水) 13:43:30.57 ID:X/91R13x.net] ありがとうございます C++17指定できました
786 名前:デフォルトの名無しさん mailto:sage [2022/02/03(木) 12:49:10.84 ID:d1XPVqCl.net] filesystemは、できればC++20モードで使いたい file_clockまわりがC++17ではgdgdだから
787 名前:デフォルトの名無しさん mailto:sage [2022/02/04(金) 13:06:35.94 ID:ovGR74Kw.net] 小文字に変換するプログラムです string toLowerCase(const string& str) { string lower = str; std::transform(lower.begin(), lower.end(), lower.begin(), std::tolower); return lower; } 実行するとstd::transform 一致するオーバーロードする関数が見つかりません、とか 6引数が必要です 4が設定されてます、とか出て 実行できません これは何が問題なのでしょうか?
788 名前:デフォルトの名無しさん mailto:sage [2022/02/04(金) 13:07:58.25 ID:N/NFryku.net] tolowerが多重定義関数だからじゃね?
789 名前:デフォルトの名無しさん mailto:sage [2022/02/04(金) 13:22:13.60 ID:ovGR74Kw.net] 自分では他に定義してないんですがどこで定義されてるんでしょう
790 名前:はちみつ餃子 mailto:sage [2022/02/04(金) 13:28:07.50 ID:RpLWwySn.net] >>776 ちょうど >>658 で同じような事例が出ている。 std::tolower は cctype ヘッダと locale ヘッダにそれぞれあって locale ヘッダのほうが関数テンプレートだし二引数なのでこの場の都合に合わない。 なんらかの方法でどれを使うのか選択する必要があり、 たとえば static_cast などが使える。 ただ、 >>661 が提示しているようにデフォルト引数が追加される可能性があったりもするので static_cast よりはラムダ式を経由するほうが安心できるスタイルかもね。 #include <iostream> #include <string> #include <algorithm> #include <cctype> std::string toLowerCase(const std::string& str) { std::string lower; std::transform(std::begin(str), std::end(str), std::back_inserter(lower), static_cast<int(*)(int)>(std::tolower)); return lower; } int main(void) { std::cout << toLowerCase("abcDEfgHi") << std::endl; }
791 名前:デフォルトの名無しさん mailto:sage [2022/02/04(金) 13:35:40.02 ID:ovGR74Kw.net] ありがとうございます ビルド通ったみたいです
792 名前:デフォルトの名無しさん mailto:sage [2022/02/04(金) 13:55:24.36 ID:3M0ClPfa.net] 最近のはptr_funやんなくても通んだな
793 名前:デフォルトの名無しさん mailto:sage [2022/02/05(土) 11:50:25.88 ID:DOE5sh/+.net] template<yyy T>//yyyはコンセプト requires !xxx<T>//xxxはコンセプト void test(const T& a);//yyyのコンセプトを満たしxxxのコンセプトを満たさないものについて処理したい C++20のコンセプトのrequires節って!使うと警告出るのでわざわざ否定用のコンセプト作成して対応してるんだけど、もっと簡単な仕組みない?
794 名前:デフォルトの名無しさん mailto:sage [2022/02/05(土) 11:52:48.48 ID:vpksE3yJ.net] requires (!xxx<T>)
795 名前:デフォルトの名無しさん mailto:sage [2022/02/05(土) 12:04:00.17 ID:DOE5sh/+.net] 解決した!ありがとう!
796 名前:デフォルトの名無しさん mailto:sage [2022/02/05(土) 20:23:31.04 ID:Irrrknzv.net] #define FOO() 1 #if FOO ... #endif と書いた場合FOOの後ろに()付けるの忘れてるのでコンパイルエラーになって欲しいんですが 実際はFOOは偽に評価されてるみたいです 何が起きてるんでしょうか?
797 名前:はちみつ餃子 mailto:sage [2022/02/05(土) 20:31:08.99 ID:NEwj3nV7.net] >>785 #if の条件の部分ではマクロ展開できるものを全部展開したあとに知らない識別子が残ったら 0 と解釈する。
798 名前:デフォルトの名無しさん mailto:sage [2022/02/05(土) 20:32:57.42 ID:BHACckaU.net] >>785 FOO に () が無いことで展開されず、マクロ展開後に残った識別子として 0 に置き換わってる。 https://timsong-cpp.github.io/cppwp/n4868/cpp.cond#11.sentence-1 > After all replacements ..., all remaining identifiers and keywords, > except for true and false, are replaced with the pp-number 0, ...
799 名前:デフォルトの名無しさん mailto:sage [2022/02/06(日) 01:29:50.60 ID:Yc7Iwiyd.net] >>785 バカですか?
800 名前:デフォルトの名無しさん mailto:sage [2022/02/06(日) 01:32:54.82 ID:3BxbnhGH.net] #if defined(FOO) ... #endif
801 名前:デフォルトの名無しさん mailto:sage [2022/02/06(日) 01:34:05.59 ID:Yc7Iwiyd.net] Cの基本が出来てないくせにC++を使いこなせると思うなよ
802 名前:デフォルトの名無しさん mailto:sage [2022/02/06(日) 01:35:00.88 ID:H2F64OwB.net] 横からだけど知らなかった
803 名前:デフォルトの名無しさん mailto:sage [2022/02/06(日) 03:28:00.08 ID:XnD7OQcd.net] >>786 >>787 ありがとうございます このルールは知りませんでした
804 名前:デフォルトの名無しさん mailto:sage [2022/02/06(日) 06:46:34.29 ID:qvD4QsX7.net] こういう馬鹿のためにコンパイラに無駄なルールが必要になるんだなと実感
805 名前:デフォルトの名無しさん mailto:sage [2022/02/06(日) 06:55:06.64 ID:usxBX4wT.net] エラーにならないのは理不尽だな
806 名前:デフォルトの名無しさん mailto:sage [2022/02/06(日) 08:23:12.41 ID:qvD4QsX7.net] 馬鹿のためにわざわざプリプロセスで構文解析エラーを要求するとか馬鹿の極み
807 名前:デフォルトの名無しさん mailto:sage [2022/02/06(日) 08:30:29.95 ID:usxBX4wT.net] FOOが0になる根拠を与えていないだろ 関連付けられていないものが出てくるのがおかしいと思わないとしたらPG適性低いぞ
808 名前:デフォルトの名無しさん mailto:sage [2022/02/06(日) 08:53:46.75 ID:2YxKeDPZ.net] 唐突に0がどうとか言い出すのはセンス無いわ
809 名前:デフォルトの名無しさん mailto:sage [2022/02/06(日) 09:07:44.45 ID:HE5J2RYG.net] 初めて知った
810 名前:デフォルトの名無しさん mailto:sage [2022/02/06(日) 09:24:54.74 ID:usxBX4wT.net] >>797 >>786
811 名前:デフォルトの名無しさん mailto:sage [2022/02/06(日) 09:35:58.81 ID:qvD4QsX7.net] 馬鹿は当たり前のように英語も読めない
812 名前:デフォルトの名無しさん mailto:sage [2022/02/06(日) 09:36:22.76 ID:vWDceL4H.net] なんじゃそりゃ>>799 はC++規格委員会が死ね言うたら死ぬんか、
813 名前:デフォルトの名無しさん mailto:sage [2022/02/06(日) 09:57:50.12 ID:vWDceL4H.net] 規格書にはなんでそうなっているのか(置換されずに残ったFOOをエラーではなく0にするのか)の理由が書かれていないが #ifdef defined(FOO) && FOO として現れる論理式「defined(FOO) && FOO」の解釈を簡単にやりたい(FOOが未定義の場合でも通常の式の解釈ルーチンで処理したい 的なしょーもない理由だったりして……
814 名前:デフォルトの名無しさん mailto:sage [2022/02/06(日) 09:59:13.49 ID:vWDceL4H.net] まつがえたorz ×: #ifdef defined(FOO) && FOO ○: #if defined(FOO) && FOO
815 名前:デフォルトの名無しさん mailto:sage [2022/02/06(日) 10:11:26.46 ID:usxBX4wT.net] >>801 唐突じゃないことを示したまで 事実関係をよく確認してからセンス無いとかドヤれってこと
816 名前:デフォルトの名無しさん mailto:sage [2022/02/06(日) 10:16:43.48 ID:a0g451d/.net] 理由はたぶん、規格化以前に存在した実装の動作を規格違反とするのはマズいとか、 その動作に依存して #if FOO としてる既存ソースをエラーとするわけにはいかなかったとか、 そんなところだろうと思う。 マズい動作として検出したければ警告は出せるんだし。
817 名前:デフォルトの名無しさん mailto:sage [2022/02/06(日) 11:57:03.48 ID:qvD4QsX7.net] 馬鹿がまだ騒いでるのかw こういう変なコードとの対比w $ g++ -x c++ - <<EOF auto f = [](){return 2;}; #define f() 1 int main() { auto i = f(); auto j = f; return i + j(); } EOF $ ./a.out $ echo $? 3 $
818 名前:はちみつ餃子 mailto:sage [2022/02/06(日) 12:12:45.00 ID:u7K67HUJ.net] 残った識別子を 0 に解釈する挙動は C89 からの仕様だから C89 の Rationale (根拠) を見たんだけど直接的な言及は見つからない。 https://docs.google.com/viewer?a=v&pid=explorer&chrome=true&srcid=0BxVCLS4f8Sg5NWZmM2NjZWEtYmExMS00Y2EzLWE3ZTMtNzFmYjYwYzBiOTIw&hl=en_US ただ、既存のコードに差し障りがないようにということは明記してある (3.8.3) ので、 その時点でそういう挙動が支配的 (かつそれに依存するコードが多かった) のだろうとは察せられる。 規格ってのは統一を図るってのが第一の目的だけど無理な仕様でまとめちゃうと誰もその規格に従わないだけなんで、 現実にそれでやっているってのも (たとえ不格好でも) 十分な理由になるんだよ。
819 名前:デフォルトの名無しさん mailto:sage [2022/02/06(日) 12:26:28.98 ID:qvD4QsX7.net] そう書かれるとC89っぽく書かないといかんのか?w 変更部分のみw $ gcc -x c -std=c89 - <<EOF int f(void){return 2;} #define f() 1 int main(void) { int i; int (*j)(); i = f(); j = &f; return i + (*j)(); } EOF
820 名前:デフォルトの名無しさん mailto:sage [2022/02/06(日) 12:53:10.29 ID:FF40fIFl.net] CとC++の規格は既存コードへの忖度の塊で出来てるからな 万人の敵だったgets()を削除するのにどんだけ苦労してるのやら
821 名前:デフォルトの名無しさん mailto:sage [2022/02/06(日) 13:16:26.39 ID:vWDceL4H.net] >>806 >>808 スレに乗っかったつもりにしては #if f 〜 #endif というのが含まれて無いようだが?
822 名前:デフォルトの名無しさん mailto:sage [2022/02/06(日) 13:22:45.35 ID:vWDceL4H.net] >>807 C++規格委員会は無罪なのかもしれんがじゃあなんでC89以前からそうで そういう挙動が支配的になってしまう事態になってしまったのか、と考えると やっぱプリプロセッサの最初の設計者がサボって プリプロセッサ式の途中でのFOOの定義/未定義判定を define(FOO)を導入する代わりに仕様の方を弄って簡単ハックしてしまったから のでは……
823 名前:デフォルトの名無しさん mailto:sage [2022/02/06(日) 13:33:49.71 ID:qvD4QsX7.net] コードを示しても馬鹿には伝わらない悲しみw
824 名前:デフォルトの名無しさん mailto:sage [2022/02/06(日) 13:37:12.22 ID:vWDceL4H.net] >>812 天才にもわかるようにkwsk
825 名前:デフォルトの名無しさん mailto:sage [2022/02/06(日) 13:39:17.55 ID:qvD4QsX7.net] 天才は自力でなんとか出来るし、他人を信用しないことも多いから、基本的に質問とかする機会がない アイデアレベルの話のみ
826 名前:デフォルトの名無しさん mailto:sage [2022/02/06(日) 14:11:31.07 ID:Yc7Iwiyd.net] (σ゚ω゚)σゲッツ stdioのバッファ使うヤツ殆ど失敗作
827 名前:デフォルトの名無しさん mailto:sage [2022/02/06(日) 14:22:31.03 ID:yFNvdNoT.net] #define マクロは単純置換のやつと関数形式のやつがある #define A(a,b) A();A(1);A(1,2,3);A(1,);A(,2);A; 結構めちゃくちゃなことやってもプリプロセスはエラー吐かない 引数足りないとか関数形式マクロの括弧がないのは意図しない使い方だろうからエラーにしてもらいたい気持ちはわかるが というか<<802で言及されてるけど#if UNDEFINEDも非推奨にしてほしいわ #define DEBUG #define DEBUG 1 #define DEBUG 0 //#define DEBUG (undefined) これらの全部のケースに対応できてねーし #if DEBUG+0 とか書けとでも?
828 名前:デフォルトの名無しさん mailto:sage [2022/02/06(日) 15:06:24.27 ID:qvD4QsX7.net] 俺のコードのg++やgccをcppに変えればプリプロセスの結果が出るよw オプション引数に-Eを付けても可w 別に不思議でも何でもない結果が表示されるw $ cpp -x c++ - <<EOF #define A(a,b) expanded A(); A(1); A(1,2,3); A(1,); A(,2); A; EOF # 1 "<stdin>" # 1 "<built-in>" # 1 "<command-line>" # 1 "/usr/include/stdc-predef.h" 1 3 4 # 1 "<command-line>" 2 # 1 "<stdin>" <stdin>:2:3: error: macro "A" requires 2 arguments, but only 1 given <stdin>:1: note: macro "A" defined here A; <stdin>:3:4: error: macro "A" requires 2 arguments, but only 1 given <stdin>:1: note: macro "A" defined here A; <stdin>:4:8: error: macro "A" passed 3 arguments, but takes just 2 <stdin>:1: note: macro "A" defined here A; expanded; expanded; A; $
829 名前:デフォルトの名無しさん mailto:sage [2022/02/06(日) 16:46:37.28 ID:XnD7OQcd.net] インクルードガード書くときも単に #define FOO_HPP とするのと #define FOO_HPP 1 と1にするのがあるがどちらが良いとかあるんだろうか 後者の方がconstexpr if文などのC++の言語機能と組み合わせて使えるというメリットがありそうだが
830 名前:デフォルトの名無しさん mailto:sage [2022/02/06(日) 16:54:43.06 ID:W01LuusE.net] 今から新規に書くなら #pragma once 一択
831 名前:はちみつ餃子 mailto:sage [2022/02/06(日) 17:09:14.27 ID:u7K67HUJ.net] >>818 私自身は前者にしてる。 インクルードしたことを示すためのフラグとしてのマクロが必要なら (そういう事例に遭遇したことはないが) ガード用とは別にマクロ定義すると思う。 ガードのために定義したものをガード以外の目的で使うというのがちょっと汚く感じるから。 だけど分けちゃうと管理が二重になるのが嫌だと思う人もいるだろうし、 思想によるんじゃないの。 私は規格厨なので #pragma once は使わない。 まあ gcc と clang と msvc で使えるから事実上は問題にならないけど。
832 名前:デフォルトの名無しさん mailto:sage [2022/02/06(日) 17:25:15.43 ID:XnD7OQcd.net] >>820 ありがとう 納得できる理由です インクルードガード以外のフラグも同様にしてますか? 標準のNDEBUGのように
833 名前:はちみつ餃子 mailto:sage [2022/02/06(日) 17:46:04.51 ID:u7K67HUJ.net] >>821 NDEBUG は「デバッグモードとそうでないモードを切り替える」というのがその用途なので それに沿うと思ったら分けずに NDEBUG を使うことはあるよ。 でも「NDEBUG の用途は assert の有効・無効の切り替えなので他に使うべきでない」と認識している人がいてもおかしくない。 規格に書いてあるのはこの場合はこうだという規則だけなので 抽象的な部分での意味の捉え方は人によってかなり幅がある。 そのあたりは文脈を察して常識的判断でやっていくしかないし、 チームでやってるなら話し合うしかしょうがない。 このへんはそんなにスッパリと判断基準を設けられるようなもんではないと思う。
834 名前:デフォルトの名無しさん mailto:sage [2022/02/06(日) 19:09:51.99 ID:qvD4QsX7.net] MS発祥のモノが嫌われてるだけとも思うw
835 名前:デフォルトの名無しさん mailto:sage [2022/02/06(日) 19:46:48.16 ID:XnD7OQcd.net] >>822 質問の意図がわかりにくくてすみません 自前でフラグ書くなら >>818 の前者と後者どちらを使うのかが知りたかった
836 名前:はちみつ餃子 mailto:sage [2022/02/06(日) 20:08:36.06 ID:u7K67HUJ.net] >>824 基本的には前者。 フラグとしてのマクロで分岐するときは #if よりも #ifdef (または defined) を使うようにしてる。 マクロは型を付けられないからそうすることで ON/OFF のどちらかであって内容に意味はない ことを明示してる感じを出したいと思ってる。
837 名前:デフォルトの名無しさん mailto:sage [2022/02/06(日) 20:55:43.12 ID:XnD7OQcd.net] >>825 改めての回答ありがとうございます こういう一見どちらでも良いものであっても裏の考えや意図が聞けて面白かったです
838 名前:デフォルトの名無しさん mailto:sage [2022/02/07(月) 06:01:51.26 ID:a2THiWt1.net] #pragma onceを標準に採用すればええのに これだけ需要あるのに長年ずっと放置状態 何がそん
839 名前:なに問題なんだろう [] [ここ壊れてます]
840 名前:はちみつ餃子 mailto:sage [2022/02/07(月) 09:54:39.71 ID:T4nofIq4.net] 現行仕様での理屈の立て方としては #include の効果でコードに一体化してから内容の解釈が始まるので インクルードに干渉する余地がない。 現実にやってるんだから出来るのは間違いないんだけど理屈を根本から変えることになるし、 モジュールが上手くいけばどうでもよくなることに手間をかけたくないんじゃないかな。
841 名前:デフォルトの名無しさん mailto:sage [2022/02/07(月) 11:19:39.20 ID:3u4X3WRg.net] シンボリックリンクで別のパスになってたりとか、同じ内容の別ファイルとか、ファイル名違う中身同じファイルとか、日付だけ違う別ディレクトリの同じ内容のファイルとか そんなの考えたくないよなーw
842 名前:はちみつ餃子 mailto:sage [2022/02/07(月) 11:53:54.22 ID:T4nofIq4.net] 名前と実体をどう対応付けるかは今でも処理系定義なのでそこらへんはあまり問題にならないと思う。
843 名前:デフォルトの名無しさん mailto:sage [2022/02/07(月) 11:56:53.41 ID:XrnUHtPA.net] そこで#pragma onceはヘッダファイルそのものをインクルード済とみなすのではなくて 定義されている内容を定義済みと記憶するのが妥当な動作 なんだけど以下のような場合に困るという、 "a.h" struct Foo { "b.h" int m_x; double m_y; }; "c.cpp" #include "a.h" #include "b.h" やっぱモジュールにしたら同じような実装で完全な解決になるのだから待った方が、
844 名前:デフォルトの名無しさん mailto:sage [2022/02/07(月) 12:22:03.46 ID:XrnUHtPA.net] 現行の #ifdef _FOO_H_ #define _FOO_H_ .... #endif はヘッダファイルをインクルード済みか否かではなく マクロ_FOO_H_が定義済みか否かを問題にしているのである意味モジュールに近い #pragma onceは現行のマイクロソフトのやつはヘッダファイルをインクルード済みか否かを問題にしているので 何をもって同一のヘッダファイルとみなすのかという解釈の揺らぎの影響を受けてしまうまインクルードの挙動が、
845 名前:デフォルトの名無しさん mailto:sage [2022/02/07(月) 12:25:19.77 ID:3u4X3WRg.net] >>830 だからどう転ぼうと中身で決められる昔ながらの方法の方が結果が明確ということw ちなみにgccは シンボリックリンク→ガード 同じ内容・日付・名前、別ディレクトリの別ファイル→ガード 同じ内容・名前、別日付、ディレクトリの別ファイル→インクルード 同じ内容・日付、別名前、ディレクトリの別ファイル→インクルード みたい
846 名前:デフォルトの名無しさん mailto:sage [2022/02/07(月) 12:42:43.58 ID:OoGLA1C8.net] MSの手抜き仕様まで合わせる必要なし
847 名前:デフォルトの名無しさん mailto:sage [2022/02/07(月) 12:56:32.61 ID:3qCWHTEM.net] でもCに代わってC++が広まったのはMSのおかげじゃん
848 名前:デフォルトの名無しさん mailto:sage [2022/02/07(月) 13:10:46.99 ID:a2THiWt1.net] ビット数多めのハッシュにしとけば 例えば衝突確率340澗分の1とかにできるよな
849 名前:デフォルトの名無しさん mailto:sage [2022/02/09(水) 12:59:20.15 ID:ioLTStxt.net] 64bit osでポインタ型を4byteにするにはどうすればいいんですか? 8byteだとちょっと大きすぎる気がします
850 名前:デフォルトの名無しさん mailto:sage [2022/02/09(水) 13:03:37.90 ID:IwR5waiE.net] なぜ大きすぎると思ったのかが分からないが、64bitのアドレス空間を表すのに8 byteは必要だよ
851 名前:デフォルトの名無しさん mailto:sage [2022/02/09(水) 13:08:06.15 ID:PzVUb2uc.net] >>837 貧乏くさすぎ
852 名前:デフォルトの名無しさん mailto:sage [2022/02/09(水) 13:19:23.53 ID:eAgudC7+.net] 64bit WindowsOSなら32bitアプリにすればok
853 名前:デフォルトの名無しさん mailto:sage [2022/02/09(水) 13:40:55.45 ID:ioLTStxt.net] 例えば64bitの場合アドレスの上位4byteを一意に決めといて下位4byteを4byteの変数に格納しておくってやり方なんてはどうですか? それで復元時には (上位4byte << 32) & 下位4byteっていうふうに変換するってふうになると思うんですが まず最初に上位4byteが一致した連続したメモリ領域から決まってメモリを確保するなんてことはできるのでしょうか?
854 名前:デフォルトの名無しさん mailto:sage [2022/02/09(水) 13:52:00.55 ID:USCqmiY8.net] 必要なメモリをvector<X>で確保しておいて32bit以下のindex値でアクセスすることにすれば? ポインタのサイズが大きすぎるなんて理由でやる人はいないと思うけど
855 名前:デフォルトの名無しさん mailto:sage [2022/02/09(水) 13:52:47.57 ID:E/6u1YW1.net] long long ago... タイニー、スモール、コンパクト、ミディアム、ラージ、ヒュージつーのがあってだな
856 名前:デフォルトの名無しさん mailto:sage [2022/02/09(水) 14:26:32.14 ID:ioLTStxt.net] >>842 そうすることにします ありがとうございました
857 名前:デフォルトの名無しさん mailto:sage [2022/02/09(水) 14:34:15.15 ID:PzVUb2uc.net] 関数ポインタかなんかが8バイトに収まってなくて混乱したことがあったっけ
858 名前:デフォルトの名無しさん mailto:sage [2022/02/09(水) 14:37:12.22 ID:Jq7h8mT9.net] 昔は16bitポインタと32bitポインタをLPとPで使い分けてたって戦争で死んだおじいちゃんに聞いた
859 名前:デフォルトの名無しさん mailto:sage [2022/02/09(水) 17:17:57.87 ID:SS+/CtsS.net] segment:offset時代か・・・
860 名前:デフォルトの名無しさん mailto:sage [2022/02/09(水) 18:17:45.02 ID:t2vkJvVR.net] アセンブラの相対ショートジャンプは8ビット
861 名前:デフォルトの名無しさん mailto:sage [2022/02/09(水) 22:34:51.11 ID:9agulkW+.net] ウィンドーズならINT_PTR使っとけばおkオール無問題 C++の標準規格でどうなっているのかわ知らん
862 名前:はちみつ餃子 mailto:sage [2022/02/09(水) 23:19:57.51 ID:9Cj+df9g.net] 規格上は std::intptr_t というものがある。 ただし関数ポインタやメンバ関数ポインタを格納できるとは限らない。 また、省略可能 (optional) であると明記されているので無くても規格準拠たりうる。 関数ポインタ同士 (メンバ関数ポインタは含まない) はお互いに変換可能であり 元の型にキャストしたら元の値と等しくなることは保証されるので 任意の型の関数ポインタを格納したいのであれば void* や intptr_t を使うよりは 適当な型の関数ポインタに入れるほうが規格に沿う。 メンバ関数ポインタは型通りに扱う以外はほとんど何の保証もないのだけれど 無理に変換して扱いたい場合も特に思いつかないのでどうでもいい。
863 名前:デフォルトの名無しさん mailto:sage [2022/02/10(木) 02:00:13.27 ID:vaE+JZMI.net] >>843 far/near を直接指定すれはすむ話、メモリモデルなんてどうでもいい
864 名前:デフォルトの名無しさん mailto:sage [2022/02/10(木) 19:32:52.48 ID:OsDlZl05.net] effective C++って現行のC++と比べてどのあたりが古いんですか? 代表的なところとかだけでも教えてくれると嬉しいです
865 名前:デフォルトの名無しさん mailto:sage [2022/02/10(木) 19:38:59.22 ID:NUzD8R/O.net] 全て
866 名前:デフォルトの名無しさん mailto:sage [2022/02/10(木) 20:00:39.81 ID:qtJUe0L+.net] 出版1998年やんけ こんなもん使うぐらいならC言語やった方がマシなレベル
867 名前:デフォルトの名無しさん mailto:sage [2022/02/10(木) 20:11:39.77 ID:OsDlZl05.net] >>854 一応第3版は原書が2005年に書かれています…
868 名前:デフォルトの名無しさん mailto:sage [2022/02/10(木) 20:20:25.92 ID:ZkLGowhi.net] 続編のeffective modern c++も古いけど、 こっちは隕石落下後の本だから読んでおいたほうがいいよ
869 名前:デフォルトの名無しさん mailto:sage [2022/02/10(木) 21:18:10.31 ID:OsDlZl05.net] 隕石落下後ってなんすか? あとC++の勉強するならこの本読め、みたいなのって他にもありますか?
870 名前:デフォルトの名無しさん mailto:sage [2022/02/10(木) 21:38:32.90 ID:ty8Wss5J.net] 2005年でも古いなあ C++98, 03, 11(0x), 14, 17, 20 と5回バージョンアップあるし そのたびに標準ライブラリが更新されてる 古い本で古い書き方しか知らないと慣れてきたころにイラつくことになるから最低でもC++11対応のやつがいい
871 名前:デフォルトの名無しさん mailto:sage [2022/02/10(木) 21:44:00.87 ID:Qcxer4Pv.net] 今更auto_ptr使うなとか言われても何の役にも立たないからな
872 名前:デフォルトの名無しさん mailto:sage [2022/02/10(木) 23:48:22.57 ID:jkDJeeU1.net] べつに使ってもいいんだよ 使い方さえ間違えなければ
873 名前:デフォルトの名無しさん mailto:sage [2022/02/11(金) 00:26:40.18 ID:3fYQCkDW.net] 使うことが間違いでは?
874 名前:デフォルトの名無しさん mailto:sage [2022/02/11(金) 04:33:24.42 ID:ajov4Ad8.net] 左辺値参照で無理やりムーブ作ったやつね
875 名前:デフォルトの名無しさん mailto:sage [2022/02/11(金) 06:13:41.97 ID:ycfpInN1.net] 仕様のバージョンは普通自分で選ぶもんじゃないので、古いことを知るのだって意味はある 逆にどの辺が古い、というのが分かってもあまり意味ない
876 名前:デフォルトの名無しさん mailto:sage [2022/02/13(日) 06:29:47.80 ID:DI/GcuLa.net] いろんな範囲で一様乱数を次々と生成したいときってどうしますか? uniform_int_distribution の範囲を次々と param で変える? あるいは、妥協して剰余をとる形で範囲を変える?
877 名前:デフォルトの名無しさん mailto:sage [2022/02/13(日) 06:32:11.91 ID:DI/GcuLa.net] あるいは、uniform_int_distribution を次々と生成して使い捨てる? 実測するべきなんでしょうが、どれがオーバーヘッドが少ないかというカンがありません
878 名前:デフォルトの名無しさん mailto:sage [2022/02/13(日) 06:51:44.09 ID:rfXE6dHR.net] 色々手はあるね 「いろんな範囲」の個数が決まっているならuniform_int_distributionの配列にするもよし ランダムならparamもよし 次々と生成して使い捨て、つまりコンストラクタとデストラクタを都度実行するのは 俺はあんまりやりたくないが止めもしない
879 名前:デフォルトの名無しさん mailto:sage [2022/02/13(日) 07:21:47.95 ID:JnTPIF3C.net] >>865 同じ範囲を何回も使うならその分distributionを用意する、そうでないならparamを変えていくのが良さそうに思います。が、たぶん実行時の差はほぼ無いです。 いちおう関数の定数を書き換えていくかメモリ上に予めたくさん用意するかの違いとして判断しました。 計算重いのは大抵は乱数生成の方だと思うので、速くしたいならそっちをとりかえたほうがいいと思います。
880 名前:デフォルトの名無しさん mailto:sage [2022/02/13(日) 07:48:28.31 ID:rfXE6dHR.net] メルセンヌツイスターの売りの1つが速度がそんなに遅くない点だね
881 名前:デフォルトの名無しさん mailto:sage [2022/02/13(日) 10:06:40.11 ID:+NRIy/Ul.net] なんで剰余を取るのが妥協なん?
882 名前:デフォルトの名無しさん mailto:sage [2022/02/13(日) 10:33:38.50 ID:SeV3jiEK.net] 一様性が一般に崩れるから
883 名前:デフォルトの名無しさん mailto:sage [2022/02/13(日) 10:37:30.83 ID:SeV3jiEK.net] 個人的にはこうやってみたりしてゐる、 /// 閉区間[0, ub]を値域とする一様乱数を生成する。 unsigned long genrand_int32_with_ub(unsigned long ub) { assert(0 < ub && ub < (unsigned long)UINT32_MAX); const uint64_t F = (uint64_t)UINT32_MAX; const uint64_t W = (uint64_t)ub + (uint64_t)1; const uint64_t Q = F / W; #ifndef NDEBUG const uint64_t R = F - W * Q; assert(Q > 0 && 0 <= R && R < W); #endif // 半開区間[0, (W+1)*Q)を値域とする一様乱数取得 const uint64_t WQ = W * Q; uint64_t rndLTWQ; do { rndLTWQ = (uint64_t)genrand_int32(); //print
884 名前:f("rndLTWQ=0x%08x, Q=0x%016llu\n", rndLTWQ, Q); } while (rndLTWQ >= WQ); // Qで割る。 const uint64_t r = rndLTWQ / Q; assert(0 <= r && r <= ub); return (unsigned long)r; } [] [ここ壊れてます]
885 名前:デフォルトの名無しさん mailto:sage [2022/02/13(日) 10:52:20.14 ID:cIrOgCom.net] 標準ライブラリ使わんの?
886 名前:はちみつ餃子 mailto:sage [2022/02/13(日) 11:12:52.07 ID:nD0XyBZB.net] >>869 分かり易い例として 0 から 9 の一様な乱数列を生成するものを考えてみればいい。 このとき 0 から 7 の値が必要だからといって 8 の余剰を取ったらどうなる? 8, 9 が 0, 1 になるから 0 と 1 の出現確率が他の倍になってしまうだろ。 生成される値の幅が必要な値の幅よりも十分に大きいなら 許容可能な誤差として無視できる場合も多いとは思うが 様々なパラメータが有りうる状況では検証しづらい。
887 名前:はちみつ餃子 mailto:sage [2022/02/13(日) 11:15:35.52 ID:nD0XyBZB.net] >>872 呼出しのたびに必要な範囲が違うような Distribution が標準に無いという文脈
888 名前:ハノン mailto:sage [2022/02/13(日) 12:39:58.09 ID:1UprWsoO.net] >>873 それもあるけれども、昔の擬似乱数列は絶望的なまでに下位桁がランダムではない、という事情をひきずっているのでは?まあ MT はそうじゃないけどね
889 名前:デフォルトの名無しさん mailto:sage [2022/02/13(日) 13:09:41.79 ID:+NRIy/Ul.net] >>873 そらもちろん、元がそんな狭い範囲ならだめでしょ あとまあ昔のrand的には割ってかけるのが正しいというのはあるけどそれは別の話で
890 名前:デフォルトの名無しさん mailto:sage [2022/02/13(日) 13:37:58.02 ID:PyRRUUG6.net] C++何の関係もない話で草 検証が必要ならすればいいだけ 要件すら不明で何もしてないのに質問するやつが馬鹿
891 名前:はちみつ餃子 mailto:sage [2022/02/13(日) 14:27:27.60 ID:nD0XyBZB.net] >>876 > 元がそんな狭い範囲ならだめでしょ 逆に欲しい範囲が大きい場合でも同様。 この場合は様々な範囲が有りうるという想定なので、都合の悪い状況も考慮する必要がある。
892 名前:デフォルトの名無しさん mailto:sage [2022/02/13(日) 15:14:31.28 ID:GfZrXG+U.net] 任意の区間の乱数って、どうせはみ出した分をちょん切るんでしょ?
893 名前:はちみつ餃子 mailto:sage [2022/02/13(日) 15:18:24.06 ID:nD0XyBZB.net] せやで。
894 名前:デフォルトの名無しさん mailto:sage [2022/02/13(日) 15:25:43.89 ID:CS3pmCmc.net] そんな短い周期の疑似乱数使ってないんじゃない? 端っこは気にしないと思うなあ
895 名前:デフォルトの名無しさん mailto:sage [2022/02/13(日) 16:00:39.64 ID:yoBtg/nD.net] >>876 > そらもちろん、元がそんな狭い範囲ならだめでしょ 「分かり易い例」って書いてあるのも理解できないの?
896 名前:デフォルトの名無しさん mailto:sage [2022/02/13(日) 16:06:17.09 ID:CS3pmCmc.net] 一般論でいうと周期に余裕がない様な疑似乱数使うのが間違いなんだと思うけどね
897 名前:デフォルトの名無しさん mailto:sage [2022/02/13(日) 16:19:57.08 ID:kSk9XozZ.net] そういうのを乱数知識ない奴が触らずに済むようにパッケージにしたのが<random>のdistributionなんだから素直に頼っとけよ
898 名前:デフォルトの名無しさん mailto:sage [2022/02/13(日) 16:42:35.21 ID:JnTPIF3C.net] 周期と値域は別では
899 名前:デフォルトの名無しさん mailto:sage [2022/02/13(日) 16:56:02.36 ID:KditTIA5.net] >>885 内部的にはおおむね同じです
900 名前:はちみつ餃子 mailto:sage [2022/02/13(日) 17:04:20.08 ID:nD0XyBZB.net] 線形合同法とかなら値の範囲と周期が一致することもあるが、乱数の一般的性質というわけではない。
901 名前:デフォルトの名無しさん mailto:sage [2022/02/13(日) 17:59:20.78 ID:av/6iEu7.net] 周期と値域は別だろ たとえばマイナス一億と、プラス一億の2値をとる乱数とか
902 名前:デフォルトの名無しさん mailto:sage [2022/02/13(日) 18:15:27.44 ID:AOBvb97v.net] 疑似乱数なんて今の値で次の値が決まるんだから周期も値も同じだろう その値の一部を使ったらまあ見た目は減るだろうけど
903 名前:デフォルトの名無しさん mailto:sage [2022/02/13(日) 18:32:37.88 ID:3OIdnfKh.net] 値域: 出力される値の範囲 周期: そのまんま乱数の出力が1周するステップ数 内部状態かなんかとごちゃ混ぜになってない?
904 名前:はちみつ餃子 mailto:sage [2022/02/13(日) 18:34:40.46 ID:nD0XyBZB.net] >>889 内部状態と結果を分離する方式だって当然あるよ。 メルセンヌツイスタのどでかい内部状態を毎回値として利用するわけないし、 乱数として利用できる性質になってない。
905 名前:デフォルトの名無しさん mailto:sage [2022/02/13(日) 18:34:49.25 ID:AOBvb97v.net] さすがにマジの最大値と最小値なんて誰も問題にしとらんやろ
906 名前:デフォルトの名無しさん mailto:sage [2022/02/13(日) 18:38:19.35 ID:mUIDTArd.net] >>892 その思い込みで「値域」と「内部状態の大きさ」をごっちゃにしてるから話がこじれてたんでしょ。 区別して。
907 名前:デフォルトの名無しさん mailto:sage [2022/02/13(日) 18:55:00.53 ID:RJAwRgrO.net] 端っこにゴミがあるよりは歯抜けが散らばってる方がいいというのは一理あるね
908 名前:デフォルトの名無しさん mailto:sage [2022/02/14(月) 10:33:59.04 ID:14KvXXq2.net] メンバー関数をテンプレートに出来たりしませんかね? struct Sample{void func1(int i); void func2(int i);...} template<typename T> void SampFunc(Sample& sample, int i){sample.T(i);} みたいな エラーはNo member named 'T' in ホゲホゲって感じですが
909 名前:デフォルトの名無しさん mailto:sage [2022/02/14(月) 10:38:23.09 ID:14KvXXq2.net] 書き込んでから思いつきましたが直接やらずに struct Caller1{void operator()(Sample& sample, int i){sample.func1(int i);}}; ... みたいなのを挟むべきですかねぇ
910 名前:デフォルトの名無しさん mailto:sage [2022/02/14(月) 10:52:52.11 ID:Z549+Tcq.net] structの{}内にテンプレートの文全部入れてみ?
911 名前:デフォルトの名無しさん mailto:sage [2022/02/14(月) 11:13:25.35 ID:o9A3FVGP.net] 毎回 uniform_int_distribution のインスタンスを一時的に生成しては破壊するのを繰り返すのだけはありえんだろ 無意味なメモリのアロケーションありすぎ
912 名前:デフォルトの名無しさん mailto:sage [2022/02/14(月) 11:16:30.38 ID:lu0CYRrt.net] #include <iostream> using namespace std; struct Sample{ void func1(int i) {cout << i << "," << __PRETTY_FUNCTION__ << endl;} void func2(int i) {cout << i << "," << __PRETTY_FUNCTION__ << endl;} }; template<typename T> void SampFunc(Sample& sample, int i, T member_func){ (sample.*member_func)(i); } int main() { Sample s; SampFunc(s, 1, &Sample::func1); SampFunc(s, 2, &Sample::func2); return 0; }
913 名前:デフォルトの名無しさん mailto:sage [2022/02/14(月) 11:28:15.31 ID:s3l2ZTMb.net] doubleとfloatの配列を同じように関数の引数に渡して扱う方法ってありますか? ・処理部が複雑なので引数の型が違う関数2個は作りたくない ・IF関数として両方版を作ってそこから処理部を呼び出すみたいな構造は可能、ただし別型版の実体コピー配列などは作りたくない(配列が巨大な為) 考えてみたのが、 配列の値部分をvoid*配列で指したものと、type_infoを持ったクラスなり構造体なりを用意して、 処理部でtype_infoに応じてvoid*をキャスティング、という方法ですが、 どうにも汚いのでもっと綺麗なやり方あれば教えてください。
914 名前:デフォルトの名無しさん mailto:sage [2022/02/14(月) 11:34:29.03 ID:lu0CYRrt.net] コードがないので0点
915 名前:デフォルトの名無しさん mailto:sage [2022/02/14(月) 11:51:48.64 ID:MNwZvUCy.net] テンプレートでいいだろ
916 名前:デフォルトの名無しさん mailto:sage [2022/02/14(月) 11:54:11.63 ID:L8LvhIeL.net] >>900 ふつーにテンプレートじゃね? template <typename T> requires std::is_floating_point_v<T> void func(T&& arg) { } あとanyなんて手もあるけど void func(std::any arg) { if(arg.type() == typeid(double)) { } if(arg.type() == typeid(float)) { } }
917 名前:デフォルトの名無しさん mailto:sage [2022/02/14(月) 11:57:58.78 ID:81yRYH7R.net] >>900 template<typename T, size_t size> void f(T(&a)[size]){ }
918 名前:デフォルトの名無しさん mailto:sage [2022/02/14(月) 12:04:39.18 ID:Z549+Tcq.net] >>903 に便乗してC++20で以下のような書き方も #include <concept> template<std::floating_point T> void func(T && a){}
919 名前:デフォルトの名無しさん mailto:sage [2022/02/14(月) 12:12:47.83 ID:L8LvhIeL.net] >>900 まさかとは思うが float f[2]; std::fill(std::begin(f), std::end(f), 0); double d[2]; std::fill(std::begin(d), std::end(d), 0); こんな基本はわかるんだよな?
920 名前:デフォルトの名無しさん mailto:sage [2022/02/14(月) 13:46:37.17 ID:nlxkZZlr.net] >>899 ありがとう、採用します 895
921 名前:デフォルトの名無しさん mailto:sage [2022/02/14(月) 14:17:59.24 ID:s3l2ZTMb.net] ありがとうございます、テンプレート便利ですね。使わせていただきます。900
922 名前:デフォルトの名無しさん mailto:sage [2022/02/14(月) 14:33:14.26 ID:HFyH6Ayv.net] あるクラスのメンバ関数のデフォルト引数を同クラスのメンバ変数にすることって可能でしょうか
923 名前:デフォルトの名無しさん mailto:sage [2022/02/14(月) 14:51:26.37 ID:lu0CYRrt.net] 可能
924 名前:はちみつ餃子 mailto:sage [2022/02/14(月) 14:51:35.72 ID:eI8f6/6+.net] もっとわかりやすく説明して……。
925 名前:はちみつ餃子 mailto:sage [2022/02/14(月) 14:55:09.41 ID:eI8f6/6+.net] デフォルト引数をデータメンバにするってのは単にデフォルト引数の値をデータメンバに入れるって意味? ↓ こういうの? struct foo { int x; void bar(int y=1) { x=y; } }; こんな単純なことがわからないとも思えんし、なんか隠れた要件がありそうな気がするんやが
926 名前:デフォルトの名無しさん mailto:sage [2022/02/14(月) 15:03:33.70 ID:JdXPqUHi.net] >>912 逆だろ文網
927 名前:デフォルトの名無しさん [2022/02/14(月) 15:13:09.50 ID:9KgBPGkB.net] >>912 こいつJ民だったの?
928 名前:デフォルトの名無しさん mailto:sage [2022/02/14(月) 15:13:51.43 ID:M1yCctPq.net] たぶん struct S{ int field; void f(int x=field){...} }; ってのをやりたいんだろうけどな あいにくC++のデフォルト引数は関数定義を見ただけで定数に決まるものしか受け付けられない どうしても同等の処理をしたいならオーバーロードして転送するのが一番楽 void f(){f(field);}
929 名前:デフォルトの名無しさん mailto:sage [2022/02/14(月) 15:17:25.95 ID:L8LvhIeL.net] > デフォルト引数は関数定義を見ただけで定数に決まるものしか受け付けられない そうか? int func() { int a; std::cin >> a; //絶対に定数になり得ない return a; } void test(int arg = func()) { } int main() { test(); //OK. もちろん入力待ちをする }
930 名前:はちみつ餃子 mailto:sage [2022/02/14(月) 15:21:08.20 ID:eI8f6/6+.net] >>915 デフォルト引数は関数を呼び出すときに補われたかのように動作する。 関数呼出しのたびに評価されるよ。
931 名前:デフォルトの名無しさん mailto:sage [2022/02/14(月) 15:33:51.02 ID:lu0CYRrt.net] コードがないし状況不明で困ってる文面にも見えないからアレで十分
932 名前:デフォルトの名無しさん mailto:sage [2022/02/14(月) 17:52:44.50 ID:m3z01MvF.net] uniform_int_distributionって本質はIntTypeのペアを持った関数オブジェクトだから毎回生成したところで遅くはないはず
933 名前:デフォルトの名無しさん mailto:sage [2022/02/14(月) 20:03:27.39 ID:vE8mmwyH.net] 乱数ってだいたい静的になんか持ってるよね
934 名前:デフォルトの名無しさん mailto:sage [2022/02/14(月) 20:44:52.17 ID:UkhMLhRO.net] マルチスレッド環境用にジャンプって機能が疑似乱数にあるよな 「疑似乱数 ジャンプ」でぐぐると出てくる
935 名前:デフォルトの名無しさん mailto:sage [2022/02/14(月) 21:33:11.13 ID:CqI2HZWm.net] 状態持ってるのはエンジンの方 分布ごときにどんな怪獣ブラックボックスのイメージ持ってんだ
936 名前:デフォルトの名無しさん mailto:sage [2022/02/14(月) 21:37:34.26 ID:zjXK/l5x.net] エンジン以外に何があんの?
937 名前:デフォルトの名無しさん mailto:sage [2022/02/14(月) 22:08:14.48 ID:2E5iBc/D.net] 例外処理で、catchした後、どのクラスがthrowしたのかってわかりますか?
938 名前:デフォルトの名無しさん mailto:sage [2022/02/14(月) 22:35:41.44 ID:jOONNl+N.net] 初心者質問ですみません。 ヘッダで定義したテンプレート特殊化の非推奨属性がヘッダ外で効いてないっぽいんですけど、 ヘッダ外でも非推奨としたい場合何か特殊な事をしないといけないとかありましたっけ? 例えば .h ``` template <std::integral INT_TYPE> struct int_auto { using type = auto_int_detail<std::is_signed_v<INT_TYPE>, sizeof(INT_TYPE)>::type; }; template <> struct [[deprecated("char type is not allowed")]] int_auto<char> { using type = auto_int_detail<std::is_signed_v<char>, sizeof(char)>::type; }; template <std::integral T> using int_auto_t = int_auto<T>::type; int_auto_t<char> i_header; // これは非推奨 ``` .cpp ``` int_auto_t<char> i_cpp; // これは非推奨じゃない ``` と
939 名前:ネっています。 MSVC++(v142)で言語標準準拠はstd:c++20です。 [] [ここ壊れてます]
940 名前:はちみつ餃子 mailto:sage [2022/02/14(月) 22:41:31.68 ID:eI8f6/6+.net] >>924 それ自体には発生元を特定する情報を持たないけど……。 どういう状況? ・ 例外的な状況から回復する必要があって発生源によって処理の切り替えが要る ・ プログラムの正常系が動くはずなのに何故か出てくる例外の元を特定したい (つまりデバッグ用途) どちら?
941 名前:デフォルトの名無しさん mailto:sage [2022/02/14(月) 23:02:44.91 ID:2E5iBc/D.net] >>926 大学でこういう課題を出されたのですが、全然いい方法がわからないです。 「あるクラスの例外だけをレポートするためにはどのような実装方法があるか」
942 名前:デフォルトの名無しさん mailto:sage [2022/02/14(月) 23:08:22.30 ID:BDOt87Dq.net] >>927 ヒント。例外はクラス等なんでも投げられる。そしてクラスは継承できる。
943 名前:デフォルトの名無しさん mailto:sage [2022/02/14(月) 23:11:22.86 ID:R5SapkSQ.net] それはどのクラスがthrowした、じゃなくて、どのクラスがthrowされた、の間違いだな 例外 c++で検索すれば答えはすぐ出てくるよ
944 名前:デフォルトの名無しさん mailto:sage [2022/02/14(月) 23:29:00.15 ID:a+DIA8ij.net] >>916 >>917 嘘やんと思って試してみたらマジでいけるやんけ知らんかった インスタンスフィールドまでは触れんかったが
945 名前:デフォルトの名無しさん mailto:sage [2022/02/15(火) 00:14:19.75 ID:VnfLS+lO.net] >>928 なるほど。std::exceptionを継承した自作クラスを定義して、 それを投げるというこですね?
946 名前:蟻人間 mailto:sage [2022/02/15(火) 00:23:09.85 ID:vbEMbnXt.net] throw this;
947 名前:デフォルトの名無しさん mailto:sage [2022/02/15(火) 14:33:45.24 ID:StNRh9X/.net] クラスメンバをforで回す方法はありますか? 例えばintのaとdoubleのbという2つのメンバを持つクラスがあったとして、 forループでクラス内のメンバ変数を全部加算したい、など。 イメージはこんな感じです。 double all = 0.0; for (T member : this->allMember) { all += member; }
948 名前:デフォルトの名無しさん mailto:sage [2022/02/15(火) 14:55:33.51 ID:aaenmMxg.net] for で回さないといけないほど多数のメンバー変数がある設計をまず見直すべき
949 名前:デフォルトの名無しさん mailto:sage [2022/02/15(火) 14:59:14.95 ID:0rNaChGh.net] リフレクションは無いというのが回答か
950 名前:デフォルトの名無しさん mailto:sage [2022/02/15(火) 15:15:26.06 ID:AWN50YIA.net] 動的にロードするのでなければ、自分で登録するか、ソースから解析するタイプのリフレクションライブラリを書くか探せばいい
951 名前:デフォルトの名無しさん mailto:sage [2022/02/15(火) 15:16:41.63 ID:g9Gn9R1H.net] 配列じゃあかんのか
952 名前:デフォルトの名無しさん mailto:sage [2022/02/15(火) 15:22:08.66 ID:3zKYAjvH.net] 数学のベクトルクラスでも作成してるのかい?
953 名前:デフォルトの名無しさん mailto:sage [2022/02/15(火) 17:13:44.36 ID:QbgtcDS7.net] >>933 あるよ。おすすめするわけじゃないけど。 https://www.google.com/search?q=boost+fusion+for_each+struct こんな奇怪なライブラリ使わなくても済むようにするための言語側サポートはいずれも提案中。先は長い。 P1306 Expansion statements https://github.com/cplusplus/papers/issues/156 P1240 Scalable Reflection in C++ https://github.com/cplusplus/papers/issues/545
954 名前:デフォルトの名無しさん mailto:sage [2022/02/15(火) 17:28:44.20 ID:AWN50YIA.net] じゃあこれもオススメではないがリフレクションベースで https://www.rttr.org/ を使った例でも... #include <iostream> #include <rttr/registration> using namespace rttr; struct s{ int m1; double m2; }; RTTR_REGISTRATION { registration::class_<s>("s").constructor<>() .property("m1", &s::m1) .property("m2", &s::m2); } template<typename T> double sum(const T& o) { type t = type::get<s>(); double sum = 0.; for (auto& prop : t.get_properties()) { sum += prop.get_value(o).to_double(); } return sum; } int main() { s o{1,1.1}; std::cout << sum(o) << std::endl; return 0; } // 思いつきで聞いてるだけな気もするけどw
955 名前:デフォルトの名無しさん mailto:sage [2022/02/15(火) 17:31:44.80 ID:AWN50YIA.net] ちょっと修正 #include <iostream> #include <rttr/registration> using namespace rttr; struct s{ int m1; double m2; }; RTTR_REGISTRATION { registration::class_<s>("s").constructor<>() .property("m1", &s::m1) .property("m2", &s::m2); } template<typename T> double sum(const T& o) { double sum = 0.; for (auto& prop : type::get<T>().get_properties()) { sum += prop.get_value(o).to_double(); } return sum; } int main() { s o{1,1.1}; std::cout << sum(o) << std::endl; return 0; }
956 名前:デフォルトの名無しさん mailto:sage [2022/02/17(木) 18:59:32.62 ID:bHlhY+TU.net] std::unique_ptr</*見切れる程長いクラス名*/> looongPtr{ std::make_unique</*見切れる程長いクラス名*/>(/*見切れる程多い引数*/) }; unique_ptrをメンバ変数にするときに最初のとこをautoに出来ないんですか?
957 名前:デフォルトの名無しさん mailto:sage [2022/02/17(木) 19:17:57.96 ID:9tUnWmYs.net] make関数使えば?
958 名前:蟻人間 mailto:sage [2022/02/17(木) 19:30:29.28 ID:sNGWbyyl.net] typedef longlonglongtypename shorttypename; auto ptr = std::make_unique<shorttypename>...
959 名前:デフォルトの名無しさん mailto:sage [2022/02/17(木) 20:09:06.95 ID:TNf7BdQD.net] >>942 できないですね。 https://cor3ntin.github.io/posts/auto_nsdmi/#so-why-are-auto-nsdmi-not-in-the-standard
960 名前:デフォルトの名無しさん mailto:sage [2022/02/17(木) 20:26:37.89 ID:wIu//gsc.net] >>942 設計を見直せ
961 名前:デフォルトの名無しさん mailto:sage [2022/02/17(木) 21:57:39.99 ID:d4bhbZak.net] 単なる○○できますか?に対して設計見直せとだけ言ってくるガイジなんなん まず質問に答えた上でなら分からんでもないが
962 名前:デフォルトの名無しさん mailto:sage [2022/02/17(木) 22:12:03.03 ID:wIu//gsc.net] うるせぇ雑魚が
963 名前:デフォルトの名無しさん mailto:sage [2022/02/17(木) 23:04:10.74 ID:wrwPyddf.net] ざーこざーこw
964 名前:デフォルトの名無しさん mailto:sage [2022/02/17(木) 23:56:12.71 ID:bHlhY+TU.net] 🤔
965 名前:デフォルトの名無しさん mailto:sage [2022/02/18(金) 00:20:49.11 ID:q/M7jrOo.net] C++の業務ってことで入ったんだけどC++とは名ばかりのC言語バリバリのコードだった C++11、いやせめてCじゃなくてC++を書こうとしようぜと思うんだけど世の中こんなんばっかなん?こういうケースほんっとに多くてさぁ 40代↑の人が書いてるC++の言語って大体ほぼCでうんざりする
966 名前:デフォルトの名無しさん mailto:sage [2022/02/18(金) 00:25:14.77 ID:qZSzRw8s.net] 偏見だけど同名の関数が並んでる以外Cとしてコンパイルできそうなイメージある
967 名前:はちみつ餃子 mailto:sage [2022/02/18(金) 00:25:30.70 ID:fowo2HBL.net] >>951 なんでそんなことになるんだろうな? コンパイラを信用してないからか? ワイは40代以上やけど C++ を使える状況であえて C 的なスタイルで書く気はしないわ。 だって単純に面倒くさいもの。
968 名前:デフォルトの名無しさん mailto:sage [2022/02/18(金) 00:26:19.39 ID:VWFgwWIW.net] で、相談は?
969 名前:デフォルトの名無しさん mailto:sage [2022/02/18(金) 01:20:21.17 ID:x3azmRP7.net] Cの文法が覚えられる限界なんでしょうな
970 名前:デフォルトの名無しさん mailto:sage [2022/02/18(金) 02:48:20.56 ID:y/CjghL0.net] 人事部の人がCとC++の見分けがつかなくて 会計上コンパイラ代に「C++」と書いてあったから C++で募集かけてたんじゃね?
971 名前:ハノン mailto:sage [2022/02/18(金) 03:23:56.08 ID:AKyBDynF.net] >>953 C++で通らないCは書きたくない、とは思いますね
972 名前:デフォルトの名無しさん mailto:sage [2022/02/18(金) 13:34:17.22 ID:NqXxszTV.net] >>951 ←こういう初心者にじゃあすべて作り直していいよ、と言うと何もできない。 無職の妄想からは何も生まれないのだよ。
973 名前:デフォルトの名無しさん mailto:sage [2022/02/18(金) 14:23:13.29 ID:y/CjghL0.net] 自分は何かできるとでも言いたげだな すべて作り直すということがどのくらいの工数かわかってないんだろ
974 名前:デフォルトの名無しさん [2022/02/18(金) 15:06:16.89 ID:tL/18rdC.net] >>958 俺もそう思う 現場の不平不満ばかりの意識高い系エンジニアさん多いよね その現場を改善するわけでもなく文句いうだけ 高いスキルあるならそんな現場やめれば? 単価150万超えるようなとこなら周りにも高スキルな人がたくさんいるよ? 現場の文句言うだけの奴は結局その現場がお似合いのレベルなんだよ、っていつも思ってる
975 名前:デフォルトの名無しさん mailto:sage [2022/02/18(金) 15:32:05.24 ID:dD/fDJ+w.net] >>951 普通の職場ならコーディングスタンダードあるから勝手はできないだろ。 コーダーとライブラリアンで許可されている範囲も違うだろうし。
976 名前:デフォルトの名無しさん mailto:sage [2022/02/18(金) 15:57:07.65 ID:NqXxszTV.net] >>955 無職が言いそうなことだ。無能なブロジェクトリーダーはCプロジェクトをあっさりとC++化できる、 存在しないスーパープログラマを探し続けるがそんな奴はどこにもいない。 そんなスーパーPGがいたらATMはバグで止まらない。C++書ける奴はCをバカにしないよ。
977 名前:デフォルトの名無しさん mailto:sage [2022/02/18(金) 16:33:00.65 ID:xb2lszF9.net] バグ出たまま放置してるヤツはバカにするけど
978 名前:デフォルトの名無しさん mailto:sage [2022/02/18(金) 17:01:46.61 ID:1bc1nI/9.net] 正当な理由もなくスマポやSTLを嫌がった結果 生ポインタをガチャガチャいじくり回したスパゲティコード書いて それが遅くて非効率でバグまみれリークだらけというのは非常によくあるけど そういうCプログラマ様も敬わなきゃダメ?
979 名前:デフォルトの名無しさん mailto:sage [2022/02/18(金) 17:04:32.95 ID:y/CjghL0.net] バイアス満載だな 落ち着けよw
980 名前:デフォルトの名無しさん mailto:sage [2022/02/18(金) 17:19:05.78 ID:xb2lszF9.net] そういうどうしょうもないのはヒソカに心の奥でバカにしていいし反面教示にすべし
981 名前:デフォルトの名無しさん mailto:sage [2022/02/18(金) 18:15:33.32 ID:jeS+/hUn.net] マ板かここ?
982 名前:デフォルトの名無しさん mailto:sage [2022/02/18(金) 20:06:32.33 ID:z2RoOtDN.net] 80対20の法則は大事だし、動くコードを作ってから最適化をした方がいいって偉い人も言ってた気がする リソース管理はとりあえずスマポを使うのが吉だと思ってます
983 名前:デフォルトの名無しさん [2022/02/18(金) 20:12:42.95 ID:N0FOn5a0.net] 自分で責任もって結合テストする覚悟があるんならいくらでもCからC++に置き換えていいと思うよ
984 名前:デフォルトの名無しさん mailto:sage [2022/02/18(金) 20:34:30.32 ID:y/CjghL0.net] とテストの基本がわかってないやつが言う C++に動的な型宣言はないからな
985 名前:デフォルトの名無しさん mailto:sage [2022/02/18(金) 20:38:01.63 ID:NqXxszTV.net] 効率ガーと言うが、CをC++に書き換えて高速化、省メモリ化するなんてむしろレアケース。
986 名前:デフォルトの名無しさん mailto:sage [2022/02/18(金) 20:44:21.03 ID:y/CjghL0.net] C++の隠れたコードが何をしてるか解ってないやつが C++にしたら高速化した低速化したって言語のせいにするんだよ
987 名前:デフォルトの名無しさん mailto:sage [2022/02/18(金) 21:35:17.98 ID:UZsjZs7N.net] こういうとき悲しいのはね CもC++もたいして知りもしねえド素人のアマチュアが 想像と思い込みでもっていろいろレスつけてくること 噴飯ものだぞ?
988 名前:デフォルトの名無しさん mailto:sage [2022/02/18(金) 23:03:13.88 ID:k8EYArXJ.net] c++書いてたとき何ちゃらストリームやらのファイル操作遅すぎてムリすぎて結局fopen使ったような… まあ便利は便利なんだけど利便さ求めるならそもそもpythonとかに逃げますし C++17未満?だとfilesystem使えなくてこんな簡単なことも出来ないのかと絶望した気もする
989 名前:デフォルトの名無しさん mailto:sage [2022/02/18(金) 23:08:29.98 ID:qZSzRw8s.net] std::endlがフラッシュ兼ねてるのを知らずに使うとクソ遅くなる
990 名前:デフォルトの名無しさん mailto:sage [2022/02/19(土) 00:57:04.84 ID:kSnJ/KwP.net] 初心者にC++は早い C++は人類に対する挑戦
991 名前:デフォルトの名無しさん mailto:sage [2022/02/19(土) 01:05:13.77 ID:Sb0QDKc0.net] みんな最初は初心者
992 名前:デフォルトの名無しさん mailto:sage [2022/02/19(土) 01:28:32.55 ID:MLwzxLgZ.net] Appleのcopland、Googleのandroid、MSのEdgeの失敗を見れば 予算と開発期間が十分にあれば解決すると思ってるならそれは間違いだと理解するだろう。 生ポインタをこねくり回す程度で脳みそのキャパが越えてるようじゃC++使ってもまともな実装なんてできない。 隠れたコードも何もC、C++はアセンブラの知識は必須だ。バイナリを読めるようになってから文句言え。
993 名前:デフォルトの名無しさん mailto:sage [2022/02/19(土) 03:09:27.37 ID:kSnJ/KwP.net] フムフムアセンブラが必須か… https://godbolt.org/z/jq16j83We #include<vector> using namespace std; void f(char* dst, const char* src_start, const char* src_end) { const char*s = src_start; char*p = dst; while (s != src_end) *p++ = *s++; } template<typename Dst, typename Src> void f2(Dst dst, Src src_start, Src src_end) { auto s = src_start; auto p = dst; while (s != src_end) *p++ = *s++; } void hoge() { vector<char> dst(1024), src(1024); f(dst.data(), src.data(), src.data() + src.size()); f2(src.begin(), dst.begin(), dst.end()); } これってどうしてhoge側だとSIMD使わないの? C++コードでSIMD使わせるにはどうしたらいい?
994 名前:デフォルトの名無しさん mailto:sage [2022/02/19(土) 04:43:40.93 ID:2+bZAOZm.net] valarray
995 名前:デフォルトの名無しさん mailto:sage [2022/02/19(土) 04:46:13.97 ID:kSnJ/KwP.net] 不正解
996 名前:デフォルトの名無しさん mailto:sage [2022/02/19(土) 06:01:38.84 ID:2+bZAOZm.net] hoge側でどうSIMD使えって言いたいの? inlineとかだったらしばくぞ
997 名前:デフォルトの名無しさん mailto:sage [2022/02/19(土) 06:20:48.76 ID:ZqDn11YK.net] イントリンシック、でしょう?
998 名前:デフォルトの名無しさん mailto:sage [2022/02/19(土) 08:45:24.25 ID:0ANF/iVA.net] Intelのコンパイラに任せ
999 名前:デフォルトの名無しさん mailto:sage [2022/02/19(土) 09:52:14.21 ID:kSnJ/KwP.net] 1024 -> 1024 * 16にすると...
1000 名前:デフォルトの名無しさん mailto:sage [2022/02/19(土) 09:57:47.91 ID:kSnJ/KwP.net] intrinsicは(inline)assemblerとほぼ同じなので、C#でしか使ったことないな
1001 名前:デフォルトの名無しさん mailto:sage [2022/02/19(土) 10:03:29.25 ID:mDQ0X8WX.net] アセンブラなどの理解は「低レイヤを知りたい人向けのCコンパイラ作成入門」が結構勉強になったんですが、バイナリは何で勉強すればいいですかね?
1002 名前:デフォルトの名無しさん mailto:sage [2022/02/19(土) 10:34:54.00 ID:0ANF/iVA.net] >>985 キャッシュメモリのアレで遅くなるやつか?
1003 名前:デフォルトの名無しさん mailto:sage [2022/02/19(土) 10:44:00.07 ID:kSnJ/KwP.net] さぁ?・・・callしたり判定用コードやサイズ計算とかオーバーヘッドがあるからじゃね?知らんw
1004 名前:デフォルトの名無しさん mailto:sage [2022/02/19(土) 11:57:14.27 ID:kSnJ/KwP.net] 次スレ立ててきた C++相談室 part159 https://mevius.5ch.net/test/read.cgi/tech/1645239402/
1005 名前:デフォルトの名無しさん mailto:sage [2022/02/19(土) 12:08:36.38 ID:2h4SA+VW.net] CADソフトCANDYの作者の発言。 >数年前に,私の会社で組み込み機器向けのプロジェクトで,C++コンパイラが安定して動かないので >Cでプログラムを書くように私が指示したケースがあったのだが, >何人かのエンジニアが「今さらCなんかでプログラムを書けませんよ。 >クラスを使えなければスパゲッティコードになってしまいます」と猛反対をしてきた。 ■ 第4回 オブジェクト指向の本質 https://gihyo.jp/lifestyle/serial/01/software_is_beautiful/0004 別のインタビューと補完すると、そのときC++の標準ライブラリ的なブツを著者が C言語でババーっと書いて仕事させたという話だったはず(記憶モード ちょっどこの昭和カヨ?!
1006 名前:デフォルトの名無しさん mailto:sage [2022/02/19(土) 12:18:20.98 ID:kSnJ/KwP.net] 組み込み機器用のCPUって特殊なんで、コンパイラが安定しないなんてよくある話 オブジェクト指向のメリットの本質についての話なので、可能/不可能が実装言語に依存しないというのもよくある話(楽かどうかは別) 別に昭和でも平成でも令和でも変わってないけど、>>991 に伝わってないのは確か
1007 名前:デフォルトの名無しさん mailto:sage [2022/02/19(土) 12:50:13.00 ID:gFosEVVi.net] GTKのGObjectはCでオブジェクト指向を実現している訳だけど (ただし学習コストが低いとは言えないと思う)
1008 名前:デフォルトの名無しさん mailto:sage [2022/02/19(土) 12:53:15.56 ID:2h4SA+VW.net] そんなん言ったらX Window SystemもC言語でオブジェクト指向しているらしい らしい(伝聞
1009 名前:デフォルトの名無しさん mailto:sage [2022/02/19(土) 13:05:47.37 ID:x/upE6G9.net] 当たり前だけどアセンブラでもオブジェクト指向はできるし還暦の爺さん(とは言ってもなかなかの人ではある)が10年以上前に書いた記事だしまじで何を言いたいのかよくわからん
1010 名前:デフォルトの名無しさん mailto:sage [2022/02/19(土) 13:20:12.26 ID:kSnJ/KwP.net] 分からん分からん言うのは誰でも出来るし、どんな初心者でも何に対してもそう言える なので、具体的に分からん部分を指摘できない人は初心者か、荒らしだと思ってる
1011 名前:デフォルトの名無しさん mailto:sage [2022/02/19(土) 13:22:03.79 ID:kSnJ/KwP.net] athenaくらいつかったことあるよね
1012 名前:デフォルトの名無しさん mailto:sage [2022/02/19(土) 13:28:47.19 ID:2h4SA+VW.net] >当たり前だけどアセンブラでもオブジェクト指向はできるし ちょっカプセル化(シンボルの隠蔽)にやや手間がかかるし オブジェクトをスタックにのコピーして返すのにもさらに手間がかかるし、 コンストラやデストラの呼び出しの保証や継承関係のチェックについて処理系のサポートが一切無いし、 やんけ;;; そういうオブジェクト指向のプログラミングパラダイムにおいて裏で当然働くべき処理が プログラマーが手間をかけ注意を振り向け続けないと実現されないというのはオブジェクト指向しているうちに入らないのでは……
1013 名前:デフォルトの名無しさん mailto:sage [2022/02/19(土) 13:31:35.88 ID:6TS2kFRN.net] brainfuckでもオブジェクト指向でプログラミングできるんやで
1014 名前:デフォルトの名無しさん mailto:sage [2022/02/19(土) 13:31:55.84 ID:6TS2kFRN.net] >>1000 なら次スレでちんこ貼る
1015 名前:1001 [Over 1000 Thread.net] このスレッドは1000を超えました。 新しいスレッドを立ててください。 life time: 95日 18時間 42分 38秒
1016 名前:過去ログ ★ [[過去ログ]] ■ このスレッドは過去ログ倉庫に格納されています