前スレ
C++相談室 part157
https://mevius.5ch.net/test/read.cgi/tech/1628474251/
C++相談室 part158
レス数が950を超えています。1000を超えると書き込みができなくなります。
2021/11/15(月) 18:49:18.44ID:I69rZ/Of
858デフォルトの名無しさん
2022/02/10(木) 21:38:32.90ID:ty8Wss5J 2005年でも古いなあ
C++98, 03, 11(0x), 14, 17, 20 と5回バージョンアップあるし
そのたびに標準ライブラリが更新されてる
古い本で古い書き方しか知らないと慣れてきたころにイラつくことになるから最低でもC++11対応のやつがいい
C++98, 03, 11(0x), 14, 17, 20 と5回バージョンアップあるし
そのたびに標準ライブラリが更新されてる
古い本で古い書き方しか知らないと慣れてきたころにイラつくことになるから最低でもC++11対応のやつがいい
859デフォルトの名無しさん
2022/02/10(木) 21:44:00.87ID:Qcxer4Pv 今更auto_ptr使うなとか言われても何の役にも立たないからな
860デフォルトの名無しさん
2022/02/10(木) 23:48:22.57ID:jkDJeeU1 べつに使ってもいいんだよ
使い方さえ間違えなければ
使い方さえ間違えなければ
861デフォルトの名無しさん
2022/02/11(金) 00:26:40.18ID:3fYQCkDW 使うことが間違いでは?
862デフォルトの名無しさん
2022/02/11(金) 04:33:24.42ID:ajov4Ad8 左辺値参照で無理やりムーブ作ったやつね
863デフォルトの名無しさん
2022/02/11(金) 06:13:41.97ID:ycfpInN1 仕様のバージョンは普通自分で選ぶもんじゃないので、古いことを知るのだって意味はある
逆にどの辺が古い、というのが分かってもあまり意味ない
逆にどの辺が古い、というのが分かってもあまり意味ない
864デフォルトの名無しさん
2022/02/13(日) 06:29:47.80ID:DI/GcuLa いろんな範囲で一様乱数を次々と生成したいときってどうしますか?
uniform_int_distribution の範囲を次々と param で変える?
あるいは、妥協して剰余をとる形で範囲を変える?
uniform_int_distribution の範囲を次々と param で変える?
あるいは、妥協して剰余をとる形で範囲を変える?
865デフォルトの名無しさん
2022/02/13(日) 06:32:11.91ID:DI/GcuLa あるいは、uniform_int_distribution を次々と生成して使い捨てる?
実測するべきなんでしょうが、どれがオーバーヘッドが少ないかというカンがありません
実測するべきなんでしょうが、どれがオーバーヘッドが少ないかというカンがありません
866デフォルトの名無しさん
2022/02/13(日) 06:51:44.09ID:rfXE6dHR 色々手はあるね
「いろんな範囲」の個数が決まっているならuniform_int_distributionの配列にするもよし
ランダムならparamもよし
次々と生成して使い捨て、つまりコンストラクタとデストラクタを都度実行するのは
俺はあんまりやりたくないが止めもしない
「いろんな範囲」の個数が決まっているならuniform_int_distributionの配列にするもよし
ランダムならparamもよし
次々と生成して使い捨て、つまりコンストラクタとデストラクタを都度実行するのは
俺はあんまりやりたくないが止めもしない
867デフォルトの名無しさん
2022/02/13(日) 07:21:47.95ID:JnTPIF3C >>865
同じ範囲を何回も使うならその分distributionを用意する、そうでないならparamを変えていくのが良さそうに思います。が、たぶん実行時の差はほぼ無いです。
いちおう関数の定数を書き換えていくかメモリ上に予めたくさん用意するかの違いとして判断しました。
計算重いのは大抵は乱数生成の方だと思うので、速くしたいならそっちをとりかえたほうがいいと思います。
同じ範囲を何回も使うならその分distributionを用意する、そうでないならparamを変えていくのが良さそうに思います。が、たぶん実行時の差はほぼ無いです。
いちおう関数の定数を書き換えていくかメモリ上に予めたくさん用意するかの違いとして判断しました。
計算重いのは大抵は乱数生成の方だと思うので、速くしたいならそっちをとりかえたほうがいいと思います。
868デフォルトの名無しさん
2022/02/13(日) 07:48:28.31ID:rfXE6dHR メルセンヌツイスターの売りの1つが速度がそんなに遅くない点だね
869デフォルトの名無しさん
2022/02/13(日) 10:06:40.11ID:+NRIy/Ul なんで剰余を取るのが妥協なん?
870デフォルトの名無しさん
2022/02/13(日) 10:33:38.50ID:SeV3jiEK 一様性が一般に崩れるから
871デフォルトの名無しさん
2022/02/13(日) 10:37:30.83ID:SeV3jiEK 個人的にはこうやってみたりしてゐる、
/// 閉区間[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();
//printf("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;
}
/// 閉区間[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();
//printf("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;
}
872デフォルトの名無しさん
2022/02/13(日) 10:52:20.14ID:cIrOgCom 標準ライブラリ使わんの?
873はちみつ餃子 ◆8X2XSCHEME
2022/02/13(日) 11:12:52.07ID:nD0XyBZB >>869
分かり易い例として 0 から 9 の一様な乱数列を生成するものを考えてみればいい。
このとき 0 から 7 の値が必要だからといって 8 の余剰を取ったらどうなる?
8, 9 が 0, 1 になるから 0 と 1 の出現確率が他の倍になってしまうだろ。
生成される値の幅が必要な値の幅よりも十分に大きいなら
許容可能な誤差として無視できる場合も多いとは思うが
様々なパラメータが有りうる状況では検証しづらい。
分かり易い例として 0 から 9 の一様な乱数列を生成するものを考えてみればいい。
このとき 0 から 7 の値が必要だからといって 8 の余剰を取ったらどうなる?
8, 9 が 0, 1 になるから 0 と 1 の出現確率が他の倍になってしまうだろ。
生成される値の幅が必要な値の幅よりも十分に大きいなら
許容可能な誤差として無視できる場合も多いとは思うが
様々なパラメータが有りうる状況では検証しづらい。
874はちみつ餃子 ◆8X2XSCHEME
2022/02/13(日) 11:15:35.52ID:nD0XyBZB >>872
呼出しのたびに必要な範囲が違うような Distribution が標準に無いという文脈
呼出しのたびに必要な範囲が違うような Distribution が標準に無いという文脈
875ハノン ◆QZaw55cn4c
2022/02/13(日) 12:39:58.09ID:1UprWsoO >>873
それもあるけれども、昔の擬似乱数列は絶望的なまでに下位桁がランダムではない、という事情をひきずっているのでは?まあ MT はそうじゃないけどね
それもあるけれども、昔の擬似乱数列は絶望的なまでに下位桁がランダムではない、という事情をひきずっているのでは?まあ MT はそうじゃないけどね
876デフォルトの名無しさん
2022/02/13(日) 13:09:41.79ID:+NRIy/Ul877デフォルトの名無しさん
2022/02/13(日) 13:37:58.02ID:PyRRUUG6 C++何の関係もない話で草
検証が必要ならすればいいだけ
要件すら不明で何もしてないのに質問するやつが馬鹿
検証が必要ならすればいいだけ
要件すら不明で何もしてないのに質問するやつが馬鹿
878はちみつ餃子 ◆8X2XSCHEME
2022/02/13(日) 14:27:27.60ID:nD0XyBZB879デフォルトの名無しさん
2022/02/13(日) 15:14:31.28ID:GfZrXG+U 任意の区間の乱数って、どうせはみ出した分をちょん切るんでしょ?
880はちみつ餃子 ◆8X2XSCHEME
2022/02/13(日) 15:18:24.06ID:nD0XyBZB せやで。
881デフォルトの名無しさん
2022/02/13(日) 15:25:43.89ID:CS3pmCmc そんな短い周期の疑似乱数使ってないんじゃない?
端っこは気にしないと思うなあ
端っこは気にしないと思うなあ
882デフォルトの名無しさん
2022/02/13(日) 16:00:39.64ID:yoBtg/nD883デフォルトの名無しさん
2022/02/13(日) 16:06:17.09ID:CS3pmCmc 一般論でいうと周期に余裕がない様な疑似乱数使うのが間違いなんだと思うけどね
884デフォルトの名無しさん
2022/02/13(日) 16:19:57.08ID:kSk9XozZ そういうのを乱数知識ない奴が触らずに済むようにパッケージにしたのが<random>のdistributionなんだから素直に頼っとけよ
885デフォルトの名無しさん
2022/02/13(日) 16:42:35.21ID:JnTPIF3C 周期と値域は別では
886デフォルトの名無しさん
2022/02/13(日) 16:56:02.36ID:KditTIA5 >>885
内部的にはおおむね同じです
内部的にはおおむね同じです
887はちみつ餃子 ◆8X2XSCHEME
2022/02/13(日) 17:04:20.08ID:nD0XyBZB 線形合同法とかなら値の範囲と周期が一致することもあるが、乱数の一般的性質というわけではない。
888デフォルトの名無しさん
2022/02/13(日) 17:59:20.78ID:av/6iEu7 周期と値域は別だろ
たとえばマイナス一億と、プラス一億の2値をとる乱数とか
たとえばマイナス一億と、プラス一億の2値をとる乱数とか
889デフォルトの名無しさん
2022/02/13(日) 18:15:27.44ID:AOBvb97v 疑似乱数なんて今の値で次の値が決まるんだから周期も値も同じだろう
その値の一部を使ったらまあ見た目は減るだろうけど
その値の一部を使ったらまあ見た目は減るだろうけど
890デフォルトの名無しさん
2022/02/13(日) 18:32:37.88ID:3OIdnfKh 値域: 出力される値の範囲
周期: そのまんま乱数の出力が1周するステップ数
内部状態かなんかとごちゃ混ぜになってない?
周期: そのまんま乱数の出力が1周するステップ数
内部状態かなんかとごちゃ混ぜになってない?
891はちみつ餃子 ◆8X2XSCHEME
2022/02/13(日) 18:34:40.46ID:nD0XyBZB892デフォルトの名無しさん
2022/02/13(日) 18:34:49.25ID:AOBvb97v さすがにマジの最大値と最小値なんて誰も問題にしとらんやろ
893デフォルトの名無しさん
2022/02/13(日) 18:38:19.35ID:mUIDTArd894デフォルトの名無しさん
2022/02/13(日) 18:55:00.53ID:RJAwRgrO 端っこにゴミがあるよりは歯抜けが散らばってる方がいいというのは一理あるね
895デフォルトの名無しさん
2022/02/14(月) 10:33:59.04ID:14KvXXq2 メンバー関数をテンプレートに出来たりしませんかね?
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 ホゲホゲって感じですが
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 ホゲホゲって感じですが
896デフォルトの名無しさん
2022/02/14(月) 10:38:23.09ID:14KvXXq2 書き込んでから思いつきましたが直接やらずに
struct Caller1{void operator()(Sample& sample, int i){sample.func1(int i);}};
...
みたいなのを挟むべきですかねぇ
struct Caller1{void operator()(Sample& sample, int i){sample.func1(int i);}};
...
みたいなのを挟むべきですかねぇ
897デフォルトの名無しさん
2022/02/14(月) 10:52:52.11ID:Z549+Tcq structの{}内にテンプレートの文全部入れてみ?
898デフォルトの名無しさん
2022/02/14(月) 11:13:25.35ID:o9A3FVGP 毎回 uniform_int_distribution のインスタンスを一時的に生成しては破壊するのを繰り返すのだけはありえんだろ
無意味なメモリのアロケーションありすぎ
無意味なメモリのアロケーションありすぎ
899デフォルトの名無しさん
2022/02/14(月) 11:16:30.38ID:lu0CYRrt #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;
}
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;
}
900デフォルトの名無しさん
2022/02/14(月) 11:28:15.31ID:s3l2ZTMb doubleとfloatの配列を同じように関数の引数に渡して扱う方法ってありますか?
・処理部が複雑なので引数の型が違う関数2個は作りたくない
・IF関数として両方版を作ってそこから処理部を呼び出すみたいな構造は可能、ただし別型版の実体コピー配列などは作りたくない(配列が巨大な為)
考えてみたのが、
配列の値部分をvoid*配列で指したものと、type_infoを持ったクラスなり構造体なりを用意して、
処理部でtype_infoに応じてvoid*をキャスティング、という方法ですが、
どうにも汚いのでもっと綺麗なやり方あれば教えてください。
・処理部が複雑なので引数の型が違う関数2個は作りたくない
・IF関数として両方版を作ってそこから処理部を呼び出すみたいな構造は可能、ただし別型版の実体コピー配列などは作りたくない(配列が巨大な為)
考えてみたのが、
配列の値部分をvoid*配列で指したものと、type_infoを持ったクラスなり構造体なりを用意して、
処理部でtype_infoに応じてvoid*をキャスティング、という方法ですが、
どうにも汚いのでもっと綺麗なやり方あれば教えてください。
901デフォルトの名無しさん
2022/02/14(月) 11:34:29.03ID:lu0CYRrt コードがないので0点
902デフォルトの名無しさん
2022/02/14(月) 11:51:48.64ID:MNwZvUCy テンプレートでいいだろ
903デフォルトの名無しさん
2022/02/14(月) 11:54:11.63ID:L8LvhIeL >>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)) { }
}
ふつーにテンプレートじゃね?
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)) { }
}
904デフォルトの名無しさん
2022/02/14(月) 11:57:58.78ID:81yRYH7R905デフォルトの名無しさん
2022/02/14(月) 12:04:39.18ID:Z549+Tcq906デフォルトの名無しさん
2022/02/14(月) 12:12:47.83ID:L8LvhIeL >>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);
こんな基本はわかるんだよな?
まさかとは思うが
float f[2];
std::fill(std::begin(f), std::end(f), 0);
double d[2];
std::fill(std::begin(d), std::end(d), 0);
こんな基本はわかるんだよな?
907デフォルトの名無しさん
2022/02/14(月) 13:46:37.17ID:nlxkZZlr >>899
ありがとう、採用します 895
ありがとう、採用します 895
908デフォルトの名無しさん
2022/02/14(月) 14:17:59.24ID:s3l2ZTMb ありがとうございます、テンプレート便利ですね。使わせていただきます。900
909デフォルトの名無しさん
2022/02/14(月) 14:33:14.26ID:HFyH6Ayv あるクラスのメンバ関数のデフォルト引数を同クラスのメンバ変数にすることって可能でしょうか
910デフォルトの名無しさん
2022/02/14(月) 14:51:26.37ID:lu0CYRrt 可能
911はちみつ餃子 ◆8X2XSCHEME
2022/02/14(月) 14:51:35.72ID:eI8f6/6+ もっとわかりやすく説明して……。
912はちみつ餃子 ◆8X2XSCHEME
2022/02/14(月) 14:55:09.41ID:eI8f6/6+ デフォルト引数をデータメンバにするってのは単にデフォルト引数の値をデータメンバに入れるって意味?
↓ こういうの?
struct foo {
int x;
void bar(int y=1) {
x=y;
}
};
こんな単純なことがわからないとも思えんし、なんか隠れた要件がありそうな気がするんやが
↓ こういうの?
struct foo {
int x;
void bar(int y=1) {
x=y;
}
};
こんな単純なことがわからないとも思えんし、なんか隠れた要件がありそうな気がするんやが
913デフォルトの名無しさん
2022/02/14(月) 15:03:33.70ID:JdXPqUHi >>912
逆だろ文網
逆だろ文網
914デフォルトの名無しさん
2022/02/14(月) 15:13:09.50ID:9KgBPGkB >>912
こいつJ民だったの?
こいつJ民だったの?
915デフォルトの名無しさん
2022/02/14(月) 15:13:51.43ID:M1yCctPq たぶん
struct S{
int field;
void f(int x=field){...}
};
ってのをやりたいんだろうけどな
あいにくC++のデフォルト引数は関数定義を見ただけで定数に決まるものしか受け付けられない
どうしても同等の処理をしたいならオーバーロードして転送するのが一番楽
void f(){f(field);}
struct S{
int field;
void f(int x=field){...}
};
ってのをやりたいんだろうけどな
あいにくC++のデフォルト引数は関数定義を見ただけで定数に決まるものしか受け付けられない
どうしても同等の処理をしたいならオーバーロードして転送するのが一番楽
void f(){f(field);}
916デフォルトの名無しさん
2022/02/14(月) 15:17:25.95ID:L8LvhIeL > デフォルト引数は関数定義を見ただけで定数に決まるものしか受け付けられない
そうか?
int func()
{
int a;
std::cin >> a; //絶対に定数になり得ない
return a;
}
void test(int arg = func())
{
}
int main()
{
test(); //OK. もちろん入力待ちをする
}
そうか?
int func()
{
int a;
std::cin >> a; //絶対に定数になり得ない
return a;
}
void test(int arg = func())
{
}
int main()
{
test(); //OK. もちろん入力待ちをする
}
917はちみつ餃子 ◆8X2XSCHEME
2022/02/14(月) 15:21:08.20ID:eI8f6/6+918デフォルトの名無しさん
2022/02/14(月) 15:33:51.02ID:lu0CYRrt コードがないし状況不明で困ってる文面にも見えないからアレで十分
919デフォルトの名無しさん
2022/02/14(月) 17:52:44.50ID:m3z01MvF uniform_int_distributionって本質はIntTypeのペアを持った関数オブジェクトだから毎回生成したところで遅くはないはず
920デフォルトの名無しさん
2022/02/14(月) 20:03:27.39ID:vE8mmwyH 乱数ってだいたい静的になんか持ってるよね
921デフォルトの名無しさん
2022/02/14(月) 20:44:52.17ID:UkhMLhRO マルチスレッド環境用にジャンプって機能が疑似乱数にあるよな
「疑似乱数 ジャンプ」でぐぐると出てくる
「疑似乱数 ジャンプ」でぐぐると出てくる
922デフォルトの名無しさん
2022/02/14(月) 21:33:11.13ID:CqI2HZWm 状態持ってるのはエンジンの方
分布ごときにどんな怪獣ブラックボックスのイメージ持ってんだ
分布ごときにどんな怪獣ブラックボックスのイメージ持ってんだ
923デフォルトの名無しさん
2022/02/14(月) 21:37:34.26ID:zjXK/l5x エンジン以外に何があんの?
924デフォルトの名無しさん
2022/02/14(月) 22:08:14.48ID:2E5iBc/D 例外処理で、catchした後、どのクラスがthrowしたのかってわかりますか?
925デフォルトの名無しさん
2022/02/14(月) 22:35:41.44ID:jOONNl+N 初心者質問ですみません。
ヘッダで定義したテンプレート特殊化の非推奨属性がヘッダ外で効いてないっぽいんですけど、
ヘッダ外でも非推奨としたい場合何か特殊な事をしないといけないとかありましたっけ?
例えば
.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; // これは非推奨じゃない
```
となっています。
MSVC++(v142)で言語標準準拠はstd:c++20です。
ヘッダで定義したテンプレート特殊化の非推奨属性がヘッダ外で効いてないっぽいんですけど、
ヘッダ外でも非推奨としたい場合何か特殊な事をしないといけないとかありましたっけ?
例えば
.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; // これは非推奨じゃない
```
となっています。
MSVC++(v142)で言語標準準拠はstd:c++20です。
926はちみつ餃子 ◆8X2XSCHEME
2022/02/14(月) 22:41:31.68ID:eI8f6/6+ >>924
それ自体には発生元を特定する情報を持たないけど……。
どういう状況?
・ 例外的な状況から回復する必要があって発生源によって処理の切り替えが要る
・ プログラムの正常系が動くはずなのに何故か出てくる例外の元を特定したい (つまりデバッグ用途)
どちら?
それ自体には発生元を特定する情報を持たないけど……。
どういう状況?
・ 例外的な状況から回復する必要があって発生源によって処理の切り替えが要る
・ プログラムの正常系が動くはずなのに何故か出てくる例外の元を特定したい (つまりデバッグ用途)
どちら?
927デフォルトの名無しさん
2022/02/14(月) 23:02:44.91ID:2E5iBc/D928デフォルトの名無しさん
2022/02/14(月) 23:08:22.30ID:BDOt87Dq >>927
ヒント。例外はクラス等なんでも投げられる。そしてクラスは継承できる。
ヒント。例外はクラス等なんでも投げられる。そしてクラスは継承できる。
929デフォルトの名無しさん
2022/02/14(月) 23:11:22.86ID:R5SapkSQ それはどのクラスがthrowした、じゃなくて、どのクラスがthrowされた、の間違いだな
例外 c++で検索すれば答えはすぐ出てくるよ
例外 c++で検索すれば答えはすぐ出てくるよ
930デフォルトの名無しさん
2022/02/14(月) 23:29:00.15ID:a+DIA8ij931デフォルトの名無しさん
2022/02/15(火) 00:14:19.75ID:VnfLS+lO932蟻人間 ◆T6xkBnTXz7B0
2022/02/15(火) 00:23:09.85ID:vbEMbnXt throw this;
933デフォルトの名無しさん
2022/02/15(火) 14:33:45.24ID:StNRh9X/ クラスメンバをforで回す方法はありますか?
例えばintのaとdoubleのbという2つのメンバを持つクラスがあったとして、
forループでクラス内のメンバ変数を全部加算したい、など。
イメージはこんな感じです。
double all = 0.0;
for (T member : this->allMember)
{
all += member;
}
例えばintのaとdoubleのbという2つのメンバを持つクラスがあったとして、
forループでクラス内のメンバ変数を全部加算したい、など。
イメージはこんな感じです。
double all = 0.0;
for (T member : this->allMember)
{
all += member;
}
934デフォルトの名無しさん
2022/02/15(火) 14:55:33.51ID:aaenmMxg for で回さないといけないほど多数のメンバー変数がある設計をまず見直すべき
935デフォルトの名無しさん
2022/02/15(火) 14:59:14.95ID:0rNaChGh リフレクションは無いというのが回答か
936デフォルトの名無しさん
2022/02/15(火) 15:15:26.06ID:AWN50YIA 動的にロードするのでなければ、自分で登録するか、ソースから解析するタイプのリフレクションライブラリを書くか探せばいい
937デフォルトの名無しさん
2022/02/15(火) 15:16:41.63ID:g9Gn9R1H 配列じゃあかんのか
938デフォルトの名無しさん
2022/02/15(火) 15:22:08.66ID:3zKYAjvH 数学のベクトルクラスでも作成してるのかい?
939デフォルトの名無しさん
2022/02/15(火) 17:13:44.36ID:QbgtcDS7 >>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
あるよ。おすすめするわけじゃないけど。
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
940デフォルトの名無しさん
2022/02/15(火) 17:28:44.20ID:AWN50YIA じゃあこれもオススメではないがリフレクションベースで
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
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
941デフォルトの名無しさん
2022/02/15(火) 17:31:44.80ID:AWN50YIA ちょっと修正
#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;
}
#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;
}
942デフォルトの名無しさん
2022/02/17(木) 18:59:32.62ID:bHlhY+TU std::unique_ptr</*見切れる程長いクラス名*/> looongPtr{ std::make_unique</*見切れる程長いクラス名*/>(/*見切れる程多い引数*/) };
unique_ptrをメンバ変数にするときに最初のとこをautoに出来ないんですか?
unique_ptrをメンバ変数にするときに最初のとこをautoに出来ないんですか?
943デフォルトの名無しさん
2022/02/17(木) 19:17:57.96ID:9tUnWmYs make関数使えば?
944蟻人間 ◆T6xkBnTXz7B0
2022/02/17(木) 19:30:29.28ID:sNGWbyyl typedef longlonglongtypename shorttypename;
auto ptr = std::make_unique<shorttypename>...
auto ptr = std::make_unique<shorttypename>...
945デフォルトの名無しさん
2022/02/17(木) 20:09:06.95ID:TNf7BdQD946デフォルトの名無しさん
2022/02/17(木) 20:26:37.89ID:wIu//gsc >>942
設計を見直せ
設計を見直せ
947デフォルトの名無しさん
2022/02/17(木) 21:57:39.99ID:d4bhbZak 単なる○○できますか?に対して設計見直せとだけ言ってくるガイジなんなん
まず質問に答えた上でなら分からんでもないが
まず質問に答えた上でなら分からんでもないが
948デフォルトの名無しさん
2022/02/17(木) 22:12:03.03ID:wIu//gsc うるせぇ雑魚が
949デフォルトの名無しさん
2022/02/17(木) 23:04:10.74ID:wrwPyddf ざーこざーこw
950デフォルトの名無しさん
2022/02/17(木) 23:56:12.71ID:bHlhY+TU 🤔
951デフォルトの名無しさん
2022/02/18(金) 00:20:49.11ID:q/M7jrOo C++の業務ってことで入ったんだけどC++とは名ばかりのC言語バリバリのコードだった
C++11、いやせめてCじゃなくてC++を書こうとしようぜと思うんだけど世の中こんなんばっかなん?こういうケースほんっとに多くてさぁ
40代↑の人が書いてるC++の言語って大体ほぼCでうんざりする
C++11、いやせめてCじゃなくてC++を書こうとしようぜと思うんだけど世の中こんなんばっかなん?こういうケースほんっとに多くてさぁ
40代↑の人が書いてるC++の言語って大体ほぼCでうんざりする
952デフォルトの名無しさん
2022/02/18(金) 00:25:14.77ID:qZSzRw8s 偏見だけど同名の関数が並んでる以外Cとしてコンパイルできそうなイメージある
953はちみつ餃子 ◆8X2XSCHEME
2022/02/18(金) 00:25:30.70ID:fowo2HBL >>951
なんでそんなことになるんだろうな?
コンパイラを信用してないからか?
ワイは40代以上やけど C++ を使える状況であえて C 的なスタイルで書く気はしないわ。
だって単純に面倒くさいもの。
なんでそんなことになるんだろうな?
コンパイラを信用してないからか?
ワイは40代以上やけど C++ を使える状況であえて C 的なスタイルで書く気はしないわ。
だって単純に面倒くさいもの。
954デフォルトの名無しさん
2022/02/18(金) 00:26:19.39ID:VWFgwWIW で、相談は?
955デフォルトの名無しさん
2022/02/18(金) 01:20:21.17ID:x3azmRP7 Cの文法が覚えられる限界なんでしょうな
956デフォルトの名無しさん
2022/02/18(金) 02:48:20.56ID:y/CjghL0 人事部の人がCとC++の見分けがつかなくて
会計上コンパイラ代に「C++」と書いてあったから
C++で募集かけてたんじゃね?
会計上コンパイラ代に「C++」と書いてあったから
C++で募集かけてたんじゃね?
レス数が950を超えています。1000を超えると書き込みができなくなります。
ニュース
- 【サッカー】U-17日本代表、激闘PK戦制す 北朝鮮撃破で6大会ぶり8強入り U17W杯 [久太郎★]
- 日本行き空路49万件キャンセル 中国自粛呼びかけ 日本行きチケット予約の約32%に相当 ★3 [ぐれ★]
- 【サッカー】日本代表、ボリビアに3発快勝 森保監督通算100試合目を飾る…鎌田、町野、中村がゴール [久太郎★]
- XやChatGPTで広範囲の通信障害 投稿や閲覧できず [蚤の市★]
- 【芸能】日中関係悪化でエンタメ業界に大ダメージ… JO1の中国でのイベント中止、邦画は公開延期、STARTOアイドルへの影響も [冬月記者★]
- 【インバウンド】中国人観光客の日本での消費額は年間約2兆円超…中国政府は公務員の出張取り消し [1ゲットロボ★]
- 青銅聖闘士のパンチは音速←わかる 白銀聖闘士はその数倍←まぁわかる 黄金聖闘士は光速←は?
- 4時だから窓から4回ちんこ出した
- クマどもが冬眠拒否
- さわやかって
- 生活保護を受けている私だけど、おはようございます。
- 【朗報】ローソン「Мサイズのカップを購入してLサイズのコーヒーを入れてくださいね」 [455031798]
