[過去ログ] C++相談室 part165 (1002レス)
上下前次1-新
このスレッドは過去ログ倉庫に格納されています。
次スレ検索 歴削→次スレ 栞削→次スレ 過去ログメニュー
1(3): デフォルトの名無しさん (ワッチョイ efda-9b8G) [sage] 2023/10/31(火) 07:37:38.52 ID:+ZyYyqMO0(1) AAS
!extend:checked:vvvvv:1000:512
!extend:checked:vvvvv:1000:512
↑同じ内容を3行貼り付けること
次スレは>>980が立てること
無理なら細かく安価指定
※前スレ
C++相談室 part164
2chスレ:tech VIPQ2_EXTDAT: checked:vvvvv:1000:512:: EXT was configured
2(2): デフォルトの名無しさん (ワッチョイ 194e-FUJr) [sage] 2023/10/31(火) 08:59:52.78 ID:DBRUqQAF0(1) AAS
>1 乙です
前スレ 例外はループ脱出に使うような物じゃない、との意見に賛成です。
自分は、例外は「起こり得るけどいちいちエラー処理を書いたらアホな話を」「処理呼び出し毎ではないレベルで」「エラー対処コーディングするもの」と思ってます。
具体例は、
リンクリストなどコレクション操作でメモリ不足が起きた場合、のエラー処理。
コレクションの追加や削除を頻繁に行うコードって、大体はもっと概念レベルが高い事をやってるので、1件の追加 レベルでエラー処理書いてたらアホな感じになる。
しかも、GUI プロセスを作ってて何か上手く動かないから特定のエラーだけを画面に表示したい、など、ことさら明確に対処したい場合です。プロセスが落ちればいいだけなら、main()の外側、の仕様がやってくれる。
古い本の情報だけど、SBリップマンによると、MS VC++と、sun、hp-ux の C++コンパイラで、例外を使う/使わないで速度性能調査したそうで、 4~6% の速度劣化があったとの事です。
3(1): デフォルトの名無しさん (ワッチョイ 6105-NMSe) [sage] 2023/10/31(火) 09:37:52.87 ID:BnGGo/620(1/2) AAS
スレ終了間際に現れる質問いいですかオジなんなの?w.
4: デフォルトの名無しさん (スププ Sd33-wFsA) [] 2023/10/31(火) 09:38:43.79 ID:yneNhI3/d(1) AAS
Pythonで言うと
forのStopIterationは へっ? だし
int()のValueErrorですら微妙
5: デフォルトの名無しさん (ワッチョイ 5397-ggTH) [sage] 2023/10/31(火) 11:32:52.74 ID:5ddE/sJo0(1) AAS
うるせえstd::stoi()ぶつけんぞ
6(1): デフォルトの名無しさん (アウアウウー Sad5-U1R4) [sage] 2023/10/31(火) 16:49:04.12 ID:Xd7Dooyma(1) AAS
>>3
ヘッダーの最後の行の #endif みたいなものだよ
7: デフォルトの名無しさん (ワッチョイ 6105-NMSe) [sage] 2023/10/31(火) 23:53:09.44 ID:BnGGo/620(2/2) AAS
>>6
と、言うことは対になる#ifがどこかに?
8: デフォルトの名無しさん (ワッチョイ 1945-FUJr) [sage] 2023/11/01(水) 10:50:51.42 ID:NLQyML8a0(1) AAS
…(いくら5chとは言え、複数の人が集まる場所で、何かを教えて頂いてもお礼も言えず、面白い返しもできない人がいたとして。その人がプログラムに関してだけは素晴らしいコードを書ける、なんてことはあるのかな?と思う瞬間が人生の中であったり、なかったり)
9: デフォルトの名無しさん (ワッチョイ 297c-tLJy) [sage] 2023/11/01(水) 12:51:50.53 ID:h0xHi7n60(1) AAS
(礼儀とプログラミングスキルは関係ないと思う)
10: デフォルトの名無しさん (ワッチョイ 13ad-feYx) [sage] 2023/11/01(水) 12:53:02.45 ID:c3s+uM8y0(1) AAS
(俺の昼飯どこ行った?)
11: デフォルトの名無しさん (アウアウウー Sad5-U1R4) [sage] 2023/11/01(水) 16:02:16.42 ID:G1jsC9Xya(1) AAS
(今日の昼飯はセブンのサバ塩焼弁当にしとくか・・・)
12: デフォルトの名無しさん (ワッチョイ 1939-PupP) [sage] 2023/11/01(水) 18:24:49.00 ID:m9AntJVX0(1) AAS
コードにはある程度そいつの人間性は反映されるな
スレチな話題ではあるけど
13: デフォルトの名無しさん (ワッチョイ b1f8-XCYI) [sage] 2023/11/01(水) 23:07:31.46 ID:PfaqlzcX0(1) AAS
(本物のプログラマはPascalを使わない)
14: デフォルトの名無しさん (ワッチョイ 6105-NMSe) [sage] 2023/11/01(水) 23:30:59.94 ID:ZqfN6pKA0(1) AAS
(でもPythonは使ってもいいのかな?って時々思う)
15: デフォルトの名無しさん (オイコラミネオ MM6d-H9h+) [sage] 2023/11/02(木) 00:03:32.45 ID:aqkFofyNM(1) AAS
そろそろキャストは止めてスマポ使いましょう
16: デフォルトの名無しさん (ワッチョイ d94e-vgKx) [] 2023/11/02(木) 02:43:15.24 ID:+4XO/JeH0(1/2) AAS
まちゅまちゅの3Dライブみた
前も思ったけどみこちとかなたそのダンス、めっちゃシンクロ率高い
リズムがぴったり一緒なんだよね
ダンスほんとにうまくなったよな
17: デフォルトの名無しさん (ワッチョイ d94e-vgKx) [] 2023/11/02(木) 02:43:45.89 ID:+4XO/JeH0(2/2) AAS
誤爆った(´・ω・`)
18: デフォルトの名無しさん (ワッチョイ 1bda-9b8G) [sage] 2023/11/02(木) 07:17:03.35 ID:Hn8AmdCQ0(1) AAS
ホロライブか
19: デフォルトの名無しさん (アウアウウー Sad5-U1R4) [sage] 2023/11/02(木) 10:44:27.02 ID:BqsrFUCWa(1) AAS
(まちゅまちゅの3Dライブ?・・・ちょっと気になる)
20: デフォルトの名無しさん (ワッチョイ 6105-NMSe) [sage] 2023/11/02(木) 23:48:48.29 ID:ebj85xCu0(1) AAS
(((お前ら括弧ばっかり使ってlisperかよ?)))
21: デフォルトの名無しさん (ワッチョイ a905-fLgT) [sage] 2023/11/03(金) 10:21:23.72 ID:sUQ44pbr0(1) AAS
←vーー( ゚∀゚)!ー^ー
22: デフォルトの名無しさん (ワッチョイ 6276-0SSA) [sage] 2023/11/04(土) 18:56:36.20 ID:Y/q1DSa/0(1) AAS
コピーとムーブの挙動、というか管理難しい。。難しくない?
23: はちみつ餃子◆8X2XSCHEME (ワッチョイ 0979-oDOv) [sage] 2023/11/04(土) 20:24:08.34 ID:1CTu6tq50(1/2) AAS
コピーやムーブはパターンに沿って管理できるからそんなに難しいとは感じないな。
ワイとしては参照の畳み込み (Reference collapsing) や変換の規則を毎回のように確認するんだけど全然頭に入ってこない。
参照はオブジェクトではないので逆に言えば値に対応する型が参照になることはないのだが、それはそれとして参照を含む型があり得るというのが今でも腑に落ちない。
24(3): デフォルトの名無しさん (ワントンキン MM92-JcAe) [sage] 2023/11/04(土) 20:28:09.97 ID:KOZ2F//lM(1) AAS
参照しか知らんものだけど、ムーブて何か簡単に教えて
参照は実装上ただのポインタじゃん
ムーブはなにがどうなるん?
25: はちみつ餃子◆8X2XSCHEME (ワッチョイ 0979-oDOv) [sage] 2023/11/04(土) 20:29:19.85 ID:1CTu6tq50(2/2) AAS
ムーブコンストラクタが起動する。
それだけ。
26: デフォルトの名無しさん (ワッチョイ 658d-qcxi) [sage] 2023/11/05(日) 09:49:50.04 ID:6vgG9vCb0(1) AAS
>>24
考え方としては、shallow copyを二重開放リスクを避けて行うための仕組み。
右辺値という特別な一時変数のコピーで特別なコピー(ムーブコンストラクタ)を実行するようにして、クラス設計者が必要に応じてshallow copyを実装しやすくしている。
27: デフォルトの名無しさん (アウアウウー Saa5-CWlg) [] 2023/11/05(日) 10:41:04.16 ID:ol9bMVcca(1/2) AAS
>>24
moveはRustで言う所有権の移動じゃないか
28: デフォルトの名無しさん (ワッチョイ 454e-0SSA) [] 2023/11/05(日) 13:06:56.97 ID:Qkn7cpbH0(1/4) AAS
>>24
aに戻り値などの一時オブジェクトbをコピーすると通常は
aでメモリを確保
bからメモリコピー
bのデストラクタでメモリを破棄
という動作になるけど、moveの場合
aにbでメモリをポインタで持ってくる
bのインスタンスでは破棄したことにする
とすれば無駄なメモリ確保とコピーが発生せず効率が良い
29: はちみつ餃子◆8X2XSCHEME (ワッチョイ 823e-9NWm) [sage] 2023/11/05(日) 13:39:42.02 ID:pHGS9osC0(1/2) AAS
標準ライブラリでのムーブは所有権 (ownership) の概念を前提として構築されているし、
慣例としてもそのようにするものではあるんだが
言語としてはムーブコンストラクタ (またはムーブ代入演算子) を呼び出すというだけで
所有権の面倒をみる機能は何もない。
(辻褄が合うようにするのはプログラマの責任。)
何が起きているのかは所有権の概念と実装レベルで分けて考えたほうがいいと思う。
どう説明していいかわからんから関連する要素を箇条書きにしたらこんな感じかな。
・ それがコピーの文脈であるかムーブの文脈であるか区別は出来る
・ 一般的にムーブの文脈であった場合 (寿命が尽きる直前の一時オブジェクトの再利用が出来る場合) にコピーより効率が良い動作が出来る可能性がある
・ どのように効率がよくなるのかはそのクラス (のムーブコンストラクタやムーブ代入演算子) の定義次第
・ 典型的なムーブの実装はリソース本体を指すポインタの交換によって実現される
・ ユーザーが定義を与えなかった場合のデフォルトのムーブは全てのサブオブジェクトをムーブすることになっている
30: デフォルトの名無しさん (ワッチョイ 454e-0SSA) [] 2023/11/05(日) 13:42:20.39 ID:Qkn7cpbH0(2/4) AAS
で、このmove動作を定義するために、
一時オブジェクト(右辺値)に対する参照動作を関数定義できるようになっている
31: デフォルトの名無しさん (ワントンキン MM92-JcAe) [sage] 2023/11/05(日) 14:05:22.83 ID:wAmDr/fyM(1) AAS
ムーブされるとそのポインタは変わってしまうと思うけど、そういうケースはないの?
32: デフォルトの名無しさん (ワッチョイ 454e-0SSA) [] 2023/11/05(日) 14:18:09.07 ID:Qkn7cpbH0(3/4) AAS
言っている意味がよく分からないが、純粋なポインタにはムーブという概念はないよ
ムーブを定義できるのはクラスに対してだけ
他の人も言っているようにムーブといっても実体は単なる関数呼び出しなので、その中でプログラマが自分の責任で必要なコードを書くことになる
33(2): デフォルトの名無しさん (ワッチョイ 653d-2MVi) [sage] 2023/11/05(日) 14:58:05.35 ID:vIwIC4VV0(1) AAS
質問した人じゃないけど説明ありがたいです
ムーブ難しいと思ってたけどもっと早く勉強して仕事で使うべきだった
(文法解析した要素をポインタいじって並べ変えるんだけど…
二重所有を防ぐのを手作業コーディングで責任を持たなければならないプログラムを作ってしまった)
34: デフォルトの名無しさん (ワッチョイ 454e-0SSA) [] 2023/11/05(日) 15:15:28.75 ID:Qkn7cpbH0(4/4) AAS
ただ、右辺値参照を使うと、通常の参照や代入と使い分けるためにconstやnoexceptを厳密に指定しないといけなくなりがちだから、
その辺の総合的な理解が必要になってくるのは注意点だね
constは一度付け始めるとライブラリ全部に伝染するからな・・・それを嫌って使わない派も結構いる(いた)よね
35: デフォルトの名無しさん (ワッチョイ ed7c-9LC0) [sage] 2023/11/05(日) 15:39:17.77 ID:Vx5ySS520(1) AAS
実際のコードだとポインタのムーブはunique_ptrとかにぶん投げで、自分で移動コード書くことはまずないな
自分でムーブ特殊関数の中身書くのはハンドル的なもののムーブを実現したいときくらい
36: デフォルトの名無しさん (アウアウウー Saa5-3l7D) [sage] 2023/11/05(日) 16:12:35.07 ID:jiV3XvQ2a(1) AAS
とにかく unique_ptr が便利すぎるから何でもかんでも全部 unique_ptr 使うようになってしまった
まあそれでいいのかもしれないが
37(1): デフォルトの名無しさん (アウアウウー Saa5-CWlg) [] 2023/11/05(日) 16:21:29.02 ID:ol9bMVcca(2/2) AAS
>>33
銀の弾丸ではない
手作業コーディングで責任を持たなければならないのは変わらない
38: はちみつ餃子◆8X2XSCHEME (ワッチョイ 823e-9NWm) [sage] 2023/11/05(日) 17:10:59.04 ID:pHGS9osC0(2/2) AAS
所有権管理も結局はプログラマが書く (間違いを部分的にコンパイルエラーとして検出できることはある)、
所有権って具体的に何なんだってのはクラス定義に押し込めるという風に管理のレイヤを分けることが出来るってわけ。
クラス定義をした後は具体的に何をやってるのかを忘れて
所有権というものだと思い込むことが出来るという抽象化の仕組み。
39: デフォルトの名無しさん (ワッチョイ 6540-pUwU) [sage] 2023/11/07(火) 10:10:32.04 ID:5c9945xO0(1) AAS
>>37
アホか
普通に考えて、そのコード(クラス)の利用者が所有権について明示的に何かしなきゃいけなかったということだろ
40(1): デフォルトの名無しさん (ワッチョイ 653a-qcxi) [sage] 2023/11/07(火) 19:02:58.77 ID:Z7KocuHY0(1/2) AAS
>>33
エスパーするけど多分その用途だとmoveは使えない。
データを共有している感じなので素直にshared ptrを使うのがいいかと。shared ptrで性能的にキツイならshared ptrを参照渡しするか。
41: デフォルトの名無しさん (ワッチョイ 653a-qcxi) [sage] 2023/11/07(火) 19:09:56.10 ID:Z7KocuHY0(2/2) AAS
>>40
ちょっと補足すると、戻り値をshared ptrの参照にするのはNGですな。そこは素直にRVOに期待するのが良いか。
42(1): デフォルトの名無しさん (ワッチョイ e5a7-cSrA) [sage] 2023/11/09(木) 17:23:48.54 ID:Op1F6lz40(1/3) AAS
VC++なんだけど32bitで_thiscallを関数ポインタ経由で呼ぶことってasm使わないと不可能?
メンバ関数を関数ポインタ変数とすることは出来てもそこから第一引数にインスタンス入れたりしてもコンパイル時エラーになる
43(1): デフォルトの名無しさん (ワッチョイ 454e-0SSA) [] 2023/11/09(木) 18:09:02.18 ID:vDu6brxv0(1) AAS
>>42
メンバ関数をポインタ経由で呼び出したいってことならstd::bindでできるはず
44: はちみつ餃子◆8X2XSCHEME (ワッチョイ 423e-9NWm) [sage] 2023/11/09(木) 18:24:20.63 ID:viBVvDAP0(1) AAS
VC++ のことは知らんけどメンバ関数ポインタは関数ポインタより大きい実装になってる処理系がある。
メンバ関数ポインタを関数ポインタに変換した時点で呼び出すのに必要な情報が失われているかもしれない。
45: デフォルトの名無しさん (ブーイモ MM62-wwCg) [sage] 2023/11/09(木) 19:04:30.42 ID:YhbH7ApDM(1) AAS
MJD?
46(1): デフォルトの名無しさん (オイコラミネオ MM49-wdyj) [sage] 2023/11/09(木) 19:13:19.18 ID:RZ9WOZDMM(1) AAS
エラーメッセージにヒントはない?
47: はちみつ餃子◆8X2XSCHEME (ワッチョイ 097f-Nt8Z) [sage] 2023/11/09(木) 19:58:26.06 ID:u3KRHVuW0(1) AAS
基本的には言語の規定内でやるに越したことはないので無理な型変換をしないで済ませられるように出来るものならそうしたほうがいい。
どうしてもそうできない事情がある(と質問者が認識している)ならもうちょっと詳しい状況をコードで示して欲しい。
48: デフォルトの名無しさん (ワッチョイ e5a7-cSrA) [sage] 2023/11/09(木) 21:12:03.97 ID:Op1F6lz40(2/3) AAS
>>43
ありがとう、逆アセ見たら完璧にthiscallになってた
メンバ関数っていうかthiscall指定したものは32bitだとecxレジスタにthisポインタが隠されていてそれ以外はstdcallと同じ
なので下みたいに第一引数にインスタンスのポインタを入れる事でecxに代入される感じになりそうだなーと思ったら無理だった
ちなみに64bitの場合はどちらもfastcallで同じだから単純に第一引数にthisポインタが隠されてるだけ
auto pFunc = CDate::addDay; // CDate addDay(int value)
CDate tomorrow = pFunc(&instance, 1);
49: デフォルトの名無しさん (ワッチョイ e5a7-cSrA) [sage] 2023/11/09(木) 21:28:58.67 ID:Op1F6lz40(3/3) AAS
てかググったら簡単なシミュレーション方法載せてるブログあった
_fastcallで宣言して第二引数のedxを捨て駒にする事で疑似_thiscallになる
つまりint(__fastcall * pFunc)(CDate*, void*, int)とすれば一応アセンブラ的な辻褄は合う事になる
50(1): デフォルトの名無しさん (ワッチョイ 1f63-1OcW) [sage] 2023/11/12(日) 10:07:59.74 ID:j2Y95IYf0(1/3) AAS
質問なのですが型Tの参照を返す関数 const T& foo() の戻り値をautoのいくつかのバリエーションで受けてアドレスを見て見たのですが
auto x = foo();
auto& y = foo();
const auto z = foo();
const auto& zz = foo();
const volatile auto& zzz = foo();
cout << "&original=" << &g_vec << endl; // &original = 00B013D8 (このアドレスは一例)
cout << "&x=" << &x << endl; // &x = 010FF8AC // コピー(意図しないかも?)
cout << "&y=" << &y << endl; // &y = 00B013D8 // 参照(OK)
cout << "&z=" << &z << endl; // &z = 010FF888 // コピー(意図しないかも?)
cout << "&zz=" << &zz << endl; // &zz = 00B013D8 // 参照(OK)
cout << "&zzz=" << &zzz << endl; // &zzz = 1 // !!!!
という行末コメントに記載の結果になったお
Q1. 参照で受けたい場合は auto でなく auto& とせねばならない、で正しい?
Q2. 間違えてauto で受けても動いてしまい発見し難いケースが多いと思うのですが
意図しないパフォーマンス低下になるので防ぐ対策とか無い?
Q3. zzzのアドレスが1になるのは一体……
MSVC2019使用、言語の設定はC++14、
51(1): はちみつ餃子◆8X2XSCHEME (ワッチョイ 7f3e-zQu6) [sage] 2023/11/12(日) 11:02:37.63 ID:O0gb6uIB0(1/3) AAS
>>50
A1. 単に auto としたときに参照になることはない。
参照として受け取りたい場合は auto& にせねばならないというのは正しい。
A2. 参照かどうかで自動的に場合分けして欲しいなら decltype(auto) とすればいいが……
参照で受けるのが正しい状況なのかどうかは状況による。
テンプレート内など自動的な場合分けが必要な場合を除いては参照は参照として明示したほうがよくない?
(個人的感想です。)
A3. いくつか用意されている operator<< の基本的なオーバーロードの内で bool にマッチするから。
void* もあるのだけれど C++ では任意のポインタは void* へは暗黙の型変換されないのでマッチング候補にならない。
アドレスとして解釈して欲しいなら void* へ明示的に型変換しないといけない。
52(1): はちみつ餃子◆8X2XSCHEME (ワッチョイ 7f3e-zQu6) [sage] 2023/11/12(日) 11:38:27.18 ID:O0gb6uIB0(2/3) AAS
ごめん。 間違いがあった。
ポインタは void* へ暗黙に変換できる。
この変換はオーバーロード解決時の候補になりうる。
ただ、 bool への変換とは優先順位に差がある。
53: デフォルトの名無しさん (ワッチョイ 1f63-1OcW) [sage] 2023/11/12(日) 11:42:25.19 ID:j2Y95IYf0(2/3) AAS
>>51>>52
㌧クス、
なるほど
わかりた
↓こうなったわ
decltype(auto) z = foo();
const auto& zz = foo();
const volatile auto& zzz = foo();
cout << "&original=" << (void*)&g_vec << endl; // &original=010213D8 (このアドレスは一例)
cout << "&z=" << (void*)&z << endl; // &z=010213D8 // 参照(OK)
cout << "&zz=" << (void*)&zz << endl; // &zz=010213D8 // 参照(OK)
cout << "&zzz=" << (void*)&zzz << endl; // &zzz=010213D8 // 参照(OK)
cout << std::boolalpha << "&zzz=" << &zzz << endl; // &zzz=true // boolean
boolへの変換は使うことは無いと思うが正体は調べてみるわ
54: デフォルトの名無しさん (ワッチョイ 1f63-1OcW) [sage] 2023/11/12(日) 11:46:29.61 ID:j2Y95IYf0(3/3) AAS
>テンプレート内など自動的な場合分けが必要な場合を除いては参照は参照として明示したほうがよくない?
非constなら考えるがこの場合foo()はconstオヌジェクトと参照を返してくるし、
これはもうdecltype(auto)一択で良いような気がが、
55: はちみつ餃子◆8X2XSCHEME (ワッチョイ 7f3e-zQu6) [sage] 2023/11/12(日) 12:07:32.76 ID:O0gb6uIB0(3/3) AAS
volatile を追加する変換は出来るが除く変換は出来ないから
volatile 付きのオーバーロードを用意していない operator<< では候補から消えて
bool だけが候補として残ってしまうってことになるみたいだな。
volatile が付いていない場合は
void* への変換のほうが bool への変換より優先順位が高いので
そっちが呼ばれる。
56(1): あぼーん [あぼーん] AAS
あぼーん
57: デフォルトの名無しさん (ワッチョイ 7fb1-qIOU) [sage] 2023/11/13(月) 02:33:43.38 ID:eLF59GiN0(1) AAS
>>56
案内サンクス
58(1): デフォルトの名無しさん (ワッチョイ 1f01-XI6K) [] 2023/11/14(火) 02:19:13.60 ID:DkCdWP9x0(1) AAS
CLion使ってる人いますか?
59: デフォルトの名無しさん (ワッチョイ 1fad-XI6K) [] 2023/11/17(金) 17:16:02.48 ID:TT3SJP5h0(1) AAS
日本人の死亡者が増えてるのに、メディアは報道規制
2chスレ:cafe50
60(1): デフォルトの名無しさん (ワッチョイ 6ecf-ekUX) [sage] 2023/11/18(土) 16:16:09.27 ID:5MckQHFy0(1) AAS
ラムダの参照キャプチャってconst参照に指定できないんだっけ?微妙に不便だな。
61: デフォルトの名無しさん (ワッチョイ 7901-4XBo) [sage] 2023/11/18(土) 20:47:45.62 ID:GRi2RJZB0(1) AAS
>>60
これじゃだめ?
#include <iostream>
using namespace std;
int main () {
const int a {0};
int b {0};
[&a, &b = const_cast <const int &> (b)] () {
++ a; // X
++ b; // X
} ();
return 0;
}
62: デフォルトの名無しさん (ワッチョイ 4701-1fOb) [] 2023/11/26(日) 06:27:21.37 ID:DSb557XU0(1) AAS
C++20 RangesはMicrosoftの説明がわかりやすかった
63(2): デフォルトの名無しさん (ワッチョイ 791f-q5uF) [sage] 2023/12/05(火) 10:33:06.64 ID:HLoKrA0o0(1) AAS
ふと今更思ったんだけど
ポインターpに対して演算子*が返す*pは、
値じゃなくて参照?
64(1): デフォルトの名無しさん (ワッチョイ b501-sZSb) [sage] 2023/12/05(火) 11:05:15.15 ID:E3GJtsiR0(1/3) AAS
#include <type_traits>
#include <iostream>
using namespace std;
int main () {
int value {0};
int *p {&value};
cout << is_reference <int>::value << '\n';
cout << is_reference <int &>::value << '\n';
cout << is_reference <decltype (value)>::value << '\n';
cout << is_reference <decltype (*p)>::value << '\n';
return 0;
}
65: デフォルトの名無しさん (ワッチョイ edf6-JrwL) [] 2023/12/05(火) 11:09:19.91 ID:IVr4NrBA0(1) AAS
>>63
参照ってのが何を意味しているか分からんが
普通はポインターの示す場所の内容だ
66(1): はちみつ餃子◆8X2XSCHEME (ワッチョイ 2a3e-By03) [sage] 2023/12/05(火) 11:22:18.93 ID:z5PiblaY0(1/4) AAS
>>63
ポインター p に対して *p とした場合の型は参照ではない。
たぶん >>64 は *p が参照と言いたいつもりで書いているんだと思うけど
decltype に与えられる式の型が T 型の lvalue だった場合には T& が返されるルールなので
その式が参照でなくても参照が返されることがある。
67: はちみつ餃子◆8X2XSCHEME (ワッチョイ 2a3e-By03) [sage] 2023/12/05(火) 11:24:42.01 ID:z5PiblaY0(2/4) AAS
あ、ごめん。 完全に間違った説明してたわ。 忘れて……。 恥ずかしい。
68(1): はちみつ餃子◆8X2XSCHEME (ワッチョイ 2a3e-By03) [sage] 2023/12/05(火) 11:34:00.06 ID:z5PiblaY0(3/4) AAS
と思ってよく仕様を読んでみたらやっぱりこの (>>66) 考え方で正しいはず。
式が識別子式の時に限っては decltype は参照にならず式の型そのままで返すせいで decltype(value) は参照にならないが、
value と *p は型システム的にも値カテゴリ的にも同じだわ。
69: デフォルトの名無しさん (ワッチョイ b501-sZSb) [sage] 2023/12/05(火) 12:43:28.97 ID:E3GJtsiR0(2/3) AAS
>>68
なるほどー! 横からだが勉強になった
70: デフォルトの名無しさん (ワッチョイ b501-sZSb) [sage] 2023/12/05(火) 12:48:03.77 ID:E3GJtsiR0(3/3) AAS
巷のスマートポインタはoperator*で参照型を返すので
生ポインタも同じかと思ってたよ
71: はちみつ餃子◆8X2XSCHEME (ワッチョイ 2a3e-By03) [sage] 2023/12/05(火) 13:28:25.92 ID:z5PiblaY0(4/4) AAS
互換性の都合とかがあるから仕方ないね。
場合分けが大量にあって単純な一般原則の組み合わせにはなってないから仕様を読み解くのがしんどい……
72(2): デフォルトの名無しさん (ワッチョイ 9f1f-oseA) [sage] 2023/12/11(月) 15:17:51.77 ID:7vxydTfj0(1/2) AAS
ある構造体Aがあります
Aの比較関数が複数ありますcompA0,compA1,compA2,...
比較関数の関数ポインタがありますcompA
compA = &compA2;
別の構造体Bがあります
BはAを内包しています
struct B{ A a; ... };
この構造体Bを、Aの比較関数ポインタcompAで比較してソートするにはどう記述すればよいですか?
std::vector<B> bs;
bs.push_back(...);...
std::sort(bs.begin(),bs.end(),?);
できればラムダ式を使わずにできるとありがたいです
73: デフォルトの名無しさん (ブーイモ MM5b-oUR/) [sage] 2023/12/11(月) 15:22:02.06 ID:F1R6HyeLM(1) AAS
>>72
ラムダ式使った方が良いと思うけど本当にラムダ式なしが良い?
74(1): デフォルトの名無しさん (ワッチョイ 9f1f-oseA) [sage] 2023/12/11(月) 15:29:19.94 ID:7vxydTfj0(2/2) AAS
使われると、ラムダ式の質問をすることになると思います・・・
75(2): はちみつ餃子◆8X2XSCHEME (ワッチョイ 9f3e-pD6R) [sage] 2023/12/11(月) 15:45:20.57 ID:wAhsIAfi0(1/2) AAS
>>72
もし C++20 を使えるなら (std::sort と違って) std::ranges::sort では比較関数とは別に
比較すべき要素を取り出す操作をプロジェクションとして与えることが出来るから
これ一発でいけてだいぶん楽できる。
std::ranges::sort(bs, compA, &B::a);
76: デフォルトの名無しさん (ワッチョイ d701-Qbcu) [sage] 2023/12/11(月) 16:01:10.52 ID:dil4ai7q0(1/2) AAS
>>75
すげ! 今そんなのあるんやね
77(1): デフォルトの名無しさん (ワッチョイ d701-Qbcu) [sage] 2023/12/11(月) 16:34:20.59 ID:dil4ai7q0(2/2) AAS
>>74
思い出すのがしんどくなってきた
#include <iostream>
#include <vector>
#include <algorithm>
#include <functional>
using namespace std;
struct A {int value_;};
bool compA2 (const A &lhs, const A &rhs) {
return lhs.value_ < rhs.value_;
}
struct B {A a;};
int main () {
vector <B> bs;
bool (*compA) (const A &, const A &) {compA2};
sort (bs.begin(), bs.end(), bind (compA, bind (mem_fn (&B::a), placeholders::_1), bind (mem_fn (&B::a), placeholders::_2)));
sort (bs.begin(), bs.end(), [compA] (const auto &lhs, const auto &rhs) {return (*compA) (lhs.a, rhs.a);});
return 0;
}
78: デフォルトの名無しさん (ワッチョイ 771f-oseA) [sage] 2023/12/11(月) 17:14:54.00 ID:cVrrslE50(1/2) AAS
>>75
>>77
お二方、ありがとうございます
参考にして組んでみます
79(1): はちみつ餃子◆8X2XSCHEME (ワッチョイ 9f3e-pD6R) [sage] 2023/12/11(月) 17:25:04.51 ID:wAhsIAfi0(2/2) AAS
その場で合成するのはさすがに見通しが悪すぎるので、
C++11 頃の C++ を仮定して私がやるならまずアダプタを作ると思う。
ちょっと雑ですまんがとりあえずこんな感じ。
class compB_adaptor {
private:
using comparator = std::function<bool(const A&, const A&)>;
comparator compA;
public:
compB_adaptor(comparator comp) : compA(comp) {}
bool operator()(const B& x, const B& y) {
return compA(x.a, y.a);
}
};
使うときには間にひとつ挟むだけで済む。
std::sort(bs.begin(), bs.end(), compB_adaptor(compA));
80: デフォルトの名無しさん (ワッチョイ 771f-oseA) [sage] 2023/12/11(月) 22:08:32.24 ID:cVrrslE50(2/2) AAS
>>79
求めていたものそのものであったため、採用させていただきました
ありがとうございます
81: デフォルトの名無しさん (ワッチョイ 1663-4if3) [sage] 2023/12/20(水) 23:47:12.14 ID:tqHuIeXr0(1) AAS
int x;
std::cout << x;
でxが正ののときは「+」符号を付けさせるのってどうするんでしたっけ……
cout.form("%+d", x)とか以外で
82: デフォルトの名無しさん (ワッチョイ 2701-NGr8) [sage] 2023/12/20(水) 23:58:48.32 ID:Qfvbx0VO0(1) AAS
cout << showpos
83: デフォルトの名無しさん (ワッチョイ 1663-4if3) [sage] 2023/12/21(木) 08:41:44.38 ID:6wjPSKlj0(1) AAS
てきました㌧クス、
iosヘッダで探せば良かったのか、、、
84: デフォルトの名無しさん (ワッチョイ 63d2-XEY5) [sage] 2023/12/21(木) 20:01:46.13 ID:i16TeC3D0(1) AAS
C++23だとこれ
std::print("{:+}", x);
85(1): デフォルトの名無しさん (ワッチョイ 4ba7-JRUi) [sage] 2023/12/22(金) 13:56:54.85 ID:pQLEje080(1) AAS
PythonやC#のようなf"{x}"構文が作られる事はないんだろうか
86: はちみつ餃子◆8X2XSCHEME (ワッチョイ d23e-E09z) [sage] 2023/12/22(金) 14:54:27.15 ID:gr/vrzoo0(1) AAS
>>85
リフレクションが充実すればその上に実装できるので
直接的な言語機能として用意すると
辻褄合わせが後で面倒になるだろうし、
現時点で考えるのは時期尚早だと思う。
87(1): デフォルトの名無しさん (ワッチョイ cf63-nyJS) [sage] 2023/12/24(日) 17:42:14.24 ID:foDTiHm90(1/5) AAS
質問なのですが自作クラスFooのストリーム出力演算子に引数付きのマニピュレータを追加したいのですが
↓こんなやつ
Foo obj;
cout << custom_setw(10) << obj; // 整数のベクトル的なオブジェクトobjの要素を幅10文字で出力
custom_setw()で与えた10という数値をつつがなくFooのストリーム出力演算子
std::ostream& operator<<(std::ostream& os, const Foo& obj)
に渡すには一体どうすれば……orz
88(1): デフォルトの名無しさん (ワッチョイ cf63-nyJS) [sage] 2023/12/24(日) 17:42:52.36 ID:foDTiHm90(2/5) AAS
グローバル変数渡しは最初に思いつくのですが、ostringstream os1, os2とFoo obj1, obj2に対して異なるスレッドで
os1 << custom_setw(30) << obj1; // スレッド1
os2 << custom_setw(20) << obj2; // スレッド2
とかやったら詰むし
std::setw()とか一体どうやってるんじゃ……
89: はちみつ餃子◆8X2XSCHEME (ワッチョイ ff3e-XnzH) [sage] 2023/12/24(日) 18:05:55.09 ID:SfA3xmSz0(1/2) AAS
>>87-88
特定の型を出力するときにだけ作用する書式を設定するマニピュレータってこと?
std::setw がやってるのはストリームのメンバ関数 width を呼ぶのと同じ。
ストリームのオブジェクトが幅に関する情報を保存するデータメンバを持っていて、それを変更してる。
もちろんあなたが定義した独自の型 (この例では Foo) に結び付いた書式を保持するところなんて存在しないから単純にはできない。
私が思いつくのは
・ ストリームのほうも新しいものを定義する、つまり basic_ostream を継承して Foo 用の書式を格納するデータメンバを増やす
・ ストリームに対応付いたデータを格納するものを std::map かなんかで保持しておいて Foo を出力するときはそれを参照する
ということくらいかな。
スレッドが絡むと面倒くさいけど、しょうがないね。
90: デフォルトの名無しさん (ワッチョイ 337c-dsFJ) [sage] 2023/12/24(日) 19:04:41.48 ID:vbUOIudY0(1) AAS
既存のcoutとかstringstreamとかで使いたいなら、グローバルのstd::unordered_map<std::ios_base*, MyManipData>にでも置いとくしかないだろうね
ストリームオブジェクトの状態で持たせるクソ設計が悪いんだ
91: デフォルトの名無しさん (ワッチョイ cf63-nyJS) [sage] 2023/12/24(日) 19:34:37.93 ID:foDTiHm90(3/5) AAS
レス㌧クス、
>ストリームのオブジェクトが幅に関する情報を保存するデータメンバを持っていて、それを変更してる。
なるほど……
これはユザーの立場からはメンバの追加ができない領域なので、Fooの側にメンバを持たせることにしますか……
class FooWrp {
const Foo& m_objRef;
int m_nWidth;
public:
FooWrp(const Foo& obj, int width) : m_objRef(obj), m_nWidh(width) { }
friend std::ostream& operator<<(std::ostream& os, const FooWrp& wrp) { ...(wrp.m_objRefの要素をwrp.m_nWidthに描かれている幅で出力する処理)... }
};
92: デフォルトの名無しさん (ワッチョイ cf63-nyJS) [sage] 2023/12/24(日) 19:35:17.01 ID:foDTiHm90(4/5) AAS
// 使い方
Foo obj;
cout << FooWrp(obj, 10);
ダッサwwwwwwwwwwwwwwwwwww
しかし、「たかが表示の整形」のために排他制御しつつmapを弄ったりTLSの利用を考えるのもアレなのでこれはこれで仕方が無いのか、orz
93: デフォルトの名無しさん (ワッチョイ a31e-H80b) [] 2023/12/24(日) 19:45:29.51 ID:Y8qSN/i/0(1/2) AAS
ストリーム用の演算子なんか作らずに
オブジェクトの文字列表現を返す関数を用意したほうが汎用性高くない?
94: デフォルトの名無しさん (ワッチョイ cf63-nyJS) [sage] 2023/12/24(日) 19:50:06.00 ID:foDTiHm90(5/5) AAS
Foo obj;
std::string s = obj.str(10); // 10億ギガ文字
cout << s;
出力を完遂できるんかこれ……
95: はちみつ餃子◆8X2XSCHEME (ワッチョイ ff3e-XnzH) [sage] 2023/12/24(日) 20:00:55.29 ID:SfA3xmSz0(2/2) AAS
C++20 からは std::formatter を特殊化して書式指定を解釈するコードを入れておけば
std::format で独自の型を表示しようとしたときにその特殊化が使われる仕組みになってる。
96: デフォルトの名無しさん (ワッチョイ a31e-H80b) [] 2023/12/24(日) 21:41:50.00 ID:Y8qSN/i/0(2/2) AAS
オブジェクトの文字列表現が10億ギガ文字もあるの!?
FooWrpオブジェクトをうっかりログに出力しちゃったら大変だね!!
97(1): デフォルトの名無しさん (ワッチョイ cf63-nyJS) [sage] 2023/12/29(金) 19:34:46.18 ID:MPSeCS+O0(1/2) AAS
実験せずに質問するますが、
int a, b;
cin >> &x >> &y;
に対し、
Q1. 「100 a」を入力したら例外もタイムアウト待ちも発生せず、cin.fail()がtrueになるだけ?
Q2. 「100」とだけ入力してそのまんま(リダイレクト元のファイルハンドルか何かが
タイムアウトもエラーもクローズもしなければ)ならそれっきり返ってこない?
98: デフォルトの名無しさん (ワッチョイ cf63-nyJS) [sage] 2023/12/29(金) 19:40:39.84 ID:MPSeCS+O0(2/2) AAS
EOFが抜けてたorz
Q2のケースにおいて「100 [EOF]」なら(多分)cin.fail()でとりあえずすぐ返ってくるのかそうか、
99(1): はちみつ餃子◆8X2XSCHEME (ワッチョイ ff3e-XnzH) [sage] 2023/12/29(金) 21:37:06.10 ID:0cvltfsQ0(1) AAS
>>97
実にしょうもない確認なんだけど、
言いたいことは
int x, y;
cin >> x >> y;
でよいんだよね?
100(1): デフォルトの名無しさん (ワッチョイ de63-J7+h) [sage] 2023/12/30(土) 05:42:41.89 ID:3ksfrMrT0(1/3) AAS
>>99
>int x, y;
>cin >> x >> y;
おk
スマンカッタorz
エラーとEOFのどちらかを検知したかったら!cin.good()が正しいっぽい?
https://blog.emattsan.org/entry/20110819/1313743195
ここまでは分かった気がするが、
ストリーム入力演算子std::istream& operator>>(std::istream& os, Foo& obj)の中で入力に失敗した場合
どうやってエラーを呼び出し元に通知したらええんじゃ……
上下前次1-新書関写板覧索設栞歴
あと 902 レスあります
スレ情報 赤レス抽出 画像レス抽出 歴の未読スレ AAサムネイル
ぬこの手 ぬこTOP 0.027s