C++相談室 part136

■ このスレッドは過去ログ倉庫に格納されています
2018/06/07(木) 23:40:12.36ID:GNQuDMaA0
次スレを立てる時は本文の1行目に以下を追加して下さい。
!extend:on:vvvvv:1000:512

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

前スレ
C++相談室 part135
https://mevius.5ch.net/test/read.cgi/tech/1522495206/

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

■長いソースを貼るときはここへ。■
 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
2018/06/22(金) 08:37:19.28ID:PS4w2oBw0
>>410
テンプレートクラスを使った変態バージョンを作ってみたわ
https://ideone.com/6i6un3
2018/06/22(金) 08:58:31.90ID:bJNd9Nrpd
>>411
確実にコンパイル時に解決されてるためには
別プログラムで計算して即値を#defineがベストって事だな
2018/06/22(金) 09:02:09.74ID:bJNd9Nrpd
>>411
「とても」ってのは例えば10年かかるとかそういうの
ある数学定数の計算とか固定データの暗号化を破るプログラムとか

適度にあきらめてくれないと
コンパイルが(事実上)出来なくなる
2018/06/22(金) 10:38:03.07ID:Hg4H5zqra
>>413 そこは即値をconstexprにしようぜ。
2018/06/22(金) 11:05:51.83ID:VkaCaqwn0
>>404
constexprならunsignedじゃなくても平気なのかな?
2018/06/22(金) 14:23:31.03ID:0acoPbmK0
>>385
リンカの挙動に付いては変数と扱いが違うせいじゃなくて
c++ では const 変数はデフォルトで static なくだけだよ

お前は正しい指摘をしている時でさえ必ず間違ったことを言う
このスレ読んでる人に嘘ついて喜んでる愉快犯か何かか
418デフォルトの名無しさん (スプッッ Sd1f-SNrP)
垢版 |
2018/06/22(金) 14:25:48.43ID:oyBTubw6d
現代においてdefineを使う利点がゼロ
2018/06/22(金) 14:31:22.11ID:JUnpVDzH0
は?constをヘッダにstaticで定義しているバカが居たことに驚きなんだが
そりゃstaticで定義しまくったら実体増えるのは当たり前だろ
灯台下暗しでstatic記述するバカに気付かなかったわ
バカ過ぎて話にならんわw
420デフォルトの名無しさん (ワッチョイ 9fd2-GwbS)
垢版 |
2018/06/22(金) 15:00:35.31ID:PS4w2oBw0
>>419
おっしゃることは確かにもっともなことですが、basic_string::npos についてはどう思われますか?
2018/06/22(金) 15:42:10.39ID:PS4w2oBw0
なお、std::dec, std::hex なども static const。
2018/06/22(金) 16:52:29.77ID:JUnpVDzH0
クラス変数は統合されるから問題ない
ネームスペースやグローバルのヘッダに書くstatic constと違って
2018/06/22(金) 17:43:30.82ID:m8knQ0QO0
constexprをご存知でない人多すぎでは
入門書に1ページおきにこれを使えと書いてあるだろ
424デフォルトの名無しさん (ワッチョイ 1fb3-RzAk)
垢版 |
2018/06/22(金) 18:20:27.94ID:0qBHNE4T0
一行おきになってから考える。
2018/06/22(金) 18:26:09.27ID:0px4TqJVd
>>418
アホ自慢?

>>423
入門書www
プロは知ってても、場合によって#defineを使う
2018/06/22(金) 19:10:51.02ID:PS4w2oBw0
>>422
クラス変数に統合されるとなぜ問題ないのですか?
そもそも統合とはどういう状態でしょうか。
ネームスペースにstatic constを書くのとあまり違いはないように思うのですが、どう違うのか教えてもらえませんでしょうか。
2018/06/22(金) 19:55:42.32ID:lkE7eBJS0
static constexprにするかstatic inlineにするかテンプレートクラスに書けば実体はただ一つになると思う
普通に書いたら分裂しそう
2018/06/22(金) 20:14:28.16ID:Hg4H5zqra
cとの互換性を無視した場合のdefineの利点てあるのですか?
2018/06/22(金) 20:16:52.97ID:m8knQ0QO0
>>425
プロはinline変数を使う
2018/06/22(金) 20:18:39.50ID:m8knQ0QO0
>>428
ソースコードをプリプロセスしたいときに使う
2018/06/22(金) 21:16:15.28ID:lkE7eBJS0
>>428
Boost.Preprocessor
2018/06/22(金) 21:16:32.93ID:sLKAbUw90
   ___
  /彡彡))
  |彡( >
  ノノノ ヽ丿 <プロでござい
 / ̄ ̄ ̄\  n_
`/| _[]_ |/\ ( )
∧||バ| Y\ `/ /
\||カ| | \_/
(|  ̄ ̄ |
 |____|
 ||_|i|_||
 | ー|ー |
2018/06/22(金) 21:19:57.23ID:wcY3liAA0
>>429
かならずインラインになる保証はないのでは?
2018/06/22(金) 22:04:30.10ID:PS4w2oBw0
>>421 を訂正。

std::dec, std::hex はマニピュレータなので定数じゃなかった。
定数なのは、std::ios_base::dec、std::ios_base::hex。
2018/06/22(金) 22:08:08.24ID:sLKAbUw90
マニピュレータは関数だぜ?
436デフォルトの名無しさん (ワッチョイ 7fd2-XQuB)
垢版 |
2018/06/22(金) 23:02:52.73ID:tZy0W+/k0
まじめにデザインパターンを学習したくて書籍を探しているのですが、Javaで
説明しているものばかりで困っています。Javaは全く知りませんし、覚えるつ
もりもありません(自分にとっては不要な言語なので)。

C++でデザインパターンを開設している書籍を教えてください。
2018/06/22(金) 23:09:45.00ID:UnfZkoNcM
>>436
gofっていうわりとデザパタに詳しい人も本出してるから探してみて。
2018/06/22(金) 23:40:54.94ID:m8knQ0QO0
サンプルがJavaで書いてあるかどうかって関係あるか?
デザパタの本ならJava特有のことはやってないはず
何をやっているのかを理解してそれをそのまま他の言語に当てはめればいい
2018/06/22(金) 23:42:29.99ID:lkE7eBJS0
>>436
本じゃないけど
http://marupeke296.com/DP_main.html
2018/06/22(金) 23:44:18.08ID:6eBOmsiI0
C++は反則技が多すぎるので勉強しても無駄。
常に速度やメモリ効率を重視するための言語。

高級言語でOOしたいなら素直にJavaを使うべし。
2018/06/22(金) 23:49:32.69ID:2mqIozuo0
反則技って言える位は覚えたい
2018/06/22(金) 23:49:39.28ID:PS4w2oBw0
今日日、Java使うくらいならPythonを使うんじゃないの。
2018/06/22(金) 23:50:46.45ID:2mqIozuo0
IDがPS4って凄いなw
2018/06/22(金) 23:59:07.23ID:m8knQ0QO0
JavaとPythonとC++って全部用途が違うじゃん
Javaと競合してるのはC#
2018/06/23(土) 00:19:38.99ID:OlLfOCSW0
>>436
結城ならば簡単なJava だから、C++ の知識で Java の字面は追えますよ(なんとなくわかる)
私は結城 Java を C++ に書き直して習得しました
446デフォルトの名無しさん (ワッチョイ ff9d-E6HK)
垢版 |
2018/06/23(土) 02:15:46.97ID:nmsTY6vF0
C#やJavaが動くのにC++を使うのは辛い。非常につらい。絶対にやめたい。にも拘らず
未だにC++を進める人がいるのは残念だ。
一方C++は組み込みには非常に威力を発揮する。しかし組み込みではいまだに90%
の人がCを使う。それはなぜなのか?
 CとC++ではスッポンと月ほどの違いがある。しかし残念ながらそれは
C++をフルに使える場合であって、フルに使える場合ならC#やJAVAを使った方がいいわけで
フルに使えないケースであるからこそ、C++を使うのが正しいのであるから、やはりC++は
Cに比べて月ほどではない。しいて言えば月というよりは牛だろう。ともすれば牛よりも
スッポン料理が高価なように、月になれるのに牛ではやはりかなり残念なのである。
どういう切り口でも残念な言語、それがC++だ。
447デフォルトの名無しさん (ワッチョイ ff9d-E6HK)
垢版 |
2018/06/23(土) 02:24:54.31ID:nmsTY6vF0
C++開発をした人がC++の本を書いていて、先輩に「読め!!!」と勧められたので読んで
みたが非常にわかり難い。こんな頭の構造をした人が作った言語だからきっとわかり難いの
だろうと思う。一言でいうと簡単なことを複雑に説明する。
C++という言語もアフォほど簡単なことをやたらと複雑に書かなければならないことが多い
という気がする。
448デフォルトの名無しさん (ワッチョイ ff9d-E6HK)
垢版 |
2018/06/23(土) 02:33:48.53ID:nmsTY6vF0
Headerファイルにメソッドを書かないスタイルは誤りだ。
理由
1.C++以外でそんなスタイルをとっているものはない。
2.なぜならメソッドも実体ではなく型だからだ。分離するメリットはないがデメリットは多い。
2018/06/23(土) 02:37:32.71ID:gROM9xFw0
>>446
コピペかと思ったけど違うのか
何でC#を使うべきケースとC++を使うべきケースを分けられない人が出てくるんだ?
インタープリタやC#やらがクソ簡単に書けるのはその下で煩わしいことをやってくれてる人がいるからだ
2018/06/23(土) 04:45:24.98ID:lx9rCNA70
最近の勘違いしたアホ機能テンコ盛りのC++。なんでも書けますよ。
2018/06/23(土) 07:07:27.53ID:CK76JyQna
c++が複雑なのはわかるがどんどん簡単に書けるように進歩してるだろ。

autoとかrange-based for loopとかconstexprとかlambdaとか。

他の言語並みに簡単に書けるようになるのはまだまだかかるとは思うが。
2018/06/23(土) 07:42:27.22ID:lx9rCNA70
使う気ないですけどね。速度が速くならないならいらないです。
使い捨て、楽したいならC#で十分ですからね。
2018/06/23(土) 08:22:04.68ID:v6rjk3zs0
>>449
相手するなよ...
454デフォルトの名無しさん (ワッチョイ ff9d-E6HK)
垢版 |
2018/06/23(土) 08:39:12.93ID:nmsTY6vF0
>>412
簡潔で綺麗だ。素晴らしいと思う。
2018/06/23(土) 08:41:28.05ID:lx9rCNA70
仕事で自作テンプレートライブラリ持ち込む奴
2018/06/23(土) 09:33:31.56ID:PbtB7OZPa
>>454
今どきはtypedefじゃなくてusingだしconstは実体が増えるからconstexprにするべきだと思うのだがどうだろう?
2018/06/23(土) 09:54:36.74ID:t78XQUz20
セットする値に singned int の範囲しか使わないなら、static const 定数じゃなくて enum でOK。
enum なら constexpr すら要らない。
2018/06/23(土) 10:18:46.59ID:ONikHNCn0
enum baseってlong long使えないんだっけ?
2018/06/23(土) 14:50:53.84ID:b8MqWubcM
>>455
関数作るのと同じだろうが
460デフォルトの名無しさん (ワッチョイ 1fb3-RzAk)
垢版 |
2018/06/23(土) 14:54:46.34ID:hRKVQ4t10
>>444
Javaは高価な機器を買わせるためにデザインされた言語だから用途が違うけど、他はソフトウェアを作るためでは?
2018/06/23(土) 15:24:45.97ID:gROM9xFw0
普通に書いてればテンプレートだらけになると思うが
2018/06/23(土) 16:11:30.67ID:jodQHKSv0
C++やるのにテンプレート使わないなんてただのマゾプレイ
2018/06/23(土) 16:14:12.23ID:b0QIE6qXd
小規模マイコンのソフト開発なんて
全てがマゾプレイみたいなもんだから
それでもCよりはC++の方が便利
2018/06/23(土) 16:53:02.33ID:v6rjk3zs0
>>462は正しいと思うけど>>461のようにテンプレートだらけになるのはどうかと思う
465デフォルトの名無しさん (ワッチョイ 7f5e-lC4z)
垢版 |
2018/06/23(土) 18:08:17.77ID:JrW4+gjv0
Expression templateでmatrix乗算、それが無理ならベクトルの内積
(それもコンパイル時計算じゃなくてコンパイラの遅延評価を利用して
一種の構文を記憶したもの)を計算するETを解説してるところしらないかな。

ベクトルのETによる遅延評価計算はC++テンプレートテクニックあるから
いいけどさ。

Matrixがわからんのよ。uBLAS、MET、TVMET探してもそれらしきソースコード
が特定できん。
466デフォルトの名無しさん (ワッチョイ 7f5e-lC4z)
垢版 |
2018/06/23(土) 18:40:25.11ID:JrW4+gjv0
Expression templateは本命じゃない。難しすぎる。でも演算子オーバーロードの
弱点である一時オブジェクトによるロス(a*aみたいな乗算も含めて)を解決する
方法を20年以上前に考えたけど、それと速度を比較したい。
2018/06/23(土) 19:33:03.44ID:uP340TqJ0
http://eigen.tuxfamily.org/
2018/06/23(土) 19:55:21.62ID:PbtB7OZPa
ユニバーサル参照で一時オブジェクトの問題は片付く?
2018/06/23(土) 22:07:20.78ID:lx9rCNA70
>>461 ←こういう車輪の再発明ばかりしてる奴
2018/06/23(土) 22:20:28.61ID:gROM9xFw0
レゴブロックしたいなら別の言語使えば
2018/06/23(土) 22:23:40.91ID:V32XRqjBd
売ってる車輪の中から探すよりも作った方が早かったり安かったりぴったりな車輪になったりする
2018/06/23(土) 22:49:55.46ID:uP340TqJ0
アプリ次第じゃね。
数値計算やアルゴリズムやってると、リソース、速度、必要精度に応じて、整数、浮動小数点、多倍長整数、有理数等々に対応できるように作るから、むしろテンプレしかない。
2018/06/23(土) 22:54:31.33ID:lx9rCNA70
>>470
うまい。プログラムがテンプレートだらけになってる奴は必死にマイレゴブロックを作ってる。
stl、boost、atl、既成レゴブロックは数多く提供され使われてるのだ。

そんなに理想の車輪がほしければ、
それこそ新言語を作ればいい。C++にアホ機能追加してる糞どもに言いたい。
2018/06/23(土) 23:04:46.58ID:rU1CNnzWM
>>473
C++03を使い続けたいのなら使ってもいいんよ。
2018/06/23(土) 23:07:53.81ID:gROM9xFw0
>>473
何言ってるのかわからん
stlやboostはブロックを作るための材料くらいの位置づけだぞ
テンプレートがstlのような比較的低レイヤーなところでしか使わないとでも思ってるのか
レゴブロックと言ってるのは大量のモジュールを読み込んで継ぎ接ぎしてるようなJSやPythonのコードのことだ
2018/06/23(土) 23:35:33.86ID:pv6hhTrX0
うちの会社にもなんでもテンプレで作りたがる奴いるけど、
調べたらほとんどのテンプレが一種類の型でしか使われてなかったw
2018/06/23(土) 23:40:58.66ID:UiVIxiJp0
>>472
色々に対応できるライブラリは動作が遅い
スペシャル版が最強
2018/06/23(土) 23:42:14.75ID:gROM9xFw0
そして変更に弱いコードが量産されて最後にはお手上げになると
親の顔より見たわ
2018/06/23(土) 23:45:15.10ID:lx9rCNA70
>>474
過去の大量のC++コードを全否定する機能を追加するなら新言語にすべし。
Java、C#みなそれで成功している。C++の名前を借りないと使ってもらう自身がないならキミは向いてない。
2018/06/24(日) 00:00:56.36ID:pIbsbhjra
全否定する機能てなんだ?なんか追加されたか?
2018/06/24(日) 00:03:37.09ID:l/Tfpprp0
提案書を読めば分かるが基本的には問題点を解決するためのものばかりなはずだがな
2018/06/24(日) 00:09:19.32ID:5X6JCb050
クソみたいな汎用化はいいからまずは一つの機能の関数をまともに書けと言いたくなるバカは確かにいる。
2018/06/24(日) 00:13:58.88ID:rLugm4Eu0
それ。C++は当初から問題ある欠陥言語だから、素晴らしい新しい言語を作るべき。
古い大量のコードはもうどうにもならない。誰も更新費用の予算を計上してくれない。
COBOLと同じなのだ。老人のおれはC++と心中する。

おまえら若者は新しい船で新しい世界に旅立ってくれ。俺の屍を越えてゆけ。
2018/06/24(日) 00:28:09.48ID:tdPdwIDr0
>>477
そうならないのがc++のtemplateなんで。。
それでも型によってかき分けたほうがいいところはTMPなり特殊化なりすればいい。
2018/06/24(日) 00:36:07.50ID:l/Tfpprp0
C++に取って代わろうとした言語はみんな死んだか別の路線を走ってるよ
486デフォルトの名無しさん (アウアウウー Sae3-E6HK)
垢版 |
2018/06/24(日) 00:46:53.92ID:f93Q4KExa
老人はC++03と心中してくれ。俺はC++14以降の船に乗る。
2018/06/24(日) 01:00:13.16ID:rYGVoBbS0
>>486
スマートポインタは使わせてほしいのですが…
2018/06/24(日) 01:14:35.71ID:l/Tfpprp0
vectorをスマポとして使え
489デフォルトの名無しさん (ワッチョイ 1fb3-RzAk)
垢版 |
2018/06/24(日) 01:41:30.34ID:AKYv/9KI0
vectorはdata()が連続した領域を返さないといけないのが大きな制約になってるかも。
2018/06/24(日) 05:38:04.07ID:NxOKC53L0
それがなくなったら、もはや配列ではない
配列を使うべき用途で出番を失う
2018/06/24(日) 07:10:53.13ID:7AsRASisa
一応連続した領域を返すと保証されたのはc++03から
2018/06/24(日) 08:02:00.62ID:l/Tfpprp0
保証されてくれないと困るから保証されるようになったんだぞ
2018/06/24(日) 08:22:28.59ID:lrwvyFHq0
>>484
テンプレートは魔法じゃない

同等の速度を出す為には結局全て特殊化することになるし、
インターフェースも型によって違う方が良いこともある

性能、リソース、...
突き詰めれば全て特殊化

テンプレートは妥協だ
2018/06/24(日) 08:42:27.47ID:5mcMpyana
妥協というより補助だろう。
templateだけで解決しようとすれば特殊化だらけになるのは当たり前の事
495デフォルトの名無しさん (ワッチョイ 9fd2-GwbS)
垢版 |
2018/06/24(日) 09:08:30.29ID:6XPmSU1L0
cstdio と STLの連携を深めて欲しいね。

・FILE* に basic_string をバッファとして渡してメモリに読み書きする機能が欲しい。
・fgets() で得られた文字列長を再計算するコストが無駄なので、文字列長も取得できる機能拡張関数が欲しい。

何らかの処理の過程で副産物として得た文字列長を捨てて、別の場所で文字列長を再計算する無駄は、かなり多いと思う。
2018/06/24(日) 10:13:59.40ID:l/Tfpprp0
templateはポリモーフィズムを実現するための実装の一つです

>>495
c_str()で渡せばいいのでは
2018/06/24(日) 10:27:01.80ID:rYGVoBbS0
>>496
基底クラスのポインタで複数の派生クラスのポインタとして振舞えるの?
template を使ってポリモーフィズムを実装できるとでもいうの?
2018/06/24(日) 10:27:08.87ID:6XPmSU1L0
>>496
FILE*を使う関数にbasic_stringをc_str()で渡すのではなく、
setvbuf() のようにFILE*の内部で使うバッファを basic_string に置き換える意味で言いました。
fprintf() でbasic_stringに書き込むことが可能になるイメージ。
C++にはpopen()で開いたパイプFILE*に相当するiostreamがないのでこれで代用可能。
2018/06/24(日) 10:50:12.04ID:koljFhYX0
>>497
コンパイル時にテンプレートパラメータでポリモーフィズムする
2018/06/24(日) 10:51:36.48ID:rYGVoBbS0
>>499
template を使ってのポインタがポリモーフィズムを実現できるとは思えないのですが…
2018/06/24(日) 11:03:14.75ID:6XPmSU1L0
templateはポリモーフィズムの実装ではなくポリモーフィズムの利用が仕事。
2018/06/24(日) 12:14:29.94ID:RRt1KIRA0
ポリモーフィズムの意味が分かってないだけだろ
2018/06/24(日) 12:56:28.50ID:l/Tfpprp0
>>497
ポリモーフィズム=継承ではない
継承もポリモーフィズムを実現するための手法の一つにすぎない
ざっくり言えば同じ名前で異なった振る舞いをするもののことを言う
関数オーバーロードもポリモーフィズム
2018/06/24(日) 12:57:48.47ID:6XPmSU1L0
詐欺師が「○○を実現できます」と言った時、実際には「他人の作った○○に便乗します」という意味であることが多いから、あながち間違いでもない。
2018/06/24(日) 13:22:31.14ID:l/Tfpprp0
>>498
boostで似たようなことができる
http://www.cplusplus.com/forum/general/16532/

これをうまいことラップして
pstream ps("ls");
ps >> str;

みたいに動作するstreamを作ればいい
2018/06/24(日) 16:33:05.22ID:6XPmSU1L0
>>505
情報ありがとう。

欲しいのは逆パターン。CをC++でラップするのではなく、C++をCでラップする感じ。難しいか。
2018/06/24(日) 16:48:47.47ID:rYGVoBbS0
>>503
>関数オーバーロードもポリモーフィズム
関数オーバーロードはコンパイル時には(どこからどこへコールしているかが)確定しているものですね
そういうものに「ポリモーフィズム」を当てるのは抵抗があります

もっとも wikipedia をみると、私の考えているポリモーフィズムは「部分型付け」(subtyping/inclusion polymorphism) としてサブクラス化されています
これは私の認識を修正しないといけない…
508デフォルトの名無しさん (ワッチョイ 9fd2-GwbS)
垢版 |
2018/06/24(日) 17:26:25.56ID:6XPmSU1L0
自然界には、収斂進化のように継承や派生と無関係な同質異像が存在します。

収斂進化 (convergent evolution)
https://ja.wikipedia.org/wiki/%E5%8F%8E%E6%96%82%E9%80%B2%E5%8C%96

多形 (polymorphism)
https://ja.wikipedia.org/wiki/%E5%A4%9A%E5%9E%8B
2018/06/24(日) 17:41:32.84ID:nQZct5lz0
意味の広い英単語を、ものすごく狭くて極端な用例の一つに限定して和製英語化しちゃう日本人のいつもの得意技
ポリモもその犠牲者の一つ
2018/06/24(日) 20:17:56.55ID:l/Tfpprp0
Ad hoc polymorphismのページでは2つの要素を+演算子にかける関数がpolymorphicなものの例として書かれてるね
https://en.wikipedia.org/wiki/Ad_hoc_polymorphism
2018/06/24(日) 20:51:47.44ID:NxOKC53L0
拡大解釈すればできちまうものだからな
いくらでも俺様解釈し放題
それを聞かされている衆目がついていけないと言ったとき
強弁するやつと謙虚なやつでリトマス試験紙みたいになる
■ このスレッドは過去ログ倉庫に格納されています
5ちゃんねるの広告が気に入らない場合は、こちらをクリックしてください。

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