C++相談室 part158

■ このスレッドは過去ログ倉庫に格納されています
2021/11/15(月) 18:49:18.44ID:I69rZ/Of
前スレ
C++相談室 part157
https://mevius.5ch.net/test/read.cgi/tech/1628474251/
2021/12/11(土) 15:26:46.48ID:U6KjSVaU
>>373
なんでatomicに処理するごときでイベントが出てくるのかわからん……
1で待っているタスクBが居るなら、アトミックな処理を終えたタスクAが3を実行した時点で
OSがタスクBに自動的に通知する(ていうか起こす
不必要に凝りまくった(そして間違った)排他制御をしているのではないか、
2021/12/11(土) 16:00:21.52ID:9bOVK1ul
セマフォでも大丈夫なん?
2021/12/11(土) 16:48:16.25ID:VVJ2blgW
U6KjSVaUだけまともだけど、CriticalSectionが同期機構として存在するのはWindowsだけ
アトミック制約と無関係でC++固有でもないのでスレ違いなのは同じだけど…その辺の話をするならせめて↓でしてくれ

標準C++で単にatomicな話なら
https://cpprefjp.github.io/reference.html#atomic-operations
標準C++でスレッドを対象とした話なら
https://cpprefjp.github.io/reference.html#thread-support
プロセスまで含むならboostになるけど
https://www.boost.org/doc/libs/1_78_0/doc/html/interprocess.html
2021/12/11(土) 17:02:39.01ID:y3N81+jA
>>376
迷惑なんでコテハンにしていただけません?
2021/12/11(土) 17:06:37.77ID:VVJ2blgW
何が迷惑なのか理由の説明がないが、コテハン付けたいならお前だけ勝手につけとけw
2021/12/11(土) 17:13:56.24ID:VjmhXzGH
template <typename T, typename Allocator = std::allocator<T>>
using vec = std::vector<T, Allocator>;

auto v = vec(0, 0);

ってgccだと動いてclangだとコンパイル通らないけどclangのバグ?
2021/12/11(土) 17:17:46.16ID:9bOVK1ul
勘違いしてた
セマフォでも一人に限定すれば問題ないか
2021/12/11(土) 17:36:33.78ID:gcR9gZtv
そもそもそもそも

アトミック制約って原子制約のことでしょう
排他制御のatomicとは全く無関係に

単にconstexprじゃないbool値をrequiresしてませんか?
2021/12/11(土) 17:38:45.13ID:kyD4TLbr
>>379
バグというか C++20 対応が不十分なんだと思う。

@ 元々は実引数から型引数にあてはまる型を推論するのは関数テンプレート (メンバ関数テンプレートを含む) でしか出来なかった
A C++17 コンストラクタの実引数からクラスの型引数を推論できるようになった
B C++20 からエイリアステンプレートを挟んでも推論できるようになった ← これがまだ出来ない
2021/12/11(土) 18:22:11.20ID:fJKHaMXl
>>381
たしかにこれの最初のサンプルのdraw関数みたいな事をrequiresしてる。
https://cpprefjp.github.io/lang/cpp20/concepts.html
ただ上で言うdraw関数はconstexprなんだけどな・・・
2021/12/11(土) 20:57:07.56ID:VjmhXzGH
>>382
わかりやすかったありがとう
まだmake_hogeみたいな不格好なヘルパ関数が役に立つこともあるのね
385デフォルトの名無しさん
垢版 |
2021/12/12(日) 02:33:53.10ID:ECuL7aut
NFTアートとNFTゲームとGameFiとブロックチェーンゲームに
提供する側・作る側として参入しよう。
(むりなら参加する側でもいい)
DAOとPlay-to-Earn(遊んで稼ぐ)が世界の未来になる
2021/12/12(日) 09:13:16.08ID:2ZUu/eca
C#で作成されたDLLってC++で呼び出せないんでしたっけ?
2021/12/12(日) 10:05:57.23ID:Rei0r571
>>386
やってみれば?何をしてみたの?
2021/12/12(日) 12:59:03.03ID:kKgLRxlD
>>386
c++cliのラッパdllを挟んでc#dllを呼ぶとかc#dllをcom参照可能にするとか.NET DLLExportを使うとかあるよ
2021/12/12(日) 13:04:02.42ID:Rei0r571
>>388
そういうのはできるかどうかを含め、どういう環境で何を対象に何をしたいのかによる。
そんなことすら書いてない人にいきなりキーワードをあげる必要はないよ。
2021/12/12(日) 13:10:20.08ID:tD0M3iYv
べつにキーワードくらいいいじゃん
2021/12/12(日) 13:17:19.51ID:Rei0r571
技術に関しては不正確な情報を垂れ流すことほどの害悪はない
392デフォルトの名無しさん
垢版 |
2021/12/12(日) 14:51:29.97ID:4sEaLykb
めんどくさい奴だなw
2021/12/12(日) 14:55:11.15ID:0XY4m15b
悪意を持って嘘をつくのはいかんが
信じていたことが後に間違っていたことに気付くことはあり
それへの虞を言い訳に何もしないやつと
自らの誤りに気付いたときに潔くないやつは生ゴミだ
2021/12/12(日) 15:18:45.20ID:MG1pihlR
そもそも>>391の言う不正確な情報ってなんだ?
395デフォルトの名無しさん
垢版 |
2021/12/12(日) 16:31:47.95ID:4sEaLykb
>>394
Linux環境ではC#のCOM相互運用できないとか、かなあ?
2021/12/12(日) 16:41:36.70ID:2ZUu/eca
>>387
君は役に立たんなw

>>388
ありがとう
やっぱそういう方法になるんだね
2021/12/12(日) 16:45:20.02ID:Rei0r571
>>394
今回の話で言えば条件によっては動かないのにさも動くかのようにミスリードする情報
相手の勘違いを指摘する機会がないことにより、結果的に回答にならない情報
2021/12/12(日) 17:00:15.53ID:ooYWiIrJ
>>395,397
ありとあらゆる環境で動く回答しか認めないとかアスペ全開やなw
2021/12/12(日) 17:05:43.60ID:Rei0r571
>>398
普通ですよ。環境はおろか困っている状況すら何も書いてないのだから。普通に釣りの気配しかありません。
2021/12/12(日) 17:16:30.63ID:Rei0r571
あと加えて言うならば、一般に・・・という話なのですが、
runtimeでVMを動かすような言語の場合、あまりnative側からキックするような使い方をしません
組み込みなど、そうせざるを得ない特殊な状況のときくらいですね
2021/12/12(日) 17:18:23.27ID:tD0M3iYv
んで根掘り葉掘り聞くだけ聞いて結局回答しないパターン、ってのはよく見るな。
2021/12/12(日) 17:26:07.41ID:Rei0r571
>>401
それは分かりもしないのに回答しようとしたケースですね
全条件想定しないで回答しようとするとそうなります
2021/12/12(日) 17:29:25.52ID:Rei0r571
もちろん聞いたことに答えがない場合も回答する機会は来ませんけどw
2021/12/12(日) 21:03:58.85ID:A2l5mzZ3
浮動小数点の0.0以外の真偽値って規定されてるんですか?
2.0 == trueが偽になるのにif(2.0)は真のように振舞うのでよく分からなくなりました
2021/12/12(日) 21:11:05.34ID:LDYHaH+j
それはtrueが1に変換されて比較してるのでは
2021/12/12(日) 21:13:32.32ID:2ZUu/eca
0は偽でそれ以外は真
if(5) も if(10) も 0 以外だから真
5も10も真だが 5 == 10 は当然等しくないため偽になる
2021/12/12(日) 21:34:12.15ID:Rei0r571
>>404
>>405が正解
暗黙変換には一定のルールがあってそれに従って変換するとそうなる

2.0 == true
-> 2.0 == 1
-> 2.0 == 1.0
-> false

if (2.0)
-> if (2.0 != 0)
-> if (true)

https://en.cppreference.com/w/cpp/language/implicit_conversion
https://en.cppreference.com/w/cpp/language/operator_comparison
2021/12/12(日) 21:36:42.12ID:Rei0r571
if (2.0 != 0)はあんまり正確じゃないけどねw
2021/12/12(日) 21:40:50.69ID:f1HMG1tw
当然ながらbool(2.0) == trueとすれば真になるよ
2021/12/13(月) 21:50:35.10ID:GurY6adw
bool(2.0) == true
2.0 == double(true)
で曖昧にならない
こういうのoperatorとctorでは作れないもんかね
2021/12/13(月) 21:58:10.81ID:anT0EydK
>2.0 == double(true)

え?
2021/12/13(月) 22:07:54.75ID:XiOitZFG
最近本当に質問者も回答者も酷いな・・・日本語からやばい
>>410
何が曖昧だと言っていて、こういうのってどういうのなんでしょ?
>>411
え?じゃ何も伝わらない
2021/12/13(月) 22:47:49.66ID:rx7XzRPV
そういうのを求めるなら上級者の相談室でも作ってそこにいればいいじゃない
人のやり取り見て文句いうだけの人なんて居ても邪魔なだけだし
2021/12/13(月) 22:54:20.23ID:XiOitZFG
そんな難しい要求してないんだけどw
一応↓なスレッドもありますよ

0からの、超初心者C++相談室
https://mevius.5ch.net/test/read.cgi/tech/1542002113/
2021/12/13(月) 23:35:59.51ID:GurY6adw
何も言ってないやつとじゃ話にならん
マウント取ったつもりになってろよアホ
2021/12/14(火) 01:10:13.82ID:4HDQQOQ1
ID:XiOitZFG
またコイツ自分賢いと思ってる例のガイジか
2021/12/14(火) 01:43:40.68ID:vFkeyZ3D
天に唾するクンじゃないよね?
2021/12/14(火) 04:27:52.83ID:l53ksWPX
std::array<std::array<int, 2>, 2> a{1, 2, 3, 4};
だとコンパイルできて
std::array<std::array<int, 2>, 2> a{{1, 2}, {3, 4}};
だとコンパイルできないのってなんでですか?
下は内側の初期化子リストの型推論が上手くいかない気はするのですが上がOKな理由が全然分かりません
2021/12/14(火) 09:36:15.02ID:jz8gmYNu
arrayは設計悪いね
string_viewみたいなラッパーのほうがマシ
2021/12/14(火) 13:08:07.96ID:64LuYoGR
arrayはそんなに設計の余地ないし別によくね
ラッパークラスは役割が別だし比較する意味がわからん
2021/12/14(火) 13:45:14.16ID:NTJkXylC
>>418
こうすればいけるね
波括弧が一つ余計に必要なのがなあ

std::array<std::array<int, 2>, 2> a{{{1, 2}, {3, 4}}};
2021/12/14(火) 15:27:55.81ID:W58I2MTh
>>418
>>420,421 の見解が適切
構造上は以下と等価
struct S1 { struct S2 { int e[2]; } s[2]; };
なので、中括弧を丁寧に書くと↓が正しい
S1 s{{{{1,2},{{3,4}}}};
質問でエラーになったケースは、上の例でメンバsを{1,2}で初期化しようとしため、{3,4}が余ってエラーになる。

https://en.cppreference.com/w/cpp/language/aggregate_initialization
2021/12/14(火) 19:16:16.31ID:l53ksWPX
>>421
>>422
ありがとうございます
配列をメンバに持ってるので本来は波括弧が二重に必要になるんですね
今までは1次元でなんとなく配列と同様で動いていたので省略しているという認識がありませんでした
2021/12/14(火) 20:13:02.90ID:kTLKUa7o
a{{1, 2}, {3, 4}}で初期化できるようにしようぜっていう提案もあったけど
初期化ルールがますますカオスになるので却下された
425デフォルトの名無しさん
垢版 |
2021/12/16(木) 18:55:44.40ID:Q3qUbeDH
テンプレートで関数の引数を書く方法がわからないんですが

sort(V.begin(), V.end(), ラムダ式)

を自作するにはどうやればいいんでしょうか
2021/12/16(木) 18:59:42.63ID:oxWy3zzs
まず日本語から勉強してください
「テンプレートで関数の引数を書く方法」と「sort(V.begin(), V.end(), ラムダ式)を自作」には何の関連もありません
2021/12/16(木) 18:59:43.14ID:oxWy3zzs
まず日本語から勉強してください
「テンプレートで関数の引数を書く方法」と「sort(V.begin(), V.end(), ラムダ式)を自作」には何の関連もありません
428デフォルトの名無しさん
垢版 |
2021/12/16(木) 19:10:09.52ID:Q3qUbeDH
自己解決しました
リンク先みながらこれで出来ました



template<typename FNC>
void usort (FNC&& fuc) { cout<< fuc(2) <<endl; }

int main() {
usort( [](int x) { return x+2; } );
}

https://zenn.dev/rita0222/articles/4bb5023e48c134
2021/12/16(木) 19:16:51.92ID:oxWy3zzs
質問と回答はおろか日本語も覚束ない人の記事の宣伝はどうかと思いますよ
2021/12/16(木) 19:28:45.53ID:/OSP+i6s
ごめん例のアスペじゃないけど俺もこの質問は日本語がひどいと思う

「テンプレートを使って、関数を引数とする関数を書く方法がわからない」でいいんだよね?
「で」も「の」も意味が複数ある助詞だから次から気を付けような
2021/12/16(木) 22:08:17.98ID:oxWy3zzs
自演乙
2021/12/19(日) 22:39:42.44ID:G+T88tW/
VC++の質問になってしまうかもしれませんがよろしくお願い致します。

void Func() throw (const char*);とした関数で静的に例外の型チェックをしてコンパイルエラーなり吐いてもらうことはできないのでしょうか?
try { Func(); } catch (const wchar_t* ex) {}と書いてしまった場合等にコンパイルエラーを出してもらいたいです
2021/12/19(日) 23:32:36.81ID:JPMZsaO2
>>432
合法なものにエラーとかねえわ
2021/12/19(日) 23:52:05.34ID:FKQX+MA6
例外指定はもうすぐ消えてなくなる機能だから使うのやめた方がいいよ
2021/12/20(月) 00:05:45.43ID:5GaBUmyD
例外指定は調べたらC++17で削除されてんだな。
例外指定は実行時のチェックで意味ないと思ってたから一度も使ったことない。
2021/12/20(月) 02:04:19.31ID:yobIy+EO
throwで投げる例外を指定するのはC++11以降非推奨でC++17で削除された
例外を投げ得ることを示す(空の)throwもC++11以降非推奨でC++20で削除

https://ja.cppreference.com/w/cpp/language/except_spec

結論としては無理
2021/12/20(月) 02:10:12.31ID:WdsmvZWK
意味わからんもんなthrow接尾子
投げる例外全部把握出来んのかよって
2021/12/20(月) 07:30:27.08ID:zT9OLvmm
ファイルオープンの失敗をどうやって間違えずに処理させるんだよ
2021/12/20(月) 07:31:31.20ID:zT9OLvmm
20年ちかくそれがいいことだっつってやってたんだぞ
2021/12/20(月) 07:47:02.08ID:raeshKom
void aho() throw(std::bad_exception);
441デフォルトの名無しさん
垢版 |
2021/12/20(月) 09:50:56.71ID:TszysAyf
ポインタ型変数のスタック消費が4バイト(32bit OS)または8バイト(64bit OS)なのはわかるんだけど、
参照型変数ってスタックを何バイト消費するの?
2021/12/20(月) 11:34:47.56ID:GbIoN43K
>>441
GCC の資料によれば Itanium C++ ABI に従う。 (Itanium 以外でも ABI は Itanium ということらしい。)
https://gcc.gnu.org/onlinedocs/libstdc++/manual/abi.html#abi.cxx_interface

で、 ABI のほうでの定義では引数・返却値における参照の実態はポインタだし、
POD のレイアウトとしても参照はポインタのように扱われる。
https://itanium-cxx-abi.github.io/cxx-abi/abi.html#reference-parameters
https://itanium-cxx-abi.github.io/cxx-abi/abi.html#reference-return-values
https://itanium-cxx-abi.github.io/cxx-abi/abi.html#pod

内部的には参照はほぼポインタだと思っていいんでないの。
自動でデリファレンスするポインタって感じ。

ちなみに言語仕様的には参照はオブジェクトではなく参照先のオブジェクトの別名のように扱われるので、
sizeof に渡したときには参照先の型の大きさが返ってくることになってる。
sizeof(int&) みたいにしたら sizeof(int) と同じ意味になるってことね。
2021/12/20(月) 11:49:32.57ID:LVF1I4ij
確認してみた。
$ gcc -x c++ -S - -o - <<EOF | sed -n '/^main:/,$p;/\$2/q'
int main() {
int a = 1;
int& r = a;
r = 2;
return a;
}
EOF
main:
.LFB0:
.cfi_startproc
endbr64
pushq %rbp
.cfi_def_cfa_offset 16
.cfi_offset 6, -16
movq %rsp, %rbp
.cfi_def_cfa_register 6
subq $32, %rsp
movq %fs:40, %rax
movq %rax, -8(%rbp)
xorl %eax, %eax
movl $1, -20(%rbp)
leaq -20(%rbp), %rax
movq %rax, -16(%rbp)
movq -16(%rbp), %rax
movl $2, (%rax)
2021/12/20(月) 12:07:37.09ID:IpG9nRdD
参照先が見えてるところでは
参照先へ直にアクセスしてコストゼロだったり
参照引数をとる関数でもインライン化された場合はゼロ
てなことがなければポインタ1個分
2021/12/20(月) 12:13:52.79ID:LVF1I4ij
そういうのは最適化なので無関係
$ gcc -O3 -x c++ -S - -o - <<EOF | sed -n '/^main:/,$p;/ret/q'
int main() {
int a = 1;
int& r = a;
r = 2;
return a;
}
EOF
main:
.LFB0:
.cfi_startproc
endbr64
movl $2, %eax
ret
2021/12/20(月) 21:41:58.49ID:c8hM8/Kk
最適化する前の意味合いとして
ポインタ1個分のコストを必ず発生するという規定なんかあったか?
2021/12/20(月) 21:44:15.52ID:LVF1I4ij
誰もそんな話はしてないので、お前が調べて貼れ
2021/12/20(月) 22:11:35.36ID:c8hM8/Kk
444へのレスで最適化がどうたらぬかしといて
そんな話はしてない、かよ
アセンブラ貼ってた威勢はどこへ吹っ飛んだんだかw
いいよ、逃げたきゃ逃がしてやるよヘタレ野郎
2021/12/20(月) 22:16:05.29ID:LVF1I4ij
最初から処理系(gcc)の話しかしてない。規定の話をしてるのはお前だけだ。早く貼れ。逃げるな。
2021/12/20(月) 23:16:36.18ID:TszysAyf
unique_ptrオブジェクトとその実体を参照する参照型を使えば、
スタック消費を抑えつつスタック変数を使っているかのようなソースコードが書けそうだけど
2021/12/21(火) 00:06:02.44ID:Ug1txKhz
それは全くレイヤーの違う話
アプリのコンテキストを構造体/クラスにしてヒープかスタティックに置くだけで実現できる
実現手段としてunique_ptrを使いたいなら使えばいいというだけ
2021/12/21(火) 00:10:51.14ID:QziEyx5H
>>451
ひょっとして ID:c8hM8/Kk かな?
無意味な煽り書き込みやめてくれ
2021/12/21(火) 00:20:05.56ID:Ug1txKhz
煽りではないんだが、俺はID:LVF1I4ij
2021/12/21(火) 00:33:36.24ID:QziEyx5H
>>453
レイヤーが違うとか、勝手に仕切るな
2021/12/21(火) 00:42:51.31ID:QziEyx5H
構造体/クラスをヒープに置いたところで、その構造体/クラスのメンバー関数でスタック変数を使ってたら意味がないだろ
何が問題提起されているのか理解してから書き込んでくれ
2021/12/21(火) 01:02:00.74ID:Ug1txKhz
スタック消費を抑えたいなら静的に確保するかヒープを使えばいいというだけの話でしょ。
struct app_context {int x;};
void func_old() {
int x = 0;
}
void func_new(app_context* ctx) {
ctx->x = 0;
}
int main() {
auto ctx = new app_context();
func_old();
func_new(ctx);
delete ctx;
return 0;
}
各関数/メソッド単位で細かくしたいなら、try〜catchでやってもいいし、スマートポインタを実装・流用してもいい。その際にunique_ptrを使いたいなら使えばいいというだけ。
伝わらないようなので少し細かく書いた。伝わるんだろうか・・・。
2021/12/21(火) 01:16:14.39ID:QziEyx5H
>>456
君は回答者に向いてない
2021/12/21(火) 01:18:02.55ID:QziEyx5H
アムロの父親みたいな変な書き込み、リアルに遭遇するとやはり引く
2021/12/21(火) 01:18:43.76ID:Ug1txKhz
>>457
質問したいレイヤと解決策のレイヤが合ってないだけw
2021/12/21(火) 01:27:03.87ID:QziEyx5H
自覚なさそうなところがますますテム・レイ感あるわ
お大事に
2021/12/21(火) 01:46:16.28ID:Ug1txKhz
質問して複数人に回答してもらってるのに、ただ煽るだけの人に「自覚」とやらを問われてもねw
大好きなガンダムのたとえに勝手に満足して病んでてくれ
君にプログラミングは向いてない
2021/12/21(火) 01:50:07.69ID:QziEyx5H
今時特別な理由もなくnew演算子を使うC++プログラマは間違いなく無能だよ
2021/12/21(火) 01:53:35.52ID:Ug1txKhz
理由はC++標準ライブラリを使用しない言語/処理系レベルの話をしていたから
2021/12/21(火) 02:05:33.42ID:QziEyx5H
ガンダムの記憶回路にとりつけるやつ好きなだけ作ってていいぞ
2021/12/21(火) 02:17:40.01ID:Ug1txKhz
妄想の中でもニュータイプじゃない君にプログラミングは無理w
ガンダムに辿り着けずコロニー内で果てる
2021/12/21(火) 14:30:10.99ID:bvwR7M/G
テンプレートを引数に取る関数で、
その入力として、vectorと配列を取るような関数で、いい書き方ってないですかね?
// vector向け
template<class T>int sum(const T& v, int size)
{
int acc = 0;
for(int i = 0 ; i < size ; i++){acc+=v[i];}
return acc;
}
内容同じなのに配列向けに
template<class T>int sum(const T* v, int size)
を作ってるけど一緒に表記できないかな、みたいな
2021/12/21(火) 15:12:48.55ID:f1yxmqA1
>>466
???
その定義で配列も受け取れるけど。
int main(void) {
int x[] = {1, 2, 3};
std::cout << sum(x, 3) << std::endl;
}
2021/12/21(火) 15:20:59.50ID:Ug1txKhz
vectorならiteratorにしてもいいと思う
#include <vector>
#include <iostream>
using namespace std;
template<class T>int sum(const T begin, const T end) {
int acc = 0;
for(T i = begin; i != end; ++i){acc+=*i;}
return acc;
}
int main() {
int a[] = {1,2,3};
const size_t s = sizeof(a)/sizeof(a[0]);
vector<int> v(a, a + s);
cout << sum(a, a + s - 1) << endl;
cout << sum(v.begin(), v.begin() + (v.size() - 1)) << endl;
return 0;
}
2021/12/21(火) 15:35:03.48ID:bvwR7M/G
ありがとうございます
>>467 頭のどこかでポインタにしないと取れないと思っていました

>>468
iteratorは馴染みがないのでそのコードで勉強させていただきます
2021/12/21(火) 15:39:21.19ID:sStr75A4
>>462
ただのサンプルコードに今時とか無能とか・・
中で何が起きるか把握してない無能を量産しようとしないでくれ
2021/12/21(火) 15:47:15.24ID:msz2/cZB
本来はrangeの出番なんだがな
導入が遅れたばかりに……
2021/12/21(火) 16:45:50.91ID:fi3Z01x+
#include <iostream>
#include <vector>
#include <array>
#include <string>
using namespace std;
template<typename Iter>
auto sum(Iter a, Iter b) {
using value_type = remove_const_t<remove_reference_t<decltype(*a)>>;
value_type acc {};
while (a != b) acc += *a++;
return acc;
}
int main() {
const int a[] { 1, 2, 3 };
vector<int> v { 4, 5, 6 };
array<double, 3> d { 3.5, 1.2, 0.9 };
const string s[] { "u", "n" "k", "o" };
cout << sum(begin(a), end(a)) << endl;
cout << sum(begin(v), end(v)) << endl;
cout << sum(begin(d), end(d)) << endl;
cout << sum(begin(s), end(s)) << endl;
return 0;
}
2021/12/21(火) 16:51:06.96ID:msz2/cZB
std::iterator_traits使おうよ
■ このスレッドは過去ログ倉庫に格納されています
5ちゃんねるの広告が気に入らない場合は、こちらをクリックしてください。