!extend:checked:vvvvv:1000:512
!extend:checked:vvvvv:1000:512
↑同じ内容を3行貼り付けること
次スレは>>980が立てること
無理なら細かく安価指定
※前スレ
C++相談室 part162
https://mevius.5ch.net/test/read.cgi/tech/1667194175/
VIPQ2_EXTDAT: checked:vvvvv:1000:512:: EXT was configured
探検
C++相談室 part163
■ このスレッドは過去ログ倉庫に格納されています
1デフォルトの名無しさん (ワッチョイ bbda-Axul)
2022/12/30(金) 23:16:31.37ID:DPUEZfMS0342デフォルトの名無しさん (ワッチョイ 0f7c-m47a)
2023/02/04(土) 20:22:02.19ID:Uc49lFdn0 >>340
std::flushは呼び出し後にバッファがフラッシュされることを保証するだけで、書き込みをするタイミングは未規定(pstreamの勝手)
ostreamはoperator<<が呼ばれたそばから全部書き出してもいいし、バッファを半分ずつとか書き出してもいいしそれはostreamの自由
「入力されてまだフラッシュされていない」なんていう状態はostreamが教える義理はないし真っ当な方法では外からは観測できないしするべきでもない
ましてそれを弄くろうなんて考えるのがカプセル化を無視した間違った考え方だ
std::flushは呼び出し後にバッファがフラッシュされることを保証するだけで、書き込みをするタイミングは未規定(pstreamの勝手)
ostreamはoperator<<が呼ばれたそばから全部書き出してもいいし、バッファを半分ずつとか書き出してもいいしそれはostreamの自由
「入力されてまだフラッシュされていない」なんていう状態はostreamが教える義理はないし真っ当な方法では外からは観測できないしするべきでもない
ましてそれを弄くろうなんて考えるのがカプセル化を無視した間違った考え方だ
343デフォルトの名無しさん (ワッチョイ 7fbb-jaVN)
2023/02/04(土) 20:26:28.53ID:b1h/gALG0 なんだろね。std::formatだけでは効率が悪かったのかな?
344デフォルトの名無しさん (オイコラミネオ MM03-IoIL)
2023/02/04(土) 20:26:47.52ID:KFFsFRScM >>340
C++のSTLには、ファイルではないstreamの中に、そういう機能を持つものがあり、
atoi()の代わりに用いる例が出ていた。
それは入力と出力が可能なstreamで、文字列を出力しておいて、整数型として
入力することが出来る。
それが出来るということは、語尾を削除することも出来そう。
C++のSTLには、ファイルではないstreamの中に、そういう機能を持つものがあり、
atoi()の代わりに用いる例が出ていた。
それは入力と出力が可能なstreamで、文字列を出力しておいて、整数型として
入力することが出来る。
それが出来るということは、語尾を削除することも出来そう。
345デフォルトの名無しさん (オイコラミネオ MM03-IoIL)
2023/02/04(土) 20:59:53.67ID:KFFsFRScM 全く確認できてないが、。
stringstring s;
s << "ABCDEF";
string s2;
s >> setw(3) >> s2;
で s2 に "ABC" が読み込めるかもしれない。
誰か確認して候。
stringstring s;
s << "ABCDEF";
string s2;
s >> setw(3) >> s2;
で s2 に "ABC" が読み込めるかもしれない。
誰か確認して候。
346デフォルトの名無しさん (ワッチョイ 4f01-hyUu)
2023/02/04(土) 21:06:47.02ID:e1OBQ9Uv0347デフォルトの名無しさん (オイコラミネオ MM03-IoIL)
2023/02/04(土) 21:10:37.97ID:KFFsFRScM >>345
[追加]
(2)
std::ofstream ostream;
ostream << setw(3) << "ABCEFG";
(3) C++ 20 以降限定になるが、
std::format() を使う。
[追加]
(2)
std::ofstream ostream;
ostream << setw(3) << "ABCEFG";
(3) C++ 20 以降限定になるが、
std::format() を使う。
348デフォルトの名無しさん (ワッチョイ 3fad-t53W)
2023/02/04(土) 21:44:35.26ID:J5X2r1Ng0 >>340
>んで、入力されてまだフラッシュされていない文字列"ABCEFG"を
>右側3文字を削除して"ABC"にするには
>どうすれば良いのでしょうか?
"ABC"しか入力(ストリームに対する出力)されないようにするのが筋じゃねえの?
何がしたいのか
>んで、入力されてまだフラッシュされていない文字列"ABCEFG"を
>右側3文字を削除して"ABC"にするには
>どうすれば良いのでしょうか?
"ABC"しか入力(ストリームに対する出力)されないようにするのが筋じゃねえの?
何がしたいのか
349デフォルトの名無しさん (アウアウエー Sabf-FmQs)
2023/02/04(土) 21:50:32.61ID:b6Tm4pTJa そういう感じの質問こそAIに聞くと的確な答が返ってきそう
350デフォルトの名無しさん (ワッチョイ 8f10-LcEw)
2023/02/04(土) 21:51:53.73ID:yysysFOo0 ストリームの出力を後からいじれたらそれはストリームじゃない
ただのバッファだ
ただのバッファだ
351デフォルトの名無しさん (ワッチョイ 3fad-4osW)
2023/02/04(土) 22:20:06.17ID:dPBsul5J0 JavaはStringBufferInputStreamとかいうのがあったけどdeprecatedされてるね
352デフォルトの名無しさん (オイコラミネオ MM03-IoIL)
2023/02/04(土) 22:39:15.87ID:KFFsFRScM353デフォルトの名無しさん (ワイーワ2 FFbf-+IHm)
2023/02/05(日) 20:22:13.30ID:KKxK2YdEF >>340
どうでもいいけどostreamはC++だぞ
どうでもいいけどostreamはC++だぞ
354デフォルトの名無しさん (ラクッペペ MM4f-lcFY)
2023/02/05(日) 22:02:55.86ID:leiLOsKWM355デフォルトの名無しさん (ワッチョイ 4f01-mMLA)
2023/02/05(日) 22:15:41.89ID:vWrwcA+50 ↑ 流石にこれはなにかの病気を疑わざるを得ないな
356デフォルトの名無しさん (ワッチョイ 0f7c-m47a)
2023/02/05(日) 23:11:05.45ID:ub5/0hy90 おかしいな、C言語の<<には左シフトの意味しかないはずだが
357デフォルトの名無しさん (オイコラミネオ MM03-IoIL)
2023/02/05(日) 23:16:38.70ID:jwd7GZbHM そもそも、C++のSTLにstd::ostreamがある。
358デフォルトの名無しさん (オイコラミネオ MM03-IoIL)
2023/02/06(月) 11:10:20.13ID:MSBukcfKM >>327
stdin から ABCDEF を入力して、stdout にABC を出力するらしい例。
なお、実際には全く確認してない。
[方法1]
// 文字列変数 a の段階で3文字に切り詰められ、ABC だけが入ってくるらしい。
string a;
cin >> setw(3) >> a;
cout << a;
[方法2]
// 文字列変数 a には、ABCDEF が入るが、出力は最初の 3 文字になるらしい。
string a;
cin >> a;
cout << setw(3) << a;
stdin から ABCDEF を入力して、stdout にABC を出力するらしい例。
なお、実際には全く確認してない。
[方法1]
// 文字列変数 a の段階で3文字に切り詰められ、ABC だけが入ってくるらしい。
string a;
cin >> setw(3) >> a;
cout << a;
[方法2]
// 文字列変数 a には、ABCDEF が入るが、出力は最初の 3 文字になるらしい。
string a;
cin >> a;
cout << setw(3) << a;
359デフォルトの名無しさん (ワッチョイ 4f5f-NCx9)
2023/02/06(月) 13:24:21.21ID:KoRl3hvD0 とりあえず変数名をostreamにするのはやめなよ
360デフォルトの名無しさん (スッププ Sd5f-340S)
2023/02/07(火) 12:29:25.49ID:UPy+Lbp7d >>340
だから自前のバッファで操作してから書き込めばいいじゃんって話
ストリー厶の意味がわかってないんじゃない
サンプル例題ならともかくもっと実用的なアプリを使うようになったら当然そうなるしそんなとこほじくってるよりもメモリ上で操作すれば簡単だって話
だから自前のバッファで操作してから書き込めばいいじゃんって話
ストリー厶の意味がわかってないんじゃない
サンプル例題ならともかくもっと実用的なアプリを使うようになったら当然そうなるしそんなとこほじくってるよりもメモリ上で操作すれば簡単だって話
361デフォルトの名無しさん (ワッチョイ 4f5f-NCx9)
2023/02/07(火) 13:30:35.63ID:3xIDowU30 ABCEFGのDが抜けてるのが気になって夜も眠れない
362デフォルトの名無しさん (ワッチョイ 3ff0-EOzK)
2023/02/07(火) 15:26:01.77ID:zqUp3ndL0 いつもの人かな?自由研究楽しそうだねー!
363デフォルトの名無しさん (ワッチョイ 0f7c-m47a)
2023/02/07(火) 19:29:46.00ID:EcDeonqz0 聞いてるのも答えてるのもいつもの天才くんだろ
お人形遊びなら他所でやってね
お人形遊びなら他所でやってね
364デフォルトの名無しさん (テテンテンテン MM4f-tu9g)
2023/02/07(火) 20:46:11.42ID:gvW0HmgtM この言語、constメンバ関数じゃなくてmutableメンバ関数だったらよかったのにと思いました。
あとnoexceptから普通に例外飛ばせるのなんとかしてください。
あとnoexceptから普通に例外飛ばせるのなんとかしてください。
365デフォルトの名無しさん (ワッチョイ 4f5f-NCx9)
2023/02/08(水) 00:16:04.31ID:XAt49H4z0 try/catchが重いのもなんとかしてほしい
366はちみつ餃子 ◆8X2XSCHEME (ワッチョイ cf3e-F1up)
2023/02/08(水) 12:51:56.02ID:dBOwscE40 >>365
今は try はそんなに重くない。
今は try はそんなに重くない。
367デフォルトの名無しさん (オイコラミネオ MM03-IoIL)
2023/02/08(水) 14:01:54.37ID:ZMdgsCGCM >>366
tryを使う場合、その関数の冒頭で、exception handler(←名前は忘れました)の
アドレスを fs:[xxx] 見たいな場所に退避したり、新しいアドレスを入れたりする
プロローグコードが挿入されるので、例外が全く発生しない場合でも、
少し遅くなる。
tryを使う場合、その関数の冒頭で、exception handler(←名前は忘れました)の
アドレスを fs:[xxx] 見たいな場所に退避したり、新しいアドレスを入れたりする
プロローグコードが挿入されるので、例外が全く発生しない場合でも、
少し遅くなる。
368デフォルトの名無しさん (ワッチョイ 7fb2-KDf3)
2023/02/08(水) 14:04:21.50ID:9Chuoarh0 重いつーより設計の悪さが残念
C++11でC++98より「マシ」になったけど
まだまだ垢抜けてない
C++11でC++98より「マシ」になったけど
まだまだ垢抜けてない
369デフォルトの名無しさん (ワッチョイ 3ff0-EOzK)
2023/02/08(水) 14:31:26.00ID:sdVGBQKo0 そうか?
他の言語触るほど良く出来てるなと感心するけど
他の言語触るほど良く出来てるなと感心するけど
370デフォルトの名無しさん (ワッチョイ 4f5f-F1up)
2023/02/08(水) 15:04:01.92ID:xSLFVKqx0 >>367 それは昔のコンパイラの話でしょ。現行だというなら具体的なコンパイラを挙げてね。
371デフォルトの名無しさん (スプッッ Sddf-6749)
2023/02/08(水) 17:48:16.42ID:JNAb9Hi4d x86-64は速い
x86-32は遅い
x86-32は遅い
372デフォルトの名無しさん (オイコラミネオ MM03-IoIL)
2023/02/08(水) 19:21:58.71ID:ny58eQb8M373デフォルトの名無しさん (オイコラミネオ MM03-IoIL)
2023/02/08(水) 19:41:50.12ID:ny58eQb8M >>372
[補足]
その時にネットで検索したら、(確か)IBMのコンパイラだけは、
例外処理を行なう関数でも、追加プロローグが必要なくて、例外が発生しない
ときには全くオーバーヘッドが無い、ということだった。
VC++だと、例外処理を使う関数には以下の様なプロローグとエピローグが追加されると
思う。記憶に頼っているので大体こんな感じだった、という程度で、本当は
間違っているかも知れない。
push fs:[xxxx]
mov fs:[xxxx],その関数の例外ハンドラのアドレス
・・・
pop fs:[xxxx]
[補足]
その時にネットで検索したら、(確か)IBMのコンパイラだけは、
例外処理を行なう関数でも、追加プロローグが必要なくて、例外が発生しない
ときには全くオーバーヘッドが無い、ということだった。
VC++だと、例外処理を使う関数には以下の様なプロローグとエピローグが追加されると
思う。記憶に頼っているので大体こんな感じだった、という程度で、本当は
間違っているかも知れない。
push fs:[xxxx]
mov fs:[xxxx],その関数の例外ハンドラのアドレス
・・・
pop fs:[xxxx]
374デフォルトの名無しさん (オイコラミネオ MM03-IoIL)
2023/02/08(水) 19:45:44.31ID:ny58eQb8M >>367
誤: アドレスを fs:[xxx] 見たいな場所に退避したり、新しいアドレスを入れたりする
プロローグコードが挿入されるので、
正: fs:[xxx]の中身をスタックに保存した後、fs:[xxx]に新しい例外ハンドラの
アドレスを入れるプロローグコードが挿入されるので
誤: アドレスを fs:[xxx] 見たいな場所に退避したり、新しいアドレスを入れたりする
プロローグコードが挿入されるので、
正: fs:[xxx]の中身をスタックに保存した後、fs:[xxx]に新しい例外ハンドラの
アドレスを入れるプロローグコードが挿入されるので
375デフォルトの名無しさん (ワッチョイ 0f7c-m47a)
2023/02/08(水) 19:53:05.57ID://IGlelw0 3レスも使って具体的な情報ゼロの無能乙
376デフォルトの名無しさん (ワッチョイ 8f10-LcEw)
2023/02/08(水) 20:11:13.99ID:0CKFfiVb0 その程度のコードが気になるほど小さな処理を例外で囲むのはおよし
377デフォルトの名無しさん (ワッチョイ 0f02-9sAx)
2023/02/08(水) 21:14:42.08ID:TiunzV3b0 std::string_viewじゃダメ?
378デフォルトの名無しさん (ワッチョイ 3f28-G/zc)
2023/02/08(水) 23:14:10.46ID:91RYCz8E0 実験もせずに聞くのもアレですが
std::array<short, 100> x;
に対して
*(unsigned long long*)&(x[0]) = 1ULL << 63;
とかやってもアライメント的に問題は無いの?
std::array<short, 100> x;
に対して
*(unsigned long long*)&(x[0]) = 1ULL << 63;
とかやってもアライメント的に問題は無いの?
379デフォルトの名無しさん (ワッチョイ 3f28-G/zc)
2023/02/08(水) 23:43:16.66ID:91RYCz8E0 問題ありそうなのでこんな感じにしたわ;;;
const static int NECONV = (sizeof(uint64_t) - 1) / sizeof(short) + 1;
union LargeInt {
short m_small[NECONV];
uint64_t m_large;
};
static void writeLargeInt(const uint64_t x, std::array<short, NE>& arr) {
LargeInt u;
u.m_large = x;
for (int i = 0; i < NECONV; i++) {
arr[i] = u.m_small[i];
}
}
const static int NECONV = (sizeof(uint64_t) - 1) / sizeof(short) + 1;
union LargeInt {
short m_small[NECONV];
uint64_t m_large;
};
static void writeLargeInt(const uint64_t x, std::array<short, NE>& arr) {
LargeInt u;
u.m_large = x;
for (int i = 0; i < NECONV; i++) {
arr[i] = u.m_small[i];
}
}
380デフォルトの名無しさん (ワッチョイ 7ff2-zLlH)
2023/02/09(木) 00:00:46.36ID:vSPJO8mm0 エンディアンでググれ
381はちみつ餃子 ◆8X2XSCHEME (ワッチョイ cf3e-F1up)
2023/02/09(木) 00:46:46.54ID:zt0qN6wf0 >>379
アラインというか、言語仕様上の保証という意味では最後に書き込んだ供用体メンバ意外から読むのは未定義という解釈が一般的だよ。
未定義と直接に書いてあるところもないんだけど出来ると書いてあるところもないのでこういう場合は未定義と解される。
(ただしスタンダードレイアウトで初期シーケンスが共通している箇所については OK 。)
m_large に書き込んだなら m_small として読むべきではない。
大抵の処理系では拡張として OK にしているけど細かい制約は場合によるから問題があるかないかは
処理系の都合をきちんと検証しないとわからん。
特にハードウェア寄りの仕方のない状況を除けば避けれるものなら避けたほうがよくはある。
アラインというか、言語仕様上の保証という意味では最後に書き込んだ供用体メンバ意外から読むのは未定義という解釈が一般的だよ。
未定義と直接に書いてあるところもないんだけど出来ると書いてあるところもないのでこういう場合は未定義と解される。
(ただしスタンダードレイアウトで初期シーケンスが共通している箇所については OK 。)
m_large に書き込んだなら m_small として読むべきではない。
大抵の処理系では拡張として OK にしているけど細かい制約は場合によるから問題があるかないかは
処理系の都合をきちんと検証しないとわからん。
特にハードウェア寄りの仕方のない状況を除けば避けれるものなら避けたほうがよくはある。
382デフォルトの名無しさん (ワッチョイ 3f28-G/zc)
2023/02/09(木) 08:04:31.16ID:nokdLSLo0 >エンディアンでググれ
えっ
>言語仕様上の保証という意味では最後に書き込んだ供用体メンバ意外から読むのは未定義
えっ;;;
LARGE_INTEGER共用体 (winnt.h)が使える環境でMicrosoft社製コンパイラでビルドする場合は未定義でないものとする、、、
LONGLONGとDWORDとLONG間でしか保証されないとか言われたら知らん、、、
えっ
>言語仕様上の保証という意味では最後に書き込んだ供用体メンバ意外から読むのは未定義
えっ;;;
LARGE_INTEGER共用体 (winnt.h)が使える環境でMicrosoft社製コンパイラでビルドする場合は未定義でないものとする、、、
LONGLONGとDWORDとLONG間でしか保証されないとか言われたら知らん、、、
383デフォルトの名無しさん (オッペケ Sr63-QuYT)
2023/02/09(木) 08:22:03.41ID:3hUU93Bbr >>382
未定義って言われたことに対して特定の処理系の仕様を挙げて何がしたいの?
未定義って言われたことに対して特定の処理系の仕様を挙げて何がしたいの?
384デフォルトの名無しさん (ワッチョイ 8f10-LcEw)
2023/02/09(木) 08:27:19.15ID:6bPfV7hH0385デフォルトの名無しさん (スプッッ Sddf-6749)
2023/02/09(木) 12:07:03.43ID:A8pViFCvd 未定義な環境なんかないんだから
C++の規格的に未定義とかどうでもいいじゃん
どうせ特定の環境でしか動かさないコードだろうし
C++の規格的に未定義とかどうでもいいじゃん
どうせ特定の環境でしか動かさないコードだろうし
386デフォルトの名無しさん (スッップ Sd5f-VAk/)
2023/02/09(木) 12:18:07.59ID:sPkxw56hd #ifで環境とエンディアンで切ってしまえ
387デフォルトの名無しさん (ワッチョイ 4f01-mMLA)
2023/02/09(木) 14:57:32.77ID:UhaInviD0 >>385
未定義な「環境」?
未定義な「環境」?
388デフォルトの名無しさん (ワッチョイ 4f5f-NCx9)
2023/02/09(木) 18:23:51.05ID:fimyrrlV0 特定の環境を想定してるのに、それを書かずに環境依存の質問するってほとんど釣りだよな
389デフォルトの名無しさん (ワッチョイ 7fb2-KDf3)
2023/02/09(木) 20:52:22.51ID:Fa1ce0CQ0390デフォルトの名無しさん (ワッチョイ cff0-6749)
2023/02/09(木) 21:21:46.36ID:/jyJY61Z0 おまいら読解力ゼロかよ
391デフォルトの名無しさん (ワッチョイ 7fb2-KDf3)
2023/02/09(木) 21:25:28.79ID:Fa1ce0CQ0 自分の意見主張を伝えるのは自分の責任
伝わらないのを人のせいにしたり人格攻撃したからって伝わりはしない
無駄で愚かな行為だ
伝わらないのを人のせいにしたり人格攻撃したからって伝わりはしない
無駄で愚かな行為だ
392デフォルトの名無しさん (ワッチョイ cff0-6749)
2023/02/09(木) 21:29:41.32ID:/jyJY61Z0 ばか
393デフォルトの名無しさん (ワッチョイ 8f12-KDf3)
2023/02/10(金) 12:00:14.43ID:rXRs96IF0 CHAR_BITってC++でもレガシーじゃないの?
394デフォルトの名無しさん (ワッチョイ 4f5f-F1up)
2023/02/10(金) 12:35:42.19ID:ntA0RsMN0 「レガシーである」の定義が不明。
395デフォルトの名無しさん (ワッチョイ 8f12-KDf3)
2023/02/10(金) 12:57:47.33ID:rXRs96IF0 例えばnumeric_limits<double>::infinity()を使うべきところでHUGE_VALを使うと
このジジイは・・・てなるようなこと
CHAR_BITを使うとこのジジイは・・・ってなる人は何使ってるのかって
このジジイは・・・てなるようなこと
CHAR_BITを使うとこのジジイは・・・ってなる人は何使ってるのかって
396デフォルトの名無しさん (ワッチョイ 4f5f-F1up)
2023/02/10(金) 13:11:57.08ID:ntA0RsMN0 numeric_limits<unsigned char>::digits なんだろうけど、圧倒的に記述が煩雑で
CHAR_BIT のほうが書きやすく読みやすいいから、「このジジイは・・・」と思う人が居ても
使えるところでは気にせず使えばいいかと。
CHAR_BIT のほうが書きやすく読みやすいいから、「このジジイは・・・」と思う人が居ても
使えるところでは気にせず使えばいいかと。
397はちみつ餃子 ◆8X2XSCHEME (ワッチョイ cf3e-F1up)
2023/02/10(金) 13:27:44.87ID:ETMiF/8h0 #if で切り分けるのに使う定数はマクロで定義されていないといけないんで使いどころはある。
398デフォルトの名無しさん (ワッチョイ 8f12-KDf3)
2023/02/10(金) 14:22:36.26ID:rXRs96IF0399はちみつ餃子 ◆8X2XSCHEME (ワッチョイ cf3e-F1up)
2023/02/10(金) 14:41:42.45ID:ETMiF/8h0 >>398
if constexpr は文を書けるところじゃないと使えないんで定義 (宣言) を切り替えるようなことができない。
この手の切り替えは割とごそっと切り替えることになると思うのでマクロは要るよ。
if constexpr は文を書けるところじゃないと使えないんで定義 (宣言) を切り替えるようなことができない。
この手の切り替えは割とごそっと切り替えることになると思うのでマクロは要るよ。
400デフォルトの名無しさん (ワッチョイ 835f-D0vN)
2023/02/12(日) 14:56:19.98ID:wUCNDItd0 template <class T , unsigned int pos , unsigned int len = 1>
struct bit_mask{
static constexpr T mask = ~( ~static_cast<T>(0) << (len) ) << pos;
// その他の処理
}
特定のビットをマスクする処理がしたくて↑のようなテンプレートクラスを作成したのだけど
warning: left operand of shift expression '(-1 << 1)' is negative [-fpermissive]
の警告が出てしまう
この警告が符号あり整数型を左シフトしてはいけないというのは分かるので、Tが必ず符号なし整数型であることを明示したいのだけどどうしたらいいだろう?
特殊化すると符号なしのバイト幅毎に処理を描かないといけなくなるし、もっと簡便なほうほうがあったりするのでしょうか?
struct bit_mask{
static constexpr T mask = ~( ~static_cast<T>(0) << (len) ) << pos;
// その他の処理
}
特定のビットをマスクする処理がしたくて↑のようなテンプレートクラスを作成したのだけど
warning: left operand of shift expression '(-1 << 1)' is negative [-fpermissive]
の警告が出てしまう
この警告が符号あり整数型を左シフトしてはいけないというのは分かるので、Tが必ず符号なし整数型であることを明示したいのだけどどうしたらいいだろう?
特殊化すると符号なしのバイト幅毎に処理を描かないといけなくなるし、もっと簡便なほうほうがあったりするのでしょうか?
402デフォルトの名無しさん (ワッチョイ 835f-t1ev)
2023/02/12(日) 16:21:40.75ID:JClhsLo90 >>400 ((static_cast<T>(1) << len) - 1) << pos じゃダメかな?
403デフォルトの名無しさん (ワッチョイ 1ef2-yWmK)
2023/02/12(日) 16:47:42.70ID:37/dTLGh0 >>402
オーバーフローする
オーバーフローする
404デフォルトの名無しさん (ワッチョイ eb01-QMhD)
2023/02/12(日) 17:18:17.77ID:mwZX9mma0 Tをunsignedにするんだよね?
ぐぐったらstd::make_unsignedとかいうのがあった
ぐぐったらstd::make_unsignedとかいうのがあった
405デフォルトの名無しさん (ワッチョイ ff7c-DG2X)
2023/02/12(日) 17:33:12.94ID:bx1Kk0PX0 Tがunsignedの場合だけ許可したいならrequires std::is_unsigned_v<T>
C++17以下でコンセプト使えないならstd::enable_ifでも使おう
無理矢理signedにして問題握り潰せって奴だらけで震える
C++17以下でコンセプト使えないならstd::enable_ifでも使おう
無理矢理signedにして問題握り潰せって奴だらけで震える
406デフォルトの名無しさん (ワッチョイ 835f-t1ev)
2023/02/12(日) 18:15:39.19ID:JClhsLo90 >>403 そこは >400 でも同じなのでは?
407デフォルトの名無しさん (ワッチョイ 3b7d-zpWe)
2023/02/13(月) 03:17:46.41ID:cPd3izqQ0 この手の警告/エラーはテンプレートを実装しただけでは出なくて、
テンプレートの実体化をした時にテンプレート実装部に警告/エラーが出るからややこしいんだよな
unsignedしか受け付けない前提で書いたコードをsignedで実体化するからこうなる
黙って内部でunsignedにするか
(using U=std::make_unsigned_t<T>; で全部U型で演算する)
signedをそもそも受け付けないか
(>>405 みたいにrequiresで受け付けるTを制限する)
の2択
テンプレートの実体化をした時にテンプレート実装部に警告/エラーが出るからややこしいんだよな
unsignedしか受け付けない前提で書いたコードをsignedで実体化するからこうなる
黙って内部でunsignedにするか
(using U=std::make_unsigned_t<T>; で全部U型で演算する)
signedをそもそも受け付けないか
(>>405 みたいにrequiresで受け付けるTを制限する)
の2択
408デフォルトの名無しさん (ワッチョイ eb01-QMhD)
2023/02/13(月) 06:42:50.66ID:Z5uQ91Hr0 そもそも「符号なしであることを明示」とか書いてるけど
俺が試した限り符号ありで実体化しないと出ないんだよな>>400の警告は
俺が試した限り符号ありで実体化しないと出ないんだよな>>400の警告は
409デフォルトの名無しさん (スフッ Sdaa-AGaU)
2023/02/13(月) 10:38:37.81ID:vihtyFuzd C++素人です
すみませんが、どなたか教えてください
こんなテンプレート関数があったとして、const を消す方法はないですか
const付いてても付いてなくても int* とか char* だけを判別したいので
毎回,余分にconst 判定入れるのだるいです
std::remove_const_t<T> とか試しても上手くいかないのでググってみたら、最上位じゃないので出来ないうんたらとか書いてあって...
最上位じゃないconstを外す方法があれば教えてください...
template<typename T>
auto function(T, t) {
if constexpr (std::is_same_v<T, int*> || std::is_same_v<T, const int*>) {
...
}
else if constexpr (std::is_same_v<T, char*> || std::is_same_v<T, const char*>) {
...
}
...以下、同パターン
}
すみませんが、どなたか教えてください
こんなテンプレート関数があったとして、const を消す方法はないですか
const付いてても付いてなくても int* とか char* だけを判別したいので
毎回,余分にconst 判定入れるのだるいです
std::remove_const_t<T> とか試しても上手くいかないのでググってみたら、最上位じゃないので出来ないうんたらとか書いてあって...
最上位じゃないconstを外す方法があれば教えてください...
template<typename T>
auto function(T, t) {
if constexpr (std::is_same_v<T, int*> || std::is_same_v<T, const int*>) {
...
}
else if constexpr (std::is_same_v<T, char*> || std::is_same_v<T, const char*>) {
...
}
...以下、同パターン
}
410デフォルトの名無しさん (ワッチョイ eb01-QMhD)
2023/02/13(月) 10:50:31.38ID:Z5uQ91Hr0 std::is_same_v<std::remove_const_t<std::remove_pointer_t<T>>, int>
411デフォルトの名無しさん (ワッチョイ d301-uphh)
2023/02/13(月) 10:52:33.56ID:/W47z0NL0412デフォルトの名無しさん (ワッチョイ deda-hBeh)
2023/02/13(月) 10:56:46.31ID:FEO/Fb/70 constexprなんだからどうやっても外せないだろ
413デフォルトの名無しさん (ワッチョイ deda-hBeh)
2023/02/13(月) 11:05:28.80ID:FEO/Fb/70 いや、出来るか
414デフォルトの名無しさん (ワッチョイ deda-hBeh)
2023/02/13(月) 11:14:03.33ID:FEO/Fb/70 コンパイラバージョンの違いかな
remove_const<T> //C++11
remove_const_t<T> //C++14
remove_const<T> //C++11
remove_const_t<T> //C++14
415デフォルトの名無しさん (ワッチョイ eb01-QMhD)
2023/02/13(月) 11:27:21.16ID:Z5uQ91Hr0 template <class T>
using remove_const_t = typename remove_const<T>::type;
typenameと::typeを省略するためのただのエイリアスやで
using remove_const_t = typename remove_const<T>::type;
typenameと::typeを省略するためのただのエイリアスやで
416デフォルトの名無しさん (ワッチョイ deda-hBeh)
2023/02/13(月) 11:33:32.46ID:FEO/Fb/70 remove_const_tがコンパイラ通らなければremove_const<T>::typeと書けば良いと
417デフォルトの名無しさん (ワッチョイ a712-NLDk)
2023/02/13(月) 13:02:27.22ID:B+Tt2JJW0 GCCもVCもデフォでC++14だかんな
418409 (スフッ Sdaa-AGaU)
2023/02/13(月) 13:15:51.58ID:vihtyFuzd >>410
ありがとうございます
上手くconst int* は拾えましたが、それだとただのint も拾ってしまいました
ポインタ のみ拾いたいです
環境書いてなかったです
VisualStudio のVC++で、設定はC++最新版です
ありがとうございます
上手くconst int* は拾えましたが、それだとただのint も拾ってしまいました
ポインタ のみ拾いたいです
環境書いてなかったです
VisualStudio のVC++で、設定はC++最新版です
419デフォルトの名無しさん (ワッチョイ deda-hBeh)
2023/02/13(月) 13:32:25.61ID:FEO/Fb/70 少しは自分で考えたらどうなの?
420デフォルトの名無しさん (ワッチョイ deda-hBeh)
2023/02/13(月) 13:41:00.86ID:FEO/Fb/70 !std::is_same_v<std::remove_const_t<std::remove_pointer_t<T>>,std::remove_const_t<T>>
421418 (スフッ Sdaa-AGaU)
2023/02/13(月) 14:00:14.31ID:vihtyFuzd422デフォルトの名無しさん (ワッチョイ deda-hBeh)
2023/02/13(月) 14:16:09.00ID:FEO/Fb/70 考えたら出来るようになる
ガムバレ
ガムバレ
423デフォルトの名無しさん (ワッチョイ 835f-t1ev)
2023/02/13(月) 14:55:08.76ID:TwATZYDk0 何がどう「出来ました」なのかよくわからないけど、 >409 を見る限りは
auto function(const int*), auto function(const char*) のオーバーロードで分けたほうがマシな
ものに見えるな。
auto function(const int*), auto function(const char*) のオーバーロードで分けたほうがマシな
ものに見えるな。
424デフォルトの名無しさん (ワッチョイ ca7c-D0vN)
2023/02/13(月) 17:23:27.09ID:v/vixYv70 そこまでして本当にテンプレートが必要か?って考える必要があると思うわw
殆どがテンプレートなんて必要ないだろw
殆どがテンプレートなんて必要ないだろw
425デフォルトの名無しさん (スッップ Sdaa-zpWe)
2023/02/13(月) 18:18:43.60ID:vSfDWYC1d 関数外にテンプレート1つ置いてしまった方がシンプルになるがね
constを消すではなくなるが
template<class T, class TTarget>
constexpr bool pointer_or_constpointer_v =
std::is_same_v<T, TTarget*> ||
std::is_same_v<T, const TTarget*>;
template<class T>
auto func(T t){
if constexpr(pointer_or_constpointer_v<T, int>){
...
}
}
constを消すではなくなるが
template<class T, class TTarget>
constexpr bool pointer_or_constpointer_v =
std::is_same_v<T, TTarget*> ||
std::is_same_v<T, const TTarget*>;
template<class T>
auto func(T t){
if constexpr(pointer_or_constpointer_v<T, int>){
...
}
}
426デフォルトの名無しさん (ガックシ 066f-p0Ho)
2023/02/15(水) 13:51:43.45ID:vrVppx/z6 困っています.助けてください.
まず作りたいものを以下に記します.
クラスObjのオブジェクトが構築されると,
そのオブジェクト内でクラスObjのオブジェクトが0~2個生成される.
(生成されるオブジェクトの個数は一様乱数で決定される)
結果的に木構造のようなデータ構造になる.
クラスObjのオブジェクトはシリアルナンバと自分を作ったオブジェクト(親)へのポインタを持っている.
クラスObjは自分を作った親をたどることで,どのようにして(どのオブジェクトを親として)生成されたかを知ることができる.
で,作ってみたものを以下に張り付けておきます.
https://wandbox.org/permlink/lXq19mN1URMQhyh5
上記のプログラムで発生している問題を以下に記述します.
起点となるクラスObjのオブジェクトobjが生成された時点では,
各オブジェクトは自分自身を生成してくれた親オブジェクトへのポインタを正しく保持しているようなのですが,その後,メソッドrootsを呼んだときには親オブジェクトへのポインタが訳の分からないアドレスを指すことがあるようです.
なにがいけないのか,どうすれば意図した通りに動いてくれるのかご教授くださると助かります.
よろしくお願いいたします.
まず作りたいものを以下に記します.
クラスObjのオブジェクトが構築されると,
そのオブジェクト内でクラスObjのオブジェクトが0~2個生成される.
(生成されるオブジェクトの個数は一様乱数で決定される)
結果的に木構造のようなデータ構造になる.
クラスObjのオブジェクトはシリアルナンバと自分を作ったオブジェクト(親)へのポインタを持っている.
クラスObjは自分を作った親をたどることで,どのようにして(どのオブジェクトを親として)生成されたかを知ることができる.
で,作ってみたものを以下に張り付けておきます.
https://wandbox.org/permlink/lXq19mN1URMQhyh5
上記のプログラムで発生している問題を以下に記述します.
起点となるクラスObjのオブジェクトobjが生成された時点では,
各オブジェクトは自分自身を生成してくれた親オブジェクトへのポインタを正しく保持しているようなのですが,その後,メソッドrootsを呼んだときには親オブジェクトへのポインタが訳の分からないアドレスを指すことがあるようです.
なにがいけないのか,どうすれば意図した通りに動いてくれるのかご教授くださると助かります.
よろしくお願いいたします.
427デフォルトの名無しさん (ワッチョイ 0abd-D0vN)
2023/02/15(水) 14:37:38.33ID:u0VdKeZj0 >>426
警告が出ているのになぜ直さない? それがすべてじゃないの?
警告が出ているのになぜ直さない? それがすべてじゃないの?
428デフォルトの名無しさん (ガックシ 066f-p0Ho)
2023/02/15(水) 16:15:28.85ID:vrVppx/z6429デフォルトの名無しさん (ワッチョイ 1ecf-8lmq)
2023/02/15(水) 17:54:06.96ID:jBF4rRuI0 55行目にchildObj.reserve(2);を入れろ
また、人にコードを示すなら本質的に関連のない警告が出ない状態のコードをまず貼れ
また、人にコードを示すなら本質的に関連のない警告が出ない状態のコードをまず貼れ
430デフォルトの名無しさん (ワッチョイ 8bf0-/uvd)
2023/02/15(水) 18:19:34.79ID:M3Yzq8DS0 警告警察うざい
警告を消す為にバグを仕込むヤツを何度も見てきた
警告を消す為にバグを仕込むヤツを何度も見てきた
431デフォルトの名無しさん (ワッチョイ 8bf0-/uvd)
2023/02/15(水) 18:20:49.58ID:M3Yzq8DS0 警告が出るかどうかは環境による
C++のルールに従っているなら警告は無視
C++のルールに従っているなら警告は無視
432デフォルトの名無しさん (ワッチョイ 0f5f-A0Hd)
2023/02/15(水) 18:29:25.36ID:QsOS31DQ0433デフォルトの名無しさん (テテンテンテン MMc6-7nFJ)
2023/02/15(水) 19:15:06.12ID:bwjUnWHEM >>426
バグを調査するときの重要な考え方として「バグが確実に再現する条件/確実に発生しない条件を明確化する」というのがある。
この場合も、まずはバグ「メソッドrootsを呼んだときには親オブジェクトへのポインタが訳の分からないアドレスを指すことがある」の条件を明確化するために「訳の分からないアドレスはどの変数に入っているのか」「訳の分からないアドレスはどういうバケツリレーで渡されているのか」「訳の分からないアドレスは最初にどこにあるのか」あたりを明確化するのがよろしいかと。
そもそも>>426で「メソッドrootsを呼んだときには親オブジェクトへのポインタが訳の分からないアドレスを指すことがある」は再現するの?
バグを調査するときの重要な考え方として「バグが確実に再現する条件/確実に発生しない条件を明確化する」というのがある。
この場合も、まずはバグ「メソッドrootsを呼んだときには親オブジェクトへのポインタが訳の分からないアドレスを指すことがある」の条件を明確化するために「訳の分からないアドレスはどの変数に入っているのか」「訳の分からないアドレスはどういうバケツリレーで渡されているのか」「訳の分からないアドレスは最初にどこにあるのか」あたりを明確化するのがよろしいかと。
そもそも>>426で「メソッドrootsを呼んだときには親オブジェクトへのポインタが訳の分からないアドレスを指すことがある」は再現するの?
434デフォルトの名無しさん (ワッチョイ 0f5f-A0Hd)
2023/02/15(水) 19:33:01.86ID:QsOS31DQ0 ああemplace_backしたときにchildObjが再確保されてparentが古いObjを指したままになってるのか
だから>>429が正解ですね
だから>>429が正解ですね
435デフォルトの名無しさん (ワッチョイ 2bf0-8lmq)
2023/02/15(水) 19:57:27.07ID:LxP0k8m20 謎の上から目線で質問するやし多くね
436デフォルトの名無しさん (スッップ Sdaa-zpWe)
2023/02/15(水) 20:25:17.26ID:sKFuDIvBd437デフォルトの名無しさん (ワッチョイ ca7c-D0vN)
2023/02/15(水) 20:43:32.06ID:aDsLy0wQ0 こんなプログラム見ていると頭痛くなるw
438デフォルトの名無しさん (ワッチョイ a712-NLDk)
2023/02/15(水) 21:25:47.83ID:SA6Um8/R0 >>430
ほんこれ
ほんこれ
439デフォルトの名無しさん (ワッチョイ 9ebb-p0Ho)
2023/02/15(水) 22:04:10.79ID:3ATKFMkE0 >>437
>こんなプログラム見ていると頭痛くなるw
誠に申し訳ない。
なんせ、近くにメンターがいないので自力でなんとかせにゃならんのです。
既にいくつか助言をいただいているので、もう少し頑張ってみます。
ゆるゆる見守ってくださると嬉しいです。
引き続きよろしくお願いいたします。
>こんなプログラム見ていると頭痛くなるw
誠に申し訳ない。
なんせ、近くにメンターがいないので自力でなんとかせにゃならんのです。
既にいくつか助言をいただいているので、もう少し頑張ってみます。
ゆるゆる見守ってくださると嬉しいです。
引き続きよろしくお願いいたします。
440デフォルトの名無しさん (ワッチョイ ff9c-nJVz)
2023/02/15(水) 22:07:21.36ID:k8KlMP7i0 なんでこんなに偉そうなの
441デフォルトの名無しさん (ワッチョイ 9ebb-p0Ho)
2023/02/15(水) 22:10:23.23ID:3ATKFMkE0 >>431
環境はvisual studio pro 2019で、皆様のご助言を仰ぐためにwandboxに貼りました。
警告に関しては、あまり気にせずコーディングしています‥
よくない癖、ですよね(汗)
環境はvisual studio pro 2019で、皆様のご助言を仰ぐためにwandboxに貼りました。
警告に関しては、あまり気にせずコーディングしています‥
よくない癖、ですよね(汗)
■ このスレッドは過去ログ倉庫に格納されています
ニュース
- 日本の立場説明へ…外務省局長が北京到着 “台湾有事”首相答弁に中国反発 ★4 [煮卵★]
- 橋下徹氏「この喧嘩は日本の完敗」 台湾有事答弁めぐる外務省局長訪中で指摘「中国に怒られてご説明に伺った日本と見られる」 [muffin★]
- 【日本大使館】中国在留邦人は安全確保を [ぐれ★]
- 【外国人問題】小野田紀美担当相「不法就労や不法滞在は許さない」 [シャチ★]
- 【野球】井端監督 大谷翔平、山本由伸らのWBCへの参加 「1日も早く返事ほしい」「待っててといっても、国内組が遅くなってしまう」★3 [冬月記者★]
- 習政権、高市首相への態度硬化 台湾有事発言で連日非難 中国 ★10 [ぐれ★]
- 【高市速報】ユーロ円180円突破。史上初 [931948549]
- 高市コイン、155円突破wwwwwwwwww [246620176]
- 杉浦綾乃板って改名したほうがいいよな
- 高市早苗の中国問題、「オーバーツーリズムが解消されてウザい中国人が消えるから日本の勝ち」という風潮になってしまう [562983582]
- 外務省幹部が18日に中国側と協議へ ツアー停止や映画公開延期も 在中国の日本大使館は現地滞在の日本人に注意喚起 [787212328]
- おじゃる丸をまったり待機するスレ🏡
