C++相談室 part141

■ このスレッドは過去ログ倉庫に格納されています
2019/02/22(金) 03:07:43.52ID:MgOIx7iK
次スレを立てる時は本文の1行目に以下を追加して下さい。
!extend:on:vvvvv:1000:512

C++に関する質問やら話題やらはこちらへどうぞ。
ただし質問の前にはFAQに一通り目を通してください。
IDE (VC++など)などの使い方の質問はその開発環境のスレにお願いします。

前スレ
C++相談室 part137 (正しくはpart138)
http://mevius.5ch.net/test/read.cgi/tech/1535353320/
C++相談室 part139
https://mevius.5ch.net/test/read.cgi/tech/1538755188/
C++相談室 part140
https://mevius.5ch.net/test/read.cgi/tech/1547326582/

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

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

[C++ FAQ]
https://isocpp.org/wiki/faq/
http://www.bohyoh.com/CandCPP/FAQ/ (日本語)

----- テンプレ ここまで -----
-
VIPQ2_EXTDAT: default:vvvvv:1000:512:----: EXT was configured
2019/03/22(金) 19:08:02.11ID:2qpWO6k3
その機能自体への好悪もあるか知れないけど、
「導入されたからには直ちに覚えて使わないのは罪悪」あるいは
「使わない奴は学習能力の劣る無能、使わないのでなく使えないんだろ」
みたいな、新機能の押し付けが嫌がられてるって部分もあるんでないかな。
2019/03/22(金) 19:19:05.75ID:wNvbYX88
実行時おじさん
2019/03/22(金) 19:21:05.55ID:OAKB0NCU
>>576
関数型持ち出すやつが、c++のconstexprの持ち上げたらいかんだろ
関数型はそんなキーワードなしに部分評価するだけで実現できんだから
2019/03/22(金) 19:23:25.37ID:YgnW0VV3
Googleの結論
Think twice before using template metaprogramming or other complicated template techniques;
think about whether the average member of your team will be able to understand your code well enough
to maintain it after you switch to another project, or whether a non-C++ programmer or someone casually browsing the code base will be able to understand the error messages or trace the flow of a function they want to call.

https://google.github.io/styleguide/cppguide.html#Template_metaprogramming
581デフォルトの名無しさん
垢版 |
2019/03/22(金) 19:26:07.13ID:LxKdyD8r
【定数型プログラミングの掟】
> 「ブッ殺す」と心の中で思ったならッ!その時スデに行動は終わっているんだッ!
2019/03/22(金) 19:31:22.14ID:M4ChOHMa
でも終わったときめちゃくちゃ疲労してるんやで
2019/03/22(金) 20:21:58.70ID:nPC1T1eJ
>>580
それ逆効果じゃね
Google社員でも使いこなせない機能を使いこなす俺スゲェwww
2019/03/22(金) 21:54:10.43ID:nrO+MVHg
>>534
>コンパイル時レイトレーシング
……
2019/03/22(金) 21:57:31.87ID:FYyZQ6ej
コンパイル時C++コンパイルをやったら尊敬する
2019/03/22(金) 22:28:07.22ID:1RSJEChR
正規表現のコンパイルならありかもしれないw
2019/03/22(金) 22:42:15.38ID:78R951f8
自分の知らない概念を勉強するって意味ならlispのマクロでも覚えたほうがはるかに有意義なんだが
そうしないだよね。
なぜならそれじゃ老害にマウントできないから。
まあそういうクソみたいな思想のやつが年取って老害化するんだけど。
2019/03/22(金) 23:22:27.03ID:C43yQc+Q
>>545
コンパイル時に決定していることしかできませんよ
コンパイル時に3の階乗を計算して、ドヤってるやついるけど、それなら6ってタイプしとけよw
589デフォルトの名無しさん
垢版 |
2019/03/22(金) 23:29:13.79ID:LxKdyD8r
でもそれがLALR(1)パーサーを生成するなら?
2019/03/22(金) 23:36:46.32ID:tosUzxZE
コンパイルに時間かかるから、その間暇つぶしに裏でレイトレーシングして遊んでんのかと思った
591デフォルトの名無しさん
垢版 |
2019/03/23(土) 00:40:56.99ID:A6OyMWzd
デイトレーシングってストーカーのことだっけ。
2019/03/23(土) 06:55:12.12ID:jegHMgvE
>>580
「同じプロジェクトで働く他の仲間はアホかもしれない、
あなたの仕事を引き継ぐ奴はボンクラかもしれない、
だから難しい機能を使うのは自重しましょう」って感じか?
一見「あなただけは特別な存在です」と言ってるように見えて、
実は現場の全社員を見下してるような文面だなぁ。
「技巧に走るより素直な書き方をしろ」って趣旨は分かるんだけど。

>>588
参加者の順列で生じるパターンの状態を記録する配列の要素数、
しかも参加者数は変更の可能性あり(コンパイル時には確定する)、
という場合なら contexpr の階乗関数を仕込む意味はありそうね。
2019/03/23(土) 07:22:13.12ID:WDi4jE89
長年プログラムの保守やってるの見るとその通りだが
2019/03/23(土) 08:07:02.46ID:T5eFVdJU
constexpr指定するだけのことが技巧的なのか知らなかった
I/Oや動的メモリと関係なさそうなところに脳死で適当に付けておくだけでいいのに
595デフォルトの名無しさん
垢版 |
2019/03/23(土) 08:35:25.57ID:RdkKrV9k
霞ヶ関文学は禁止ってこった。
2019/03/23(土) 12:20:32.92ID:0OEv8pnV
基本的に新機能は分かりやすく書きやすくするためのものなんだけどな
2019/03/23(土) 12:50:41.97ID:p3DdVUb8
数学への回帰と先祖返りじゃないの
分かり易くなるんじゃない、難しくなるんだよ
2019/03/23(土) 13:37:38.67ID:v/SrloXk
template<typename Item>
Item Fool::InsertItem(const Item& item)
{
 //なにがしかの処理
 item.c_str()...
}

こんなコード見かけると吐き気がするわ
c_str()を持つ型しか使えないじゃん
なんのためにtemplate使ってんだよw
2019/03/23(土) 13:47:58.81ID:uJTAZAlu
c_strを持つ型に限定したいから問題無いけど。
2019/03/23(土) 13:49:44.59ID:T5eFVdJU
何か変か?
c_strを持っているクラスのみを想定しているんじゃないの
本当はSFINAEで消すべきかも知れないけど
2019/03/23(土) 13:50:21.13ID:ByL/s3eU
>>598
だからコンセプトの導入が悲願とされてるんだよ。
2019/03/23(土) 14:34:53.50ID:JQCK5flX
>>598
程度のはsfinaeでいいんだけどね
2019/03/23(土) 14:56:23.90ID:EB4wgvrK
basic_stringの特殊化に限定するなら文字型を受け取るだけでいいと思うんだけど
2019/03/23(土) 15:01:12.26ID:fJspHuQc
>>598
constexprでコンパイル時に特定のメソッドがあるか調べられないの?
2019/03/23(土) 15:03:42.82ID:EB4wgvrK
それは型の情報だから、すでに言われてるようにメタプログラミングでsfinae使って調べるしかない
2019/03/23(土) 15:55:31.24ID:RdkKrV9k
吐き気がするだけで済んでいるのなら御の字。
2019/03/23(土) 16:15:35.83ID:T5eFVdJU
アレルギーが重症化すると辺境で難癖付けて騒ぎ出したりテンプレート指定すると何故か生産性が落ち出したりするからな
2019/03/23(土) 17:08:18.78ID:qcSb+DlG
pythonみたいにエラーメッセージ表示してくれるだけで大分マシになると思うんだけどな
2019/03/23(土) 18:52:42.53ID:4cH0E/is
そうなんだよね
1500行のエラーメッセージの代わりに「itemのメンバ関数c_str()が見つかりませんでした」ってコンパイラが言ってくれてたら
ここまでテンプレートは嫌われなかった
2019/03/23(土) 18:54:43.76ID:enzaJQTj
だからgoのコード生成系のアプローチのがマシってことなんだが馬鹿は脳内でしかビルドしないから通じない訳だ。
611デフォルトの名無しさん
垢版 |
2019/03/23(土) 19:11:19.55ID:A6OyMWzd
これからは定数型プログラミングの時代。
2019/03/23(土) 19:15:22.30ID:EB4wgvrK
>>609
それはC++20でコンセプト入ったら実現されるはず(ライブラリ側で対応する必要あるけど
613デフォルトの名無しさん
垢版 |
2019/03/23(土) 19:18:48.99ID:iMO+WCpL
過去の話をしてるのに未来の話で返されてもな
614デフォルトの名無しさん
垢版 |
2019/03/23(土) 19:22:34.86ID:A6OyMWzd
エラーメッセージがわかりにくいなら、VC++を使うべき。
2019/03/23(土) 19:26:46.49ID:T5eFVdJU
過去のことなんかどうでもいい
未来だけ見て生きていこう
2019/03/23(土) 19:30:40.79ID:EB4wgvrK
>>613
コンセプトは最近出てきた概念じゃないぞ
C++11が0xとか呼ばれてた頃から言われてた話
2019/03/23(土) 21:03:26.04ID:16DhXZwe
>>614
vcはバグだらけで使い物にならない
2019/03/23(土) 21:40:53.85ID:eUSVaq66
>>598
嫌なら実体化しなければ良いんじゃ…
仮にFooのインスタンスを生成したとしても、Foo::InsertItem()を呼ばなければFoo::InsertItem()は実体化されないはず…
2019/03/23(土) 22:45:17.73ID:4cH0E/is
今思えばC++0xのコンセプト案はいろいろ酷かったな
あのまま入らなくてよかった
2019/03/23(土) 23:17:20.42ID:EB4wgvrK
コンセプトマップだとかコンセプトを満たすことを自己申告しなきゃいけないだとか
傍目に見て正直意味わからんかった
2019/03/23(土) 23:51:54.14ID:11jhwwP/
Axiomはとてもいいと思ったが、消えたのだな・・・
2019/03/23(土) 23:53:58.85ID:enzaJQTj
>>588
フーリエ変換の係数みたいなものは実行時には定数だけれど、事前に計算式で計算しておきたくはなる。
でもまあ普通に考えればビルド構成の問題だわな。
なぜコンパイラに無理やり突っ込むかと言えばまともにビルド構成を考える能力がないからっていうね。
2019/03/23(土) 23:54:27.98ID:4cH0E/is
axiomさんは契約アトリビュートとして生まれ変わったのだ
624デフォルトの名無しさん
垢版 |
2019/03/24(日) 00:40:12.28ID:7x4/H6l4
C++の複雑さはオナニー的なところがある
2019/03/24(日) 01:38:06.52ID:b8r3VMdD
コンパイル時に決定してることしかできないなら、コード書く必要あるか?
1+2しか計算できないんだろ、2+3の結果が欲しかったら、コンパイルし直しw
2019/03/24(日) 02:05:19.27ID:xAoD2jBj
狭義のアルゴリズム(有限ステップで終わる)を記述する分にはそれで十分
無限ループを含む手続きを記述したかったら無限再帰すればええ
と考えればメモリが無限にあればコンパイルが終わるまでに任意の処理ができる
627デフォルトの名無しさん
垢版 |
2019/03/24(日) 02:07:46.29ID:4oYv+rwZ
定数型プログラミングでコンパイラを創ろう。
2019/03/24(日) 02:16:59.70ID:9ZLLLplX
コンパイル時に畳み込んで定数にした方がよいかどうかはコンパイラの最適化で頑張って欲しい話で、
それで足りない、さらなるチューニングが必要なときの記法が統一的だったらうれしいねっていう程度の話じゃないかな。
普段からそんなにコンパイル時計算を意図したりはしないよ。
629デフォルトの名無しさん
垢版 |
2019/03/24(日) 02:25:38.27ID:Wmd2CxZH
P言語でC++中間コードを生成するスクリプトを書けばいいじゃない。
swigみたいな。
カスタムコンパイルやカスタムビルドはそのためにある。
630デフォルトの名無しさん
垢版 |
2019/03/24(日) 02:33:38.88ID:4oYv+rwZ
ヤック、レック相当をメタプログラミングで実現することができるのではないか。
スピリチュアルな方向性ではなく。
2019/03/24(日) 02:50:04.22ID:9ZLLLplX
PEG 相当のことを実現しているライブラリとしては Qi があるけど、
Yacc みたいに LALR をやってくれるのは知らないなぁ。
出来るのかな?
2019/03/24(日) 03:13:50.09ID:PmamUspu
>>628
個人的には、メタプログラミングで定数値のパラメータ作るのに構造体でメタプログラミングする必要が無くなったのはconstexprにかわしゃ
2019/03/24(日) 03:16:29.85ID:PmamUspu
ごめん間違って送信した、
constexprに感謝してるw
あとビット演算とか整数値の計算する関数もconstexprつけときゃテンプレートパラメータに渡せるし
高速化は二の次だと個人的には思ってる
634デフォルトの名無しさん
垢版 |
2019/03/24(日) 03:23:59.40ID:4oYv+rwZ
STLあっての私たち。
2019/03/24(日) 03:30:27.34ID:b8r3VMdD
STLって遅くて使えなくない
636デフォルトの名無しさん
垢版 |
2019/03/24(日) 03:32:16.98ID:4oYv+rwZ
確かに遅いね。
637デフォルトの名無しさん
垢版 |
2019/03/24(日) 03:37:58.18ID:4oYv+rwZ
テンプレートメタプログラミングは永久機関。
2019/03/24(日) 05:16:54.07ID:xAoD2jBj
STLにCStringを入れて欲しい
639デフォルトの名無しさん
垢版 |
2019/03/24(日) 05:41:26.93ID:NAaHZN6A
嫌です
2019/03/24(日) 05:51:09.56ID:0ur1Ot0v
男なら全部char[]
2019/03/24(日) 06:09:08.25ID:xAoD2jBj
sprintf_s()と_cuntof(array)がどこの環境でも標準で使えるならchar[]も悪くない選択肢ではある
2019/03/24(日) 08:26:16.35ID:3s1WkY0F
boost spiritはコンパイルが糞遅いし、何か間違えると何処が原因かさっぱりわからんし、
実用には程遠かったな。テンプレートでここまでできるという一発芸的な。
2019/03/24(日) 09:20:48.36ID:0R743LPx
テンプレートメタプログラミングって元々はアンチパターンとして提出した例だったんだけどね。
本当に愚者というのは度し難いというか。。
2019/03/24(日) 09:21:19.70ID:EkBj7yKG
CStringをこの世から完全に消し去って欲しい
せめてbasic_stringと互換性のあるインターフェースを持たせてからフェードアウトして欲しかった
645デフォルトの名無しさん
垢版 |
2019/03/24(日) 09:23:21.86ID:Wmd2CxZH
CStringT::Format()系関数は、sprintf()系関数を2回呼ぶので冗長。
利用バッファサイズを事前に指定できないことが原因。
2019/03/24(日) 09:27:05.22ID:EkBj7yKG
>>643
だから天井人がお前ら下々に分かるレベルにしてやるよってことで様々な改良が加えられてるんだよなあ
それでもまだ分からないとなったらどこまでレベルを下げればいいんだってなって頭抱えちゃうよ
2019/03/24(日) 10:26:38.44ID:a59b/YMZ
CStringってなに?
2019/03/24(日) 10:31:25.24ID:SVMO04Wq
CStringは、Windows用のC++のクラスライブラリ、MFCの文字列クラス。
2019/03/24(日) 10:45:02.21ID:myNgr9GS
>>645
冗長って言われても一度パースしないと必要サイズはわからんからしょうがないだろ
まあ1KB程度のバッファー持って処理中に足りなくなったらパースし直すとかでもいいとは思うが
2019/03/24(日) 10:47:24.53ID:0ur1Ot0v
便利さを求めるならなんかフレームワーク使えよ
軽さを求めるならchar配列でゴリゴリ書けよ
2019/03/24(日) 10:52:30.12ID:EkBj7yKG
性能も利便性も標準より低いフレームワークさん・・・
652デフォルトの名無しさん
垢版 |
2019/03/24(日) 11:06:49.87ID:Wmd2CxZH
>>649
素直にsnprintf()のように最大バッファサイズを指定するオーバーライド関数を追加すべきでしょ。
CStringT::Format()関数を呼び出す側は、あらかじめサイズを予想できる状況にあることが多い。
2019/03/24(日) 11:52:04.64ID:0R743LPx
>>646
天上人のつもりなのがそもそもの問題なんだがな。。
最近の標準委員は明らかにプログラム組んでなさそうな連中が決めてるような感じだし。
c++なんかは顕著だがそういうマウントの取り合いによる新機能拡充が一番現場を疲弊させてるっていうことを
なんでわからんかね。
2019/03/24(日) 11:52:05.81ID:EHuBBnjq
MFCが出来た頃のstd::stringはそりゃまあ酷いシロモノだったんじゃ
あまりCStringを責める気にはなれん
2019/03/24(日) 11:55:08.60ID:DVu1xjKe
いくらリリース時に型がすべて決まってるはずと言ったってDRYはそれなりに大事だろ
2019/03/24(日) 12:01:45.23ID:rLn5TxmP
>>653
標準化委員会の議論とまともに論理的な議論のできない5chを同一レベルで扱うなよ
657デフォルトの名無しさん
垢版 |
2019/03/24(日) 12:05:08.13ID:4oYv+rwZ
しかし旧石器時代にSTLが作られたことを思うと、オーパーツと言ってよいのではないか。
数学的に洗練されたこの美しさ。
古代人は数学が得意だったのでは。
2019/03/24(日) 12:09:06.38ID:EkBj7yKG
>>654
まあそれはある
でもstlが普及してからも互換性が全くないまま終了したので負債になってしまったのは悲しい
2019/03/24(日) 12:09:46.38ID:Wmd2CxZH
それにしてもiostreamの醜さよ。
2019/03/24(日) 12:37:41.11ID:NSjukkr5
>>652
C言語に毒された老害かよw
欲しけりゃ自分で実装しろよ
661デフォルトの名無しさん
垢版 |
2019/03/24(日) 12:46:47.36ID:DqM6OskA
>>648

>>647 はそんなの百も承知で書いてると思うが
2019/03/24(日) 12:47:06.43ID:rmV9lt2O
<strsafe.h>を知らない人が多いのか?
663デフォルトの名無しさん
垢版 |
2019/03/24(日) 12:55:26.69ID:DqM6OskA
>>657
そうか?
全然そんなことないと思うぞ

MFCのはもっと酷かったからそれよりマシかなって程度
664デフォルトの名無しさん
垢版 |
2019/03/24(日) 12:57:50.08ID:Wmd2CxZH
>>660
簡単だから当然、実装はする。
下手にバッファサイズを測る手間をかけるくらいならバッファサイズを渡せという話。
バッファサイズを渡せば速度が通常のCStringT::Format()より30〜40%ほど改善するんだから、公式でも採用してもらいたいという趣旨。
665デフォルトの名無しさん
垢版 |
2019/03/24(日) 13:07:04.34ID:Wmd2CxZH
gccとvcでは vsnprintf()の挙動が違う。va_listの内部実装が異なるからだろう。
gccの場合、同じva_listを使ってvsnprintf()を複数回呼び出すと…
666デフォルトの名無しさん
垢版 |
2019/03/24(日) 13:26:03.77ID:tvGVd8WB
続きはCMのあとで!!
2019/03/24(日) 13:42:15.21ID:uLk8b7ur
>>664
どうせ弄るなら、va_listとか旧世紀の遺物つかわなくても、templateの可変長引数を使って1から作り直した方が良い。
2019/03/24(日) 13:44:34.27ID:EHuBBnjq
va_listを他の関数に渡した後で、va_startで初期化せずに再使用するのは未定義動作
何が起きても文句は言えないしコンパイラごとに挙動が違うのは当然というものだ
2019/03/24(日) 13:55:44.10ID:oV9fIVj4
string_viewはどうだろうか?
670デフォルトの名無しさん
垢版 |
2019/03/24(日) 13:56:05.38ID:Wmd2CxZH
>>668
それはつまり、gccではCStringT::FormatV()相当の実装が困難ということを意味している。
バッファサイズを自分で渡す仕様が最適解ということ。
2019/03/24(日) 13:59:03.55ID:myNgr9GS
>>664
そんな旧態依然のインターフェイス欲しけりゃ自分でやれやってことだろ
672デフォルトの名無しさん
垢版 |
2019/03/24(日) 14:13:40.53ID:Wmd2CxZH
それにつけてもostringstreamの醜さよ。
2019/03/24(日) 14:40:52.61ID:EkBj7yKG
streamサイコー<<<<<<
2019/03/24(日) 14:51:51.49ID:a59b/YMZ
clang++使ってみたら、std::async使えない・・・
さすが、フリーだな
2019/03/24(日) 14:52:15.46ID:b6oq5ESd
clang++使ってみたら、std::async使えない・・・
さすが、フリーだな
676デフォルトの名無しさん
垢版 |
2019/03/24(日) 16:30:35.16ID:4oYv+rwZ
>>672
何処がひどいですか?
■ このスレッドは過去ログ倉庫に格納されています
5ちゃんねるの広告が気に入らない場合は、こちらをクリックしてください。

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