C++相談室 part163

■ このスレッドは過去ログ倉庫に格納されています
2022/12/30(金) 23:16:31.37ID:DPUEZfMS0
!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
2023/02/25(土) 12:35:52.57ID:EkXmct6Y0
訂正orz、
誤: 自作のインターフェースで疑似乱数クラスをwrapする
正: 自作のインターフェースで疑似乱数クラスとDistributionクラスをセットでwrapする

<random>はテンプレート全振りすぎてオブジェクト指向的でない
ヤヴァイ……
2023/02/25(土) 12:52:10.86ID:k1cc/WLc0
>>621
そもそも何がしたいのか
seedの異なるものが同時に必要ならそうするしかない
2023/02/25(土) 13:02:15.45ID:sAnrfOr80
>>620
>関数foo()に渡したりして使いまわしたいのだけど
>foo()は特定の疑似乱数クラスに依存させたくないという場合、
foo()を関数テンプレートにし疑似乱数クラスをテンプレート引数とする
じゃだめなの?
2023/02/25(土) 13:06:02.14ID:EkXmct6Y0
>foo()を関数テンプレートにし疑似乱数クラスをテンプレート引数とする
>じゃだめなの?
通常はそれでも良いが
foo()が1万行ある関数だったとしてヘッダファイルに書くのかっていうか、
なんで疑似乱数を使うことと、書き方がテンプレートに制限されてしまうことが相関されねばならないのか
疑問に思わないのかそうか、、、
2023/02/25(土) 13:19:38.23ID:EkXmct6Y0
んまー現実解としてはどうせstd::mt19937をstd::random_deviceで初期化するような使い方しかしないのだろうから
using rand_t = std::random_device;
using psrand_t = std::mt19937;
class FooTest : public ::testing::Test {
protected:
 psrand_t m_psrand;
public:
 FooTest() : m_psrand(rand_t()()) { }
};
ぐらいで過度の抽象化はやめておいた方が良いのかもしれん……
(別名にする、程度にしておけば疑似乱数クラスの選択とDistributionクラスの選択を分離できる
2023/02/25(土) 13:21:23.18ID:a4UZTu4a0
標準ライブラリのテンプレートもみんなヘッダに書いてるんだしいらない疑問だと思うが……
使ったことは無いけど、気にするならC++20モジュールとして書いてみるといいかもしれない
2023/02/25(土) 13:25:58.19ID:sAnrfOr80
>>624
疑似乱数クラスは限定されているので
俺ならfooの実装はcppに書いて明示的インスタンス化をする
2023/02/25(土) 15:15:43.98ID:0MW4CaX30
>>620
result_typeが違うと、乱数のサイズが変わって、それに処理も合わせないといけないからな
素直にラップすればいいんじゃね
2023/02/25(土) 19:34:51.11ID:pcyV0/Fb0
>>619
近い将来西武デパートがなくなる可能性もあるので
コンピュータ技術同様、未来永劫変わらないものなんてないんだ
2023/02/26(日) 06:44:53.09ID:wlYkLcj5M
>>620
randomてoperator()持っていなかったっけ?
std::functionに入れるとなんか問題あったっけ?
2023/02/26(日) 07:48:51.16ID:Gr0Cvu5K0
>>620
ないけど_enjineがつくやつは使い方が統一されているから
普通にテンプレート引数にするだけでいい
テンプレートに渡せるクラスを限定したいならconceptという手がある
2023/02/26(日) 07:49:07.86ID:Gr0Cvu5K0
_engine
2023/02/27(月) 00:29:36.28ID:gYXyoIsy0
_eringi
634デフォルトの名無しさん (アウアウエー Sa02-mjxs)
垢版 |
2023/02/27(月) 17:17:04.08ID:3MgFEhuya
サンプラザ中野が亡くなったのはびっくり
635デフォルトの名無しさん (アウアウウー Sa39-EsFZ)
垢版 |
2023/02/27(月) 18:32:42.37ID:uiaf09PPa
>>634
どこ情報?
636デフォルトの名無しさん (ワッチョイ 9501-ZYAP)
垢版 |
2023/02/28(火) 06:11:10.06ID:gPlIR4bB0
会議で「テレメトリーの結果、オートコレクトをオフにしているユーザーさんが多い、どうしたら良いか」ということを話し合った。
「小文字にする方法」を解説するページを作っておけば儲かるぞ。
2023/02/28(火) 07:28:04.38ID:K4SOyNvXd
どこの誤爆だろう
2023/02/28(火) 07:34:53.09ID:3dbS5K+md
くんさんついてない方の事では?
2023/02/28(火) 14:17:12.73ID:8Tfx2t07F
https://youtu.be/OC1PvKjgREo
C++沼へようこそ
2023/02/28(火) 15:20:52.24ID:dNNgH11Kd
g++のu8クソ過ぎワロタ
2023/03/04(土) 12:36:42.18ID:Rl7ZOdOT0
stdexceptの各例外の使い分けがわかりません
まず
・エラーは「実行時エラー (runtime error) 」と「論理エラー (logic error) 」との2つに大別される。
とのことでinvalid_argumentはlogic_errorの派生クラスみたいなのですが
foo()に不正な引数が渡る状況はたいてい呼び出し元bar()の実行時エラーなわけじゃん?

しかしそれだと論理エラーの出る幕が一切なくなるので、
foo()視点でfoo()に不正な引数が渡る状況は論理エラーである、とみなす立場が考えられるますが、
しかしfoo()が投げた例外を補足する箇所はfoo()の外なわけで、そんなローカル視点知ったことか、となるわけじゃん?

もうstdexceptのうちでユザープログラムから投げるのはruntime_error(<適当なメッセージ>)だけで良い?
2023/03/04(土) 13:04:37.77ID:Rl7ZOdOT0
だいたい自己解決しましたサーセン、
1. cassertにおけるassert()条件に書くような、設計上絶対起こり得ないやつ(起きたらバグ)はlogic_error
2. 上記以外(設計上起き得ないことを保証しかねる不整合)はruntime_error

で、さらに細分化可能な場合(明らかに派生クラスにあてはまるやつ)は派生クラスにする
例外を補足する個所では、logic_error& eかruntime_error& eで捕捉する(そうすれば派生クラスも捕捉できうる
でFA?
2023/03/04(土) 13:33:21.64ID:MZ+gWi90M
ソケットプログラミングがマジ解らん。
コネクトするコード書いてもエラー起こすし、バインドしてみたらエラー返してきてどうしようもないし
どうすればインだー。
2023/03/04(土) 14:05:40.41ID:XDSJ2ABs0
throw EINVL;
2023/03/04(土) 18:37:32.42ID:gLC7WXhtd
>>643
もしかしてWindows?
2023/03/04(土) 18:55:56.69ID:x4fRAuLN0
>>643
まずはサンプルを動かすところから始めよう
647デフォルトの名無しさん (ワッチョイ 8b89-Wv9y)
垢版 |
2023/03/04(土) 19:13:48.29ID:no85xIV40
解決する気があるなら書いたコードと返ってくるエラーぐらい貼ろうぜ
648デフォルトの名無しさん (ワッチョイ 1305-5I03)
垢版 |
2023/03/04(土) 20:37:57.16ID:2zCyTihi0
このスレ見て久しぶりにC++やったら今まで丸暗記してたことが
他の言語にも適用できる感じ理解できてしまったわ
649デフォルトの名無しさん (スププ Sd33-MJlW)
垢版 |
2023/03/05(日) 12:17:19.55ID:tgZ89GxTd
>>643
馬鹿には無理
2023/03/05(日) 14:10:43.43ID:V5cM5Nk90
>>642
分類としてはそんな感じでいいと思うけど、型でcatchし分けるのはお勧めしない。
2023/03/06(月) 21:47:32.00ID:iiB2MEh2M
>>645 そうです。コネクトしてメッセージ出るまでできました。
>>464 いえすさー

サンプルのサーバーも自分で書かされた結果。
サーバーがアクセプトするまでクライアントは何してもほぼ無駄という事でした。
2023/03/06(月) 22:52:55.64ID:K6iDrUwm0
最後の「ばインだー」はバインドとかけてるのか?いや、まさかな…
653デフォルトの名無しさん (スププ Sd33-MJlW)
垢版 |
2023/03/07(火) 12:11:28.12ID:f9Hon4H6d
W32APIにfork入れなかったのは嫌がらせか
2023/03/07(火) 12:49:30.34ID:gZ1LpnCS0
Cygwinを使うとか?
2023/03/07(火) 12:51:18.28ID:5oG+IrWl0
fork自体あまり良い設計ではないから、マネしなかったのは良いことだと思うよ
2023/03/07(火) 14:18:28.28ID:YRf34T/Q0
NTの構造上、forkをWin32サブシステムに入れる筋合いはどこにもないからな
2023/03/07(火) 19:14:40.99ID:OIq1O0Ib0
Unixの構造上ならどう筋合いがあるんじゃ……
親プロセスから子プロセスになんか引き継ぎたいとき便利(そういうのが多いときコピーオンライトで高速化も可能)だというのはわかるが
そもそも親プロセスから子プロセスに引き継がれるべき情報ってそんなに重大で大容量なのがなんかあるっけ、、、
2023/03/07(火) 19:35:58.81ID:nDfu8VY70
代わりにspawnがあるからでしょ
2023/03/07(火) 20:12:06.52ID:yBXOBLOe0
そもそもプロセスって並列処理のためのもので、並列処理って同じ仕事する奴をたくさん用意するものなんだからforkは自然な設計
現代のPCやデバイスと噛み合ってないのはその通り
660デフォルトの名無しさん (スップ Sd73-Wv9y)
垢版 |
2023/03/07(火) 20:19:21.43ID:hnN7reTEd
俺の使い方だとshellのビルトインコマンドをパイプで繋げるときと、PS1に色々仕込むぐらいしか恩恵ないかな
Windows(cygwin)でパイプ使いまくるとクソ重い

他はネットワークサーバーでaccept→forkのサンプルコードをよく見る
2023/03/08(水) 06:43:43.40ID:D4+z1pfo0
>>657
筋合いって、それはunixだからだろ
windowsならwslでやればいい
2023/03/08(水) 07:31:55.78ID:I9WABGt0a
何を言ってるんだお前は
2023/03/08(水) 07:38:01.65ID:D4+z1pfo0
何か間違ったこと言ったか?
2023/03/08(水) 07:49:03.77ID:H+IAPgT9M
天然か
2023/03/08(水) 07:52:01.79ID:D4+z1pfo0
何も言えんヘタレか
つまらんぞ
2023/03/08(水) 10:54:15.94ID:/Tvc5S700
forkはそのままではメモリ共有できないので並列処理の定石とは言い難い
2023/03/08(水) 15:41:08.30ID:hz03AXgUM
if (auto result = Hoge())
{

}
else
{

}

て書いたときelseブロックでもresult参照できるのめっちゃ違和感あるんですけど、こうなってる理由ってどこかに書いてありますか?
2023/03/08(水) 16:00:38.16ID:D4+z1pfo0
違和感? 何で?
ブレースは必須じゃねえだろ

if (auto result = Hoge()) ; else /* ここでresultが使えるのおかしいか? */ ;

{
else /* これはできないわけで、elseはifの続きだぞ */
}
669デフォルトの名無しさん (ワッチョイ 119c-8Eq5)
垢版 |
2023/03/08(水) 16:22:00.73ID:ytiNTw1F0
try で宣言した変数を catch や finally で参照できるようにして欲しいと思ったことが 5億回はある
2023/03/08(水) 16:26:12.41ID:sNgBrAzK0
>>669
出来たとしても catch したときには解体済み (または構築していない) なはずなのでだめぽ。
671デフォルトの名無しさん (ワッチョイ 119c-8Eq5)
垢版 |
2023/03/08(水) 16:36:24.71ID:ytiNTw1F0
うん、ダメな理由は分かる

でもみんな try に書いてた変数を catch や finally で必要になってから外出しした経験あるよね
2023/03/08(水) 16:38:09.65ID:sNgBrAzK0
>>667
C with Classes が C++ になる頃にそこに宣言を書けることにした話はD&E に言及がある。
Algol68 の真似をしたつもりだったが
実は設計者の勘違いで Algol68 にそんな仕様はなかったということも書かれている。

スコープのことまでは書かれていなかったが、
たぶんそれも当時の設計者の脳内 Algol68 ではそうだったってだけなんだろう。
まあ else も if 文の一部なので自然に考えれば全体がスコープになるほうが
理屈に合うように思えるし、私は疑問に感じたことは無かったな。
2023/03/08(水) 18:30:22.29ID:lmBqNRkPM
>>672
ありがとうございます。

ifでの宣言は初期化とテストが一緒にされるわけで、テストに失敗した結果実行されるelseブロックでそれが使えることがちょっと納得できませんでした。

言われてみれば、中身がnullptrとは限らないし、エラーハンドリングとかで使ってるんですかね
2023/03/08(水) 22:20:58.55ID:tb9BYlUU0
それよか
int outlierCnt;    // ←これのスコープのが問題
do {
  outlierCnt = 0;
  for (int j = 0; j < n; j++) {
    if (...) {
      outlierCnt++;
    }
  }
} while (outlierCnt > 0);

// ループを出たらoutlierCntは用済み
2023/03/08(水) 22:35:27.94ID:vNfcyURF0
見えてほしい範囲とか見えてほしくない範囲があんならブロック使って任意にスコープ作ればいいんでは
2023/03/08(水) 23:51:23.50ID:tb9BYlUU0
>>675
bool bUniqueList;    // ← constにできない
{
  bUniqueList = true;
  std::set<T> dupChk;
  foreach (auto it = vec.begin(); it != vec.end(); it++) {
    auto result = dupChk.insert(*it);
    if (!result.second) {
      bUniqueList = false;
      break;
    }
  }   
}

if (bUniqueList) { ... }
2023/03/09(木) 00:39:11.87ID:3j1Ekj6a0
>>676
const bool bUniqueList
{
[&]
{
bool bUniqueList = true;
std::set<T> dupChk;
for (auto it = vec.begin(); it != vec.end(); it++) {
auto result = dupChk.insert(*it);
if (!result.second) {
bUniqueList = false;
break;
}
}
return bUniqueList;
} ()
};

if (bUniqueList) { /* ... */ }
2023/03/09(木) 06:47:29.67ID:Kr9kVNlI0
do while が一番パフォーマンス的に有利なんだから
もう少し使いやすくしてほしかったなあ
2023/03/09(木) 06:51:51.75ID:Kr9kVNlI0
>>677
行数増えてんじゃん
2023/03/09(木) 14:14:05.11ID:lc0skjdva
// みんなこうやってんの
{
int outlierCnt;    // ←これのスコープのが問題
do {
  outlierCnt = 0;
  for (int j = 0; j < n; j++) {
    if (...) {
      outlierCnt++;
    }
  }
} while (outlierCnt > 0);
}
2023/03/09(木) 15:04:30.56ID:80vOWs2Ed
for (A;B;C){

} while (D);

こんなのがあれば万能
2023/03/09(木) 15:15:47.17ID:AnxNC5rK0
for (A;B;C){

if(!D) break;
}

解決した
2023/03/09(木) 15:41:20.30ID:80vOWs2Ed
>>682
論理逆だし行も増えるし
2023/03/09(木) 15:46:07.32ID:AnxNC5rK0
>>683
Dの横の一文字が見えない?
2023/03/09(木) 17:40:38.10ID:zXViYC6t0
ループの条件が2箇所になってるのは
構造化プログラミングのパラダイムからは外れる形だね

俺は教条主義者ではないが、あんまり気が乗らない
2023/03/09(木) 17:45:05.69ID:80vOWs2Ed
>>684
見やすさの観点から論理は非常に重要
2023/03/09(木) 17:47:03.73ID:80vOWs2Ed
見やすさや行数を無視するなら
for、while、do while なんかいらない
gotoで良い
2023/03/09(木) 17:51:18.91ID:zXViYC6t0
えー<algorithm>だろ、C++的には
2023/03/09(木) 18:07:24.33ID:Uk52+MzN0
doとかいう貴重な2文字キーワードをこんなとこで無駄遣いしてるのは正直ダサい
2023/03/09(木) 18:41:24.17ID:80vOWs2Ed
{
A
if(!B)goto L0002;
{
}
C
if (D) goto L0001;
L0002:;
}
2023/03/09(木) 19:54:06.46ID:maTPLFSP0
>>681
do {} while (!D) は,ループの事後条件として,Dが条件として成立することを保証している。
(until D として欲しかったが)

for (a;b;c) {} while (D) じゃ,ループの事後条件として何が成立してるのかわからないので
こんなコードは却下だな
2023/03/09(木) 20:02:25.15ID:maTPLFSP0
逆に, B | D が成立してほしいなら
A; do { C } while (!(B|D)) と書くべき
2023/03/09(木) 20:06:14.82ID:pAfi+zPk0
こんなので

dowhile(int cnt; cnt > 0)
{
cnt=0
cnt++;
}
2023/03/09(木) 20:11:30.40ID:maTPLFSP0
for (int cnt=0; cnt>0;) {
cnt++
}
でいいんじゃないの?
2023/03/09(木) 20:22:51.74ID:kUujduR60
do{}while(){}
セミコロン最後に付けるならスコープでいいよな
2023/03/09(木) 20:24:42.25ID:kUujduR60
do{}for(){}
とかなぜないのか
2023/03/09(木) 20:27:29.69ID:maTPLFSP0
ループ終了条件を,ループ制御変数以外で書きたいということ?
別に書いてもいいけど,わかりにくと思うんだ
for (int i=0; i<0 || D ; ++i) { … }
で良いんでは?
2023/03/09(木) 20:28:43.40ID:kUujduR60
do(int i=0){}for(i<n;i++);
こんな感じか
2023/03/09(木) 20:32:17.74ID:maTPLFSP0
for を前に書こうが、後ろに書こうが,for ループを抜けた時は,
for ループの終了条件が成立しているので,前に書いたら良い
2023/03/09(木) 20:35:31.74ID:maTPLFSP0
for (A; B||D; C,D) { … } じゃダメなの?
2023/03/09(木) 21:57:49.10ID:Kr9kVNlI0
>>691
頭悪いって言われない?
2023/03/09(木) 22:20:20.74ID:fJ6NWa1S0
アスペのこだわり大会かよ
2023/03/10(金) 23:18:44.72ID:hCUBJoIo0
>>680
なるほどforeachではなくてforなのですね
わかりました
2023/03/11(土) 03:20:25.02ID:gMabCRDUM
inline 指定子って前方宣言と定義の少なくとも一方に付ければ良いんですかね?
普通は inline 関数を宣言と定義分けて書くことはあまりしないと思いますが
2023/03/11(土) 20:44:27.01ID:+PZMhSrI0
宣言にはつけなくね?
2023/03/12(日) 12:26:00.35ID:/+cwNiL3d
メンバ関数の定義にinlineは普通にやる
2023/03/15(水) 13:16:39.32ID:T1RUme5O0
inlineの元々の意味はもう存在感なくなってきてるな
今はODRに違反するものを通して貰ったり
namespaceのアレとかで使う
2023/03/15(水) 13:44:43.53ID:yzqSYUc10
本来の意味では、コンパイラ依存になっちゃうけどalways_inlineとか__forceinlineっていうのがあったりするな
これもちゃんと規格化した方が良いよね
2023/03/15(水) 15:22:25.13ID:T1RUme5O0
[[force_inline]]か
2023/03/15(水) 20:13:46.16ID:3bZGOkgE0
モジュールだとinlineは元の意味になる、forceではないけど
2023/03/18(土) 00:24:08.81ID:AshFX+nM0
enum class Fooの項目数を取得するにはどうすれば良いですの?
昔ながらに
enum class Foo { A = 0, B, C, D, E, NELEMS };
みたいに要素数NELEMSを定義しないと駄目?
2023/03/18(土) 00:34:08.94ID:4yjyip5Y0
はい
2023/03/18(土) 08:22:34.90ID:X2nJJgpEM
いいえ
できますし実際にライブラリもあります

https://github.com/Neargye/magic_enum
2023/03/18(土) 09:34:19.12ID:AshFX+nM0
ファッ?!
2023/03/18(土) 09:37:45.79ID:XgD5JQEe0
>>711
現在の言語仕様の範囲内でやるならそれがたぶん一番に簡単な方法。

magic_enum を活用するのもいいけど処理系の拡張を利用しているのでもしもメンテが
滞ることがあったら処理系の変化について行けなくて破綻するかも? (余計な心配かも?)
要素数を数えるためだけに導入するならちょっと大げさという感じがする。

将来の C++ にリフレクション系の機能を追加しようとする提案はある。
https://www.open-std.org/jtc1/sc22/wg21/docs/papers/2019/n4818.pdf
試験的に GCC に追加したブランチもあって、
オンラインコンパイラで試せるところがあったはずなんだがどこだったか思い出せない。 すまぬ……。
2023/03/18(土) 10:54:33.77ID:bCJ0RWMx0
どうやってんのかと思ったらゴリ押しで草
2023/03/19(日) 02:53:52.21ID:aov6FzNY0
std::vectorを初期化せず要素数を変更する方法が存在しないそうですが、どうにかなりませんか?
2023/03/19(日) 07:02:58.28ID:/XQ3/AVL0
>>717
初期化しないことを指定するフラグをメンバ変数に追加し、resize(n,c)の二番目の引数でそのフラグを立てたインスタンスcを渡す。
コピーコンストラクタが呼び出されるので、渡されてきたインスタンスcの該当フラグを見て、初期化するかどうか判定して分岐させる。
2023/03/19(日) 09:21:23.84ID:6gmOWdI+0
>>717
vector が要素のデフォルトコンストラクタを呼ぶことは保証されるが
デフォルトコンストラクタが初期化しないようにしておけば初期化されない。
https://wandbox.org/permlink/8SepeggcI18hio7W
2023/03/19(日) 10:57:57.35ID:6gmOWdI+0
>>711
列挙型を定義するときには要素の数は分かっているのだから要素数を書いた定義も書いておけば十分かもしれない。

#include <type_traits>

// プライマリテンプレート (実際にはこれが使われたらエラー)
template <class T>
class enum_count {
template <class U>
class helper : public std::integral_constant<bool, false> {};
static_assert(helper<T>::value, "expected known enum.");
};
// 列挙型を定義
enum class Foo {A, B, C, D, E};
// 列挙型 Foo の要素数が 5 であることは分かっているので 5 で定義しておく
template <> class enum_count<Foo> : public std::integral_constant<std::size_t, 5> {};

int main(void) {
// 列挙型の要素数をカウントしたかのように見える
static_assert(enum_count<Foo>::value == 5);
}

列挙型の定義と要素数の定義を同時にするようなマクロでも作っておけばなおよいと思う。
Boost にそんな感じのライブラリがあった気がするが使ったことが無いのでよく知らない。
■ このスレッドは過去ログ倉庫に格納されています
5ちゃんねるの広告が気に入らない場合は、こちらをクリックしてください。

ニューススポーツなんでも実況