前スレ
C++相談室 part157
https://mevius.5ch.net/test/read.cgi/tech/1628474251/
C++相談室 part158
■ このスレッドは過去ログ倉庫に格納されています
2021/11/15(月) 18:49:18.44ID:I69rZ/Of
582デフォルトの名無しさん
2021/12/28(火) 01:04:16.62ID:OVEU2JJm 厳密な2πnと、doubleで表した有効桁数15桁の大体2πnに近い数字の差を計算すると、nが大きくなるほど差がデカくなってくるってだけの話じゃないの?
浮動小数点数は0から離れれば離れるほど目盛りが大きくなっていくのだから。
sinの実装がマクローリン級数展開でなくても起こる問題だと思うが。
浮動小数点数は0から離れれば離れるほど目盛りが大きくなっていくのだから。
sinの実装がマクローリン級数展開でなくても起こる問題だと思うが。
583デフォルトの名無しさん
2021/12/28(火) 01:43:08.31ID:NIM0c1vY 小学生多すぎじゃないか?
584デフォルトの名無しさん
2021/12/28(火) 09:17:10.46ID:p+qHklGW おまえさん1人だろ
中学以後、いつ何を習うか知らないようだが
中学以後、いつ何を習うか知らないようだが
585デフォルトの名無しさん
2021/12/29(水) 21:49:37.03ID:+eZ32Uo6 >1e-20 は仮数部には1桁目からゴミが入っているが、倍精度ではゼロと見なす
mjk、
IEEE754の2進数形式の倍精度浮動小数点表示は
仮数部がケチ表現の52 bit(実質53 bit)で
指数部は-1022〜+1023なのやぞ
1e-20とか1×2^(-60)かそこらなので無問題で53 bit(=15.9桁)の精度ェ、
mjk、
IEEE754の2進数形式の倍精度浮動小数点表示は
仮数部がケチ表現の52 bit(実質53 bit)で
指数部は-1022〜+1023なのやぞ
1e-20とか1×2^(-60)かそこらなので無問題で53 bit(=15.9桁)の精度ェ、
586デフォルトの名無しさん
2021/12/29(水) 21:55:43.45ID:+eZ32Uo6 >sin(x)=0の所は微分が1または-1、入力のずれがそのまま出力に出る所
x << 1のとき
sin(x) ≒ x
であることの見事な工学的応用、
x << 1のとき
sin(x) ≒ x
であることの見事な工学的応用、
587デフォルトの名無しさん
2021/12/29(水) 21:57:34.77ID:+eZ32Uo6 まつがえた |x| << 1 やったorz
588デフォルトの名無しさん
2021/12/30(木) 01:48:03.91ID:L6Vpkxay よっしゃ、よっしゃ、おっちゃんがいいもん作ったろう
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、
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、
589デフォルトの名無しさん
2021/12/30(木) 01:51:27.40ID:L6Vpkxay590デフォルトの名無しさん
2021/12/30(木) 02:32:05.49ID:7UdZ08Kf >>588
結果見たけど、sin_valの値は、きっちり0から10000になったときに5桁精度悪化してるし、100000で6桁精度悪化してるのでは…?
結果見たけど、sin_valの値は、きっちり0から10000になったときに5桁精度悪化してるし、100000で6桁精度悪化してるのでは…?
591デフォルトの名無しさん
2021/12/30(木) 07:31:31.40ID:xtSEOuqd592デフォルトの名無しさん
2021/12/30(木) 11:37:53.79ID:ZhVAaRAF まだやってたのか小学生・・・ID変えてご苦労様
593デフォルトの名無しさん
2021/12/30(木) 11:39:17.39ID:ZhVAaRAF 何度も言ってるが>>560でこの話は終了している
594デフォルトの名無しさん
2021/12/30(木) 12:38:33.70ID:A3EHubzP 質問主が現れないからもう何議論しても無駄な気がする
ソースコードがあるわけでもないし
100万程度で誤差ヤバい言うぐらいだからfloatで計算してないか疑たくもなる
ソースコードがあるわけでもないし
100万程度で誤差ヤバい言うぐらいだからfloatで計算してないか疑たくもなる
595デフォルトの名無しさん
2021/12/30(木) 14:43:33.58ID:Wt/MKF34 誰も計算機上のゼロについて理解できてない
596デフォルトの名無しさん
2021/12/30(木) 16:49:59.36ID:uaiyfMI5 もまいら、浮動小数点のゼロ判定どうしてる?
597デフォルトの名無しさん
2021/12/31(金) 00:22:01.38ID:kcosmPcn 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ではなく配列を使うというのはしたくないです
例えば、
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ではなく配列を使うというのはしたくないです
598デフォルトの名無しさん
2021/12/31(金) 00:36:47.69ID:ysmsTKqS599デフォルトの名無しさん
2021/12/31(金) 05:02:18.38ID:zF3P5q1E600デフォルトの名無しさん
2021/12/31(金) 05:10:34.66ID:zF3P5q1E ちなみにsinがゼロのとこは微分が1か-1でsinが1のとこは微分がゼロだから違うってのは、事実だが今回の事象の説明としては感覚的に過ぎるね
なぜならf(x) = xなる関数は微分は1だが f(1000000.3575642) は14桁正しいw
sinの挙動について理解したいなら実装に踏み込むしかないよ
あるいは>>576あたりで思考停止しとくか
なぜならf(x) = xなる関数は微分は1だが f(1000000.3575642) は14桁正しいw
sinの挙動について理解したいなら実装に踏み込むしかないよ
あるいは>>576あたりで思考停止しとくか
601デフォルトの名無しさん
2021/12/31(金) 06:37:46.15ID:qJZ2APUI >>597
アクセスを厳密に禁止したいなら、配列操作のみ定義したラッパークラスを用意して渡したほうが良い。
アクセスを厳密に禁止したいなら、配列操作のみ定義したラッパークラスを用意して渡したほうが良い。
602デフォルトの名無しさん
2021/12/31(金) 08:06:29.68ID:FnYy2lty んだね
603デフォルトの名無しさん
2021/12/31(金) 08:45:47.76ID:FPee+d5o クラス T のメンバ関数で自身のコピーを返す(つまり返り値の型が T)ものを考える
メンバ関数の修飾が && のときは std::move(*this) とかしたいけどこれはいちいち書かないとダメ?
普通は std::forward で統一できるが
メンバ関数の修飾が && のときは std::move(*this) とかしたいけどこれはいちいち書かないとダメ?
普通は std::forward で統一できるが
604デフォルトの名無しさん
2021/12/31(金) 09:05:22.16ID:FnYy2lty *thisはxvalueではないからムブコンに渡したければstd::move()か(T&&)がいるね
605デフォルトの名無しさん
2021/12/31(金) 11:52:30.35ID:kcosmPcn606デフォルトの名無しさん
2021/12/31(金) 14:47:55.66ID:fEOKhR13 instance.field; が暗黙のうちに書き変わらないだけでも効果あるんだよ
void f(T&t){ t.clear();}
f(instance.field);
うっかりこんなことしたらヤバいし
const T& get_field() const;
を使っとけばコンパイル時エラーにしてくれる
>>597 冒頭の質問なら、参照渡し引数に
void f(const T&);
のようにconstつけとけばいい
void f(T&t){ t.clear();}
f(instance.field);
うっかりこんなことしたらヤバいし
const T& get_field() const;
を使っとけばコンパイル時エラーにしてくれる
>>597 冒頭の質問なら、参照渡し引数に
void f(const T&);
のようにconstつけとけばいい
607デフォルトの名無しさん
2021/12/31(金) 15:16:00.18ID:7kXupeFa608デフォルトの名無しさん
2022/01/04(火) 07:21:58.04ID:5hvio7Nh Packtpubが不安定になってるんだけど。
見れますか?
見れますか?
609デフォルトの名無しさん
2022/01/05(水) 21:49:37.99ID:2R8vvmqQ クラステンプレートについて、明示的実体化しておけば実装を.cppでもできるというのを知ったのですが、その場合、テンプレートでない普通のクラスと同じように
部分的にヘッダに実装を書いて、残りを.cppに書く、というのは正式な書き方として許されるでしょうか?
部分的にヘッダに実装を書いて、残りを.cppに書く、というのは正式な書き方として許されるでしょうか?
610デフォルトの名無しさん
2022/01/05(水) 22:24:10.67ID:tiBxT68+ 許される。
611デフォルトの名無しさん
2022/01/05(水) 22:48:02.56ID:2R8vvmqQ >>610
ありがとうございます!
ありがとうございます!
612デフォルトの名無しさん
2022/01/06(木) 15:12:35.27ID:C9LB+2SX その昔、exportテンプレートというのがあってだな
613デフォルトの名無しさん
2022/01/07(金) 00:07:55.52ID:UgPywUlD class T;
class C {
public:
T t;
};
とあったとき
C c{T()};
と集成体初期化を行うと T のコンストラクタが1回だけ呼ばれます
メンバ t をカプセル化してコンストラクタを自分で用意するとどうやっても T のムーヴコンストラクタが余計に1回呼ばれてしまうと思ったのですが回避する方法はありますか?
class C {
public:
T t;
};
とあったとき
C c{T()};
と集成体初期化を行うと T のコンストラクタが1回だけ呼ばれます
メンバ t をカプセル化してコンストラクタを自分で用意するとどうやっても T のムーヴコンストラクタが余計に1回呼ばれてしまうと思ったのですが回避する方法はありますか?
614デフォルトの名無しさん
2022/01/07(金) 02:01:17.79ID:uUhimsKL615デフォルトの名無しさん
2022/01/07(金) 20:51:50.26ID:UgPywUlD >>614
ありがとうございます!
ありがとうございます!
616デフォルトの名無しさん
2022/01/09(日) 10:55:01.80ID:7BGFeByJ >>597
配列の定義を vector<const testclass*> にすればよくない?
配列の定義を vector<const testclass*> にすればよくない?
617デフォルトの名無しさん
2022/01/09(日) 11:30:20.08ID:BcvcYHng 外では変更するけど関数内では変更しないことを明示したいんでしょ
618デフォルトの名無しさん
2022/01/12(水) 09:32:50.44ID:kvnPCGqB 関数の定義で
auto foo() -> void{}
みたいに書くの見かけたけどこのやり方何かメリットありますか?
auto foo() -> void{}
みたいに書くの見かけたけどこのやり方何かメリットありますか?
619デフォルトの名無しさん
2022/01/12(水) 12:16:01.64ID:SK9+pElf あるね
auto s = std::string{"test"};
みたいな宣言とかも
auto s = std::string{"test"};
みたいな宣言とかも
620デフォルトの名無しさん
2022/01/12(水) 12:26:17.78ID:Z0p/7uhd >>618は型推論効いてないやん
621デフォルトの名無しさん
2022/01/12(水) 12:28:40.33ID:VUzGdiiG 戻り値の型を->の先に書いてあるだけだよ。
だからこれはvoid型の戻り値ね。
利点は引数からdecltype使って戻り値の型を指定できるくらいじゃない?
だからこれはvoid型の戻り値ね。
利点は引数からdecltype使って戻り値の型を指定できるくらいじゃない?
622デフォルトの名無しさん
2022/01/12(水) 13:45:01.07ID:uq5/9jO3623はちみつ餃子 ◆8X2XSCHEME
2022/01/12(水) 13:59:43.98ID:7Sv8jpqL ラムダ式で返却値の型をどう書くかというのが後置スタイルを導入した直接の動機だと思う。
普通の関数で後置にするメリットがない場合であっても、
メリットがある場合とない場合で区別して使い分けるよりは全部を後置で一貫させたほうが綺麗だと思うこともあるだろ。
普通の関数で後置にするメリットがない場合であっても、
メリットがある場合とない場合で区別して使い分けるよりは全部を後置で一貫させたほうが綺麗だと思うこともあるだろ。
624デフォルトの名無しさん
2022/01/12(水) 17:10:39.04ID:VRtGvzgV みずほが復旧をあきらめるとかどうみてもfukkyu
625デフォルトの名無しさん
2022/01/12(水) 18:43:03.08ID:NICGWYWs 人がつくったものネットから持ってきて何個も組み合わせて合体させるとみずほみたいになるんだろうな
自分で作ってない部分はメンテしようがないからな
自分で作ってない部分はメンテしようがないからな
626デフォルトの名無しさん
2022/01/12(水) 19:53:35.19ID:UH3nST5b Windows serverにしたのが最大の間違い。
627デフォルトの名無しさん
2022/01/12(水) 20:51:55.49ID:VUzGdiiG std::stringの大文字を全て小文字に変換するのってstd::transformより良いものあるの?
628デフォルトの名無しさん
2022/01/12(水) 22:50:55.12ID:VRtGvzgV Windowsで文字列中の大文字を小文字に変換する_mbslwr()って今やランタイムで使えなくなってんだね、知らんかったわ
629蟻人間 ◆T6xkBnTXz7B0
2022/01/12(水) 23:14:22.56ID:htST1fFk CharLower
CharLowerBuff
CharLowerBuff
630デフォルトの名無しさん
2022/01/13(木) 21:50:13.52ID:bN4t5i1e c++のexe → ライブラリA(c++のdll)
と
c++のcリンケージのdll → ライブラリA(c++のdll)
で
同じライブラリの同じ関数を呼び出してるのに
呼び出し元の形態によって挙動が変わるなんてこと有り得ますか?
と
c++のcリンケージのdll → ライブラリA(c++のdll)
で
同じライブラリの同じ関数を呼び出してるのに
呼び出し元の形態によって挙動が変わるなんてこと有り得ますか?
631デフォルトの名無しさん
2022/01/13(木) 22:14:06.74ID:+PFReeTS ライブラリも呼び出し元も外部の同名のdllをリンクしているけれども
呼び出し元が参照しているdllの実体が別だったとか。
呼び出し元が参照しているdllの実体が別だったとか。
632デフォルトの名無しさん
2022/01/14(金) 09:16:33.28ID:ovvIshUS struct Vector2 { float x, y; };のような64bitで済んでしまうものの計算にSSE命令を使っても高速化は見込めないのでしょうか?
上記に対して_mm_mul_psを行うと上位2float分を余計に計算させることになってしまいますよね
上記に対して_mm_mul_psを行うと上位2float分を余計に計算させることになってしまいますよね
633デフォルトの名無しさん
2022/01/15(土) 05:56:06.60ID:ps658RNN >>603
deducing thisがC++23で入るね
deducing thisがC++23で入るね
634デフォルトの名無しさん
2022/01/15(土) 16:29:52.27ID:fx8S/FAM635デフォルトの名無しさん
2022/01/16(日) 12:31:04.34ID:20f7Ghpo >>630
同じ関数というのが関数名と引数の数が同じというだけなら
extern "C" double sqrt(double x);
extern float sqrt(float x);
とから有り得る
同じ関数というのが関数名と引数の数が同じというだけなら
extern "C" double sqrt(double x);
extern float sqrt(float x);
とから有り得る
636デフォルトの名無しさん
2022/01/17(月) 15:18:31.08ID:sD13NBSV pair<int, int> の first と second に、例えば座標と向きのような意味をもたせてるとします
このとき、using なんかを使って pair<int, int> x の第一要素と第二要素に x.pos、x.dir のようにアクセスする方法ってありますか?
このとき、using なんかを使って pair<int, int> x の第一要素と第二要素に x.pos、x.dir のようにアクセスする方法ってありますか?
637はちみつ餃子 ◆8X2XSCHEME
2022/01/17(月) 15:34:47.07ID:jU2WrI4n >>636
C++ ではメンバ (のように見えるもの) を後から生やすことは出来ない。
C++ ではメンバ (のように見えるもの) を後から生やすことは出来ない。
638デフォルトの名無しさん
2022/01/17(月) 16:04:32.58ID:+6BKuldY auto& [x, y] = obj;
x = 100;
y = 100;
動くかは試してない
x = 100;
y = 100;
動くかは試してない
639デフォルトの名無しさん
2022/01/17(月) 16:07:55.78ID:h5bglXe3640はちみつ餃子 ◆8X2XSCHEME
2022/01/17(月) 16:18:00.13ID:jU2WrI4n いくつかの要件を満たして "Tuple-like" であるようなクラスはタプルのように扱える仕組みがある。
タプルを多用途に使うよりは個別のクラスを作った上でタプルのインターフェイスを持たせるほうが
使いやすくなると思う。
タプルを多用途に使うよりは個別のクラスを作った上でタプルのインターフェイスを持たせるほうが
使いやすくなると思う。
641デフォルトの名無しさん
2022/01/17(月) 16:55:14.33ID:aOF99LGB >>636
まず構造体を勉強しよう
まず構造体を勉強しよう
642デフォルトの名無しさん
2022/01/17(月) 17:09:52.53ID:bBHBfELI struct だと困るんですか?
643デフォルトの名無しさん
2022/01/17(月) 17:35:43.45ID:AdXHrviP みなさん御機嫌よう
このスレには何度も助けられているものです
再度お知恵を拝借したいです
任意のユーザー定義型のインスタンス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(){}
このスレには何度も助けられているものです
再度お知恵を拝借したいです
任意のユーザー定義型のインスタンス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(){}
644はちみつ餃子 ◆8X2XSCHEME
2022/01/17(月) 17:43:03.78ID:jU2WrI4n 老眼なので Hantei が Hentai に見えた。
645はちみつ餃子 ◆8X2XSCHEME
2022/01/17(月) 17:49:59.30ID:jU2WrI4n >>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;
}
静的な型を判定するならこういうのでいけると思うが、
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;
}
646デフォルトの名無しさん
2022/01/17(月) 20:36:31.89ID:PMmhhAT1 dynamic_cast<base*>(hoge)がnullptrかどうかを見ろ
647デフォルトの名無しさん
2022/01/17(月) 20:47:22.64ID:6BYLlYWJ648デフォルトの名無しさん
2022/01/17(月) 20:49:09.31ID:AdXHrviP >>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の機序が違うのかな……?
ありがとうございます。
ただ今これで動作確認はしました。
が本来は基底クラスのポインタに格納されているのです……
書き込む時に蛇足と思って省いてしまったのですが、実際は
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の機序が違うのかな……?
649デフォルトの名無しさん
2022/01/17(月) 21:03:17.46ID:PMmhhAT1 だからdynamic_castで調べろって
そのための機能だから
そのための機能だから
650デフォルトの名無しさん
2022/01/17(月) 21:36:21.92ID:AdXHrviP >>649
ありがとうございます!!!
確認しましたところ自分の思っている動作が得られました☆*:.。. o(≧▽≦)o .。.:*☆
こんなに簡単に出来るとは、is_base_ofの使い所さんはどうなってしまうんだ。。。
レスへの返信を書きながら、自分でもコード確認やリファレンスを検索していたため、スレの確認が遅くなってしまい、多くの型と行き違いになってまいました。
返信をくださった方々には重ね重ねお礼申し上げます。
まだまだ弱輩者ですが、これからも生暖かい目で返信くださると幸いです。
皆さんありがとうございます!
ありがとうございます!!!
確認しましたところ自分の思っている動作が得られました☆*:.。. o(≧▽≦)o .。.:*☆
こんなに簡単に出来るとは、is_base_ofの使い所さんはどうなってしまうんだ。。。
レスへの返信を書きながら、自分でもコード確認やリファレンスを検索していたため、スレの確認が遅くなってしまい、多くの型と行き違いになってまいました。
返信をくださった方々には重ね重ねお礼申し上げます。
まだまだ弱輩者ですが、これからも生暖かい目で返信くださると幸いです。
皆さんありがとうございます!
651はちみつ餃子 ◆8X2XSCHEME
2022/01/17(月) 21:36:54.84ID:jU2WrI4n652デフォルトの名無しさん
2022/01/17(月) 21:37:50.95ID:AdXHrviP dynamic_castは知ってたはずなのに思い出さなかったというか思いつかなかった……
653デフォルトの名無しさん
2022/01/17(月) 21:46:56.12ID:AdXHrviP >>651
ありがとうございます。
自分はスライシングもちゃんと理解してないですね……
ポインタのメモリ確保サイズが一様に8バイト(4バイト)なので、基底型が派生型の型を丸ごと格納している(派生型のポインタを確保している)と理解していました。。。(*を付けると派生型が出てくる)
悪魔でも基底型なのですね?
キャストで受けるまでは基底型として扱われるので、型情報が合致しなかったのかな。
type_infoは、全く別の型を型合致に使うから*baseが有効なのかな。
ありがとうございます。
自分はスライシングもちゃんと理解してないですね……
ポインタのメモリ確保サイズが一様に8バイト(4バイト)なので、基底型が派生型の型を丸ごと格納している(派生型のポインタを確保している)と理解していました。。。(*を付けると派生型が出てくる)
悪魔でも基底型なのですね?
キャストで受けるまでは基底型として扱われるので、型情報が合致しなかったのかな。
type_infoは、全く別の型を型合致に使うから*baseが有効なのかな。
654デフォルトの名無しさん
2022/01/17(月) 21:55:40.15ID:h5bglXe3 dynamic_castって仮想関数テーブル必要じゃなかったっけ?
まぁいずれにせよ仮想関数テーブルでぐぐればそこらへんの理解が進むと思う
多分
まぁいずれにせよ仮想関数テーブルでぐぐればそこらへんの理解が進むと思う
多分
655デフォルトの名無しさん
2022/01/19(水) 17:29:06.73ID:u/w202Yd スライシングとか知らない単語使わないで
656デフォルトの名無しさん
2022/01/19(水) 18:16:17.94ID:oZ05fVjC 用語って大事だよな
言葉遣いがおかしいの指摘されると逆ギレする
DQN気質なやつが残念ながら後を経たない
言葉遣いがおかしいの指摘されると逆ギレする
DQN気質なやつが残念ながら後を経たない
657デフォルトの名無しさん
2022/01/20(木) 05:34:44.25ID:tJtJ60TC https://cpplover.blogspot.com/2018/07/c20.html?m=1
汎用エイリアス宣言の提案ってどうなったんだろう
汎用エイリアス宣言の提案ってどうなったんだろう
658デフォルトの名無しさん
2022/01/20(木) 09:07:39.69ID:PFfSIkf2 #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
//#include <string>
template <typename F>
void test(F&& f){}
int main(){
test(std::isprint);
}
これ<string>を有効にするとcouldn't deduceになるんだけど
なんで?
コンパイラはMSYS2 g++ 10.3.0
659デフォルトの名無しさん
2022/01/20(木) 09:24:47.83ID:MuVW7weO 名前衝突してんじゃないの?
660デフォルトの名無しさん
2022/01/20(木) 09:37:40.24ID:PFfSIkf2 <locale>のテンプレートが干渉してるっぽいことはわかった
これ、俺の落ち度なの?
これ、俺の落ち度なの?
661デフォルトの名無しさん
2022/01/20(木) 13:32:22.34ID:NzUGMacM >>660
オーバーロードやデフォルト引数が追加される可能性があるから、
一般的に標準ライブラリ関数のアドレスは取れないと思ったほうがいい。
https://isocpp.org/std/standing-documents/sd-8-standard-library-compatibility
オーバーロードやデフォルト引数が追加される可能性があるから、
一般的に標準ライブラリ関数のアドレスは取れないと思ったほうがいい。
https://isocpp.org/std/standing-documents/sd-8-standard-library-compatibility
662デフォルトの名無しさん
2022/01/20(木) 18:29:19.36ID:PFfSIkf2 ぐぶー・・・
663デフォルトの名無しさん
2022/01/20(木) 22:37:24.73ID:Df2OyNH0 ランタイムサポートが必要なC++言語機能ってRTTIやdynamic_cast、例外くらい?
664デフォルトの名無しさん
2022/01/20(木) 23:29:32.85ID:a5eQ4sV9 そもそもランタイムサポートの定義をちゃんとしないとな・・・
665デフォルトの名無しさん
2022/01/21(金) 00:00:01.47ID:/d5tBos9 RTTIも例外も標準C++の一部
それが使えないような設定は厳密には規格違反だし、それで高速化や効率化しますってのは各コンパイラの独自機能に過ぎない
それが使えないような設定は厳密には規格違反だし、それで高速化や効率化しますってのは各コンパイラの独自機能に過ぎない
666デフォルトの名無しさん
2022/01/21(金) 01:04:31.52ID:VVQk5y8F アホすぎるw
667デフォルトの名無しさん
2022/01/21(金) 07:18:18.80ID:j/G12RQ8 dynamic initializationも裏で色々やってるね
668デフォルトの名無しさん
2022/01/21(金) 07:28:47.34ID:VVQk5y8F とりあえずOSないところか、簡単な仕組みしかないところでC++で何か書いてみればいいよ
処理系が何をしてくれているのか分かる
処理系が何をしてくれているのか分かる
669デフォルトの名無しさん
2022/01/21(金) 07:43:11.40ID:j/G12RQ8 ベアメタルはオモロイ
670デフォルトの名無しさん
2022/01/21(金) 07:59:33.55ID:j/G12RQ8 658だけど、自己解決の報告。
テンプレートにしないで
void test(int(*f)(int)){}
にしたら<locale>のisprintが干渉しなくなった
最初の発想がいかんかった
テンプレートにしないで
void test(int(*f)(int)){}
にしたら<locale>のisprintが干渉しなくなった
最初の発想がいかんかった
671デフォルトの名無しさん
2022/01/21(金) 08:26:30.46ID:VVQk5y8F isprintのテンプレート引数が決まらないからだろ
test(std::isprint<int>);
とかなら通ると思う
test(std::isprint<int>);
とかなら通ると思う
672デフォルトの名無しさん
2022/01/21(金) 08:32:03.82ID:VVQk5y8F 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>);
}
#include <locale>
template <typename F>
void test(F&& f){}
int main(){
//test(std::isprint);
test(std::isprint<int>);
}
673デフォルトの名無しさん
2022/01/21(金) 08:47:07.93ID:VVQk5y8F 元のコードをなるべく変えずにだと
#include <string>
#include <cctype>
template <typename F>
void test(F&& f){}
int main(){
test(static_cast<int (*)(int)>(std::isprint));
}
※オーバーロードを選択させるべくキャストする
#include <string>
#include <cctype>
template <typename F>
void test(F&& f){}
int main(){
test(static_cast<int (*)(int)>(std::isprint));
}
※オーバーロードを選択させるべくキャストする
674デフォルトの名無しさん
2022/01/21(金) 09:54:53.25ID:j/G12RQ8 conceptでテンプレートテンプレート引数を弾いたりできないかとも思ったけど
SFINAEは関数の除外なので引数の候補を絞るのは無理だった
SFINAEは関数の除外なので引数の候補を絞るのは無理だった
675デフォルトの名無しさん
2022/01/22(土) 10:28:58.52ID:om6KWGu4 class A { static inline struct SubStruct { int value; } Field1; } //通常の構造体のスタティックメンバ変数はヘッダファイル、cppファイル共に実体は同じ
class A { static inline struct { int value; } Field1; } //無名構造体のスタティックメンバ変数はヘッダファイルとcppファイルとでそれぞれ別の実体が生成されアドレスが異なる
この挙動は仕様なのでしょうか?
class A { static inline struct { int value; } Field1; } //無名構造体のスタティックメンバ変数はヘッダファイルとcppファイルとでそれぞれ別の実体が生成されアドレスが異なる
この挙動は仕様なのでしょうか?
676デフォルトの名無しさん
2022/01/22(土) 10:57:07.60ID:OQdcFc3P 名前書き忘れて0点取ったことないのか
677デフォルトの名無しさん
2022/01/22(土) 11:38:04.16ID:+VFNw8nk 今だと仮想関数とvariantとどっち使うのが主流ですか?
678デフォルトの名無しさん
2022/01/22(土) 11:49:22.43ID:XNgWTOyh679デフォルトの名無しさん
2022/01/22(土) 13:06:33.51ID:BllOBQpy >>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.
「ヘッダファイルと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.
680デフォルトの名無しさん
2022/01/22(土) 13:08:52.36ID:BllOBQpy >>678
あと仮にinline指定が無視されたとしても「別の実体が生成される」というような動作には繋がらないね。
あと仮にinline指定が無視されたとしても「別の実体が生成される」というような動作には繋がらないね。
681デフォルトの名無しさん
2022/01/22(土) 13:59:06.18ID:0LC8SyT+■ このスレッドは過去ログ倉庫に格納されています
ニュース
- 【サッカー】U-17日本代表、激闘PK戦制す 北朝鮮撃破で6大会ぶり8強入り U17W杯 [久太郎★]
- 日本行き空路49万件キャンセル 中国自粛呼びかけ 日本行きチケット予約の約32%に相当 ★3 [ぐれ★]
- XやChatGPTで広範囲の通信障害 投稿や閲覧できず [蚤の市★]
- 【芸能】日中関係悪化でエンタメ業界に大ダメージ… JO1の中国でのイベント中止、邦画は公開延期、STARTOアイドルへの影響も [冬月記者★]
- 現役猟師・東出昌大、クマ被害続出も過熱する報道に「クマはそんな危ないもんじゃない」理由語る [muffin★]
- 【インバウンド】中国人観光客の日本での消費額は年間約2兆円超…中国政府は公務員の出張取り消し [1ゲットロボ★]
- ハゲがレジやってるコンビニって
- 4時だから窓から4回ちんこ出した
- クマどもが冬眠拒否
- Perfume・あ~ちゃんの結婚相手の一般男性、吉田カバンの社長と判明 [977261419]
- 自民党議員「高市は先人が築き上げた日中関係を壊した。外務省が謝罪に言ってるが自分で責任を取れ」 [834922174]
- 宇宙飛行士 vs 超天才数学者
