トップページ⇒tech
1002コメント293KB

C++相談室 part126 [無断転載禁止]©5ch.io

■ このスレッドは過去ログ倉庫に格納されています
0001デフォルトの名無しさん2016/08/13(土) 11:24:45.65ID:NPYsKJkE
次スレを立てる時は本文の1行目に以下を追加して下さい
!extend:on:vvvvv:1000:512

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

前スレ
C++相談室 part125
http://echo.2ch.net/test/read.cgi/tech/1463761261/

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

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

[C++ FAQ]
https://isocpp.org/wiki/faq/
http://www.bohyoh.com/CandCPP/FAQ/ (日本語)
0357デフォルトの名無しさん2016/09/02(金) 09:14:47.55ID:OksuLk+6
>>355
ググれば普通に出るが?
なんでそんなに必死なの
http://boost.2283326.n4.nabble.com/the-best-possible-c-properties-implementation-tt2626498.html
0358デフォルトの名無しさん2016/09/02(金) 09:20:57.20ID:OksuLk+6
>>356
そうね、そういう感じ
0359デフォルトの名無しさん2016/09/02(金) 10:36:49.94ID:AFnhG1K/
それじゃ仮想関数にできないじゃん。やり直し。
無理やりオーバーライドできるようにしなくていいよ。
既にコードも必要以上に複雑化しててgetter/setterの方がマシなレベルだし。
0360デフォルトの名無しさん2016/09/02(金) 12:07:39.19ID:+CUdjKtm
>>359
NVIって知ってる?
0361デフォルトの名無しさん2016/09/02(金) 12:09:10.62ID:rUpx5Cs1
結局、プロパティは要らんわな。

タイプ量の問題ならマクロで解決出来るし。
0362デフォルトの名無しさん2016/09/02(金) 12:26:51.71ID:6Qab/oE8
これからのC++にプロパティーは必須だな。
これからもどんどん新しい機能を取り入れてどんどん
わけがわからなくなるといい。
0363デフォルトの名無しさん2016/09/02(金) 12:41:00.31ID:1fpVQ5H8
マクロは入力補完できないし衝突の可能性がある
0364デフォルトの名無しさん2016/09/02(金) 12:49:08.18ID:6Qab/oE8
C++はマクロで出来ることをどんどん機能として取り込んで来たのに
いまさら後戻りはできない。
0365デフォルトの名無しさん2016/09/02(金) 18:00:48.43ID:96M6CE+e
C#の「プロパティ」って機能がどんなのか知らないけど、
現在C++にないから不要な機能だ、と突っ張るのは危険かも知れないよ。

いつか「次の規格から『C#のプロパティ』と同様の機能が追加」と
発表されるかもしれない。これまでもそうやって肥大化してるじゃない。
0366デフォルトの名無しさん2016/09/02(金) 18:28:49.74ID:qjeLwgBZ
Javaでもそうだけどgetter/setterは言語的には単なるメソッドでしかないが
C#のプロパティは言語的にメソッドとは違うものとして認識出来るようになっている
そこから様々な便利さが出てきている
0367デフォルトの名無しさん2016/09/02(金) 19:27:06.33ID:nL/2u0CX
>>364
マクロで出来ることではなく、
マクロに頼っていたことを、
マクロを使わずに出来るようにしてきたんだよ。

スコープに従わないオブジェクト指向の敵との戦いだ
0368デフォルトの名無しさん2016/09/02(金) 19:37:33.13ID:XrGCfAOV
C++のテンプレートってポストプロセッサといっていいよね。
マクロみたいなもん。
0369デフォルトの名無しさん2016/09/02(金) 20:24:08.55ID:8Rlh5aGL
↓テンプレートとマクロは全く違うもの
0370デフォルトの名無しさん2016/09/02(金) 20:41:05.83ID:Wj/juS31
ソースコードの書き換えという点では同じ。
0371デフォルトの名無しさん2016/09/02(金) 20:49:32.19ID:W5XwdQxs
テンプレートはテキスト置換じゃないよ。
あれはコンパイルタイムに計算してるんだよ。
0372デフォルトの名無しさん2016/09/02(金) 20:49:47.52ID:1fpVQ5H8
テンプレートが単なる置き換えだと思ってるのか
0373デフォルトの名無しさん2016/09/02(金) 20:50:16.78ID:BGbCtBYN
マクロの親玉だ
0374デフォルトの名無しさん2016/09/02(金) 20:52:42.81ID:W5XwdQxs
テンプレートもconstexprもある種の計算機のサブセットだからなぁ。
0375デフォルトの名無しさん2016/09/02(金) 22:57:15.93ID:Q3H4IaZb
コンパイル時に計算できることなんてたかが知れてるし、使い道ないんだよな
0376デフォルトの名無しさん2016/09/02(金) 22:59:57.14ID:3Xz3H/8a
いやいや…型チェックとかのなくすべき実行時オーバーヘッドがなくせるってだけで意味大有りだろ
0377デフォルトの名無しさん2016/09/02(金) 23:04:13.81ID:W5XwdQxs
PURE関数が入ったら、constexprなんかは関数がハッシュに置き換わってそこから値置換になるかも。
コードを全部どけて数字一個になる日も近い。
0378デフォルトの名無しさん2016/09/02(金) 23:12:20.33ID:1fpVQ5H8
まともにC++使ってて使い道無いとかどうやったらそう解釈できるんだ
0379デフォルトの名無しさん2016/09/02(金) 23:30:26.24ID:Q3H4IaZb
コンパイル時に決まってるなら計算する必要ないじゃん
0380デフォルトの名無しさん2016/09/02(金) 23:32:54.48ID:1fpVQ5H8
手動で計算してくれ
0381デフォルトの名無しさん2016/09/02(金) 23:35:19.44ID:W5XwdQxs
そしてたどり着くのだ。42に。
0382デフォルトの名無しさん2016/09/03(土) 00:45:41.77ID:WTZrMZ5J
テンプレートなしだとマクロとvoid*でやりくりすることになるのかな
<algorithm>の中身がおそろしいことになりそう
0383デフォルトの名無しさん2016/09/03(土) 02:05:00.69ID:VnUB3qPQ
>>381
43ですが
0384デフォルトの名無しさん2016/09/03(土) 02:08:56.14ID:VnUB3qPQ
templateなんてデブなブタに過ぎんからな
0385デフォルトの名無しさん2016/09/03(土) 02:12:17.57ID:qWYFFL/S
>>383
なんすかそれ。
0386デフォルトの名無しさん2016/09/03(土) 07:03:39.80ID:ZkDRxv2v
>>375
最適化を否定するのか?
0387デフォルトの名無しさん2016/09/03(土) 07:04:51.23ID:ZkDRxv2v
>>382
bsearchみたいにな
0388デフォルトの名無しさん2016/09/03(土) 09:55:01.98ID:MIqeGybs
templateなんて実際に使えるレベルものを書ける人なんてほとんどいないだろ
使うことはあっても、書くことはないだろ
0389デフォルトの名無しさん2016/09/03(土) 10:03:25.99ID:2vnq4BB3
ライブラリを作っていれば嫌でも使うが
0390デフォルトの名無しさん2016/09/03(土) 11:15:11.07ID:NvcWw3DB
>>388
キミの周りではそうかもしれないけど、templateみたいな便利なものを使えないようじゃ現代のプログラマとしては失格だと思います
てかテンプレートってそんなに難しいか?
0391デフォルトの名無しさん2016/09/03(土) 11:47:23.77ID:KpYZ86nt
標準コンテナくらいバカでも使える。
それだけでテンプレートのメリットは十分に享受できる。
0392デフォルトの名無しさん2016/09/03(土) 11:48:35.81ID:2vnq4BB3
boost並みの実装ができないと書けていることにならないらしい
0393デフォルトの名無しさん2016/09/03(土) 12:11:48.21ID:NXr2sGOM
>>388
汎用性があって他人も実際に使えるレベルとなると難しいかもしれんが、自分が使う範囲内では普通に書くだろう。
はじめからtemplateを書くんじゃなくて自分用のユーティリティとかをtemplate化することも含めればけっこうある。
0394デフォルトの名無しさん2016/09/03(土) 12:23:53.61ID:ZkDRxv2v
>>390
ほんこれ
0395デフォルトの名無しさん2016/09/03(土) 12:35:37.51ID:UwaIhkeW
くだらねえな
もっと為になる話をしろやカス
0396デフォルトの名無しさん2016/09/03(土) 12:54:22.03ID:e++gk4lZ
Boost並に使いこなせるか?って聞かれたら
謝るしか無いわ、ホントごめん
0397デフォルトの名無しさん2016/09/03(土) 12:56:30.19ID:2vnq4BB3
為になる本ならたくさんある
0398デフォルトの名無しさん2016/09/03(土) 13:22:16.46ID:xlYZjvy0
メソッドA->B->C->D->Eと呼ばれる階層が深い構造のシステムがあって、
Eの計算結果をAで取りたい要望が新しくでてきたときってみんなならどう実装する?

条件としては、
・AはwhileループでBを呼び出し続ける
・Eの最新の計算結果はループで毎回使う
・CがDをnewしてるから、単純なgetterとかじゃ取れない

1. 引数が増えるのは仕方ないが、A~Eに全て引数を追加する
2. Eでstaticなグローバル変数を作る。Aからはgetterで取得する

一応思いつくのはこのあたりなんだけど、もっとスマートなやり方ってあるかな?
0399デフォルトの名無しさん2016/09/03(土) 13:25:09.63ID:WhBzeO8K
>>398
メソッドDをCがnewする?なんか説明が胡散臭いんだけど、普通に戻り値で返すのはダメなん?
0400デフォルトの名無しさん2016/09/03(土) 13:31:49.96ID:ftE9LPfh
そんなことしてたら「この計算結果もほしいんだけど」ってなった時に
また困ることになる。

Contextクラスを追加して、計算に必要な情報はそこに集約させろ。
そうすればどの階層からでも必要な情報を取れる。
0401デフォルトの名無しさん2016/09/03(土) 13:34:05.21ID:xlYZjvy0
>>399
すまん、説明が適当だった
CはDメソッドがあるクラスをnewしてるってこと
DClass dClass = new DClass()

C() {
dClass->d();
0402デフォルトの名無しさん2016/09/03(土) 13:36:43.61ID:xlYZjvy0
>>399
ごめん、途中で送信しちゃった、

CはDメソッドがあるクラスをnewしてるってこと

C() {
DClass dClass = new DClass()
dClass->d();
}

戻り値はEから外部システムに送信が成功したかどうかを表すbool値がすでに返されてるんだ

>>400
Contextクラスか・・自分は使ったことないし、よく理解できてないからググってみるわ
ありがとう
0403デフォルトの名無しさん2016/09/03(土) 13:40:54.20ID:2vnq4BB3
説明の意味が全く分からない
hoge B::get_E(){
  D *d = c.create_D();
0404デフォルトの名無しさん2016/09/03(土) 13:47:29.68ID:e++gk4lZ
今後パラメータが増える可能性があるようなら、それらをクラスなり構造体なりにまとめて、
何らかの方法で渡すようにすれば、最小限のコード修正で済むよってことじゃない?
0405デフォルトの名無しさん2016/09/03(土) 13:51:40.11ID:2vnq4BB3
>>402
そのCの戻り値にDの戻り値のEを入れてBが受ければいいんじゃないのか
0406デフォルトの名無しさん2016/09/03(土) 13:58:09.73ID:Px0qkqVR
>>398
引数を追加する方法を取るとして、楽するならば
一旦引数を構造体にして、後で追加したい場合構造体のメンバーを追加する形にする
全部の関数はその構造体を引数にしていれば、好きな構造体メンバーを追加しても形は変わらない
0407デフォルトの名無しさん2016/09/03(土) 13:58:29.96ID:Px0qkqVR
>>404
おれはや
0408デフォルトの名無しさん2016/09/03(土) 13:59:56.32ID:e++gk4lZ
>>405
既に戻り値は他で使われてるらしいし
そのやり方だと、参照渡しなんかが現実的じゃない?
0409デフォルトの名無しさん2016/09/03(土) 14:00:12.38ID:WhBzeO8K
>>402
「全て引数を追加する」がContextかなんかの参照引数を渡してまわる方法だと思ったんだけど、違ったんかな?
戻り値を変えたくないならそうするしかないと思うよ。
0410デフォルトの名無しさん2016/09/03(土) 14:01:01.19ID:ZkDRxv2v
>>395
気がついたやつがやれ
指図すんなクレクレ厨め
0411デフォルトの名無しさん2016/09/03(土) 14:05:10.90ID:2vnq4BB3
>>408
戻り値なんてpairなりtupleなりでいくらでも増やせばいいじゃん
周囲に影響を出したくないならそこから特定の値だけを取り出す関数でも噛ませればいい
0412デフォルトの名無しさん2016/09/03(土) 14:14:55.80ID:4FUmxt1N
コンポジションじゃ駄目なん?
0413 ◆SEdFBOkLSw 2016/09/03(土) 14:20:00.21ID:WfmCkwdk
Eの結果がどう欲しいかによるとは思うな。
Aだけが知りたいなら素直にEがログ残せば良いと思う。
中間層が知りたいなら返してやらなきゃならんだろうけど、B→Eが他の部分で使われてたら関連するのビルドし直しだしテストし直しだし、出し直さないといかんのでは?
0414デフォルトの名無しさん2016/09/03(土) 15:45:28.04ID:KoWGZcqO
はいはい池沼は去れ
0415デフォルトの名無しさん2016/09/04(日) 06:52:12.75ID:5SDmlLW2
https://www.embarcadero.com/jp/products/delphi/downloads
現在、RAD Studio(Delphi、C++Builderのセット)が無料でダウンロード可能ですよ
右側のStarter Edition100% Offをクリックするとダウンロードページに飛べます。
(無料ダウンロードは、2016年8月22日から9月9日までの期間限定)
0416デフォルトの名無しさん2016/09/04(日) 06:58:26.93ID:5SDmlLW2
すいません、C++Builderはこっちです
https://www.embarcadero.com/jp/products/cbuilder/downloads
現在、C++Builderが無料でダウンロード可能
右側のStarter Edition100% Offをクリックするとダウンロードページに飛べます
(無料ダウンロードは、2016年8月22日から9月9日までの期間限定)

DelphiとC++Buiderは別個にダウンロードが必要な模様

(無料ダウンロードは、2016年8月22日から9月9日までの期間限定)
0417デフォルトの名無しさん2016/09/04(日) 07:03:58.75ID:5SDmlLW2
>>415はDelphiのみでした
0418デフォルトの名無しさん2016/09/04(日) 07:28:40.73ID:uvifPYcj
リンク先ページを見たけど、これでダウンロードできるのは
「30日間だけ無料で使えます」バージョンじゃないのかな。

"Try C++Builder FREE for 30 days" って
ダウンロードできる期間が30日間、じゃないよね。
>>415-416 に出てる期間は30日には足りないし。
0419デフォルトの名無しさん2016/09/04(日) 09:09:03.52ID:xp6EP8jq
スターターエディションの方じゃね?

C++ Builder
https://www.embarcadero.com/jp/products/cbuilder/starter/promotional-download

Delphi
https://www.embarcadero.com/jp/products/delphi/starter/promotional-download
0420デフォルトの名無しさん2016/09/04(日) 09:17:51.17ID:ZU1xzEkS
>>390
簡単だと言い張って可読性の低いバギーなもん作ってよこす奴が多いから
テンプレートは嫌いなんだよ。
STLで十分。
0421デフォルトの名無しさん2016/09/04(日) 09:56:16.37ID:ZZxj7Xyl
無能の言い訳にしか聞こえないな
0422デフォルトの名無しさん2016/09/04(日) 10:13:47.98ID:xp6EP8jq
>>420
> 簡単だと言い張って可読性の低いバギーなもん作ってよこす奴が多いから

理由になってなくて笑た
0423デフォルトの名無しさん2016/09/04(日) 10:22:29.27ID:GcCwBDUy
>>420
特定の人間でなく周りに多いのなら受けるお前の方に問題があるんじゃないか?
0424デフォルトの名無しさん2016/09/04(日) 10:39:20.02ID:GZCXAM8t
類友なのに自分は違うって思ってるパティーン
最も傑作でおめでたい人種
0425デフォルトの名無しさん2016/09/04(日) 12:40:13.35ID:+mIHXAwk
昔のオブジェクト指向と似たような議論だな。
別にフルに使いこなせなくても恩恵は受けられるだろうにw
0426デフォルトの名無しさん2016/09/04(日) 13:31:30.85ID:u29z8UDZ
難しいから使うなって一生使えるようにならないよね
そういう進歩を捨てた人間は技術者とは認めてないわ
0427デフォルトの名無しさん2016/09/04(日) 13:58:48.62ID:6rO3xNqX
>>420
最後の2行は2016年度最強の名言だな
0428デフォルトの名無しさん2016/09/04(日) 14:05:26.02ID:VQnaPYaY
>>427
テンプラ屋でもやれば?
0429デフォルトの名無しさん2016/09/04(日) 14:05:45.23ID:X6kuqpOw
べつに嫌いな機能が有ってもおかしくはないな。
プリプロセッサーが嫌いな人とか、iostreamが嫌いな人とか人それぞれ
0430デフォルトの名無しさん2016/09/04(日) 14:06:53.24ID:6rO3xNqX
オブジェクト指向www
久しぶりに聞いたな
0431デフォルトの名無しさん2016/09/04(日) 14:07:38.02ID:OnzMHuuE
>>420
まずはSTLが何の略語なのか調べてみよう!
0432デフォルトの名無しさん2016/09/04(日) 14:17:00.28ID:xp6EP8jq
>>429
嫌いな機能はあってもいいけどその理由が >>420 とかなのはねぇ
0433デフォルトの名無しさん2016/09/04(日) 14:45:42.58ID:bYyi8Nkm
C++を使う理由の90%がテンプレートでしょう
使わないならCでもやっててください
0434デフォルトの名無しさん2016/09/04(日) 14:52:46.08ID:VQnaPYaY
C言語しか出来ない50代くらいのジジイたくさん居る
で、なぜかえばっている
0435デフォルトの名無しさん2016/09/04(日) 14:54:45.23ID:Zvr3allz
便利だと言い張って可読性の低い醜悪なもん作ってよこす奴が多いからCPPは嫌いなんだよ。
テンプレートは最高。
0436デフォルトの名無しさん2016/09/04(日) 15:16:44.85ID:9+LtAjSl
stlっていっても、実装見たら初学者でも書けるようなものがほとんどでしょ。
forで回して、比較してるだけとかwww
積極的に使う理由がない
0437デフォルトの名無しさん2016/09/04(日) 15:23:23.36ID:u29z8UDZ
コピペすんな
0438デフォルトの名無しさん2016/09/04(日) 15:58:19.56ID:dwel9f30
おいら最近はC#のほうが多くてC++はご無沙汰になってるんだけど
C++のテンプレートが使えたらなあって思うことはたまにある
0439デフォルトの名無しさん2016/09/04(日) 16:51:50.12ID:1H4SDZ6a
は? C#にも名前は違うけどあるだろボケ
0440デフォルトの名無しさん2016/09/04(日) 17:03:58.61ID:u29z8UDZ
ねえよ
0441デフォルトの名無しさん2016/09/04(日) 17:05:46.48ID:dwel9f30
>>439
似たようなのはあるし、大体はそれで問題ないんだけど
テンプレートとは根本的な仕組みが違うので、特殊化とか微妙に出来ることに差があるのよね
0442デフォルトの名無しさん2016/09/04(日) 17:12:09.12ID:UDXdUcTk
C#のジェネリックはCLIを一個しか生成せずに、型の違うオブジェクトが与えられたら
JITコンパイル時に生成してるもんな
だからサイズは小さいけどC++のtemplateとは根本的に考え方が異なる

おまけにオブジェクト同士を演算しようとするとコンパイルエラーになるので
dynamic、つまりリフレクションを使うしかないという
0443デフォルトの名無しさん2016/09/04(日) 18:39:26.39ID:c++wF4a4
IDがC++だー
0444デフォルトの名無しさん2016/09/04(日) 18:54:35.76ID:ZZxj7Xyl
>>443
おおすげーおめでとう
0445デフォルトの名無しさん2016/09/04(日) 19:14:14.87ID:1H4SDZ6a
>>442
言語機構が違うから実装も異なるのは当たり前。
それがどう実用上影響するのかを書けよ。

当たり前だが、俺はC#のジェネリックと
C++のテンプレートの機能上の様々な相違点(例えばintを引数に取れないとか)は知った上で、
おまえさんの教育のために質問してるからな?
勘違いするなよ。
0446デフォルトの名無しさん2016/09/04(日) 19:16:44.51ID:1H4SDZ6a
intを取れないってのは_
C++でできるtemplate<int N>
みたいなのがC#ではできないって意味な。

馬鹿が勘違いするといけないから。
0447デフォルトの名無しさん2016/09/04(日) 19:25:27.22ID:OnzMHuuE
>>443
おおっ!
0448デフォルトの名無しさん2016/09/04(日) 21:25:33.06ID:pHvOGCAw
>>439
> は? C#にも名前は違うけどあるだろボケ
ジェネリックとテンプレートが同じだといいたいのかな?
ガチなアフォ登場したなwww
0449デフォルトの名無しさん2016/09/04(日) 21:27:10.35ID:dwel9f30
>>448
C++分かる人に使い方の説明しろと言われたら間違いなく
真っ先に「テンプレートです」って言うけどな
0450デフォルトの名無しさん2016/09/04(日) 21:37:35.91ID:ZdgSZwYz
テンプレートはコンパイルタイム、ジェネリックはランタイムだ。
0451デフォルトの名無しさん2016/09/04(日) 21:37:38.20ID:xp6EP8jq
>>443
スゲー、なんか羨ましいぜ
0452デフォルトの名無しさん2016/09/04(日) 21:48:56.88ID:I3Tx/JDs
コンパイルタイムのくせにいちいち
typenameをつけまくらないといけない
クソ言語。
テンプレートパラメーターごとに特殊化が作られるんだから
その辺テキトーでもいいはずなのに。
0453デフォルトの名無しさん2016/09/04(日) 21:54:49.52ID:LHkeQq2D
つか、型なんてコンパイル時なんて遅すぎだろ
普通は設計終わった段階で全て決定してるし。
0454デフォルトの名無しさん2016/09/04(日) 21:58:44.17ID:I3Tx/JDs
まじかよ
俺今日vector<int>って書いたけど
vectorの設計後にインスタンス化しちゃったぜよ
0455デフォルトの名無しさん2016/09/04(日) 22:00:39.11ID:+mIHXAwk
細かい違いはあれどジェネリックはC#版のテンプレートだろ
0456デフォルトの名無しさん2016/09/04(日) 22:16:41.22ID:LHkeQq2D
ジェネリックはC#版のテンプレート
名言頂きました
■ このスレッドは過去ログ倉庫に格納されています