C++相談室 part145at TECH
C++相談室 part145 - 暇つぶし2ch112:デフォルトの名無しさん
19/09/18 15:09:43.97 cX0n8f6q.net
ファイルにテキストを書き込みする際に、
ファイルにどれだけ書き込んだかを取得してプログレスバー的な処理をしたいのですが、
どのようにして書き込んだ量を取得すればいいのでしょうか?

113:蟻人間
19/09/18 15:14:37.40 d3y9L0GY.net
書き込んだバイト数の合計を数えるしかない。fprintfなら戻り値。文字列ならstrlen。

114:蟻人間
19/09/18 15:19:25.37 d3y9L0GY.net
合計バイト数がわからない場合は最初に全部数えるか、バイト数の代わりに行数などを使う手もある。

115:デフォルトの名無しさん
19/09/18 23:17:12.89 UKnFRk4i.net
頑張ってプログレスバーを実装したはいいがいざ実行すると
一瞬で表示が終り実装した意味あったのか・・と嘆く >>112 の未来の姿がみえる・・

116:デフォルトの名無しさん
19/09/19 00:44:38.80 zP6ZrAr3.net
書き込んだ量を取得することより、書き込み総量を計算するほうが難しい
ですよね。特にプログレスバーが必要になるほどトータル時間の掛かる処理の場合
に正確な総量を計算するとなれば莫大な時間が掛かってしまう可能性が高くて。
だから推定量を何らかの方法で求めるしかない事が多いでしょう。

117:デフォルトの名無しさん
19/09/19 01:08:08.89 pXxp02XD.net
いや足していくだけだけど

118:デフォルトの名無しさん
19/09/19 01:11:02.88 b8NtymRi.net
つーかテキストだろ?ギガ単位のサイズじゃないんなら
一回メモリにバコバコ貯めといて一気にブワァーッと書くほうが早いよいろいろと

119:デフォルトの名無しさん
19/09/19 01:23:42.33 wlX+Ifsh.net
だな
今のコンピュータなら数十MBくらいガバっと読み込んでいいのに、いまだに少しずつみたいな解説してる本やウェブサイト大杉

120:デフォルトの名無しさん
19/09/19 06:29:12.29 TNTldw8V.net
プログレスバーとかユーザーの気を静めるためのインテリアみたいなもんなので
過度に精度に凝っても仕方が無い
例えばウィンドーズのファイルシステムで1フォルダに10万個ぐらいファイルがあって
それをリモートのウィンドーズのファイルシステムにコピーするとかな場合は
ファイルのトータル容量とか気にせずに
 進捗率(%) = 100 * コピーしたファイル数/10万個ぐらい
でも役に立つ

121:デフォルトの名無しさん
19/09/19 06:32:56.13 1k0/HGmS.net
いやプログレスバーは「きちんと」「しっかり」作らないと
ユーザーのイライラゲージを却って煽ることになるぞ

122:デフォルトの名無しさん
19/09/19 06:34:12.46 TNTldw8V.net
長らくぴくりとも動かなかったプログレスバーが一気に進んだとき
ユーザーに爽快感を与えることができうる

123:デフォルトの名無しさん
19/09/19 07:48:55.38 FVuvug5W.net
>>122
自分でそれを見たらイライラするタイプだろう

124:デフォルトの名無しさん
19/09/19 08:27:53.76 UG8ew1B1.net
99%で止まるやつはイライラするな。
進捗率よりも、書き込んだバイト数とか表示してくれると動いてるのがわかるから好きだな。

125:デフォルトの名無しさん
19/09/19 08:40:01.59 X+5OT7FX.net
>>121
windows update

126:デフォルトの名無しさん
19/09/19 23:28:31.87 TdUlR93V.net
progress_displayたん…どうして死んじゃったの…

127:デフォルトの名無しさん
19/09/20 08:56:12.04 Qo6+tgpY.net
全支店のファイルを集計するツール作った時
九州支店とか遠方の支店に入ると突然90%とかから進まなくなって
イライラおじさんに「なら最初から期待させるな」みたいなお説教された思い出
そこの回線だけやたら細かったというオチなんですけどね
今ならどうやって作るかなあ?
前処理で軽くテスト集計して予想回線速度をチェックしたうえで
拠点ごとに速度の重みづけをして見積もるか?
きちんとやるなら面倒だけどやるしかないよな
それとも運用方法の変更なりで逃げるか
プログレスバーの工数見積り怖い・・・

128:デフォルトの名無しさん
19/09/20 09:04:34.21 Qo6+tgpY.net
処理中のファイル名をリアルタイム表示して
進捗率の方はあくまで参考値という体にする手もあるか
あとは費用対効果を説明してこれで我慢してもらう交渉でって感じで
キャンセルボタンも付けるべきだよな上司はイランて言ってたけど

129:デフォルトの名無しさん
19/09/20 09:12:44.78 hmm5+Tdj.net
プログレスバーの下に店名と店長の名前表示すりゃいいじゃん

130:デフォルトの名無しさん
19/09/20 09:29:35.36 JFYTR1x6.net
その支店に接続するのにかかった時間を計測しておいて
それをベースに表示してみたら

131:デフォルトの名無しさん
19/09/20 10:44:26.44 BhKigXRx.net
接続先と毎秒の処理したバイト数でも表示すればいいんでね。

132:デフォルトの名無しさん
19/09/20 11:11:25.39 Qo6+tgpY.net
>>129
店長の名前は関係ないだろ
うっかり考え込んでしまったわ

133:デフォルトの名無しさん
19/09/20 11:36:45.41 hmm5+Tdj.net
クレーム先だよ
なんなら電話番号も出せばいい

134:デフォルトの名無しさん
19/09/20 12:02:27.62 l/kiVjID.net
ロード中にテトリスで遊べるようにしておけばいいよ

135:デフォルトの名無しさん
19/09/20 14:12:27.16 RTklMOF0.net
>>134
それたしかナムコが特許もってたような

136:デフォルトの名無しさん
19/09/20 14:57:59.95 KQX84Fxf.net
とっくに消滅してる

137:デフォルトの名無しさん
19/09/20 18:37:33.58 xrPkbjYn.net
あるクラスのインスタンスを生成するときに、必ずあるメンバを初期化してほしいとします。
このとき、コンストラクタで初期化することにしたのですが、初期化は必ずやってほしいためデフォルトコンストラクタは禁止したいです。
デフォルトコンストラクタを禁止するのはどうやりますか。

138:デフォルトの名無しさん
19/09/20 18:43:14.50 MFrl2Bhu.net
deleteすりゃいいじゃん。これ以上は言わぬ

139:さまよえる蟻人間
19/09/20 19:02:34.17 sJdfK6qv.net
>>137
モダンなやり方は = delete;だろう。
古臭いやり方はprivateにして定義を書かないようにすれば、アクセスできないようになる。

140:デフォルトの名無しさん
19/09/20 19:30:48.34 HuG+DEnO.net
5年ぐらい前に失効してたのか・・時の流れるのは早いのう
URLリンク(automaton-media.com)

141:デフォルトの名無しさん
19/09/20 19:32:15.62 mfXfj+Qu.net
どうでもいいがC++界隈はハチミツギョーザとか蟻人間とか
なかなかユニークなコテが多い印象

142:デフォルトの名無しさん
19/09/20 19:58:49.42 xrPkbjYn.net
>>138-139
ありがとうございます。
やりたいことそのものです。

143:デフォルトの名無しさん
19/09/20 21:54:40.66 Q9EEZSVd.net
キャンセルボタンなしの進捗ダイアログ表示して安心してたらESCキーで閉じられて不正動作

144:
19/09/21 12:33:44.52 HPdvwX1r.net
>>141
「蟻人間」のコテは最近それに改名されたものですよ…

145:デフォルトの名無しさん
19/09/21 17:28:53.63 hvfc00gO.net
Visual Studio 2019 C++ community editionを使用して
PythonをC++で使いたいのですが、
Pythonライブラリーの Python.h ファイルに
#pragma comment(lib,"Python37.lib")
といった記述があり、それがリンクエラーの原因となっております。
プロジェクトプロパティ>VC++ディレクトリ>ライブラリディレクトリには
「$(Path)libs」と記述して、パスは通したのですが改善されません。
これのリンクを通したいのですが、どのようにして対処すればよいのでしょうか?
お願いします。

146:デフォルトの名無しさん
19/09/21 17:46:36.63 B7P1QhOW.net
$(Path)という定義済みマクロが無いか、あるいは環境変数PATHの内容が
そのまま(つまり複数のパスを「;」を挟んで連接した文字列に)展開されているのかもしれんから、
展開結果を確認するか、それができないのであれば
絶対間違いのない絶対パス指定でうまくリンクできることを確かめてから改めて来なちゃい

147:デフォルトの名無しさん
19/09/21 18:20:26.50 hvfc00gO.net
>>146 さん。ありがとうございます。
絶対パス指定ならリンクは通りました。
ただ、相対パス自体はあるのですが展開結果が連結しているようです。
重ねての質問になるのですが、
#pragma 等で相対パスを使用する際に、
相対パスが連結している場合はどう対処すればいいのでしょうか?

148:デフォルトの名無しさん
19/09/21 18:54:54.04 B7P1QhOW.net
ライブラリをソリューション相対指定可能なフォルダに置いて
Visual Studioの定義済みマクロ($(SolutionDir)なり$(ProjectDir)なり)を正しく使えば良いだけの話なのでは…
あるいは、ライブラリのインストール先が決まっておりライブラリの位置を勝手に動かせないということであれば、
絶対パス指定で何の問題も無いはず…
ソースコードなりプロジェクトファイルなりに絶対パス指定が書かれることによるプロジェクトの可搬性が問題になるなら
適当な環境変数を設けてそれにただ1個のパスだけ定義して$(環境変数名)で展開させるか、
絶対パス部分をVisual Studioの機能でユーザーマクロ定義して最小化することができうる
※ [表示]→[その他のウィンドウ]→[プロパティーマネージャ]、とすればプロパティーマネージャータブが現れるので
  そこで継承元の設定を変更でき、その中でマクロのユーザー定義が可能
いじょ 耕運を祈る、

149:デフォルトの名無しさん
19/09/22 06:52:19.04 wJwJ26l5.net
std::variantってテンプレートによる静的ポリモーフィズムを実現しつつ一つのコンテナで管理したいという要求から生まれたんでしょうか
であるとしたら今後継承による動的ポリモーフィズムは下火になっていくのでしょうか

150:デフォルトの名無しさん
19/09/22 10:30:22.84 dVD4vVZj.net
variantは共用体の代わり

151:デフォルトの名無しさん
19/09/22 22:04:08.49 P121omqV.net
> std::variantってテンプレートによる静的ポリモーフィズムを実現
継承もstd::variantも実際に格納されている型が実行時まで分からないのだから、
静的(コンパイル時)ポリモーフィズムにはならないのでは?

152:デフォルトの名無しさん
19/09/23 00:26:21.21 7kwjfJuy.net
gcc, clang, VC++, その他
仕事で使われるのはどれ?

153:デフォルトの名無しさん
19/09/23 00:50:57.87 QJYuDw18.net
>>152
gcc, clang, VC++

154:デフォルトの名無しさん
19/09/23 01:06:32.53 4WIp5ctr.net
intelも使われるし、C++ Builderも使われてる

155:デフォルトの名無しさん
19/09/23 01:21:58.30 7kwjfJuy.net
仕事でC++14より上使っている?

156:デフォルトの名無しさん
19/09/23 03:12:30.92 aMvJGSmY.net
iccって高いだけで性能もgccとほぼ変わらないなら値段に見合う利点あるのか?

157:デフォルトの名無しさん
19/09/23 09:16:12.73 QJYuDw18.net
メニーコアなCPUとSIMDを使ったときのプロファイラが優秀
おそらく <


158:デフォルトの名無しさん
19/09/23 11:42:56.67 rVs/BJT1.net
普通に17使うだろ
filesystemやvariant,optional使わんの?

159:デフォルトの名無しさん
19/09/23 11:57:29.62 f1jovMGd.net
だよな

160:デフォルトの名無しさん
19/09/23 12:02:46.51 P5eYiou7.net
お仕事だとそうぽんぽんバージョンあげられないし
使っていい標準ライブラリのしばりもあったりするんですよ
特にプラットフォーム抽象する系はあんまり使わない
そんなのにべったり頼るぐらいならc++でなくてよくね?ってなる

161:デフォルトの名無しさん
19/09/23 12:08:09.26 rVs/BJT1.net
最近はmsvcがバイナリ互換保ち続けているから安心してあげられる。
gccやclangはもともと対応早いから安心だったし。

162:デフォルトの名無しさん
19/09/23 12:19:16.90 f1jovMGd.net
>>160
filesystem使って見た?
まだ荒削りで所々変なところがあるけど
方向性としてはいい線ついてると思うぜ

163:デフォルトの名無しさん
19/09/23 12:24:31.61 EI75oq0E.net
あ、こいつバギーなライブラリ入れて現場荒らすタイプだわw

164:デフォルトの名無しさん
19/09/23 12:31:48.66 rVs/BJT1.net
勝手にライブラリ追加できる時点で糞みたいな職場じゃね

165:デフォルトの名無しさん
19/09/23 12:47:46.83 f1jovMGd.net
難癖つけるのは構わんが
脇が甘いぞおまえら

166:デフォルトの名無しさん
19/09/23 13:15:30.01 WS0TgAIm.net
まあケースバイケースだろ
ポンポンバージョン上げられないって言うだけで古い環境使い続ける職場もどうかと思うし

167:デフォルトの名無しさん
19/09/23 13:21:49.79 P5eYiou7.net
>>162
ファイルシステムまわりはこてこてにネイティブ依存の内製のものがあるので出番はないでしょうね
パフォーマンス第一の仕事なもので
あと標準ライブラリはデバッガやプロファイラのことがスコープ外なのでそのあたり自分達で整備しないと採用できないってのもある

168:デフォルトの名無しさん
19/09/23 13:33:54.17 f1jovMGd.net
なるほどね
パフォーマンス第一か
どっちかつーと標準なんぞ糞くらえつーか
標準の意味が違ったりするわけか

169:デフォルトの名無しさん
19/09/23 14:04:13.62 JqkYM16h.net
同じじゃん標準ライブラリは一般性重視故に特定の問題領域において必ずしも最高の性能は発揮しない(最高の性能となる保証がない)ことは確定的に明らかよって80-20の法則の80部分からパフォチューしていく

170:デフォルトの名無しさん
19/09/23 14:07:39.82 QJYuDw18.net
頭悪い書き込みしか無くて草

171:デフォルトの名無しさん
19/09/23 14:31:50.86 JqkYM16h.net
天 才 現 る

172:デフォルトの名無しさん
19/09/23 22:59:04.40 EI75oq0E.net
てかc++でやることじゃねーだろどう考えても。
糞の役にも立たんわ。

173:デフォルトの名無しさん
19/09/24 00:22:06.58 iXMkuGmM.net
C++でやる事って何よ?

174:デフォルトの名無しさん
19/09/24 01:05:00.80 blreVUO1.net
templateで遊ぶくらいしかやることないね。

175:デフォルトの名無しさん
19/09/24 06:38:35.03 3E9gAKbz.net
仕事がないって話はマ板でやんな

176:デフォルトの名無しさん
19/09/24 18:32:13.78 9F3bEWFD.net
汎用性・可搬性を重視するかパフォーマンスを重視するかのスタンスの違いだけでしょ

177:デフォルトの名無しさん
19/09/24 19:39:45.71 bRBDEgqh.net
>>173
filesystemみたいなライブラリの実装。

178:デフォルトの名無しさん
19/09/24 20:52:11.47 ZtSwhx8Z.net
visual studio 2019 16.3でついにconceptが使えるように(赤線でるけど。。。

179:デフォルトの名無しさん
19/09/25 00:19:35.27 T/Q1Hzp4.net
conceptはいい
人類は真の抽象化を手にする

180:デフォルトの名無しさん
19/09/25 00:39:03.31 0gY/IvgH.net
C++98の俺には1ミリも関係ない話だな。

181:デフォルトの名無しさん
19/09/25 00:43:58.99 ROl8Z6BD.net
じゃあ出て行け

182:デフォルトの名無しさん
19/09/25 01:15:27.21 zpsuJSx5.net
98とかVB6と同レベルの化石

183:デフォルトの名無しさん
19/09/25 16:32:45.50 5a


184:P+8CuP.net



185:デフォルトの名無しさん
19/09/25 21:10:30.42 065+eRsw.net
じゃあ俺が

186:デフォルトの名無しさん
19/09/25 21:20:37.77 SmUxqnJ3.net
いやおれが

187:デフォルトの名無しさん
19/09/28 01:40:31.76 cIYNjYIc.net
重複スレの方が謎の盛り上がり

188:デフォルトの名無しさん
19/09/28 02:11:00.78 intFUv+k.net
void君はあのスレから出られないからな

189:デフォルトの名無しさん
19/09/28 14:48:43.27 nKwEArCO.net
このスレはwinapiを扱ってますか?
sendmessageとか。

190:デフォルトの名無しさん
19/09/28 16:09:42.06 EwMBvois.net
>>188
Win32API質問箱 Build125 :
スレリンク(tech板)

191:
19/09/28 16:12:26.72 QJtrgyVU.net
>>188
win32api ならやってる人は少なからず居ると思います

192:デフォルトの名無しさん
19/09/28 16:37:07.73 nKwEArCO.net
>>190
サンクス!

193:デフォルトの名無しさん
19/09/29 07:24:31.34 wVCOjSn/.net
文法とか開発思想の初歩的な質問なんだが、例えば最大流問題を解くプログラムと最小費用流問題を解くプログラムで「Edge」という構造体や「dfs」という関数の意味を変えたいときに使うのが名前空間だという理解でOK?
(関数の意味を変えたいだけなら名前空間じゃなくて別のクラスを用意すれば良いだけかな?)

あと、名前空間の中でグローバル変数を使うのは通常のグローバル変数と同じで慎重にやった方が良い(と言われてる)?
例えば最小費用流問題を解くときに経路の情報を記録したりするんだが、この経路を mincostflowという名前空間におけるグローバル変数にするとか

194:デフォルトの名無しさん
19/09/29 09:01:23.18 thkZayt3.net
名前空間は名前をまとめるだけであって隠蔽したり上書きしたりする機能はない
素直にクラス使え

195:デフォルトの名無しさん
19/09/29 10:02:14.52 sih8o/+S.net
>>192
そのくらいのプログラムでは名前空間は使わない方がいい。
使うべきなのはクラス。

196:デフォルトの名無しさん
19/09/29 10:24:44.95 MP9GBJ11.net
いや同じ識別子を違う意味で使いたいのなら名前空間だ
名前をどうかしたいというだけでクラス化するといらん制限がかかって邪魔なだけ

197:デフォルトの名無しさん
19/09/29 10:27:55.39 lvoGL429.net
>>192
その例では明らかにグローバル変数を使う必要はない。
「最小費用流を解くクラス」のメンバに押し込めるのが普通だと思われる。

198:デフォルトの名無しさん
19/09/29 12:21:02.27 xopwPRlT.net
名前空間は一連の処理や機能をライブラリとしてまとめるときに他のライブラリと名前衝突しないようにするためのものだ
minとmaxの違いだけなら名前空間分けずに変数名や関数名に直接反映させればいいのでは

199:デフォルトの名無しさん
19/09/29 15:27:39.30 sih8o/+S.net
>>197
個人的には自分もそう理解しています。
自分が作るプログラムでは namespace は基本的に使う必要はほぼ
有りません。古い時代に既に作ってしまったプログラムで名前が衝突して
困るような場合に使うと便利な機能として登場したのではないかと思っています。

200:デフォルトの名無しさん
19/09/29 15:31:08.94 MP9GBJ11.net
せっかくの回避策をマクロでばっちり透過してくれた素敵なマイクロソフトw

201:デフォルトの名無しさん
19/09/29 16:03:17.31 k4CvVXqN.net
>>198
昔作ったものに対してだけでなく、いま作ったものが将来使うときに名前の衝突を回避するという目的もあるぞ。

202:デフォルトの名無しさん
19/09/29 16:52:41.21 1aVYpaid.net
なぜ日本人c++プログラマの99%はstd::vectorもstd::find_ifも見たことすらないのだろう。
c言語風の生ポインタ、生配列、if文、for文のみを使ったプログラムしか読めない。
外国の人でそういう人は見たことがない。

203:デフォルトの名無しさん
19/09/29 17:03:09.76 bY9zxDl0.net
99%は盛り過ぎでは・・・

204:デフォルトの名無しさん
19/09/29 17:06:09.85 cKDPFQQS.net
>>201
ワイド文字知らん人見たことあるわ

205:デフォルトの名無しさん
19/09/29 17:28:35.45 TRtZnyIq.net
体感で8割ぐらいかな
まず規格があって改訂されてるってことも知らないのもいる
これは他の言語にも言えることだが
職場で使ったことのあるJavaやPHPのバージョンと環境がすべてみたいな

206:デフォルトの名無しさん
19/09/29 17:37:04.15 MP9GBJ11.net
>>201
おまえ豚小屋にでも住んでるのか?w

207:デフォルトの名無しさん
19/09/29 17:38:36.19 MCSEZmay.net
C++20に入るauto変数を使った簡易関数テンプレートは宣言と実装を分割してコンパイルできますか?

208:デフォルトの名無しさん
19/09/29 18:02:01.75 xopwPRlT.net
全部ヘッダーファイルに書いてしまえ

209:デフォルトの名無しさん
19/09/29 18:13:05.80 Lkb9fNY1.net
vector知らんのはいたとしても組み込みマンくらいだろ

210:デフォルトの名無しさん
19/09/29 19:02:41.77 bY9zxDl0.net
>>206
多分戻り値型と同じで、1つの翻訳単位内ならできると思う
宣言だけヘッダに書いたりするとautoのままだと呼び出せない

211:デフォルトの名無しさん
19/09/29 19:46:49.92 qdFsd7WD.net
>>208
組み込みマンはC言語だろ
C++使っててstd::vector知らないのは流石に勉強不足

212:デフォルトの名無しさん
19/09/29 19:56:43.66 MCSEZmay.net
>>209
ありがとう
やっぱだめか

213:デフォルトの名無しさん
19/09/29 21:36:43.15 MP9GBJ11.net
>>210
組み込みマンだからprinf知りませんみたいなもんだなw

214:デフォルトの名無しさん
19/09/29 21:44:06.01 xcXauKC9.net
vectorの存在は知っていても中身は知らんやつばっかだろ
いまだに生配列の方が速いとか言ってるやついるし

215:デフォルトの名無しさん
19/09/29 21:51:00.97 lvoGL429.net
まあ実際計ってる奴はそんなにはいないわな。
てきとうな演算するくらいなら配列だろうとvectorだろうとほとんど変わらん
(ただしコンパイルオプションによる。
O2 ならそんな変わらんが最適化しないとvectorは本当に遅い。)

216:デフォルトの名無しさん
19/09/29 21:57:52.25 OYiClG3B.net
まあ最適化有効にすれば、すればそこいらの玄人が生配列でごちゃごちゃ書くより速くなることが多いがな

217:デフォルトの名無しさん
19/09/29 22:09:42.47 7KCLRAec.net
サイズを変えない操作でvectorと生配列の効率に違いなんかないだろ

218:デフォルトの名無しさん
19/09/29 22:16:27.22 C35/CdkS.net
ただ最近のc++の最適化前提のスタンスはいただけないな
デバッグのためにデバッグビルド使おうとするが一桁二桁遅くなって実用に耐えないとか
問題再現できないとか多々あって困る

219:デフォルトの名無しさん
19/09/29 22:58:28.58 UVnMNq40.net
>>217
そういうのはコンパイラベンダに言わないと変わらないでしょ。
言語規格としては知ったことではない。

220:デフォルトの名無しさん
19/09/29 23:03:53.99 7KCLRAec.net
もし最適化の有無で速度の変わらないコードがあったとしたら、まず間違いなく人が読めるものではないだろうな

221:デフォルトの名無しさん
19/09/29 23:06:55.39 C35/CdkS.net
こういう開き直りのスタンスって何か固有名詞ついてなかったっけ?
マッチポンプではないし・・なんかなかったかな?

222:デフォルトの名無しさん
19/09/29 23:10:51.16 C35/CdkS.net
>>219
Cはコードはそこまでひどく遅くならないからね

223:デフォルトの名無しさん
19/09/29 23:28:02.53 bY9zxDl0.net
そのおかげで実行時の速度と抽象化した書き方の両立ができるのでまあ仕方ないのでは

224:デフォルトの名無しさん
19/09/29 23:34:47.03 C35/CdkS.net
仕事でやってるので仕方ないで済まないんですよね
かつ遅いところは自分達では手が入れられないところだったり
こういうところ共感できる人いないのかな

225:デフォルトの名無しさん
19/09/29 23:37:19.27 SfsnISLI.net
>>217
良いPC買え

226:デフォルトの名無しさん
19/09/29 23:39:36.92 C35/CdkS.net
>>224
10、100倍遅い問題がPC買い替えてなんとかなると思います?
あと使ってるPC結構いいスペックですよ
開発環境には金かけてくれる会社なんで

227:デフォルトの名無しさん
19/09/29 23:53:13.21 7KCLRAec.net
仕事でやってようと高水準言語とはそういうものなのだから仕方ないものは仕方ない
仕方ないで済まされないなら仕事をやめるしかない
仕事は不可能を可能にするものではない
そんなに最適化が気に入らないなら最適化なしでリリースすりゃいい
プロダクトとデバッグ環境が同一になる

228:デフォルトの名無しさん
19/09/29 23:55:18.86 lvoGL429.net
仕方ないで済まないのでc++使わずc使うっていう話だな。
そこまで無理してc++を使う必然性はない。
結局組み込み系で行われる判断というのはそういったものなんだろう。

229:デフォルトの名無しさん
19/09/29 23:56:29.88 SfsnISLI.net
じゃあ使わなければいい終わり
苦行を強いられているなら文句を言わずに甘んじて受け入れてくれうざい
デバッグができないくらい時間がかかるのであればデバッグ用にデータを減らすかデバッガを使わずにデバッグすればいいだけ

230:デフォルトの名無しさん
19/09/30 00:01:41.09 1t7BL5a5.net
c++の問題を指摘したら自分が否定されてる気持ちになる人ですね?
こういうのって何か固有名詞ついてましたよね?
心理学かなにかの

231:デフォルトの名無しさん
19/09/30 00:07:48.80 K1luVxXx.net
自分以外は仕事でC++使ってないと思ってるのかねえ

232:デフォルトの名無しさん
19/09/30 00:12:05.55 d3KN1ocd.net
C++の問題ではなく、トレードオフなものを両取りできないことに腹を立てている馬鹿の頭が問題

233:デフォルトの名無しさん
19/09/30 00:29:11.50 BjVWgoML.net
debugバージョンでもinline有効にすれば良い

234:デフォルトの名無しさん
19/09/30 00:41:06.86 BjVWgoML.net
gccなら-Ogとか使えば楽

235:デフォルトの名無しさん
19/09/30 08:38:56.00 96lznZkD.net
>>217
問題再現できないのってUB踏んでるんじゃ...

236:デフォルトの名無しさん
19/09/30 20:10:40.43 m19D9tLr.net
c++ほどサンクコストに引っ張られる輩を作り出す言語はないだろうな。

237:デフォルトの名無しさん
19/09/30 20:22:13.77 H9c5jpU6.net
つまり他の言語は底の浅いオモチャ、と

238:デフォルトの名無しさん
19/09/30 20:56:24.52 m19D9tLr.net
そんな掘ってもしょうがないところが深くても邪魔なだけなんだよ。

239:デフォルトの名無しさん
19/09/30 21:49:42.53 A2h+ApYr.net
あっさ

240:デフォルトの名無しさん
19/09/30 21:53:05.92 eLbbGbO7.net
速度や効率を度外視すれば実はプログラミングはものすごく簡単になることが多い。
ところがそれだと劇的に遅くなってしまう。うまく工夫して書かれたプログラムの
所要時間を1とすると、何にも考えずに書かれたプログラムの所要時間は、
100兆位になることがある。そこまで極端でないにしても何にも考えなければ
100位にはなる。その意味で高速化を常に意識しながら組むことは結構
大切な事だと思う。特にアルゴリズム的な部分においては。

241:デフォルトの名無しさん
19/09/30 22:05:07.81 JjfJ0hCF.net
アルゴリズム的に改善できる話なら言語関係ないじゃん

242:デフォルトの名無しさん
19/09/30 22:28:45.63 29SpHEC8.net
固定少数が速いとかdoubleよりもfloatが速いとか割算は遅いから掛け算だとか色々な噂聞いたけど・・・
今時ほとんど変わらんよね?

243:デフォルトの名無しさん
19/09/30 22:34:03.50 /hygPyRQ.net
>>241
実際測ってみりゃいいよ

244:デフォルトの名無しさん
19/09/30 22:48:36.98 ypiuCBLp.net
その時のためのtemplateです。

245:デフォルトの名無しさん
19/09/30 23:07:55.69 ypiuCBLp.net
URLリンク(ideone.com)
これなんで通らんのやろう?
コード補完で読み切れないのはいいけど、コンパイラさんは読めても良いのでは?

246:デフォルトの名無しさん
19/09/30 23:15:32.33 d3KN1ocd.net
class A :public T...{
にすりゃ通る

247:デフォルトの名無しさん
19/09/30 23:19:40.15 d3KN1ocd.net
もしくは
struct A :T...{
継承元にアクセスできんのが原因

248:デフォルトの名無しさん
19/09/30 23:29:43.59 ypiuCBLp.net
>>245-246
あ、俺環だったか。
マジで通った。。。@vc
URLリンク(ideone.com)

249:デフォルトの名無しさん
19/09/30 23:42:29.68 ypiuCBLp.net
>>247
自分で作っておいてあれだが、なにに・・・つか・・・えるん・・・だ・・・。ぐああああ。
考えれば考えるほどもやもやする。

250:デフォルトの名無しさん
19/09/30 23:50:49.59 ypiuCBLp.net
ヴェーダに接続するときに使うんかいな。とかおかしなことしか思い浮かばねー。

251:デフォルトの名無しさん
19/10/01 10:39:26.07 SeWV7ZFb.net
>>217
この場合に A<B,C,D>とした場合、public T... の部分は、
public B, public C, public D
と展開されるんでしたっけ?

252:デフォルトの名無しさん
19/10/01 15:52:31.87 vnyPyC//.net
>>193-194,196
では、Edgeという名前の構造体の定義を問題によって変えたいときはどうすれば良いですか?

253:デフォルトの名無しさん
19/10/01 21:48:01.50 9tGbOXPW.net
>>241
今どきのプロセッサではdoubleは速いよ
doubleは専用チップ積んでるから。floatはdoubleに内部的に変換かけられるから、原理的にdoubleより速くはならない

254:デフォルトの名無しさん
19/10/01 21:50:51.00 sOAgszt0.net
いや、今時のプロセッサはSIMDで不動小数点演算するからdoubleよりfloatの方が速いよ
演算やプロセッサによるが、大抵2~4倍差が出る

255:デフォルトの名無しさん
19/10/01 23:04:08.95 +hOGjxeQ.net
floatが早い今どきのプロセッサってGPUの話か?
ちゃんと区別しろ

256:デフォルトの名無しさん
19/10/01 23:06:13.36 geI6I9WY.net
直前の計算結果を次の計算で使うようなありがちな状況だと、SIMDじゃ一切早くならないのでは?よく知らんけど

257:デフォルトの名無しさん
19/10/01 23:06:54.09 sOAgszt0.net
x86とかも典型的だろ
doubleよりfloatの方が倍速いよ
最近はbfloat16の方がさらに速いまである

258:デフォルトの名無しさん
19/10/01 23:26:39.35 5ranOfZi.net
SIMDで1語で複数のfloat演算を並列にやったら早くなる
しかしコンパイラの最適化が普通はそこまでやってくれない

259:デフォルトの名無しさん
19/10/01 23:28:12.34 DRbEIshC.net
今はfloatのが速い
amd64出てからsse基本なので
昔とは状況が違う

260:デフォルトの名無しさん
19/10/01 23:28:49.51 DRbEIshC.net
>>257
やるけど

261:デフォルトの名無しさん
19/10/01 23:30:04.90 5ranOfZi.net
>>259
やるんか?

262:
19/10/01 23:32:20.09 3zNRBOOL.net
>>253
1個のプログラムの中に一個か二個の float しか使わなくても、 double の場合より速くなるのですか?
そもそもイントリンシックを書かないのに SIMD のコードが出力されるのですか?
私は、コンパイラは fpu のコードしか吐かないじゃないか?って考えています

263:デフォルトの名無しさん
19/10/01 23:37:45.74 KZgN44vw.net
>>261
それはお前の頭が老害だから

264:デフォルトの名無しさん
19/10/01 23:39:09.19 84uW7JaU.net
速さ計測すればいいじゃん
逆アセンブル見ればいいじゃん

265:
19/10/01 23:40:49.69 3zNRBOOL.net
>>262
1個のプログラムの中に一個か二個の float しか使わなくても、 double の場合より速くなるのですか?
そもそもイントリンシックを書かないのに SIMD のコードが出力されるのですか?

266:デフォルトの名無しさん
19/10/01 23:44:09.36 sOAgszt0.net
そもそもx64ではFPUは無かったことにされている
doubleやfloatの計算したかったらSIMDで1レーンだけ使って計算する仕組み

267:デフォルトの名無しさん
19/10/01 23:54:05.20 5ranOfZi.net
>1個のプログラムの中に一個か二個の float しか使わなくても、 double の場合より速く
その条件だとどっちを使っても良い大して変わらん
やっぱループアンローリングできるぐらいループリッチな課題でないと意味が無い
URLリンク(www.isus.jp)
URLリンク(cpplover.blogspot.com)

268:デフォルトの名無しさん
19/10/02 00:10:27.89 eo8nmuYy.net
しかしコンパイラの最適化はイマイチっぽい
URLリンク(www.isus.jp)

269:
19/10/02 07:48:44.41 BafSfR+Q.net
>>265
いいえ x64 でも fpu コードは使えますよ、嘘はやめて!

270:デフォルトの名無しさん
19/10/02 07:54:44.99 Y2eIpMbX.net
>>228
こういうやつって何かしらソフト完成させたこともない初心者のクセしてイキってるんだろ
マジ邪魔だから消えて欲しい
テンプレート使ったコードで遅くなるというのがわからんならboostのspiritとか使ってみたらいいわ
言ってる意味わかるから

271:デフォルトの名無しさん
19/10/02 07:59:03.00 Y2eIpMbX.net
あ、もちろんデバッグビルドの話な
最適化ありならspiritは当然速い

272:デフォルトの名無しさん
19/10/02 08:01:33.95 sddCZQNP.net
C++を使わないと言っているやつに、どうぞご勝手にということと何の関係が?

273:デフォルトの名無しさん
19/10/02 08:22:40.25 QmwKmz4W.net
>>268
でもアセンブラで直接使わないと無かったことにされるだろ

274:デフォルトの名無しさん
19/10/02 08:29:18.29 0zoKeqvU.net
>>261
amd64でfpuコード吐かせるほうが手間じゃwwww

275:デフォルトの名無しさん
19/10/02 08:30:44.39 0zoKeqvU.net
そもそもプログラム中に一個か二個の浮動小数点演算なんて最適化ポイントちゃうがなwwww
自説を通すためにバカな例を仮定するアホに絡むだけ無駄やなw

276:デフォルトの名無しさん
19/10/02 11:21:30.36 iITLzrzf.net
>>272
プロジェクトの設定でfpも選べるよ
既定だとsse使われると思うけど

277:デフォルトの名無しさん
19/10/02 22:05:22.14 VK3sSC9+.net
コンパイラの種類変わったら算術演算ぶん回す場合は結構差が出るだろうけど、同じコンパイラでバージョンかわると最適化とかの進化で結構かわるのかな?
gccの3と4、msvcの2005と2017とかそういう違いで

278:デフォルトの名無しさん
19/10/03 04:57:05.82 vAL7lUst.net
質問です
既にクラスHogeとAがあり
クラスAとは別に新たにクラスBを追加することになった
BはA専用の関数が無く呼び出す必要も無いし逆のことは無い
その場合BにA専用の関数と同じ名前の空の関数を用意するか、呼び出されているHoge内で切り分けるかどちらの方が良いですか?
なおAは絶対に継承しなければならないし改変することもできない
class Hoge : A か class Hoge : Bをプリプロセッサかテンプレートで切り分ける
これを
void Hpge::func() {
  A_func(); //Bは持っていない
}
プリプロセッサで切り分けるのが良いのか
void Hpge::func() {
#if defined(USE_A)
  A_func();
#endif
}

それとも空の関数を書いた方が良いのか
class Hoge : B {
  A_func() {}
}
詳しい方がいたら教えていただきたいです
これ以外の賢いやり方があればそれでも大丈夫です

279:デフォルトの名無しさん
19/10/03 07:04:32.42 damPur2/.net
絶対に、の理由が知りたいところだけど、普通はA_funcを仮想関数にしてBは空関数でオーバーライド。

280:デフォルトの名無しさん
19/10/03 07:05:22.94 OJdSM3QH.net
c++17以降ならif constexprとstd::is_sameでできるんじゃない?
template < typename T >
class Hoge : T{
void func() {
  if constexpr(std::is_same<T,A>){ //基底クラスTがAであればA_func()を実行する
    A_func();
  }
}
}

281:デフォルトの名無しさん
19/10/03 07:12:55.92 OJdSM3QH.net
std::is_same<T,A> じゃなくて std::is_same_v<T,A> か

282:デフォルトの名無しさん
19/10/03 07:31:04.45 5EMHpFEj.net
>>278
HogeがAかBを継承するんだからそれじゃだめやろ
ただ設計見直したいところだけどそういうわけにもいかんのかね

283:デフォルトの名無しさん
19/10/03 07:54:23.64 r73Y/293.net
c++17が使えなくて、Bの定義を関係ないAのために汚染したくないなら一層増やせばいい
template<typename T>
class HogeBase;
template<>
class HogeBase<A> : A {}
template<>
class HogeBase<B> : B { A_func(){} }
template<typename T>
class Hoge : HogeBase<T> { /*...*/ }

284:デフォルトの名無しさん
19/10/03 09:13:02.91 r91xqmRv.net
>>2


285:81 なにか問題起きる?



286:デフォルトの名無しさん
19/10/03 11:57:14.92 z1c5xmGq.net
>>277
基底クラスを切替たいってこと?
しかも片方の基底クラスにしかないメソッドを派生クラス側で呼出すとかどんな状況なんだろう…
まあ、やっつけでやるなら素直にB側に空のメソッド追加しとけばいいと思うよ
どう見てもまともな設計じゃなさそうだし、かと言って設計を見直すこともできなさそうだしね
プリプロセッサなんて愚の骨頂にしかならん

287:281
19/10/03 12:22:59.66 GJuckdYX.net
>>283
A_funcを持つものを継承するならオーバーライドが理想的だろうけど、基底がAかBってことだから無理っしょ
しかもAは書き換えられないときてる
すでに言われてるようにテンプレートで基底を指定させるか単純に空のA_funcを書くか、プリプロセッサか
でもそもそも利用者側がAを使うのかBを使うのか決めるのなら、クラス側で対処せずに利用者がプリプロセッサで分けた方がいいと思う(でないとぐちゃぐちゃになりそう)
それだと修正箇所が多すぎるのかもしれんけど

288:デフォルトの名無しさん
19/10/03 13:00:06.78 t4NBMq8s.net
こんなマトモじゃないケースに
ベストな解答なんかないわな

289:デフォルトの名無しさん
19/10/03 13:00:33.56 YSTER/9m.net
>>284
Qtをdisってんの

290:デフォルトの名無しさん
19/10/03 15:51:04.04 z1c5xmGq.net
まさかと思うがQtを盲信してるのか?w

291:デフォルトの名無しさん
19/10/03 16:04:15.58 LjcEi/T6.net
ちょとっ猛進

292:デフォルトの名無しさん
19/10/03 16:37:32.38 vAL7lUst.net
回答ありがとうございます
プリプロセッサまみれになるより空の関数生やした方が見通しよさそうですね

293:デフォルトの名無しさん
19/10/03 18:04:25.67 SL8wP/0a.net
>>288
え、qt便利じゃん

294:デフォルトの名無しさん
19/10/03 19:00:51.01 BEqWQnsI.net
旧版は知らんけどQt5はかなり良いと思う
不満に思うのはベンチ厨くらいでは

295:デフォルトの名無しさん
19/10/03 19:22:01.27 z1c5xmGq.net
>>291
便利かどうかなんて言ってないのにいきなりどうした?w

296:デフォルトの名無しさん
19/10/03 21:53:13.09 Uq6PP8Ux.net
コンパイル通らないので助けてください。
メンバテンプレートを持つクラスを継承して、派生先からメソッドが呼べません。
一見問題なさそうにはみえるのですが・・・
template<typename _T1>
class A{
public :
template<typename _T2> _T2 get() { return _T2(); };
};
template<typename _T3>
class B : public A<_T3> {
std::string hogehoge() { return A<_T3>::get<std::string>();}
};

297:デフォルトの名無しさん
19/10/03 21:59:37.34 A/fPHEZe.net
>>294 エラーメッセージとか出てないの?

298:デフォルトの名無しさん
19/10/03 22:06:09.67 BrhogHgJ.net
>>294
clangさんが教えてくれた
std::string hogehoge() { return A<_T3>::template get<std::string>();}

299:デフォルトの名無しさん
19/10/03 22:13:42.78 Uq6PP8Ux.net
ありがとうございました。
通りました。
つか、そんなtemplate文の使い方初めて知った・・

300:デフォルトの名無しさん
19/10/03 22:31:15.90 zkquM/gX.net
この場合Aがテンプレートなので、Aの先のgetが何者かコンパイラは判断つかないので
"<" が比較演算なのかテンプレートのかっこなのか判断つかないから
らしい
clangは教えてくれるんだから判断ついてるわけだが・・・
まったく醜い文法を持った言語だよ

301:デフォルトの名無しさん
19/10/03 22:49:50.59 BrhogHgJ.net
この場合のエラーメッセージ、GCCはほんとに何言ってるのか分からないのを出すのでclang様様

302:デフォルトの名無しさん
19/10/04 01:11:35.70 gSpEwnzq.net
C++テンプレートのプログラミングでのエラーを読み解く訓練をしているうちに
実世界での初心者が投げてくる質問へのエスパー力がやしなわれる
これ豆

303:デフォルトの名無しさん
19/10/04 02:30:32.92 gpJXYiEy.net
そのうちエラーメッセージを見ずにエラーを修正できるようになる

304:デフォルトの名無しさん
19/10/04 02:54:08.89 P4b1n6up.net
ちなVC2015か2017か忘れたけど、一時期までのVCは
その場合のtemplateを書くと逆にエラーにされてた

305:デフォルトの名無しさん
19/10/04 03:18:41.39 I4catYuR.net
goで変数用いて
*******
*****
***
*
***
*****
*******
って出力するにはどうすりゃいいのっと

306:デフォルトの名無しさん
19/10/04 03:19:28.61 I4catYuR.net
あ、↑のは砂時計みたいな形にしたい

307:蟻人間
19/10/04 04:12:53.14 NaWoGk/Z.net
>>303
二重のループか仮想画面

308:デフォルトの名無しさん
19/10/04 04:19:18.14 I4catYuR.net
>>305
申し訳ないが初心者ゆえ、数字の二重ループはできるけどそれを文字列にする仕方がわからず

309:デフォルトの名無しさん
19/10/04 05:45:45.52 jwb6jSs+.net
goスレ行け

310:デフォルトの名無しさん
19/10/04 08:20:48.47 FzFdUbJu.net
>>298
なぜか偶然ですが、このスレを見る前から昨日からその辺に関係するパーサーを
作っていて悩んでいたところなんですが、
多くの言語では、+,-,*,/,<,> などの演算子が混ざったいわゆる「数式」は文脈に依存せずに
上位のコンパイル作業に入る前に、いったん「数式ツリー」に直すことが出来ます。
ここで「文脈に依存せず」というのは、変数名、関数名、型名などの宣言情報を
調べなくても済むという(いわゆる意味解析の結果の情報を必要としないと言う
)ことです。
ところが、template機能が入った後のC++では、A<B と書いたとき、
< がテンプレートの記号なのか比較演算子なのかは A がテンプレート名であるか
どうかによって決まります。
Bが型名であることが明確な場合には文脈によらず < はテンプレート記号だと断定
できます。ところが、Bに 1, 456, 3.1415 のような数値や、"Hello" などの文字列
が来ている場合には、(その場では)判断が付きません。
文脈に依存せずに判断を付けたいなら、もっと先まで呼んで、< に対応する >
があるかどうかを調べるといける可能性があります。
1. "<"に対応する">"が存在するかどうか調べれば、これまでの宣言情報を使わなくても
 トークン・ツリーを作ることが出来る。トークン・ツリーと言ったのは、数式とは
 限らないからです。例えば、A<B> x[100]; などとすることがありますが、A<B>
 は型名であり、数式では有りません。ただし、他の多くの言語では数式ツリーは
 作ることが多いのですが、トークン・ツリーはまず作りません。
2. 1の方法を使わないなら、宣言情報を調べて、Aがtemplate名であるかどうかを調べる
 必要がある。ところが、Q::A<B> などのような場合があるので、そんなに
 単純な作業でく、Q::A が型名なのか、変数名なのかはちゃんと調べる必要がある。

311:デフォルトの名無しさん
19/10/04 08:25:56.64 FzFdUbJu.net
>>308
補足
「Bが型名であることが明確な場合には文脈によらず < はテンプレート記号だと断定
できます。」
の部分ですが、B<CPerson(実引数列) などとした場合、CPersonは型名ですが、
CPerson(実引数列) 全体は、型名ではなくCPersonクラスの引数つき
コンストラクタを呼び出した結果の「一時オブジェクト」です。なので、
Bが変数名の場合は、< は比較演算子の可能性があります。

312:デフォルトの名無しさん
19/10/04 08:33:37.62 FzFdUbJu.net
>>308
誤:なぜか偶然ですが、このスレを見る前から昨日からその辺に関係するパーサーを
正:なぜか偶然ですが、このスレを見る前の昨日からその辺に関係するパーサーを
誤:文脈に依存せずに判断を付けたいなら、もっと先まで呼んで、< に対応する >
正:文脈に依存せずに判断を付けたいなら、もっと先まで読んで、< に対応する >
誤:単純な作業でく、Q::A が型名なのか、変数名なのかはちゃんと調べる必要がある。
正:単純な作業ではなく、Q::A がtemplate名なのか、変数名なのかはちゃんと調べる必要がある。

313:デフォルトの名無しさん
19/10/04 08:37:14.54 P4b1n6up.net
>>225
>>224=228や>>226=219みたいなどうみても初心者なヤツにプロが敬語使う必要ないと思うよ
C++スゲー=俺スゲーみたいな明らかにプログラミングに向いてない精神構造のクソバカが多く居るからねここ

314:デフォルトの名無しさん
19/10/04 08:41:34.48 FzFdUbJu.net
>>306
一般論として、文字列の長さを len として、文字列型の変数を str としたとき、
for ( len 回のループ ) {
 str = str + "*"
}
で行けます。

315:デフォルトの名無しさん
19/10/04 09:33:34.23 8yIxxMU3.net
>>311
ようクソバカ

316:デフォルトの名無しさん
19/10/04 09:41:54.97 P4b1n6up.net
>>313
すまんな図星だったか?
邪魔だから出てけよ

317:デフォルトの名無しさん
19/10/04 11:43:51.24 FzFdUbJu.net
>>308
C++言語をパースする方法として、結論的には、2.ではダメで、1.でなくてはならないようです。例として、A<実引数列>::B の場合を考えると、template は実体化する
際の実引数によって展開される内容は大幅に変わりますので、
A<int>::B とした場合には、B は template 名で、
A<string>::B とした場合には、B は変数名であることもありえます。すると、
A<int>::B<C> の場合の B<C> は template 実体化ですが、
A<string>::B < C の場合は、変数B と変数 Cに対しての比較演算となります。
なので、もし、>>308 の 2.のやり方でパース使用とすると、Aがtemplate名であると
分かっただけでは B が「何なのか」を結論付けるには不十分で、A<実引数列>の
実引数列をほとんど完全に調べ上げてから、その方名に応じた template A の
定義を探して template の overload 解決をしてから、A<実引数列> 部分(のclass)を
完全に「特定」する必要があります。ここまでやるとなると、コンパイラの層分けが
上手く出来ないことになります。

318:デフォルトの名無しさん
19/10/04 12:03:58.19 FzFdUbJu.net
>>315
A::B くらいの場合なら、意味解析の情報だけを元に、Bが何なのかを特定をすることは
可能です。ところが、A<1+2,decltype(x*y)>::B の様な場合、x, y の意味論的な型
を調べた後、x*yに適応可能な operator*() 関数が定義されて言うかどうかも調べ、
定義されていれば、その戻り値の型を調べてx*y の型として、A<・・・> の部分が
結局何なのかを特定しなくてはなりません。今述べた x*y の部分の処理は、
トークン解析層(?)より上位のコンパイル層で行う処理です。なのでこのやり方
だと、コンパイラ内部の「層」の切り分けが難しくなります(技術的に不可能な
わけではありませんが。)。

319:デフォルトの名無しさん
19/10/04 12:07:27.45 FzFdUbJu.net
>>315
誤:なので、もし、>>308 の 2.のやり方でパース使用とすると、Aがtemplate名であると
正:なので、もし、>>308 の 2.のやり方でパースしようとすると、Aがtemplate名であると
誤:実引数列をほとんど完全に調べ上げてから、その方名に応じた template A の
正:実引数列をほとんど完全に調べ上げてから、その型名に応じた template A の
>>316
誤:を調べた後、x*yに適応可能な operator*() 関数が定義されて言うかどうかも調べ、
正:を調べた後、x*yに適応可能な operator*() 関数が定義されているかどうかも調べ、

320:デフォルトの名無しさん
19/10/04 12:36:35.66 cK/f4a5x.net
>>312
ありがとうございます!
やってみます

321:デフォルトの名無しさん
19/10/04 12:41:17.15 G1/ISgxb.net
c++って文法に曖昧さがないことどうやって保証してんだろ
形式的なアプローチ無理だと思うんだが

322:デフォルトの名無しさん
19/10/04 13:05:22.64 MVQV/kgg.net
いや、そんな保証は端っから諦めてるだろ
引数なしの関数宣言とデフォコン呼び出しの曖昧さなんか
長年放置してたのをC++11でようやく対応したし
関数ポインタにキャストするoperatorはtypedef使えとか
言語としての完全性なんか重視してない

323:デフォルトの名無しさん
19/10/04 13:28:40.80 FzFdUbJu.net
>>319
曖昧さはあるといわれています。例えば、CPersonというクラスがあったとき、関数内で
CPerson person();
と書いた場合、person という名前で、戻り値の型が CPerson の関数のプロトタイプ宣言なのか、
CPerson クラスの person という変数名(オブジェクト名)の定義なのかの曖昧さがあります。
後�


324:メは、CPerson person("name", 25, MALE); などと同じ系統で、実引数が全く無い場合 に相当します。 また、template class の場合に、 A<B<・・・>> と書くと、>> が右シフト演算子に解釈されてしまうので、回避するために空白を1つ入れて A<B<・・・> > としなければならなかった(過去形)時代も有ります。 しかし、パーサーを作る側からすれば、">>" を ">" 2個 だと解釈するのはかなり大変な 労力が必要でです。 また、x < y を比較演算のつもりで A< x < y > などと書くと、A<・・・> の中に x という template class 名に対しての x<y> が入っていると解釈 されてしまい、> が足りないというエラーになるかもしれません。 回避するには、 A< (x < y) > と書くと良いと思われます。



325:デフォルトの名無しさん
19/10/04 14:48:30.02 D8qarNFk.net
C++というより3Dプログラミングの質問で申し訳ないのだけど、
行列ライブラリglmの以下のコードがbugってる気がするので詳しい人がいたら確認して欲しい。
template<typename T, qualifier Q>
GLM_FUNC_QUALIFIER qua<T, Q> rotate(qua<T, Q> const& q, T const& angle, vec<3, T, Q> const& v)
{
vec<3, T, Q> Tmp = v;
// Axis of rotation must be normalised
T len = glm::length(Tmp);
if(abs(len - static_cast<T>(1)) > static_cast<T>(0.001))
{
T oneOverLen = static_cast<T>(1) / len;
Tmp.x *= oneOverLen;
Tmp.y *= oneOverLen;
Tmp.z *= oneOverLen;
}
T const AngleRad(angle);
T const Sin = sin(AngleRad * static_cast<T>(0.5));
return q * qua<T, Q>(cos(AngleRad * static_cast<T>(0.5)), Tmp.x * Sin, Tmp.y * Sin, Tmp.z * Sin);
}
クオータニオンqをベクタ軸v周りにAngleRad回転させる関数のソースらしいんだが、
最後の行掛け算の順番が逆のような気がする。
qua<T,Q>(...) * qが正解だと思うんだ。
glmはファイル構成がバージョン間で結構派手に変更されてるんで、
最近のバージョンではext/quaternion_transform.inlに上のコードが含まれてる。
古いバージョンではgtx/quaternion.inlにあったような気がする。

326:デフォルトの名無しさん
19/10/04 14:55:11.92 FzFdUbJu.net
>>322
あるライブラリでのq1 * q2 という書き方が、q2 * q1
がどういう意味に解釈されるかは、

327:デフォルトの名無しさん
19/10/04 15:01:05.28 FzFdUbJu.net
>>322
(>>323 は誤投です。)
あるライブラリでの q1 * q2 という書き方が、別のライブラリでは
q2 * q1 と等価なことが有り得て、それはベクトルや行列計算全般に
言える記法の違いなのでこのソースだけではなんとも言えない。
ベクトルの場合、成分表示を1列の縦行列と考えるか1行の横行列
と考えるかによって、賭け全の左右が逆さまになる。
その結果、成分表示で書かない表記も、左右どちらかで書くかは
好みの問題となる。
特に Quaternion の場合も同様。

328:デフォルトの名無しさん
19/10/04 15:02:02.33 FzFdUbJu.net
>>324
誤:と考えるかによって、賭け全の左右が逆さまになる。
正:と考えるかによって、掛け算の左右が逆さまになる。

329:デフォルトの名無しさん
19/10/04 15:45:42.88 P4b1n6up.net
OpenGL系は縦ベクトルだね
D3Dを前提にしたライブラリとは逆になる(行列も転置

330:デフォルトの名無しさん
19/10/04 15:58:00.91 FzFdUbJu.net
>>326
数学や物理学では縦ベクトルが多いが、D3Dはそれに従ってない。

331:デフォルトの名無しさん
19/10/04 16:08:07.51 JXWhYfPM.net
テンプレが糞だと思う瞬間はいくつもあるが
その一つはネストしてるときの閉じ括弧
>> じゃだめで > > ってわざわざ分けないといかんうざい

332:デフォルトの名無しさん
19/10/04 16:08:35.30 P4b1n6up.net
>数学や物理学では縦ベクトルが多いが、D3Dはそれに従ってない。
みたいだね
D3Dからそれ以外に移るとみんなここで引っかかるけど
実は行列周りは(大文字は行列として)
OpenGLに合わせるとA*B*C*xとなるのを
D3Dではx*C*B*Aと書けた方が、左からの計算が全部結果がベクトルなので計算量が減るというメリットはある
MSはC++での書きやすさと効率を考えたのかもしれない

333:デフォルトの名無しさん
19/10/04 16:09:02.58 JXWhYfPM.net
>>326-327
縦横ってより右から掛けるか左から掛けるかだと思ってた
意味は一緒なんだろうけど

334:デフォルトの名無しさん
19/10/04 16:11:58.82 P4b1n6up.net
>>328
C++11からは連続して書けるようになったで

335:デフォルトの名無しさん
19/10/04 16:14:31.61 MVQV/kgg.net
C++03いやC++98?のまま更新止まってるやつ
俺が想像するより遙かに多いのかもしかして
もうC++11でさえ要注意な旧規格になってるんだが

336:デフォルトの名無しさん
19/10/04 16:16:30.52 JXWhYfPM.net
>>329
メモリ上の順序も変わるぞ
SIMDとかで計算されるときの効率にも影響する
必ずしもD3D(横ベクトル方式)が高速化に都合が良いとは言えないんじゃないか
行列の各要素のメモリ上の並びって
glの行列AとD3Dの行列A'はいちいち転置しなくても結局同じになるんだっけ

337:デフォルトの名無しさん
19/10/04 16:22:07.03 P4b1n6up.net
ああ確かにメモリの中身は同じだった
格納方式も違うから結果的に同じになるんだよね
そこが余計ややこしい

338:デフォルトの名無しさん
19/10/04 16:29:39.34 FzFdUbJu.net
>>329
行列計算は、縦ベクトル方式、横ベクトル方式でも、(それぞれで)「結合則」があるので、
A*B*C*x = A*(B*(C*x))
でもあり、
A*B*C*x = ((A*B)*C)*x)
でもあり、どっちで計算しても結果は同じになる。
また、3D計算の場合、点の座標がいくつあっても、行列を一度計算しておくと、
使いまわしできるので、先に行列の方を計算しておいて、最後に座標の変換
を行うと、点が2個以上あるときには効率が高い。

339:デフォルトの名無しさん
19/10/04 16:31:49.50 FzFdUbJu.net
>>332
C++98くらいから、実際問題上使いたくない機能ばかりが追加されるような
傾向があったのに、Upgrade 版は適用外になったりしたりして買う機を逃した。

340:デフォルトの名無しさん
19/10/04 16:38:53.10 FzFdUbJu.net
>>329
>MSはC++での書きやすさと効率を考えたのかもしれない
>>335 に既に書いたけど、OpenGL 形式でも、右結合でも、
左結合でも、好きな方で計算は出来る。だから、行列部分を
先に計算しても良いし、座標部分から計算しても良い。
座標部分から計算していくと一見計算量が減るように思える
かも知れないが、点の個数が多くなると、一度だけ行列部分の
積を予め計算しておいて、その結果を全ての点の変換部分に
遣うと効率が劇的に向上するので、むしろ、効率が良いのは逆。

341:デフォルトの名無しさん
19/10/04 16:40:53.55 P4b1n6up.net
>>335
確かに(OpenGLでも上で書いたような式が使えるライブラリ使うとして)括弧でくくったりして優先順位変えればいいし
言う通り行列はまとめればいいんだけど
どちらにもメリットデメリットあると言いたかった

342:デフォルトの名無しさん
19/10/04 16:51:20.07 FzFdUbJu.net
>>338
実は、アメリカで有名な 3D Graphics の本が、横ベクトル方式を採用していた
事が関係しているかもしれない。要はその本が数学や物理の標準とは何故か
逆の記法を採用していたということ。

343:デフォルトの名無しさん
19/10/04 17:00:49.77 FW+Y/3wm.net
>>337
GL
(A*B*C)*(x0(縦),x1(縦),x2(縦),x3(縦), ... , xN(縦))(横)
D3D
(x0(横),x1(横),x2(横),x3(横), ... , xN(横))(縦)*(C*B*A)
が最速やね

344:
19/10/04 19:54:25.76 5CiM54x6.net
>>335
行列って結合則は約束されてましたっけ?

345:デフォルトの名無しさん
19/10/04 20:17:27.71 gZky9oRw.net
当たり前だろ。
そんなレベルの知識しかないからフォントライブラリ書けないんだよ

346:
19/10/04 20:27:59.81 5CiM54x6.net
>>342
では証明してください(キリッ)

347:デフォルトの名無しさん
19/10/04 21:24:32.75 FzFdUbJu.net
>>343
ベクトル部分はおいておくとして、まず正方行列の部分だけに限定すれば
A(BC)=(AB)C  ・・・(1)
が証明できれば どんな場合でも結合側が成り立つことが数学的帰納法で
証明できます。なので、A,B,C が正方行列の時に(1)を証明すれば全体の証明が
ほぼ終わります。
【(1)の証明】
行列の積の定義により
 (AB)ij=Σ_{k=1}^n A_{ik} B_{kj}  ・・・(2)
です。なので、
{(AB)C}mn = Σ_l(AB)_{ml}C_{ln}
     = Σ_k Σ_l A_{mk} B_{kl} C_{ln} ・・・(3)
です。全く同様に、
{A(BC)}mn = Σ_k A_{mk} (BC)_{kn}
     = Σ_k A_{mk} Σ_l B_{kl} C_{ln}
     = Σ_k Σ_l A_{mk} B_{kl} C_{ln} ・・・(4)
となり、(3), (4) が一致することから、
 {A(BC)}mn = {(AB)C}mn
が言えます。これが (1) に他なりません。    (Q.E.D)
次に、このように3つの行列の場合ではなく、一般の個数の行列の場合、
最初に書いたように数学的帰納法を使います。それは、あなた自身で
お考えください。考える力の練習になります。

348:デフォルトの名無しさん
19/10/04 22:10:52.87 cDY60lSZ.net
doubleの値を++aした時にaの値は+1と規定されてる?

349:デフォルトの名無しさん
19/10/04 23:19:26.96 FzFdUbJu.net
>>345
boolen型以外では、++x は正確に x+=1 と等価です。
x+=1 は、正確に x = x + 1 と等価です。x がポインタ型の場合は、
BYTE 単位で見ると object size 単位で増加しますが、double/float/int/short/char
などの「算術型」の場合は、単純に 1 が足されるだけです。

URLリンク(en.cppreference.com)
For non-boolean operands, the expression ++x is exactly equivalent to x += 1, and the expression --x is exactly equivalent to x -= 1, that is, the prefix increment or decrement is an lvalue expression that identifies the modified operand.

350:デフォルトの名無しさん
19/10/04 23:36:52.32 NJj/Utu/.net
>>346
ありがとうございます。
という事はキャストの時におかしくなっているのかな?
aの値は0.0~100.0程度
for(double i = a; i < 1000.0; ++i){
std::cout << (int)i << "," << std::endl;
}
期待している結果: 1,2,3,4,5...と連番になる
たまに起こる結果: 1,2,3,5,6...と歯抜けになる

351:デフォルトの名無しさん
19/10/04 23:42:33.92 8yIxxMU3.net
丸められただけでは

352:デフォルトの名無しさん
19/10/04 23:55:23.10 YWySipM2.net
>>341-344
また5ch名物のしょーもない煽り煽られの流れかとおもったら
ちゃんと勉強になる流れでワロタ

353:デフォルトの名無しさん
19/10/05 00:03:15.79 bnoeYdBm.net
行列の結合則なんて高校で習っただろ
線形代数わからないプログラマって生き残れないと思うわ

354:デフォルトの名無しさん
19/10/05 00:05:26.41 KADe2ROY.net
>>347
・そのコードは、完全に上記の通りですか?
例えば、ループ回数が1000回より遥かに多くなると、
誤差の都合でそうなることがあるかもしれませんが、1000回くらい
だと、正しい処理系ではその現象は起きないはずです。

355:デフォルトの名無しさん
19/10/05 01:17:38.13 d5aP5JOP.net
キャストする前にlround呼んだらええんちゃうん。

356:デフォルトの名無しさん
19/10/05 01:44:04.24 VkhEKreX.net
(0.2+0.3)+0.4 == 0.2+(0.3+0.4)の結果がfalseになるのは正しいの?

357:デフォルトの名無しさん
19/10/05 01:54:00.97 Lbi5NeET.net
浮動小数点を勉強しておいで

358:デフォルトの名無しさん
19/10/05 02:07:17.64 5hJZ4CgN.net
有効数字1桁の計算で誤差は生じない

359:デフォルトの名無しさん
19/10/05 07:04:22.03 UfPJq4d2.net
10進の0.1を2進表現すると循環小数定期
>>355
バカ乙

360:デフォルトの名無しさん
19/10/05 08:03:13.32 9T2eUTn8.net
>>336
本当、人って色々だな
俺はC++98は未完成感があまりに強くて続きはまだかと待ちかねていた
具体的には例えば右辺値参照だ
一時オブジェクトにいちいちconstがつくのがイヤでイヤで待望のやつがやっと来た

361:デフォルトの名無しさん
19/10/05 08:28:45.86 iS4eZEWC.net
>>337, >>340
ちょっと誤解招くのでやっぱ突っ込んでおくけど、
多数のベクトルを変換するのに行列をまとめておかないと無駄になるのはどっちの方式でも同じだよ
俺が言ったのは(少なくとも同一の行列が)一度限りしか出てこない場合の話
まぁそれを最適化する必要があるのか、またそういう処理を大量にループするなら最適化の方法は他にあるだろうけど
>>333
GL方式でも列優先だから結局d3dと同じ無駄はあるんやで
最近のは知らんけど

362:デフォルトの名無しさん
19/10/05 08:49:33.11 KADe2ROY.net
>>353
計算誤差です。
(0.2+0.3)+0.4 == 0.2+(0.3+0.4) が偽になっても
(0.2+0.3)+0.4 == (0.2+0.3)+0.4 や
0.2+(0.3+0.4) == 0.2+(0.3+0.4)
は必ず真になることが保障されています。

363:デフォルトの名無しさん
19/10/05 08:55:38.66 KADe2ROY.net
>>359
コンピュータにおける浮動小数点は、内部表現は10進数ではなく2進数
で表現されており、有効桁数は 10 進数で 8 桁や 15桁などではなく
2進数で xx BIT という風になっています。
0.2, 0.3, 0.4 は、10進数だと、有効桁数が1桁でも完全に区切れが
よく表現できていますが、2進数の表現だと厳密には無限小数になってしまい、
どんなに有効桁数を長くしても厳密には表現できません。そのため計算誤差
が生じるのです。0.5 や 0.25 や 0.125 は 2 進数でも区切れ良く表現できるため、
 (0.125+0.25)+0.5 == 0.125+(0.25+0.5)
は誤差が生じることがないため、必ず真になるはずです。

364:デフォルトの名無しさん
19/10/05 10:06:32.18 e1uvrqu3.net
>>360
浮動小数の計算誤差を考慮して比較する時にstd::abs(a-b) < std::numeric_limit<double>::epsilon()というふうにするのはどう思う?

365:デフォルトの名無しさん
19/10/05 11:34:20.93 KADe2ROY.net
>>361
誤差の量が計算の順序や書き方によって変わってくるので、
そのようなヘッダに書かれているような誤差定数を使うことは
余り意味がありません。

366:デフォルトの名無しさん
19/10/05 11:37:49.72 7pdQvekm.net
実用数学

367:デフォルトの名無しさん
19/10/05 11:43:08.23 rY1OpV0v.net
>>361
機械イプシロンはそういうふうに使うものじゃない

368:デフォルトの名無しさん
19/10/05 12:09:22.39 uol03Q2n.net
cpprefjpが>>361と全く同じ間違いしてたわ馬鹿が湧くのはこいつのせいか
cppreference.comは正しかったからそっち見れ

369:デフォルトの名無しさん
19/10/05 12:34:57.85 dFaPF8AB.net
>>365
x-yの元になっているxやyがどのような計算過程を経てきたかわからないのに
 std::abs(x-y) <= std::numeric_limits<T>::epsilon() * std::abs(x+y) * ulp
でxとyがalmost equalsと言い切ってよい根拠とは、
ちゅか常識的に考えて、x、yがそれぞれ±e、±gの誤差を有するなら
 std::abs(x-y) <= std::numeric_limits<T>::epsilon() * (std::abs(e) + std::abs(g))
あたりの判定に落ち着かねばおかしい(これで正解とは言っていない
なんでstd::abs(x+y)みたいな場合によっては莫大な値になりえる係数を掛けねばならないの?

370:デフォルトの名無しさん
19/10/05 13:04:02.75 rY1OpV0v.net
イプシロンに誤差を掛けても意味ない。
つか、許容誤差の絶対値が与えられているならイプシロン使う必要もない。
cppreference.comのは許容誤差をULP単位で与える場合のやりかたで、
abs(x+y)はxとyの指数のうち大きい方を意味するものだったはず。

371:デフォルトの名無しさん
19/10/05 13:12:59.71 uol03Q2n.net
>>366
なんか色々根本的に勘違いしてる
cppreference.comのalmost_equal関数の仕事はあくまで与えられたxとyがalmost equalかどうかの判定だよ
> x、yがそれぞれ±e、±gの誤差を有するなら
なにこれ?「誤差」って何に対する何の誤差?

372:デフォルトの名無しさん
19/10/05 13:28:00.03 dFaPF8AB.net
>>367
>イプシロンに誤差を掛けても意味ない。
>つか、許容誤差の絶対値が与えられているならイプシロン使う必要もない。
左様ですなスマンカッタorz
>>368
>なにこれ?「誤差」って何に対する何の誤差?
真の値に対する誤差じゃわパオーン
真の値に対する誤差に依存しないalmost equal判定とか、使いどころはきわめて限定されるはず、

373:デフォルトの名無しさん
19/10/05 14:05:34.77 dFaPF8AB.net
>abs(x+y)はxとyの指数のうち大きい方を意味するものだったはず。
xが (xの符号)×1.bbbb...×2^m
yが (yの符号)×1.cccc...×2^n
だとしたときに、m>nだとすると
 x + y =
 { (xの符号)×1.bbbb... + ((yの符号)×1.cccc...×2^-(m-n)) } ×2^m
として計算されるのでだいたい2^m(x≒yなら2^(m+1))という意味か左様か、

374:デフォルトの名無しさん
19/10/05 14:08:05.45 dFaPF8AB.net
んまーulpをxとyの来歴に応じて調整すべき量とするなら
cppreference.comのalmost_equal関数は理解してやらないでもない

375:デフォルトの名無しさん
19/10/05 16:03:17.50 NXndjuW4.net
だれか、俺に分数を教えてくれないか?
足し算と引き算がマジ解らなくなってるんだ。
URLリンク(ideone.com)
一番のネックはネガフラグの扱い。
マイナスとプラスの反転演算でどうかくとスマートだろうか。
だれか教えてプリーズ。

376:デフォルトの名無しさん
19/10/05 16:21:25.21 bnoeYdBm.net
分子に符号もたせりゃいいだろ

377:デフォルトの名無しさん
19/10/05 16:25:36.94 NXndjuW4.net
>>373
え、それでよかったっけ?

378:デフォルトの名無しさん
19/10/05 16:34:31.54 hwiNAqBO.net
>>350
今習わないよ
俺の時でも選択

379:デフォルトの名無しさん
19/10/05 17:18:56.47 NXndjuW4.net
一応以下のような感じになった。Thx!
URLリンク(coliru.stacked-crooked.com)

380:デフォルトの名無しさん
19/10/05 17:19:54.63 NXndjuW4.net
URLリンク(coliru.stacked-crooked.com)
こっちだった。Orz
んじゃ。

381:デフォルトの名無しさん
19/10/05 17:28:26.58 QHD8CUaF.net
>>377
1. constexprにしてもいいんじゃない?
2. 出力関数作成しよう
template<typename Char>
std::basic_ostream<Char>& operator<<(std::basic_ostream<Char>& os, const Fraction& frac){
return os << frac.GetNumerator() <<'/'<<frac.GetDenominator();
}

382:デフォルトの名無しさん
19/10/05 19:08:43.36 NXndjuW4.net
>>378
1.できなくはない。機械的に接頭語つけるだけでいいよね。
2.暇だから作るわ。
行ってきまーす。

383:デフォルトの名無しさん
19/10/05 19:46:54.47 NXndjuW4.net
URLリンク(ideone.com)
ただいまー。イデオンで動かせるようにした。Gcdがバグってないといいなぁ。
あとvc2019では意味不明なエラーで動かない。

384:デフォルトの名無しさん
19/10/05 19:58:28.51 NXndjuW4.net
フィードバックハブに投げておいた。

385:デフォルトの名無しさん
19/10/06 10:28:58.03 yc9LKsYB.net
>>380
マルチ禁止

386:デフォルトの名無しさん
19/10/06 13:42:53.69 bPt7YQEe.net
>>382
ソーリー。

387:デフォルトの名無しさん
19/10/07 19:17:43.20 PHxdOQnu.net
C++ってなんでヘッダファイルいるんですか
最近マシン早いんだし
全部ソースに書いてインポートすればいいのに

388:デフォルトの名無しさん
19/10/07 19:38:58.27 Xs+XlBV4.net
やれば?(クレヨンしんちゃん風に)

389:デフォルトの名無しさん
19/10/07 19:52:54.51 9pxPpXZa.net
来年まで待ってね

390:デフォルトの名無しさん
19/10/07 20:58:42.59 A3KSW75p.net
>>384
むしろソースがいらなくて全部ヘッダに書けばいい
inline変数とかもできるようになったことだし

391:デフォルトの名無しさん
19/10/07 21:05:07.29 8FnUNDHt.net
>>387
たまに趣味で何でもかんでもtemplateでゴリゴリ実装してるとガチでそれになるww

392:デフォルトの名無しさん
19/10/07 21:26:10.24 YMM6HSZT.net
>>385
ヤレばデキるは魔法の言葉

393:デフォルトの名無しさん
19/10/08 09:06:39.07 xr4jQIWZ.net
プリコンパイルヘッダーって使ってます?
使っているプロジェクト見たことないですわ。

394:デフォルトの名無しさん
19/10/08 20:03:58.69 kGAGzuS0.net
>>387
こういう馬鹿野郎が出てくるからメタプロとかテンプレ好き連中ってのは嫌いなんだよ。

395:デフォルトの名無しさん
19/10/08 21:04:41.31 OCfPMe68.net
C++なんて趣味でやってるんだからテンプレ好きでもええやん

396:デフォルトの名無しさん
19/10/08 21:16:41.69 /kdim2Vo.net
出てくることの何が嫌なんだろうか
はっきり言って病気だ

397:デフォルトの名無しさん
19/10/08 21:42:59.95 lGNioH0G.net
headerオンリーってのは可搬性に優れた良いものだろ
特にテンプレート多用している奴は、一部関数だけソースファイル分離する意味が薄い

398:デフォルトの名無しさん
19/10/08 21:43:38.32 asJ1ctJB.net
>>391
どんなものにだって馬鹿は出てくるだろうに

399:デフォルトの名無しさん
19/10/08 21:54:07.26 J87hrB1p.net
「全部ヘッダ」と言われると、そのときの「ヘッダ」の定義がどういうものなのか気になる。

400:デフォルトの名無しさん
19/10/08 21:57:19.52 EwyBASw5.net
趣味でやってる人は全部ヘッダでいいと思う

401:デフォルトの名無しさん
19/10/08 22:09:52.63 tSj7di+z.net
>>390
VCのやつは使いまくり
依存するライブラリのヘッダファイルを標準のやつもソリューション内のやつも全部まとめて
stdafx.hの中でインクルードしたらことのほか便利
ただし同じプロジェクトのヘッダファイルを入れだしたら目的を見失って氏ぬ

402:デフォルトの名無しさん
19/10/08 22:10:50.35 hpLG4xMo.net
テンプレート関数は便利だしconstexpr関数は市民の義務だし
結局ほとんどヘッダファイルに書くことになるでしょ

403:デフォルトの名無しさん
19/10/08 22:30:34.35 X4FGjRpd.net
初心者ですが質問させてください
print(1, 3.14, "abc");とやると引数の中身を順番にスペース区切りで出力してくれるような関数は
可変引数テンプレートの再帰呼出しを使うと便利にできることを知りました。
そこで引数の型に応じて出力の見た目を少し変えたいのですが、
関数の特殊化をすればいいですか?
typeidだと動的な評価になってしまうんですよね?

404:デフォルトの名無しさん
19/10/08 22:33:59.15 kGAGzuS0.net
予想通りの馬鹿回答で笑ってしまった。
やっぱいい判別になるわテンプレバカ。

405:蟻人間
19/10/08 22:37:33.87 jfG+k1ni.net
>>400
引数一つに対するテンプレート関数を作って特殊化してそれに少しずつ渡せばできるよ。

406:デフォルトの名無しさん
19/10/08 22:42:38.66 /kdim2Vo.net
C++嫌いなのにいつまで居座るんだろうなこのガイジ

407:デフォルトの名無しさん
19/10/08 22:57:34.25 HxNAD6ah.net
好き嫌いの問題じゃねーんだわ

408:デフォルトの名無しさん
19/10/08 23:04:05.43 /kdim2Vo.net
こんな雑談スレ好きな奴以外に需要ないだろ
こんな辺境別に見なくて良いんだよ?

409:デフォルトの名無しさん
19/10/08 23:08:13.69 hpLG4xMo.net
>>400
c++17以降ならif constexprとstd::is_same_vの使用を検討してみるのもいいかも

410:デフォルトの名無しさん
19/10/09 04:08:22.18 NmoqHfbB.net
400です。頑張ってみましたがどうにもコンパイルエラーが出ます
難しいですねC++は...
void print() {}
template<class... Args>
void print(const char* c, Args... args) {
cout << "[" << c << "]" << endl;
print(args...);
}
template<class First, class... Args>
void print(First first, Args... args) {
cout << first << endl;
print(args...);
}
int main() {
print(1, 3.14, "abc");
return 0;
}

411:デフォルトの名無しさん
19/10/09 04:17:51.46 NmoqHfbB.net
あ、こういうふうにするとコンパイルできました。引数2個の関数を特殊化したからエラーになった?
テンプレートの展開のされ方がよくわからないけど、とりあえず目的のことはできました
ありがとうございました
void print(const char* c) {
cout << "[" << c << "]" << endl;
}
template<class T>
void print(T t) {
cout << t << endl;
}
template<class First, class... Args>
void print(First first, Args... args) {
print(first);
print(args...);
}

412:デフォルトの名無しさん
19/10/09 04:21:52.30 NmoqHfbB.net
>>406
いわゆる型特性というやつでしょうか?enable_ifを使うのかと思い試したもののうまくいかず、
ネットで調べるとenable_ifと可変引数テンプレートは相性が悪いという意見を見つけたり...

413:デフォルトの名無しさん
19/10/09 07:02:07.47 8qv563yz.net
>>409
if constexprを使った例はこんな感じ
template<class First, class... Args>
void print(First first, Args... args) {
if constexpr(std::is_same_v<First, const char*>){
std::cout << "[" << first << "]" << std::endl;
} else {
std::cout << first << std::endl;
}
if constexpr(sizeof...(args)>0){
print(args...);
}
}

414:デフォルトの名無しさん
19/10/09 10:59:59.89 RbUf+g7C.net
const char * 自体も class First や class Args と一致するんじゃね

415:デフォルトの名無しさん
19/10/09 21:59:58.44 8qv563yz.net
First と Argsの二つがあるのがややこしい場合は畳み込み式でもできるぞ
template<class... Args>
void print(Args... args){
  ([](auto t){
    if constexpr(std::is_same_v<decltype(t), const char*>){
      std::cout << "[" << t << "]" << std::endl;
    } else {
      std::cout << t << std::endl;
    }
  }(args), ...);
}

416:デフォルトの名無しさん
19/10/09 22:42:32.58 J+0BhmRu.net
win系のOSの画面に1.txt~5.txtがあります。1.txtと2.txtをドラッグして選択したとします。
この状態で3.txt~5.txtを選択したことにするにはどのようなコードを書けば良いですか?

417:蟻人間
19/10/09 22:52:59.82 bPxMjWa1.net
>>413
ListView_SetItemState

418:デフォルトの名無しさん
19/10/10 00:29:05.87 uUO69neG.net
エクスプローラにdll注入とか?

419:蟻人間
19/10/10 01:32:41.34 VnnXeZwz.net
前にやったことがある。
URLリンク(github.com)

420:デフォルトの名無しさん
19/10/11 01:40:25.90 n351RXRL.net
std::shared_ptrを構築後に(カスタム)デリータを変更するのは無理?
既にどっかで作成済みのshared_ptrについて、破棄タイミングを後から見れないかなと

421:デフォルトの名無しさん
19/10/11 02:44:16.61 uKeO6WuZ.net
別のstd::shared_ptrをカスタムデリータ付きで構築してswapすれば

422:デフォルトの名無しさん
19/10/11 04:06:16.56 RvdWaBLb.net
shared_ptrとunique_ptrでdeleterの指定方法が違うってのが興味深いね。

423:デフォルトの名無しさん
19/10/11 12:29:56.77 w5dDNHMJ.net
VCのlatestでchar8_tが入ってたわ
やっとC++erが文字コード問題から解放されるんだな

424:デフォルトの名無しさん
19/10/11 14:00:32.34 XWYiG0pn.net
やったぜ。

425:デフォルトの名無しさん
19/10/11 15:19:50.16 iqVlf+4W.net
>>418
デリータごとswapされたわ
stackoverflowにも似たような質問があったけど結論としては出来ないっぽい
たぶん

426:デフォルトの名無しさん
19/10/11 23:12:48.13 WXWRLB/C.net
>>392
別にテンプレ好きでも構わんが、C++ユーザー全員が趣味だと思ってんの?

427:デフォルトの名無しさん
19/10/11 23:15:04.89 WXWRLB/C.net
>>405
雑談以外に役に立つ書き込み出来なくてすみません、ってことか

428:
19/10/12 08:08:31 vgsPsMOm.net
>>423
C++ユーザが全員趣味なんてどこにも書いてないし、あるプログラミング言語が趣味でしか使われてない状況なら、委員会なんていらないわwww

429:
19/10/12 08:48:46 fl5cgmi7.net
衣食住の確保以外の仕事なんてみんな趣味みたいなもんだよ
なくたって構わんのだから

430:
19/10/12 08:58:25 rY+KRAa3.net
農業以外は遊びってことか!

431:デフォルトの名無しさん
19/10/12 09:03:04.22 tzOo7sle.net
原始人から見たら1次産業以外は遊びだしそうだろ

432:デフォルトの名無しさん
19/10/12 09:06:03.19 w6XAfbR5.net
委員会なんて何の役にもたってねーだろ。
構文解析もまともに理解できてないバカが俺様仕様の理想に突っ走ってるだけのクソ組織で、
仕様の実装、デバッグの手間なんてこれっぽっちも考えてないのがよくわかる。

433:デフォルトの名無しさん
19/10/12 09:14:16.17 Fi90LVHu.net
デバッグできねえのを人のせいにするクズがよく言うぜ

434:
19/10/12 09:54:19 DT43rpFP.net
近年は新機能は三大コンパイラ(GCC,MSVC,Clang)での試験実装が入ってから仕様入りするのが普通になってるし
コンセプトなんてまさにデバッグの手間の軽減を第一目的に苦心して作られた機能なんだけど
どのへんを見てよくわかったのか教えて

435:
19/10/12 10:00:51 w6XAfbR5.net
>>431
実装したことないやつは黙っててね。
で、そのコンセプトを実際のコードでコンパイルした時間がどれくらいになるかわかってる?
そういう有用なベンチマークもほとんど出さずに無理やり入れようとするから
信頼を無くしてるんだよ。

436:
19/10/12 10:19:47 Nq/Z/R6A.net
経験したことは全て正しいっていう日本特有のアホ理論だろそれ
経験してないお前に発言権は無い、っていう
その理屈を持ち出すヤツは大抵はアホ

437:
19/10/12 10:24:58 69fBrMS4.net
コンパイル時間は、コンパイラの出力する最適化されたバイナリの実行速度に比べたら問題ではないだろ

しかも構文解析にかかる時間なんて最適化時間に比べりゃ屁みたいなもの

438:
19/10/12 10:26:15 mYzO26Pi.net
似たようなものを複数書いてもバグ修正時に一部見落としなんて馬鹿げたことになるわけで
マクロでもテンプレートでもまとめられるものはまとめたほうがいいわな

439:
19/10/12 10:27:43 69fBrMS4.net
c++言語の場合、パースのコンテキスト依存が、識別子の種類でも変わるから、テンプレート時の記述でtypename やらtemplateやらで、識別子の種類自体を指定する羽目になっているのはあるよね

440:
19/10/12 11:23:13 zNYGVDyE.net
>>434
テンプレートふんだんに使ったライブラリ実用してるとひどいことにはなる
アプリ自体は数万行なのにコンパイル10分以上とか

441:デフォルトの名無しさん
19/10/12 11:27:59.19 KmpqQhzT.net
>>432
お前が信用しないのは勝手だが、みんなの総意みたいに言うなよ

442:
19/10/12 12:09:52 73DoxmjF.net
数万行で10分が早いのか遅いのかよくわからない

443:デフォルトの名無しさん
19/10/12 12:15:22.09 69fBrMS4.net
それは本当にパースの複雑さのせいなのかは疑問だな
templateだと、プログラマは簡単にコンパイラの仕事をあまり意図せず増やしてしまいがちだからね。
std visitで引数増やすとコンパイル時間は簡単に増やせるよ。
5つくらいでもうコンパイラが落ちたりする
やらせていることの面倒くささ、それを手書きすることを考えれば妥当なのだけど

444:
19/10/12 12:41:57 Tqr7IA/6.net
最近C++触ってないけど数万程度で10分もかかるの?
10万行程度なら5分以内に終わってほしいところだけど…

445:
19/10/12 13:13:02 trzfpzAc.net
>>439
かなり遅いです。
ヘッダファイル *.h とソース本体のファイル *.c では事情が違いますが、
OSのバージョンによりますが、Win32の標準ヘッダファイルの windows.h などだけでも
コメントを除外しても2万行弱くらいあります。
これのパースは、VC++で1秒~数秒くらいです。
通常は、precompiled header を使うので、一つのプロジェクトで一度だけ
パースされることが多いです。
ただし、プロトタイプ宣言やマクロ定義、構造体定義、inline関数定義
などだけで、実際のコード生成は伴わないので、*.c の数万行とは
また事情が違います。*.c はコード生成を伴うので、同じ行数であれば*.hよりも
遅くなる傾向があります。
しかし、それでも、C++98 の場合、数万行だと3秒~10秒以下でコンパイルできます。

446:デフォルトの名無しさん
19/10/12 13:23:47.19 UpKv7BB3.net
↑こいつはVSスレで有名なキチガイなので放置で

447:デフォルトの名無しさん
19/10/12 13:24:45.74 69fBrMS4.net
c++の文法のせいでパースが遅いってレベルの話じゃないような

448:デフォルトの名無しさん
19/10/12 15:33:32.46 UCFxfzGx.net
ヘッダオンリーのライブラリがポータブルとか言われてもてはやされるのがc++だからね
生産性の意識が間違った方向に向いてる
コンセプトでどうなることやら

449:
19/10/12 15:52:13 K75UXpIa.net
俺の10万行程度のアプリは1分以内にコンパイル終わるが・・・
10分てどこの世界だ

450:
19/10/12 19:26:26 8VsKOlOD.net
「参照の配列」を作りたいときって現状 reference_wrapper を使う以外ないですか?

451:デフォルトの名無しさん
19/10/12 20:29:07.16 iehpkqJW.net
ポインタやスマポじゃいかんのか

452:
19/10/12 20:55:57 cS98TRHZ.net
>>437
プリコンパイルヘッダー使え…!

>>446
VC++2010の場合配列要素のアドレスの配列というのを
それぞれ1万行ぐらい書いてリリースビルドすると10分かかる

453:デフォルトの名無しさん
19/10/12 23:18:34.83 zNYGVDyE.net
spiritで構文解析させてたコード(その上et使った自作ライブラリあり)だから�


454:痰ニして極端だったかもしれんけどね プリコンパイルドヘッダは使ってたよ 効いてるときは数分かからなかったと思う というか5年以上そのコード使ってないんで今のマシンならまだマシになるとは思う



455:デフォルトの名無しさん
19/10/13 01:04:01.79 2Ilco01g.net
boostを多用した10数万行のソースでprecompileありでreleaseビルドしたら10分くらいかかってたけど、debugビルドでは1,2分くらいだった気がする。パースだけなら大したことないけど最適化がかなり遅いと思われる。

456:デフォルトの名無しさん
19/10/13 01:06:42.02 uORMYh+w.net
翻訳単位が増えると単純に遅くなるし
リンク時最適化でもさらに遅くなる

457:
19/10/13 01:16:58 Fwjkj11x.net
LTOは本当のリリース時や速度検証の時以外は外しても問題ないよね


次ページ
最新レス表示
レスジャンプ
類似スレ一覧
スレッドの検索
話題のニュース
おまかせリスト
オプション
しおりを挟む
スレッドに書込
スレッドの一覧
暇つぶし2ch