C++相談室 part146

■ このスレッドは過去ログ倉庫に格納されています
2019/11/07(木) 11:35:36.76ID:4wggfTwe
C++に関する質問やら話題やらはこちらへどうぞ。
ただし質問の前にはFAQに一通り目を通してください。
IDE (VC++など)などの使い方の質問はその開発環境のスレにお願いします。

前スレ
C++相談室 part145
http://mevius.5ch.net/test/read.cgi/tech/1568362404/

このスレもよろしくね。
【初心者歓迎】C/C++室 Ver.105【環境依存OK】
http://mevius.5ch.net/test/read.cgi/tech/1556142878/

■長いソースを貼るときはここへ。■
 http://codepad.org/
 https://ideone.com/

[C++ FAQ]
https://isocpp.org/wiki/faq/
http://www.bohyoh.com/CandCPP/FAQ/ (日本語)
2019/12/05(木) 21:51:24.38ID:u0CioZb2
adync awaitなんてネイティブで実装しようとしたら面倒なのわかるだろうに

それでもぶっこんでくるのだからc++11以降は完全にポリシー変更しているよね
2019/12/05(木) 21:57:53.51ID:dM4mxJ4y
>>637 std::for_each(std::execution::par, ...) じゃダメだったの?
641デフォルトの名無しさん
垢版 |
2019/12/05(木) 22:07:45.52ID:q0kDwfyl
ツリーの巡回はイテレータにするとスタックとキューを入れ替えるだけで深さ優先と幅優先を切り替えられますよ。
STLのスタックとキューはインターフェースが違うのでひと工夫必要ですが。
algorithmも使えてウマウマです。
2019/12/05(木) 22:28:33.56ID:IPfJ90pV
>>615
末尾再帰ならこう書くかと
https://ideone.com/GG1x2O
2019/12/05(木) 22:53:24.80ID:wvPvimki
おいおい
そこはcpsで書いてマウント取るところだろ
2019/12/05(木) 23:00:13.77ID:uXzevjeq
>>637
お前のそのクソコードlockとunlockの間で例外投げたらあっという間にデッドロックだぞ
すぐにlock_guardに書き換えるか死ぬかどっちか選べ
645デフォルトの名無しさん
垢版 |
2019/12/05(木) 23:44:19.10ID:JallKI28
状況説明:
Visual Studio 2019 Version 16.4.0 で std::exception::what() の戻り値を無視すると以下のようなC4834の警告が出るようになった。
> warning C4834: 'nodiscard' 属性を持つ関数の戻り値を破棄しています

なお、catchスコープでeについて何か書かないと以下の警告が出てしまう。
> warning C4101: 'e': ローカル変数は 1 度も使われていません。

今は以下のように記述して警告C4101が出ないようにしている。
try
{
// do something.
}
catch(std::exception& e)
{
e.what();
}

質問:
C4101とC4834の両方とも出ないようにするにはどうしたらいい?
2019/12/05(木) 23:57:51.72ID:2jEFb1Vk
>>645
(void)e.what();
647645
垢版 |
2019/12/05(木) 23:58:13.71ID:JallKI28
自己解決しました。
try
{
// do something.
}
catch(std::exception& e)
{
(void)e;
}
648645
垢版 |
2019/12/05(木) 23:59:17.57ID:JallKI28
>>646
回答ありがとうございます。
2019/12/05(木) 23:59:36.77ID:uXzevjeq
catch(std::exception&)
でええやん
2019/12/06(金) 00:01:11.04ID:Cd9yyMrn
>>645 ほんとうに例外を何も処理せず握りつぶしたいの?どんな状況?
651645
垢版 |
2019/12/06(金) 00:12:07.73ID:Rpl4CMwP
>>650
スレッドの安全な終了。
652645
垢版 |
2019/12/06(金) 00:19:17.77ID:Rpl4CMwP
>>649
マクロ切り替えでeを使うコードも使えるようにしておきたいので無名変数だと都合が悪い、という感じです。
2019/12/06(金) 00:24:27.98ID:hYHuFzfT
VCは2019から返り値を捨てるコードに警告出すようになって鬱陶しい
2019/12/06(金) 00:27:04.95ID:R5wwI9SD
[[nodiscard]]を確認せずに捨てる奴が悪い
2019/12/06(金) 00:30:55.24ID:Cd9yyMrn
>>651
std::exception& で受けると bad_alloc とか関係ない例外もまとめて無視しちゃいそうで、
それは「安全」なのか疑問。
2019/12/06(金) 00:51:39.38ID:jImJStBO
終了させるにしてもちゃんとやれ
657645
垢版 |
2019/12/06(金) 00:54:05.25ID:Rpl4CMwP
>>655
どうせなにもできない事には変わりないので無視でいいかなと。
スレッド終了時にプログラム固有のリソース解放処理を確実にやりたい目的でのthrow&catchなのでC++標準ライブラリ自身の出す例外は無視、的な。
2019/12/06(金) 01:06:58.12ID:jImJStBO
ログ出力という大事な仕事があるだろ
2019/12/06(金) 02:04:04.00ID:Cd9yyMrn
>>657
それだとほんとに何か問題があって例外が飛んでるときに気づけなくて危なさ沿う、という話。
struct thread_exit {} とか専用の例外をthrow&catchしとけば、目的を達成しながら問題検出もできそうな。
2019/12/06(金) 06:39:31.51ID:pHI2Uem1
>>654
正論
2019/12/06(金) 07:31:29.17ID:zfbHpqVT
>>637
for_each(parあんじゃん
いちいち待ち合わせなんて
まだやってんの?
2019/12/06(金) 09:21:05.01ID:WVLKHQiQ
寒い

http://34vv.net/8d8/
663デフォルトの名無しさん
垢版 |
2019/12/06(金) 12:56:29.50ID:vJ3416lC
>>644
てめえの糞おつむでは未だにlock_guardなんか使ってんのかよww
んな互換性のためだけに残ってるコード人様に勧めてどーするつもりだ。
2019/12/06(金) 14:04:15.50ID:6r3WfMRZ
>>635
LISP では再帰で書くなどという俗説を信じるな。
665デフォルトの名無しさん
垢版 |
2019/12/06(金) 14:28:22.22ID:hyokDgJv
もしかしてメンバ関数の定義で引数や戻り値に不完全型を使っても許されるようになりましたか?
autoが許されるのだから、許されて良いような気がするのですが。
2019/12/06(金) 14:55:34.36ID:qwyC8IXX
厳密にはわからんけど、クラステンプレートやメンバ関数テンプレートだと
それらが実体化されるより前であれば不完全型は使えるはず(コンパイラによっても変わることあるけど
autoも似たような理屈だと思う、宣言だけして関数定義より前で使うとエラーになるはず
667デフォルトの名無しさん
垢版 |
2019/12/06(金) 15:04:26.66ID:hyokDgJv
https://ja.cppreference.com/w/cpp/language/function
> 関数の引数の型および戻り値の型は、削除された関数を除き (C++11以上)不完全クラス型にできません。 完全性のチェックは関数の本体の文脈で行われます。
これはそういうことを言ってるんですかね。
668デフォルトの名無しさん
垢版 |
2019/12/06(金) 15:08:45.40ID:hyokDgJv
関数本体内のコンテキストで完全型になっていれば良いのであれば、いろいろできるような気がする。
あんなことやこんなことが。
2019/12/06(金) 15:14:03.21ID:qwyC8IXX
あーそういうことだね
関数定義前なら不完全でもいいってことだと思う
すまんテンプレートには限らないぽいな
670デフォルトの名無しさん
垢版 |
2019/12/06(金) 15:29:10.59ID:hyokDgJv
どうもありがとう。
2019/12/06(金) 15:45:43.96ID:LIPaYWZD
>>661
step =1000000;
for( double r2 = R2 - dev2; r2 < R2 + dev2; r2 += dev2 / step ){
}
こいつを並列化したいんだが、ループカウンタをintに変更するとしても、
2M ノードのvector確保するわけ?
ループカウンタ設定するために並列化要るがなw
単にループ回したいだけなのに巨大なメモリ要るてww
調べてみてもC#やtbbのparallel_for相当がないんだが
これら見ながら企画作ったC++規格策定メンバーってお前と同じパープリンじゃないのか?
2019/12/06(金) 16:13:34.34ID:zfbHpqVT
>>671
おい、真面目に情報提供している者に対してパープリンとは何だ
俺だけじゃなく640もパープリン呼ばわりか

後出しという自分の落ち度を棚に上げて
そういう発言は5chのフランクさでは済まんぞ
2019/12/06(金) 16:14:35.15ID:hYHuFzfT
初手人格否定はC++erのセオリー
2019/12/06(金) 16:14:40.19ID:jImJStBO
>>671
お前が生きてる価値の無いゴミなだけ
2019/12/06(金) 16:39:35.59ID:qwyC8IXX
>>661もたいがい無意味に煽ってる書き込みだと思うがw
676デフォルトの名無しさん
垢版 |
2019/12/06(金) 17:15:36.33ID:hyokDgJv
https://news.livedoor.com/article/detail/17486025/
2019/12/06(金) 18:34:35.34ID:PPEOwhLk
>>671
OpenMP & SIMD intrinsics
2019/12/06(金) 19:25:13.77ID:3oohkeAj
lock_guard使わずになに使うの?
679デフォルトの名無しさん
垢版 |
2019/12/06(金) 19:35:24.69ID:3J8eqh7h
ひのきのぼう と かわのふく
680デフォルトの名無しさん
垢版 |
2019/12/06(金) 22:24:12.87ID:hyokDgJv
ヒノキの棒でぶっ叩けば人は死ぬし、皮の服は火焔や刃物を弾く。
どちらかというと上級者向けの装備だと思います。
681デフォルトの名無しさん
垢版 |
2019/12/06(金) 23:38:17.10ID:pm/DYA/c
operator[]で読み書きって毎回調べないとできず
set()、val()とか関数で読み書きしてすますことが多いのだが
新文法などで簡単にやる方法わかりますか
2019/12/07(土) 01:06:30.72ID:5MyaotCE
なにいうとるのかわからん
operator[]をどう実装してどこで使えばいいのか理解できてないという話なのか
2019/12/07(土) 01:08:17.23
>>615
余再帰だな
江添やっちまったなあ!
684デフォルトの名無しさん
垢版 |
2019/12/07(土) 01:59:52.93ID:4p8EX4B8
>>682
ふつうの実装では、A[n]は参照しかできず
A[n] = の代入ができないという事
2019/12/07(土) 05:36:21.30ID:UnIspDfI
>>684
「参照」を返せばいいだけだが、そういうことではない?
まさか「参照」を知らないと言うわけではないよね。
2019/12/07(土) 06:10:47.12
ちょくちょく初心者質問スレに行った方が良い人までここに堂々と書き込むのが
スレを妙な雰囲気にしてる
2019/12/07(土) 06:56:32.11ID:C/SdN+6e
>>615 >>683
「余再帰」 corecursion って呼ぶのか。勉強になるわ。

江添さんのページを見てみたんだけど、
「このコードは末尾再帰になっている。」の行の前に
最初の return n * factorial(n-1) を返す関数を
末尾再帰に書き換えたコードの引用があるべきなのを
挿入し忘れたように思えるね。

・末尾再帰でないコード例を示す
・末尾再帰にするとこうなる ... コード欠落
・末尾再帰はループに書き換えられるよ
・ループにしたコード例
っていう流れで自然に読めるでしょ。
2019/12/07(土) 09:42:39.92ID:fV2E4bDP
でもこのシグネチャのfactorialのままだと末尾再帰できなくね?>>642みたいになるかと。
689デフォルトの名無しさん
垢版 |
2019/12/07(土) 11:49:45.97ID:4p8EX4B8
>>685
たとえばbitsetを実装しようして、内部では32や64bitの整数へ保存するとして
参照だけではB[i]=1はできないかと
2019/12/07(土) 11:56:48.08ID:vGCb4aWc
最初からそうかけよ
691デフォルトの名無しさん
垢版 |
2019/12/07(土) 11:57:37.74ID:4p8EX4B8
これのこと、毎回調べ直さないと作れない


プロキシ
実は、C++ でも、かなり無理やりですが、(見た目だけは)プロパティのようなことができたりします。 とりあえず、百聞は一見にしかずということで、以下の例を見てください。

利用側、すなわち、main の中では、 まるで普通の変数に対する代入・参照であるかのようなコードになっています。

このからくりは、 age の読み書きに、AgeProxy という名前の別のクラスを介することで実現します。 Age は AgeProxy 型の変数です。
AgeProxy の代入演算子(operator =)と int 型へのキャスト(operator int)を通して、 Person クラスの age 変数の読み書きをします。

ちなみに、こういう例のように、いったん別のクラスを通して値を読み書きしたりする方法を、 プロキシ(proxy: 代理)と呼びます。

まあ、このパターンは、利用側の見た目は綺麗になりますが、 実装は面倒ですし、実行効率もあまりよいとはいえません。
さらに言うと、プロパティを virtual 化しようとすると、 この例よりもさらに複雑な実装が必要になります。

こういう感じの話を振り返った上で、 改めて C# の「プロパティ」機能を見ると、 便利な機能だなぁとつくづく思います。
https://ufcpp.net/study/miscprog/accessor.html
2019/12/07(土) 12:00:39.08ID:vGCb4aWc
相談じゃないなら他へ
2019/12/07(土) 12:02:24.40ID:U9XnFfRh
プロパティはコード上でフィールドのように扱えることよりもメンバとしてIDEが認識できるところに意味がある
最近はC#でもデザイナに頼らずに何でもコード上で済ませるスタイルが主流になりつつあり、プロパティの必要性は薄れている
初期化時にパラメータを纏めて渡したりするだけなら生フィールドで十分なわけだしな
2019/12/07(土) 12:11:07.35ID:JfALL9r7
proxyで別に実行効率は下がらんよね
てかstd::vector<bool>は大昔から存在するし
695デフォルトの名無しさん
垢版 |
2019/12/07(土) 12:25:43.42ID:cPeMBqq7
C++Builder使えばよいのでは。
2019/12/07(土) 12:42:26.89ID:JVuyt12v
>>684, >>684
他言語での getter/setter メソッド的な事をやりたいのだろうなあと考えてみました。

例えば a[i] と書かれたら、 内部データ(typename T) への参照(T&) を返すのではなく
新たに内部クラス(fields: owner, index)を用意して、そのオブジェクトを作って返すようにします。
これに代入演算子(operator =) と キャスト演算子(operator T()) を実装すれば...
・a[7] = 99; //setter
・cout << a[7]; //getter
こうやって普通にアクセスできます。メソッドを分離したお陰で、
添え字アクセスによるデータベースのupdate / select みたいな事が可能になります。

代入演算子は最低二種類必要で
Inner& operator =(const T& value); // a[i] = value
Inner& operator =(const Inner& rhs); // a[i] = a[j]
二つ目を実装しないと暗黙のコピー代入演算子が作られてしまい
a[i] = a[j]; のような代入操作は実質空文化します。(owner/indexがコピーされるだけ )

素人の思いつきですがサクっと試したら機能しました。
もっとスマートなやりかたもあるでしょう。
2019/12/07(土) 12:55:02.34ID:vGCb4aWc
意味の無い所で無駄にコードサイズを増やさなくても
普通にset/get関数で良いよ
2019/12/07(土) 13:20:15.07ID:euj2mOhA
setterの戻り値はvoid?this参照?
699デフォルトの名無しさん
垢版 |
2019/12/07(土) 13:22:21.40ID:cPeMBqq7
bitsetは参照返すからset(1).set(2).set(10)などと連鎖できる。
2019/12/07(土) 13:35:21.54ID:QAzyzpfC
>>672

なんだてめえパープリンの活け造りが
ぶち殺すぞ低脳野郎

ぶち殺し行ってやるから住所さらせや糞野郎
2019/12/07(土) 13:36:49.02ID:hSwO/YRY
これがC++er流の挨拶です
2019/12/07(土) 13:37:29.36ID:QAzyzpfC
>>672
真面目に糞情報しか提供できない出来損ないならすっこんでろウスノロ
とにかくぶち殺しに行ってやるから住所晒せや
2019/12/07(土) 13:38:45.35ID:QAzyzpfC
>>678
今ごろlock_guardて ID:zfbHpqVT 並の情弱かオマエww
2019/12/07(土) 13:44:27.19ID:QAzyzpfC
パープリンどころかアホの活造り ID:zfbHpqVT

パープリンどころかアホの活造り ID:zfbHpqVT

パープリンどころかアホの活造り ID:zfbHpqVT

パープリンどころかアホの活造り ID:zfbHpqVT

パープリンどころかアホの活造り ID:zfbHpqVT



出てこい知障
705デフォルトの名無しさん
垢版 |
2019/12/07(土) 13:49:37.66ID:cPeMBqq7
そもそも10を代入して値が10にならないなら、意味的に組み込み型の整数とは違うのかもしれない。
整数ではないものを整数で代用したときに起きる問題なのかも。
2019/12/07(土) 14:40:05.37ID:gqZSFnI2
効いてる効いてるw
弱い犬ほどよく吠えるねえ
2019/12/07(土) 15:57:37.60ID:kC4yD5gf
>>683
江添なんて前からそんなもんだぞ。
人の間違いには厳しいが自分の間違いには逆ギレするような男だ。
708デフォルトの名無しさん
垢版 |
2019/12/07(土) 15:59:46.23ID:cPeMBqq7
clang-cl結構いいね。
709デフォルトの名無しさん
垢版 |
2019/12/07(土) 16:00:40.56ID:cPeMBqq7
>>707
全方面に厳しいって事?
自分にも他人にも。
2019/12/07(土) 16:33:39.12ID:C/SdN+6e
「自分の間違い(に対する指摘)には逆ギレ」ってことでしょな。

書籍として印刷・発売する前にネット公開して広く意見を求める、
「お前らタダで読ませてやるから品質向上に協力しろや」方式と考えれば
誰にも損のないやり方だと思うけどね。
少なくとも俺にとってはありがたい。
2019/12/07(土) 17:24:58.21ID:ZsYnLuoj
意見を反映させる能力があればな。
2019/12/07(土) 17:31:56.94ID:xzwyWWlr
https://github.com/EzoeRyou/cpp-intro/issues
2019/12/07(土) 20:57:58.81ID:KRZcErEE
なんかうちのVisual Studioだと
iscntrl('\t')
が非0(真)になるんだけど
これって正しい?
2019/12/07(土) 21:22:47.02ID:F8+HNqgO
表示できる文字と空白以外は全部制御文字だね
2019/12/07(土) 22:13:42.05ID:KRZcErEE
isspace('\t')は非0(真)なので'\t'は空白のはずェ、

つかGoogle Testにかけたらこうじゃわ↓↓↓
TEST(stdlibTest, ctype) {
ASSERT_FALSE(isspace('\0'));
ASSERT_TRUE(isspace('\n'));
ASSERT_TRUE(isspace('\r'));
ASSERT_TRUE(isspace('\t'));
ASSERT_TRUE(isspace(' '));

ASSERT_TRUE(iscntrl('\0'));
ASSERT_TRUE(iscntrl('\n'));
ASSERT_TRUE(iscntrl('\r'));
ASSERT_TRUE(iscntrl('\t'));
ASSERT_FALSE(iscntrl(' '));
}
716デフォルトの名無しさん
垢版 |
2019/12/07(土) 23:02:18.90ID:cPeMBqq7
盲目の為のロケールがあったら、ベル以外全部制御文字になるんだろか。
2019/12/07(土) 23:12:25.74ID:fV2E4bDP
0x00から0x1fまでは全部制御文字で違和感ないけど。
2019/12/07(土) 23:19:02.06ID:EVNez7Da
printableってのは音声出力も含むのではなかろうか
2019/12/08(日) 02:49:31.16ID:C6vow3qq
盲人のブログラマーって普通にいるんだな
なんかかっけーな
2019/12/08(日) 08:37:40.25ID:9eRqVWoa
Visual Studio 16.4オンラインアプデしたら
それまで使ってたParallel Studio2019 U5使えなくなった。
Visual C++でコンパイルできるがIntel Compilerはコンパイル失敗してしまう
それと、
プロジェクトのプロパティからIntel Compilerは選択できるんだが、
プルダウンメニューからIntel Compilerを選択できないようになった。
Parallel Studio最インスコしてもコンパイルは失敗する。2019 U5 が16.4に対応してないとかないよね?
2019/12/08(日) 08:39:40.14ID:drue7Jpy
>>713
例によってロケール依存らしいが "C" だと
iscntrl() が真を返す値は 0x00-0x1f, 0x7f みたいね。
これまた例によって unsigned char 範囲と EOF 以外の値については未定義。

つうか、このくらいは5ちゃんねる以外から情報を探す方が
早くて確実じゃないかしら。
2019/12/08(日) 13:11:02.08ID:hM3Qn2JU
C++で作ったブラウザテニスゲーム(PWA仮対応):
https://yutakaaoki.github.io/demo_tennis/
Wasm+PWA+WebGL+"C++"
723デフォルトの名無しさん
垢版 |
2019/12/08(日) 14:09:36.54ID:3pi+cAN/
>>722
青木さんは何をしようとしてるんですか?
2019/12/08(日) 14:17:37.03ID:vN1dzuVf
>>722
で、質問は?
725デフォルトの名無しさん
垢版 |
2019/12/08(日) 14:36:36.30ID:3pi+cAN/
もっと早くは最速って意味ですか?
それとも速くしたいって意味ですか?
726デフォルトの名無しさん
垢版 |
2019/12/08(日) 14:56:59.55ID:3pi+cAN/
インテリコード、ほんとに提案してくるね。
お前は次にこう書く・・・って。
727デフォルトの名無しさん
垢版 |
2019/12/08(日) 15:02:14.03ID:J+6Nu+8f
歯垢の妨げにしかならんわ
2019/12/08(日) 17:09:58.86ID:hM3Qn2JU
>>723
C++ Nex という言語とそのIDEを作ってますが、マルチプラットフォームの
ツールキットも同時に作ってます。MacやiOSなどまで native 対応するのは
貧乏なので機材の関係で難しいので、wasm に対応することでひとまずは
凌ごうかと思いました。

ツールキットのソースをBSD/MIT系ライセンスで公開して、C++ Nex も
無料で使えることにして、みなさんのお力をお借りして native対応の
ツールキットに出来ればいいのですが。ひとまず、Windows/Wasm/Android
くらいまでなら対応できる目処は立ってます。iOSについては、swift
言語が出したオブジェクトファイルとリンクすることはWindows上でも
実験できそうなので、その基礎的な部分だけならMakefileなどの開発環境を
用意することはできそうです。

Mac miniがあれば、iOS native 対応も出来そうなんですが。
729デフォルトの名無しさん
垢版 |
2019/12/08(日) 17:29:31.80ID:3pi+cAN/
基本的にネイティブ志向なんですね。
2019/12/08(日) 17:29:36.52ID:oOCB7Yl8
>>728
ソースコード見せて
731デフォルトの名無しさん
垢版 |
2019/12/08(日) 17:30:50.90ID:3pi+cAN/
ウェブアセンブラは興味あるんだけど、イマイチ情報が。
732デフォルトの名無しさん
垢版 |
2019/12/08(日) 17:32:13.08ID:3pi+cAN/
高橋茉奈著やさしいウェブアセンブラが待たれる今日この頃。
2019/12/08(日) 17:37:23.93ID:hM3Qn2JU
>>730
ライセンスは、BSD, MIT, LGPL(静的リンクしてもGPL感染しない例外あり) の
どれかにするか迷っています。
2019/12/08(日) 17:43:51.77ID:8Jdq2NjK
WTFPLライセンスにしようぜ
2019/12/08(日) 23:33:02.58ID:Cj3eSjEv
>>721
>"C" だと
>iscntrl() が真を返す値は 0x00-0x1f, 0x7f

ほう、そんなことが規格のどこにかいてあるのですか
2019/12/08(日) 23:58:38.94
>>722
Android 4.4.2 Chromeで動作した
737デフォルトの名無しさん
垢版 |
2019/12/09(月) 01:41:27.18ID:ExBOPGUm
ID無いのは5chの人って事?
2019/12/09(月) 01:45:35.78ID:aHmkn8DW
有料ユーザーってこと
■ このスレッドは過去ログ倉庫に格納されています
5ちゃんねるの広告が気に入らない場合は、こちらをクリックしてください。

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