[過去ログ] C++相談室 part165 (1002レス)
上下前次1-新
このスレッドは過去ログ倉庫に格納されています。
次スレ検索 歴削→次スレ 栞削→次スレ 過去ログメニュー
9: (ワッチョイ 297c-tLJy) 2023/11/01(水)12:51 ID:h0xHi7n60(1) AAS
(礼儀とプログラミングスキルは関係ないと思う)
10: (ワッチョイ 13ad-feYx) 2023/11/01(水)12:53 ID:c3s+uM8y0(1) AAS
(俺の昼飯どこ行った?)
11: (アウアウウー Sad5-U1R4) 2023/11/01(水)16:02 ID:G1jsC9Xya(1) AAS
(今日の昼飯はセブンのサバ塩焼弁当にしとくか・・・)
12: (ワッチョイ 1939-PupP) 2023/11/01(水)18:24 ID:m9AntJVX0(1) AAS
コードにはある程度そいつの人間性は反映されるな
スレチな話題ではあるけど
13: (ワッチョイ b1f8-XCYI) 2023/11/01(水)23:07 ID:PfaqlzcX0(1) AAS
(本物のプログラマはPascalを使わない)
14: (ワッチョイ 6105-NMSe) 2023/11/01(水)23:30 ID:ZqfN6pKA0(1) AAS
(でもPythonは使ってもいいのかな?って時々思う)
15: (オイコラミネオ MM6d-H9h+) 2023/11/02(木)00:03 ID:aqkFofyNM(1) AAS
そろそろキャストは止めてスマポ使いましょう
16: (ワッチョイ d94e-vgKx) 2023/11/02(木)02:43 ID:+4XO/JeH0(1/2) AAS
まちゅまちゅの3Dライブみた
前も思ったけどみこちとかなたそのダンス、めっちゃシンクロ率高い
リズムがぴったり一緒なんだよね
ダンスほんとにうまくなったよな
17: (ワッチョイ d94e-vgKx) 2023/11/02(木)02:43 ID:+4XO/JeH0(2/2) AAS
誤爆った(´・ω・`)
18: (ワッチョイ 1bda-9b8G) 2023/11/02(木)07:17 ID:Hn8AmdCQ0(1) AAS
ホロライブか
19: (アウアウウー Sad5-U1R4) 2023/11/02(木)10:44 ID:BqsrFUCWa(1) AAS
(まちゅまちゅの3Dライブ?・・・ちょっと気になる)
20: (ワッチョイ 6105-NMSe) 2023/11/02(木)23:48 ID:ebj85xCu0(1) AAS
(((お前ら括弧ばっかり使ってlisperかよ?)))
21: (ワッチョイ a905-fLgT) 2023/11/03(金)10:21 ID:sUQ44pbr0(1) AAS
←vーー( ゚∀゚)!ー^ー
22: (ワッチョイ 6276-0SSA) 2023/11/04(土)18:56 ID:Y/q1DSa/0(1) AAS
コピーとムーブの挙動、というか管理難しい。。難しくない?
23: はちみつ餃子◆8X2XSCHEME (ワッチョイ 0979-oDOv) 2023/11/04(土)20:24 ID:1CTu6tq50(1/2) AAS
コピーやムーブはパターンに沿って管理できるからそんなに難しいとは感じないな。
ワイとしては参照の畳み込み (Reference collapsing) や変換の規則を毎回のように確認するんだけど全然頭に入ってこない。
参照はオブジェクトではないので逆に言えば値に対応する型が参照になることはないのだが、それはそれとして参照を含む型があり得るというのが今でも腑に落ちない。
24(3): (ワントンキン MM92-JcAe) 2023/11/04(土)20:28 ID:KOZ2F//lM(1) AAS
参照しか知らんものだけど、ムーブて何か簡単に教えて
参照は実装上ただのポインタじゃん
ムーブはなにがどうなるん?
25: はちみつ餃子◆8X2XSCHEME (ワッチョイ 0979-oDOv) 2023/11/04(土)20:29 ID:1CTu6tq50(2/2) AAS
ムーブコンストラクタが起動する。
それだけ。
26: (ワッチョイ 658d-qcxi) 2023/11/05(日)09:49 ID:6vgG9vCb0(1) AAS
>>24
考え方としては、shallow copyを二重開放リスクを避けて行うための仕組み。
右辺値という特別な一時変数のコピーで特別なコピー(ムーブコンストラクタ)を実行するようにして、クラス設計者が必要に応じてshallow copyを実装しやすくしている。
27: (アウアウウー Saa5-CWlg) 2023/11/05(日)10:41 ID:ol9bMVcca(1/2) AAS
>>24
moveはRustで言う所有権の移動じゃないか
28: (ワッチョイ 454e-0SSA) 2023/11/05(日)13:06 ID:Qkn7cpbH0(1/4) AAS
>>24
aに戻り値などの一時オブジェクトbをコピーすると通常は
aでメモリを確保
bからメモリコピー
bのデストラクタでメモリを破棄
という動作になるけど、moveの場合
aにbでメモリをポインタで持ってくる
省2
29: はちみつ餃子◆8X2XSCHEME (ワッチョイ 823e-9NWm) 2023/11/05(日)13:39 ID:pHGS9osC0(1/2) AAS
標準ライブラリでのムーブは所有権 (ownership) の概念を前提として構築されているし、
慣例としてもそのようにするものではあるんだが
言語としてはムーブコンストラクタ (またはムーブ代入演算子) を呼び出すというだけで
所有権の面倒をみる機能は何もない。
(辻褄が合うようにするのはプログラマの責任。)
何が起きているのかは所有権の概念と実装レベルで分けて考えたほうがいいと思う。
どう説明していいかわからんから関連する要素を箇条書きにしたらこんな感じかな。
省5
30: (ワッチョイ 454e-0SSA) 2023/11/05(日)13:42 ID:Qkn7cpbH0(2/4) AAS
で、このmove動作を定義するために、
一時オブジェクト(右辺値)に対する参照動作を関数定義できるようになっている
31: (ワントンキン MM92-JcAe) 2023/11/05(日)14:05 ID:wAmDr/fyM(1) AAS
ムーブされるとそのポインタは変わってしまうと思うけど、そういうケースはないの?
32: (ワッチョイ 454e-0SSA) 2023/11/05(日)14:18 ID:Qkn7cpbH0(3/4) AAS
言っている意味がよく分からないが、純粋なポインタにはムーブという概念はないよ
ムーブを定義できるのはクラスに対してだけ
他の人も言っているようにムーブといっても実体は単なる関数呼び出しなので、その中でプログラマが自分の責任で必要なコードを書くことになる
33(2): (ワッチョイ 653d-2MVi) 2023/11/05(日)14:58 ID:vIwIC4VV0(1) AAS
質問した人じゃないけど説明ありがたいです
ムーブ難しいと思ってたけどもっと早く勉強して仕事で使うべきだった
(文法解析した要素をポインタいじって並べ変えるんだけど…
二重所有を防ぐのを手作業コーディングで責任を持たなければならないプログラムを作ってしまった)
34: (ワッチョイ 454e-0SSA) 2023/11/05(日)15:15 ID:Qkn7cpbH0(4/4) AAS
ただ、右辺値参照を使うと、通常の参照や代入と使い分けるためにconstやnoexceptを厳密に指定しないといけなくなりがちだから、
その辺の総合的な理解が必要になってくるのは注意点だね
constは一度付け始めるとライブラリ全部に伝染するからな・・・それを嫌って使わない派も結構いる(いた)よね
35: (ワッチョイ ed7c-9LC0) 2023/11/05(日)15:39 ID:Vx5ySS520(1) AAS
実際のコードだとポインタのムーブはunique_ptrとかにぶん投げで、自分で移動コード書くことはまずないな
自分でムーブ特殊関数の中身書くのはハンドル的なもののムーブを実現したいときくらい
36: (アウアウウー Saa5-3l7D) 2023/11/05(日)16:12 ID:jiV3XvQ2a(1) AAS
とにかく unique_ptr が便利すぎるから何でもかんでも全部 unique_ptr 使うようになってしまった
まあそれでいいのかもしれないが
37(1): (アウアウウー Saa5-CWlg) 2023/11/05(日)16:21 ID:ol9bMVcca(2/2) AAS
>>33
銀の弾丸ではない
手作業コーディングで責任を持たなければならないのは変わらない
38: はちみつ餃子◆8X2XSCHEME (ワッチョイ 823e-9NWm) 2023/11/05(日)17:10 ID:pHGS9osC0(2/2) AAS
所有権管理も結局はプログラマが書く (間違いを部分的にコンパイルエラーとして検出できることはある)、
所有権って具体的に何なんだってのはクラス定義に押し込めるという風に管理のレイヤを分けることが出来るってわけ。
クラス定義をした後は具体的に何をやってるのかを忘れて
所有権というものだと思い込むことが出来るという抽象化の仕組み。
39: (ワッチョイ 6540-pUwU) 2023/11/07(火)10:10 ID:5c9945xO0(1) AAS
>>37
アホか
普通に考えて、そのコード(クラス)の利用者が所有権について明示的に何かしなきゃいけなかったということだろ
40(1): (ワッチョイ 653a-qcxi) 2023/11/07(火)19:02 ID:Z7KocuHY0(1/2) AAS
>>33
エスパーするけど多分その用途だとmoveは使えない。
データを共有している感じなので素直にshared ptrを使うのがいいかと。shared ptrで性能的にキツイならshared ptrを参照渡しするか。
41: (ワッチョイ 653a-qcxi) 2023/11/07(火)19:09 ID:Z7KocuHY0(2/2) AAS
>>40
ちょっと補足すると、戻り値をshared ptrの参照にするのはNGですな。そこは素直にRVOに期待するのが良いか。
42(1): (ワッチョイ e5a7-cSrA) 2023/11/09(木)17:23 ID:Op1F6lz40(1/3) AAS
VC++なんだけど32bitで_thiscallを関数ポインタ経由で呼ぶことってasm使わないと不可能?
メンバ関数を関数ポインタ変数とすることは出来てもそこから第一引数にインスタンス入れたりしてもコンパイル時エラーになる
43(1): (ワッチョイ 454e-0SSA) 2023/11/09(木)18:09 ID:vDu6brxv0(1) AAS
>>42
メンバ関数をポインタ経由で呼び出したいってことならstd::bindでできるはず
44: はちみつ餃子◆8X2XSCHEME (ワッチョイ 423e-9NWm) 2023/11/09(木)18:24 ID:viBVvDAP0(1) AAS
VC++ のことは知らんけどメンバ関数ポインタは関数ポインタより大きい実装になってる処理系がある。
メンバ関数ポインタを関数ポインタに変換した時点で呼び出すのに必要な情報が失われているかもしれない。
45: (ブーイモ MM62-wwCg) 2023/11/09(木)19:04 ID:YhbH7ApDM(1) AAS
MJD?
46(1): (オイコラミネオ MM49-wdyj) 2023/11/09(木)19:13 ID:RZ9WOZDMM(1) AAS
エラーメッセージにヒントはない?
47: はちみつ餃子◆8X2XSCHEME (ワッチョイ 097f-Nt8Z) 2023/11/09(木)19:58 ID:u3KRHVuW0(1) AAS
基本的には言語の規定内でやるに越したことはないので無理な型変換をしないで済ませられるように出来るものならそうしたほうがいい。
どうしてもそうできない事情がある(と質問者が認識している)ならもうちょっと詳しい状況をコードで示して欲しい。
48: (ワッチョイ e5a7-cSrA) 2023/11/09(木)21:12 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) 2023/11/09(木)21:28 ID:Op1F6lz40(3/3) AAS
てかググったら簡単なシミュレーション方法載せてるブログあった
_fastcallで宣言して第二引数のedxを捨て駒にする事で疑似_thiscallになる
つまりint(__fastcall * pFunc)(CDate*, void*, int)とすれば一応アセンブラ的な辻褄は合う事になる
50(1): (ワッチョイ 1f63-1OcW) 2023/11/12(日)10:07 ID:j2Y95IYf0(1/3) AAS
AA省
51(1): はちみつ餃子◆8X2XSCHEME (ワッチョイ 7f3e-zQu6) 2023/11/12(日)11:02 ID:O0gb6uIB0(1/3) AAS
>>50
A1. 単に auto としたときに参照になることはない。
参照として受け取りたい場合は auto& にせねばならないというのは正しい。
A2. 参照かどうかで自動的に場合分けして欲しいなら decltype(auto) とすればいいが……
参照で受けるのが正しい状況なのかどうかは状況による。
テンプレート内など自動的な場合分けが必要な場合を除いては参照は参照として明示したほうがよくない?
(個人的感想です。)
省3
52(1): はちみつ餃子◆8X2XSCHEME (ワッチョイ 7f3e-zQu6) 2023/11/12(日)11:38 ID:O0gb6uIB0(2/3) AAS
ごめん。 間違いがあった。
ポインタは void* へ暗黙に変換できる。
この変換はオーバーロード解決時の候補になりうる。
ただ、 bool への変換とは優先順位に差がある。
53: (ワッチョイ 1f63-1OcW) 2023/11/12(日)11:42 ID:j2Y95IYf0(2/3) AAS
AA省
54: (ワッチョイ 1f63-1OcW) 2023/11/12(日)11:46 ID:j2Y95IYf0(3/3) AAS
>テンプレート内など自動的な場合分けが必要な場合を除いては参照は参照として明示したほうがよくない?
非constなら考えるがこの場合foo()はconstオヌジェクトと参照を返してくるし、
これはもうdecltype(auto)一択で良いような気がが、
55: はちみつ餃子◆8X2XSCHEME (ワッチョイ 7f3e-zQu6) 2023/11/12(日)12:07 ID:O0gb6uIB0(3/3) AAS
volatile を追加する変換は出来るが除く変換は出来ないから
volatile 付きのオーバーロードを用意していない operator<< では候補から消えて
bool だけが候補として残ってしまうってことになるみたいだな。
volatile が付いていない場合は
void* への変換のほうが bool への変換より優先順位が高いので
そっちが呼ばれる。
56(1): あぼーん [あぼーん] AAS
あぼーん
57: (ワッチョイ 7fb1-qIOU) 2023/11/13(月)02:33 ID:eLF59GiN0(1) AAS
>>56
案内サンクス
58(1): (ワッチョイ 1f01-XI6K) 2023/11/14(火)02:19 ID:DkCdWP9x0(1) AAS
CLion使ってる人いますか?
59: (ワッチョイ 1fad-XI6K) 2023/11/17(金)17:16 ID:TT3SJP5h0(1) AAS
日本人の死亡者が増えてるのに、メディアは報道規制
2chスレ:cafe50
BEアイコン:224t1.png
60(1): (ワッチョイ 6ecf-ekUX) 2023/11/18(土)16:16 ID:5MckQHFy0(1) AAS
ラムダの参照キャプチャってconst参照に指定できないんだっけ?微妙に不便だな。
61: (ワッチョイ 7901-4XBo) 2023/11/18(土)20:47 ID:GRi2RJZB0(1) AAS
>>60
これじゃだめ?
#include <iostream>
using namespace std;
int main () {
const int a {0};
int b {0};
省6
62: (ワッチョイ 4701-1fOb) 2023/11/26(日)06:27 ID:DSb557XU0(1) AAS
C++20 RangesはMicrosoftの説明がわかりやすかった
63(2): (ワッチョイ 791f-q5uF) 2023/12/05(火)10:33 ID:HLoKrA0o0(1) AAS
ふと今更思ったんだけど
ポインターpに対して演算子*が返す*pは、
値じゃなくて参照?
64(1): (ワッチョイ b501-sZSb) 2023/12/05(火)11:05 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';
省5
65: (ワッチョイ edf6-JrwL) 2023/12/05(火)11:09 ID:IVr4NrBA0(1) AAS
>>63
参照ってのが何を意味しているか分からんが
普通はポインターの示す場所の内容だ
66(1): はちみつ餃子◆8X2XSCHEME (ワッチョイ 2a3e-By03) 2023/12/05(火)11:22 ID:z5PiblaY0(1/4) AAS
>>63
ポインター p に対して *p とした場合の型は参照ではない。
たぶん >>64 は *p が参照と言いたいつもりで書いているんだと思うけど
decltype に与えられる式の型が T 型の lvalue だった場合には T& が返されるルールなので
その式が参照でなくても参照が返されることがある。
67: はちみつ餃子◆8X2XSCHEME (ワッチョイ 2a3e-By03) 2023/12/05(火)11:24 ID:z5PiblaY0(2/4) AAS
あ、ごめん。 完全に間違った説明してたわ。 忘れて……。 恥ずかしい。
68(1): はちみつ餃子◆8X2XSCHEME (ワッチョイ 2a3e-By03) 2023/12/05(火)11:34 ID:z5PiblaY0(3/4) AAS
と思ってよく仕様を読んでみたらやっぱりこの (>>66) 考え方で正しいはず。
式が識別子式の時に限っては decltype は参照にならず式の型そのままで返すせいで decltype(value) は参照にならないが、
value と *p は型システム的にも値カテゴリ的にも同じだわ。
69: (ワッチョイ b501-sZSb) 2023/12/05(火)12:43 ID:E3GJtsiR0(2/3) AAS
>>68
なるほどー! 横からだが勉強になった
70: (ワッチョイ b501-sZSb) 2023/12/05(火)12:48 ID:E3GJtsiR0(3/3) AAS
巷のスマートポインタはoperator*で参照型を返すので
生ポインタも同じかと思ってたよ
71: はちみつ餃子◆8X2XSCHEME (ワッチョイ 2a3e-By03) 2023/12/05(火)13:28 ID:z5PiblaY0(4/4) AAS
互換性の都合とかがあるから仕方ないね。
場合分けが大量にあって単純な一般原則の組み合わせにはなってないから仕様を読み解くのがしんどい……
72(2): (ワッチョイ 9f1f-oseA) 2023/12/11(月)15:17 ID:7vxydTfj0(1/2) AAS
ある構造体Aがあります
Aの比較関数が複数ありますcompA0,compA1,compA2,...
比較関数の関数ポインタがありますcompA
compA = &compA2;
別の構造体Bがあります
BはAを内包しています
struct B{ A a; ... };
省5
73: (ブーイモ MM5b-oUR/) 2023/12/11(月)15:22 ID:F1R6HyeLM(1) AAS
>>72
ラムダ式使った方が良いと思うけど本当にラムダ式なしが良い?
74(1): (ワッチョイ 9f1f-oseA) 2023/12/11(月)15:29 ID:7vxydTfj0(2/2) AAS
使われると、ラムダ式の質問をすることになると思います・・・
75(2): はちみつ餃子◆8X2XSCHEME (ワッチョイ 9f3e-pD6R) 2023/12/11(月)15:45 ID:wAhsIAfi0(1/2) AAS
>>72
もし C++20 を使えるなら (std::sort と違って) std::ranges::sort では比較関数とは別に
比較すべき要素を取り出す操作をプロジェクションとして与えることが出来るから
これ一発でいけてだいぶん楽できる。
std::ranges::sort(bs, compA, &B::a);
76: (ワッチョイ d701-Qbcu) 2023/12/11(月)16:01 ID:dil4ai7q0(1/2) AAS
>>75
すげ! 今そんなのあるんやね
77(1): (ワッチョイ d701-Qbcu) 2023/12/11(月)16:34 ID:dil4ai7q0(2/2) AAS
>>74
思い出すのがしんどくなってきた
#include <iostream>
#include <vector>
#include <algorithm>
#include <functional>
using namespace std;
省12
78: (ワッチョイ 771f-oseA) 2023/12/11(月)17:14 ID:cVrrslE50(1/2) AAS
>>75
>>77
お二方、ありがとうございます
参考にして組んでみます
79(1): はちみつ餃子◆8X2XSCHEME (ワッチョイ 9f3e-pD6R) 2023/12/11(月)17:25 ID:wAhsIAfi0(2/2) AAS
その場で合成するのはさすがに見通しが悪すぎるので、
C++11 頃の C++ を仮定して私がやるならまずアダプタを作ると思う。
ちょっと雑ですまんがとりあえずこんな感じ。
class compB_adaptor {
private:
using comparator = std::function<bool(const A&, const A&)>;
comparator compA;
省8
80: (ワッチョイ 771f-oseA) 2023/12/11(月)22:08 ID:cVrrslE50(2/2) AAS
>>79
求めていたものそのものであったため、採用させていただきました
ありがとうございます
81: (ワッチョイ 1663-4if3) 2023/12/20(水)23:47 ID:tqHuIeXr0(1) AAS
int x;
std::cout << x;
でxが正ののときは「+」符号を付けさせるのってどうするんでしたっけ……
cout.form("%+d", x)とか以外で
82: (ワッチョイ 2701-NGr8) 2023/12/20(水)23:58 ID:Qfvbx0VO0(1) AAS
cout << showpos
83: (ワッチョイ 1663-4if3) 2023/12/21(木)08:41 ID:6wjPSKlj0(1) AAS
てきました㌧クス、
iosヘッダで探せば良かったのか、、、
84: (ワッチョイ 63d2-XEY5) 2023/12/21(木)20:01 ID:i16TeC3D0(1) AAS
C++23だとこれ
std::print("{:+}", x);
85(1): (ワッチョイ 4ba7-JRUi) 2023/12/22(金)13:56 ID:pQLEje080(1) AAS
PythonやC#のようなf"{x}"構文が作られる事はないんだろうか
86: はちみつ餃子◆8X2XSCHEME (ワッチョイ d23e-E09z) 2023/12/22(金)14:54 ID:gr/vrzoo0(1) AAS
>>85
リフレクションが充実すればその上に実装できるので
直接的な言語機能として用意すると
辻褄合わせが後で面倒になるだろうし、
現時点で考えるのは時期尚早だと思う。
87(1): (ワッチョイ cf63-nyJS) 2023/12/24(日)17:42 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) 2023/12/24(日)17:42 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) 2023/12/24(日)18:05 ID:SfA3xmSz0(1/2) AAS
>>87-88
特定の型を出力するときにだけ作用する書式を設定するマニピュレータってこと?
std::setw がやってるのはストリームのメンバ関数 width を呼ぶのと同じ。
ストリームのオブジェクトが幅に関する情報を保存するデータメンバを持っていて、それを変更してる。
もちろんあなたが定義した独自の型 (この例では Foo) に結び付いた書式を保持するところなんて存在しないから単純にはできない。
私が思いつくのは
・ ストリームのほうも新しいものを定義する、つまり basic_ostream を継承して Foo 用の書式を格納するデータメンバを増やす
省3
上下前次1-新書関写板覧索設栞歴
あと 913 レスあります
スレ情報 赤レス抽出 画像レス抽出 歴の未読スレ AAサムネイル
ぬこの手 ぬこTOP 0.022s