[表示 : 全て 最新50 1-99 101- 201- 301- 401- 501- 601- 701- 801- 901- 1001- 2ch.scのread.cgiへ]
Update time : 02/24 15:41 / Filesize : 321 KB / Number-of Response : 1024
[このスレッドの書き込みを削除する]
[+板 最近立ったスレ&熱いスレ一覧 : +板 最近立ったスレ/記者別一覧] [類似スレッド一覧]


↑キャッシュ検索、類似スレ動作を修正しました、ご迷惑をお掛けしました

C++相談室 part137



1 名前:デフォルトの名無しさん [2018/08/27(月) 16:02:00.94 ID:vY3QDx2y0.net]
次スレを立てる時は本文の1行目に以下を追加して下さい。
!extend:on:vvvvv:1000:512

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

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

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

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

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

----- テンプレ ここまで -----
VIPQ2_EXTDAT: default:vvvvv:1000:512:----: EXT was configured

655 名前:デフォルトの名無しさん mailto:sage [2018/09/23(日) 09:37:53.48 ID:LgC14Oo10.net]
bool operator<(const T& a, const T& b)は定義されている前提で、
クラスTについてbool operator==(const T& a, const T& b)が定義されていたらそのoperator==()を使い、
定義されていなかったら
 bool operator==(const T& a, const T& b) { return (!operator(a, b) && !operator(b, a)); }
を勝手に補完するようなテンプレート(の特殊化?)ってどうやって書くの?

656 名前:デフォルトの名無しさん mailto:sage [2018/09/23(日) 11:39:09.69 ID:A6XCmyXs0.net]
std::rel_ops空間に == から != を、< から <= > >= を合成するテンプレートならあるけど

657 名前:デフォルトの名無しさん mailto:sage [2018/09/23(日) 12:14:54.07 ID:loi8GnJQ0.net]
これとかに載ってなかったっけ?
https://www.amazon.co.jp/dp/4894714353/?tag=hatena_st1-22&ascsubtag=d-7dzm

658 名前:デフォルトの名無しさん mailto:sage [2018/09/23(日) 14:13:03.08 ID:oyuLVtOs0.net]
detection idiomで検出してSFINAEで分岐させるだけでできそうだけど

659 名前:デフォルトの名無しさん mailto:sage [2018/09/23(日) 14:26:07.42 ID:Dpz6ufMn0.net]
barton nackman trickやな
operator ==が定義されているかどうかの分岐はSFINAEいるんでちょっと複雑になりそうだけど
private継承する基底を選ぶような形にできるはず

660 名前:デフォルトの名無しさん [2018/09/23(日) 16:41:12.46 ID:d60j7qb90.net]
そんなことができるざんすか。
めんどくさそうですな。

661 名前:デフォルトの名無しさん mailto:sage [2018/09/23(日) 16:42:46.60 ID:oyuLVtOs0.net]
if constexprつかえばSFINAEいらんな
普段使えない環境だから出てこなかった・・・

662 名前:デフォルトの名無しさん mailto:sage [2018/09/23(日) 17:06:46.21 ID:LgC14Oo10.net]
スフィ姉たまんねぇ

ていうか>>643見てnamespace rel_opsの定義見て考えたがSFINAE要らなくね?
コンパイラの挙動(関数名の解決規則?)として、
Tについてoperator==(const T& a, const T& b)そのものズバリが定義されていればそれが使われるし、
無ければその次以降にテンプレートを探しに行こうとするから、
そのときstd::rel_ops名前空間が導入されていれば勝手にテンプレートバージョンが使われる
というしくみっぽい?

663 名前:デフォルトの名無しさん mailto:sage [2018/09/23(日) 17:18:52.49 ID:oc2N8BDIM.net]
>>632
バリバリのテンプレート使いいませんか?
テンプレート難し



664 名前:デフォルトの名無しさん mailto:sage [2018/09/23(日) 17:45:10.35 ID:oyuLVtOs0.net]
>>649
あーたしかに
試してみたらいけた

665 名前:デフォルトの名無しさん mailto:sage [2018/09/23(日) 17:58:10.59 ID:Dpz6ufMn0.net]
>>648
if constexprほとんど使ったことなかったけど便利だなー
確かに型で分岐する必要なかった
https://wandbox.org/permlink/8CGWlZ5i5JLl33Ws

>>649
その方法だと、>>642で言ってるような特殊な補完を他のクラスにも適用することにならん?
それでもいいならいいけど

666 名前:デフォルトの名無しさん mailto:sage [2018/09/23(日) 19:13:07.53 ID:3hdlUg1R0.net]
>>650
わかんないなら質問すればいいじゃん
何がわからないから分からないと本とかのおススメもできないだろ

667 名前:デフォルトの名無しさん mailto:sage [2018/09/23(日) 21:11:00.27 ID:ygIHva++9]
https://ideone.com/uNCJuL
なぜデストラクタが2回呼ばれるのか分かりません。
理由を教えてください。

668 名前:デフォルトの名無しさん mailto:sage [2018/09/23(日) 21:04:04.43 ID:LgC14Oo10.net]
>>652
>その方法だと、>>642で言ってるような特殊な補完を他のクラスにも適用することにならん?
ならない。ならずに済ませられることができる
補完する演算子のテンプレートの導入範囲を

669 名前:名前空間で限定すればおk↓↓↓
ttps://ideone.com/p4FS43

21行目のOP_EQ_FOO_ENを定義してもしなくてもビルドが通り、Foo::operator==()の呼び出し回数を除き同じ結果になる。

ただし、operator==()についてはちょっぴり闇が深いことがわかった。
名前空間std::rel_opsにはoperator==()テンプレートが存在しない
上のサンプルではstd::rel_ops名前空間に無理矢理operator==()テンプレートを追加したが、
実際にやるときは独自の名前空間でoperator<()以外の全部(==、!=、>、<=、>=)を用意しておくことになるん
ジャマイカ
[]
[ここ壊れてます]

670 名前:デフォルトの名無しさん mailto:sage [2018/09/23(日) 21:30:04.73 ID:Dpz6ufMn0.net]
あーすまん、目的を誤解してた
クラスのoperator ==の実装を省きたいんじゃなくて使う側で補完できればいいのか

671 名前:デフォルトの名無しさん [2018/09/24(月) 00:24:52.05 ID:rSek34EXa.net]
5年くらい前?にテンプレートプログラミングっぽい趣旨の本があったし、基本情報に何故かPrologと同じジャンルにテンプレートが言語として載ってる辺り論理型言語っぽい事ができるみたいだが、基本C++の1機能でしか無いから、知ってる人は少ないんじゃ無い?

俺も知らない。

672 名前:デフォルトの名無しさん mailto:sage [2018/09/24(月) 00:56:28.11 ID:cIWp1XlU0.net]
C++テンプレートテクニック 第2版、
επιστημη(えぴすてーめー)・高橋 晶、2014

C++ 標準化委員のεπιστημη の本だろ。

ドワンゴ江添亮も、需要があれば、こういう本を書きたいって言ってたけど

673 名前:デフォルトの名無しさん [2018/09/24(月) 01:06:54.52 ID:rSek34EXa.net]
それそれ。
出来るっぽいってのは知ってても、実際できてる奴少ないと思われ。



674 名前:デフォルトの名無しさん [2018/09/24(月) 01:14:19.28 ID:Kxio7RVg0.net]
テンプレート使うのに
いちいちそんな悩むもんなんか

なにかを参考にしたいようだが
たとえばtraits乱用してるようなのは読む必要もないし
逆にマネする必要がないわ

675 名前:デフォルトの名無しさん [2018/09/24(月) 01:21:07.01 ID:rSek34EXa.net]
俺も気にした事ないけど、気になる奴は気になるんだろう。

俺の場合は整数型をどうやって文字列型にしてるんだ?ってのが疑問でむしろアセンブラに走って頭捻って理解した。

まあ人間そんなもん。

676 名前:デフォルトの名無しさん mailto:sage [2018/09/24(月) 01:37:53.34 ID:orHhPIQU0.net]
テンプレートはC++の必須教養だと思ってるけど、別になくても困らないしな・・・

677 名前:デフォルトの名無しさん mailto:sage [2018/09/24(月) 01:47:51.69 ID:sBjtzBeV0.net]
>>662
つ vc++ 1.x
こいつのテンプレートは泣ける

678 名前:デフォルトの名無しさん mailto:sage [2018/09/24(月) 01:54:17.59 ID:XuY/8j5Q0.net]
>>657->>662
同感

はちみつと言い争ったときに
>>デザインの風潮というものは間違いなくある。
>そう思ってんのはお前らアマチュアだけだから。(特にお前の思ってるようなデザインについては)
とか書いたけど
実践ではなく仕様メインで覚えてる人(趣味でC++の知識を集めるのがメインの人であり、アマチュア)は
「これからの時代はテンプレート使った総称的プログラミングが主流」
みたいなパラダイムの変化を訴えてるけど、それはっきり言って素人が見れるコードでだけだから・・・
(C++標準ライブラリやBoost等)
テンプレート使ってとことん汎用性を高めたライブラリなんか、普通のソフト開発の現場では使われんわ
あまりにも時間がかかりすぎる
そういうごくごく一部の偏ったソースしか読んだことないから誤解するんだろう
で、その誤解した趣味グラマのネット上の言説やライターが書いた本を読んで、
初心者がC++に挫折して去っていくという・・・・・
C++なんか最初はベターCでいいんだよはっきり言って
あと最近ネット見てて(C++の)オブジェクト指向とかC時代の古いノウハウの解説が少ないのは、
単にとっくに出尽くしたからだからな、最近始めたやつは誤解したらだめよ

679 名前:デフォルトの名無しさん mailto:sage [2018/09/24(月) 02:00:05.34 ID:XuY/8j5Q0.net]
訂正
Xテンプレート使ってとことん汎用性を高めたライブラリなんか
○テンプレート使ってとことん汎用性を高める開発手法なんか

680 名前:はちみつ餃子 mailto:sage [2018/09/24(月) 02:14:19.64 ID:tUW1+gfS0.net]
>>664
「何もかもを継承構造で解決しようとするな」の
ひとつとしてテンプレート (を C++ なら利用することになるプロトコル指向的デザイン) が出たんだし、
C++ にコンセプトの概念を持ち込もうとする機運があるほどには活用比率も高まるだろう、という程度の主張なのに、
「とことん汎用性を持たせるべき」とか「主流になる」みたいな拡大解釈はやめてくれよ。
俺はそんなこと主張してないからね!

681 名前:デフォルトの名無しさん mailto:sage [2018/09/24(月) 02:32:05.77 ID:XuY/8j5Q0.net]
>>666
しつこいぞ
>テンプレートの活用が失敗っていうのは言語そのものとしてのサポートが不充分だったというのがあって
「おかしな流行が発生して初心者を惑わした」、に対して反論したんだろ?嘘つくなよ

>俺はそんなこと主張してないからね!
主流になる、って意味だろ?これ↓
>C++20 でコンセプトが入ったら C++ のパラダイムがそっちに一気に傾くと思う。

ちなみに
>コンセプトの概念を持ち込もうとする機運
コンセプトは標準化委員会や禿が言い出したことだぞ
導入されたら素晴らしいとは思うが、元々はテンプレートを使ったコードのエラーメッセージをどうにかすることと
テンプレートパラメータで満たすべき要件をコメントではなくコードで示せるようにすることだ
プロトコル指向は聞いたことないが、それはコンセプトで可能になるおまけ程度だろ
しかもそれを利用するにはテンプレート必須なわけで、コンセプトが入ろうが、
クラスなどが実際どういう仕組みなのか程度のことは把握してないと、初心者が手を出せるようなものではないし
出させるべきでもない

682 名前:はちみつ餃子 mailto:sage [2018/09/24(月) 02:45:26.39 ID:tUW1+gfS0.net]
>>667
変な (教え方なり使い方なりが下手くそな) 流行があったということを以て
テンプレートの活用を全否定するような言い分に反論したんだよ。
テンプレートが無くて良いと思ってるわけじゃないんだろ?

> 主流になる、って意味だろ?
今までが継承構造に頼りすぎだったのが是正されるという意味だ。

初心者への教え方については、また別の話。
ベターCからで良いという意味のことは D&E にも書かれてる基礎理念だから
そこは疑ってない。

683 名前:デフォルトの名無しさん mailto:sage [2018/09/24(月) 02:59:37.96 ID:XuY/8j5Q0.net]
>テンプレートの活用を全否定するような言い分に反論したんだよ。
>>587>>588を100回読み直せボケが
悪いけど、お前まともにメタプログラミングやってないだろ?
まともに活用して利点・欠点をはっきりわかってないやつが何偉そうに語ってんの?
しかもその理由で反論したんなら、なおさらポリモーフィズムの話で論破されただろ、
なんで認めずに自分の主張の意味を途中から変えてまで言い返してんの?
図星突かれて気分が悪いってか?

>今までが継承構造に頼りすぎだったのが是正される
誰が頼りすぎてたの??今までっていつまで?

>初心者への教え方については、また別の話
今まで何度も「こいつ初心者にテンプレート勧めてるよ・・・・何考えてんだ」と思ってたんですが
どの口で言ってんだ



684 名前:はちみつ餃子 mailto:sage [2018/09/24(月) 03:17:34.86 ID:tUW1+gfS0.net]
>>669
ポリモーフィズムの話ってなんだ?

初心者へじゃなくて、
君に、テンプレートの話はしてたつもりだが。
(ID 変わってるから他の人だったらスマソ)
他の人にアンカーを付けてテンプレートの話はしてないだろう。

685 名前:はちみつ餃子 mailto:sage [2018/09/24(月) 03:38:10.37 ID:tUW1+gfS0.net]
>>669
> 誰が頼りすぎてたの??

標準ライブラリすら。
その他はまあ、私の実感なので、違うというなら違うのかもしれない。

686 名前:はちみつ餃子 mailto:sage [2018/09/24(月) 03:48:16.31 ID:tUW1+gfS0.net]
「美味しんぼには我慢ならん」
「おい、辛抱しろ」

687 名前:はちみつ餃子 mailto:sage [2018/09/24(月) 03:48:58.75 ID:tUW1+gfS0.net]
誤爆した。 ごめん。

688 名前:デフォルトの名無しさん mailto:sage [2018/09/24(月) 09:51:46.55 ID:dKKNaNpJ0.net]
本当にテンプレートが必要なものってだいたいSTLに揃ってる印象。
あとはTBBみたいにある程度低いレイヤーの抽象化ではどうしても必要にはなる。
しかしこの種類のライブラリってのは本当に信用できる奴が作ったもの以外は
使いたくねーんだわ。
めちゃくちゃデバッグコスト高いからね。
そういう意味で一般プログラマーが実装するってのは実践的ではない。

689 名前:デフォルトの名無しさん mailto:sage [2018/09/24(月) 10:18:16.36 ID:cpSL59m30.net]
テンプレートは型の定義をすり替えるために使うもの
#ifdefで型切り替える方がもっと糞だからそこはテンプレートにするべき
それ以上の凝った事はしないほうがいいね

690 名前:デフォルトの名無しさん mailto:sage [2018/09/24(月) 11:22:17.38 ID:GIs1tf8Y0.net]
頼りすぎつーか逆だと思うぜ
コンテナの要件なんかインターフェイスにすればすっきりするのに
紙マニュアル(pdf含む)でガタガタ書かれた口約束とかすげーイヤ
歴史的に見てもそれをやるのに充分な言語機能がもうあったのに

691 名前:はちみつ餃子 mailto:sage [2018/09/24(月) 11:36:08.69 ID:tUW1+gfS0.net]
>>676
現状の C++ では型の制約を表すには意味不明な SFINAE で回りくどくやってて
初心者には使いこなせない (中級者でも不安があったり面倒だったりする)
という話の文脈だから、言語機能が充分だというのはちょっと変な立場だ。

692 名前:デフォルトの名無しさん mailto:sage [2018/09/24(月) 11:43:09.69 ID:IXp/Ejzw0.net]
どうーがんばっても停止性問題は機械的に解けないケースを無くせないのだから
プログラミング自体をアルゴリズム化する企てはどこかで行き詰る
藻前らは行き詰まりかたの良し悪しを議論しているにすぎないのだガハハハハハハ

693 名前:はちみつ餃子 mailto:sage [2018/09/24(月) 11:47:19.43 ID:tUW1+gfS0.net]
>>676-677
ひょっとして抽象クラスでやったらいいという話だろうか。
Java とかから来た人はそういうことをやりがちだけど、 C++ の設計理念からすると、
少なくとも標準ライブラリでは仮想関数テーブルを辿る実行コストを許容はしないだろうと思う。



694 名前:デフォルトの名無しさん mailto:sage [2018/09/24(月) 12:24:10.58 ID:GIs1tf8Y0.net]
>>679
動的結合のコストは関数ポインタなみにはっきりしてるだろ

695 名前:デフォルトの名無しさん mailto:sage [2018/09/24(月) 12:28:24.97 ID:cpSL59m30.net]
インターフェース(=データメンバーなし抽象クラス)は静的な型の制約を表現できないからダメ

696 名前:デフォルトの名無しさん mailto:sage [2018/09/24(月) 12:58:55.73 ID:XuY/8j5Q0.net]
>>679
>C++ の設計理念からすると、
>少なくとも標準ライブラリでは仮想関数テーブルを辿る実行コストを許容はしないだろうと思う
滅茶苦茶言うな
https://cpplover.blogspot.com/2015/09/memoryresource.html

>>674
ついでに開発コストも高い
STLが優れてるのは、作者が長年コンテナについて熟考に熟考を重ねたライブラリだからであって
それを実現するためにテンプレートが使われたに過ぎない
テンプレート使ってりゃなんでも有用なライブラリになると勘違いしてるアホが増えた

697 名前:デフォルトの名無しさん mailto:sage [2018/09/24(月) 13:04:35.46 ID:B4Me2M7J0.net]
テンプレートは即席麺的な発想でライブラリのような寝かして熟成させるワイン的な使い方には向いていない

698 名前:デフォルトの名無しさん mailto:sage [2018/09/24(月) 13:10:53.22 ID:IXp/Ejzw0.net]
インターフェースはあらゆるメソッドを最初から詰め込まねばならないからイヤソ(特に単一継承の場合
お禿様も自著でそういう傾向(あらゆるメソッドが基底クラスに集中する傾向があることをこっそりカミングアウトしていたはず
テンプレートにはそういう制約がない
型引数Tにadd()メソッドがあるものとしてテンプレートを書いたら、add()メソッドがある既存クラス全部にそのテンプレートが使える
というわけで、インターフェースはそれ自体静的な型の制約のつもりなのかもしれんが、
真にかけたい制約(上の例でいうとadd()メソッドの存在だけを問題にしたいケース)に対して不必要に過剰になることが多いキモス

あとインターフェースだとコンテナの実現は具体的にはどうするんじゃ…
仮想関数テーブル参照の実行時コストだけでも許容し難いのに、間接参照がさらに必要になるんじゃ…

699 名前:デフォルトの名無しさん mailto:sage [2018/09/24(月) 13:22:48.05 ID:GIs1tf8Y0.net]
インターフェイスを単一継承前提で考えるって、どんな教育を受けるとそうなるのかな
numeric_limits<uintmax_t>::max()歩譲って単一継承ってことにしても
最初から全部詰め込みなんてハメにはあまりならないし

あらゆるメソッドが基底クラスに集中するなんて事例あるか?
俺は空想論だと断言するぞ
Smalltalkのobjectみたいなクラスに何が置けるんだよ

あと、なんか仮想テーブルのコストが云々いってるやつが複数いるようだが
具体的にどのくらいか、せめてオーダーくらいわかっているのか

700 名前:デフォルトの名無しさん mailto:sage [2018/09/24(月) 13:35:23.36 ID:cpSL59m30.net]
オーダーの問題じゃなくて、C++にはゼロオーバーヘッドの原則があるんだから
ゼロオーバーヘッドに出来るものはゼロオーバーヘッドにするんだよ、標準はその手本なんだから

それにオーダーなんか処理内容でなんぼでも変わるだろ
せいぜい数十万要素のコンテナしか使わないプログラムだから仮想テーブルなんかどうでもいいと主張する奴の言うことは正しいかもしれないが
数兆個の要素を扱う人にはそんなもの慰めにならん

701 名前:デフォルトの名無しさん mailto:sage [2018/09/24(月) 13:56:47.91 ID:IXp/Ejzw0.net]
>>685
>インターフェイスを単一継承前提で考えるって、どんな教育を受けるとそうなるのかな
型に対する静的制約を実現するにあたり、多重継承は助けにならないからですだが…

>あらゆるメソッドが基底クラスに集中するなんて事例あるか?
上とまとめて理由を述べる
今、add()メソッドを備えるインターフェースA、sub()メソッドを備えるインターフェースBがあったとして、
加減算ができる具象クラスDやEは、それぞれAとBを多重継承したら一応はできる ・・・(1)
しかし、このバージョンのDやEは「加減算ができるクラス」という静的制約を満たしているとは言えない
なぜなら、DとEは全く別のクラス扱いになるから、DとEを共通に扱える関数を書けないので…
「加減算ができるクラス」という制約の正しい書き方は、AとBを継承するインターフェースCを定義して、
DやEにCを継承させる(単一継承)とらざるおえない ・・・(2)

なおいうまでもないことだがテンプレートにはそんな制限は無い。(1)のバージョンのD、Eに対して
問題なく「加減算ができるクラス」という制約をかけられる(Cにメソッドを集中させる必要が一切ナッシング

702 名前:デフォルトの名無しさん mailto:sage [2018/09/24(月) 14:02:13.87 ID:IXp/Ejzw0.net]
ていうか最後の2行で筆が滑ったorz
テンプレートで「加減算ができるクラス」という制約をかけるにはインターフェースA、Bもそもそも要らん
スゲー便利

703 名前:デフォルトの名無しさん mailto:sage [2018/09/24(月) 14:25:40.72 ID:yuMzZsdXa.net]
templateはダックタイピングだとおもう



704 名前:はちみつ餃子 mailto:sage [2018/09/24(月) 15:09:08.71 ID:tUW1+gfS0.net]
どう説明したもんかと思ったけど、 >>684 の説明が分かりやすいな。
(Java でいうところの) インターフェイスは型の性質を事前に網羅しなきゃ
全体のデザインが定まらない。

関数が要求する性質 (インターフェイス) が増えた時に元の定義をいじるか、
mixin のような形で継承関係を作ることになる。
ちょっと機能を増やすだけでいらん継承関係を作るのは良くないという話の延長線上で
考えればインターフェイスを使ったところであまり解決にならない。

型制約 (コンセプト) は関数の側に付加するものなので、後付けが簡単だ。
結果的に型の側はその性質を持たなきゃならないことにはかわりないが、
性質を追加するのに元のクラス定義を弄らなくて済む。

-----------

最初の設計がキッチリしてたら、
クラス指向的なスタイルの方が混乱が少なくて良いかもしれないなと思い始めてきた。

でも、現実にはそうではない後付けだらけじゃん? とも思ってるわけ。

705 名前:デフォルトの名無しさん mailto:sage [2018/09/24(月) 15:15:20.89 ID:GIs1tf8Y0.net]
>>687
型に対する性的制約って何?
それと事例あるか?と聞いている質問に何で長文がいるんだよ
具体的なライブラリとクラス名を挙げるだけだろうが
なるべく知名度の高い事例ほど説得力があるぞ

706 名前:デフォルトの名無しさん mailto:sage [2018/09/24(月) 15:32:49.32 ID:XuY/8j5Q0.net]
>>690
コンセプトを盲信しすぎだろ
あくまで要件をコードで示せるだけだっての

それこそSTLには必ず導入されるべきものだけど、そのSTLでの不満、
つまりInputIteratorだのなんだのの要件をいちいちリファレンス参照しないとわからなかった(>>676)から
必要とされたわけで

はちみつとかは多分STLべったりで、それ以外のライブラリを読んだり
まともにソフト書いたことないから、STLがほとんど出てこない状況ってのを経験してないんだろ

>ちょっと機能を増やすだけでいらん継承関係を作るのは良くないという話の延長線上で考えれば
話を広げすぎ。
型の制約という意味でいえば、現状コンセプトを待つしかないが
多分>>685が言ってるのは、Modern C++ Designで言うところのポリシークラスみたいな話じゃね?(違うかもしれんけど
この場合はあくまで要件定義なので当てはまらないと思うけど、
>いらん継承関係を作るのは良くない
これは暴言。Andrei Alexandrescuに言ってくれば?
ポリシークラスのような、継承によって機能を取り込む設計も非常に便利だし、それこそSTLでもあちこちで使われてるんだがww

あと後半チラ裏にも程がある。何様だよ

707 名前:デフォルトの名無しさん mailto:sage [2018/09/24(月) 15:33:05.07 ID:cpSL59m30.net]
Container<T>のbegin()が返すのはIterator<T>だとか
Matrix<M,N>とVector<K>はN==Kのときだけ掛け算できて結果はVector<M>だとか
Converter<V,W>とQueue<X>とProcessor<Y,Z>を持ってたらWとXとYはコンパチブルじゃなきゃいけないとか
そういうのが型の静的制約

708 名前:デフォルトの名無しさん mailto:sage [2018/09/24(月) 15:39:44.60 ID:GIs1tf8Y0.net]
へーえ、vector<int>とvector<string>が掛け算できないという制約が
pure virtualを使った途端に無法状態になってしまうのか

709 名前:デフォルトの名無しさん mailto:sage [2018/09/24(月) 16:03:46.76 ID:cpSL59m30.net]
じゃあ練習問題だ
IntVector::begin()の戻り値はIntIteratorで、IntIterator::value()はintを返す
StringVector::begin()はStringIteratorで、StringIterator::value()はstringを返す
そういう制約を表現するインターフェースIVectorを具体的に書いてみよう!

出来やしないのは手を動かせばすぐわかる

710 名前:デフォルトの名無しさん mailto:sage [2018/09/24(月) 16:06:21.46 ID:cpSL59m30.net]
ああこれだけだと出来ちゃうか
end()もあってbegin()と同じ型のイテレーターを返すっていう制約も付けてちょうだい

711 名前:デフォルトの名無しさん mailto:sage [2018/09/24(月) 16:08:34.73 ID:GIs1tf8Y0.net]
#define interface struct
template <typename T>
interface IVector
{
class iterator;
virtual iterator begin() const = 0;
};

712 名前:はちみつ餃子 mailto:sage [2018/09/24(月) 16:14:35.10 ID:tUW1+gfS0.net]
>>692
ポリシークラスは注入 (?) すべきポリシーをパラメタ化してるだけで、
何をパラメタにするかというデザインがきちんとしてれば有用だし、
いらん継承だとは思わないよ。

でも、現実には後になってそれがわかることもあるよねっていう話。

713 名前:デフォルトの名無しさん mailto:sage [2018/09/24(月) 16:24:48.03 ID:cpSL59m30.net]
>>697
テンプレート使ってんじゃねえよ雑魚



714 名前:デフォルトの名無しさん mailto:sage [2018/09/24(月) 16:34:08.72 ID:GIs1tf8Y0.net]
>>699
は? 後出しで言い訳してんじゃねえよ蛸助
インターフェイスがテンプレートになってる実例をまさか知らんのか?w

715 名前:デフォルトの名無しさん mailto:sage [2018/09/24(月) 16:37:21.35 ID:cpSL59m30.net]
お前の主張通り継承で全部やれよ
そういう所が雑魚なんだよw

716 名前:デフォルトの名無しさん mailto:sage [2018/09/24(月) 16:38:54.75 ID:GIs1tf8Y0.net]
捨て台詞吐いて逃亡かw
追わねえよくっだらねえ

717 名前:デフォルトの名無しさん mailto:sage [2018/09/24(月) 16:41:06.83 ID:cpSL59m30.net]
そっくりそのままお返ししますわw
テンプレートと継承の出来ることと出来ないことの区別がつくまで二度と下らない妄言吐くなよ

718 名前:デフォルトの名無しさん mailto:sage [2018/09/24(月) 17:18:02.91 ID:XuY/8j5Q0.net]
>>698
>現実には後になってそれがわかることも
それは
>何をパラメタにするかというデザインがきちんとしてれば
が後で変更になることもある、ってことだろうけど
そこまでの変更があったら、結局元の定義に手を出さなきゃいけないのは
どんな設計でも同じことだと思うけどなぁ

>性質を追加するのに元のクラス定義を弄らなくて済む
と言ってたが、それは結局関数とかでクラスの要件を必要以上に大きくしないように
例えばallocator_traitsみたいに、色々手間をかけて、利用するクラスへの依存を減らすのと同じじゃね?
俺にはそういうイメージしか沸かないんだが
コンセプトマップってそういうことだろ
結局テンプレートであれこれ書くことになるか、コンセプトマップであれこれ書くことになるか、ってだけ
(=開発コストは高い)

std::vectorだって、例えばアロケータは初期化時に渡さないといけないし
コピーとかしたときにアロケータはコピーしてくれなかったと思うが
それが不便だという声もある(ここでたまに取り上げられるEASTLの開発動機で触れられてる
あと、アロケータは型に依存するけど、メモリ確保なんてのはそもそも型は関係ないので
アロケータのあの設計は失敗かもね、というのもある(同じくEASTLでも触れられてる
それに対する代替案として、上で挙げたstd::pmr::memory_resourceが出てきたわけだけど、
今更STLの基本設計は変えられないのでpolymorphic_allocatorでラップするということになった

もしvectorがポリシークラスを受け取って、アロケータやメモリ管理についてもっと汎用化してたら
こういう問題は起きなかった(クッソ複雑になってるだろうけど)
これコンセプトでどうにかなるか?後になってわかってもどうにもならんよ

719 名前:デフォルトの名無しさん mailto:sage [2018/09/24(月) 17:46:45.01 ID:yIbiTIWcr.net]
ヒープ領域にインスタンスを作りたいときってどうしてもポインタを意識しないとダメなの?

MyClass abc;
みたいに宣言したいんだが。

MyClass* abc;
abc = new MyClass;
みたいにするしか方法ないの?


ヒープに作りたい理由は、巨大なオブジェクトだから。
ちなみにスマートポインタは使えない (icpc 12.0.4)。

720 名前:デフォルトの名無しさん mailto:sage [2018/09/24(月) 17:53:54.47 ID:CvpxIDb80.net]
コンパイラに指示できるか、という意味ではないよ
そんなのあったも紛らわしいだけだと思うけど

721 名前:デフォルトの名無しさん mailto:sage [2018/09/24(月) 18:26:32.41 ID:sIOpRstjM.net]
>>705
MyClass& abc = *new MyClass;
でいけるかも知らんけど十中八九delete忘れるし後から見て分かりにくいだけだから俺ならやらない

722 名前:デフォルトの名無しさん mailto:sage [2018/09/24(月) 18:31:59.03 ID:cpSL59m30.net]
struct MyClassHolder
{
 MyClass* p;
 MyClassHolder(): p(new MyClass()){}
 ~ MyClassHolder(){delete p;}
};

とか作っとけばいいんじゃない
自分でスマポ書いてるのと同じだけど

723 名前:デフォルトの名無しさん mailto:sage [2018/09/24(月) 18:47:38.62 ID:yIbiTIWcr.net]
>>708
ありがとうございます。
参考にします。


ちなみにポインタをどうこうしたくない理由は、これまで MyClass のインスタンスを参照渡しするように作っていた関数を、できるだけ変更したくないからです。

参照渡しをポインタ渡しに変えて、関数内に適宜アスタリスクを挿入するだけですか? 考えるのもしんどいです。



724 名前:はちみつ餃子 mailto:sage [2018/09/24(月) 18:55:55.79 ID:tUW1+gfS0.net]
>>704
> 色々手間をかけて、利用するクラスへの依存を減らすのと同じじゃね?

その通りだよ。
プロトコル指向でいうプロトコルは C++ で言うならまさにトレイツに相当すると思う。
(C++ では実装を直接的に強制する方法ではないけど。)

継承構造ではなく性質でジェネリック関数を使うってだけ。
継承で表すよりも性質で表現する方がたぶん記述は細分化されることになるので、
それが手間かもしれないし、
関連するものがとっちらかる感じはあると思う。

だけど「こういう型」というよりは「こういう性質」という方がプログラムが分かりやすくない?
既に述べたように拡張が楽というのもある。


ただ、プロトコル指向的デザインでは機能を追加することは出来ても
既に問題が生じているものをスパッと綺麗に解決できるわけではないので、
いつでも元の定義を弄らずに済むほど万能とはさすがに言わないよ。
vector なんてそれこそ達人たちが検証してるだろうから、
私が思いつくようなことが入り込む余地は無いだろうし。

そこらへんは程度問題なので、積極的に (あるいは消極的に)
(テンプレートを用いた) プロトコル指向的デザインを
使うのが割に合わないという場面もそれなりに多くあると思う。
繰返すけど、そこまで万能と思ってるわけじゃない。

725 名前: mailto:sage [2018/09/24(月) 19:02:18.61 ID:63DR0NZS0.net]
>>705
static 宣言する、というのはありな状況ですか?
static MyClass abc;

726 名前:デフォルトの名無しさん mailto:sage [2018/09/24(月) 19:02:38.38 ID:XuY/8j5Q0.net]
こいつ金慶珠みたいなやっちゃな・・・・マジめんどくさい

727 名前:デフォルトの名無しさん mailto:sage [2018/09/24(月) 19:04:43.22 ID:XuY/8j5Q0.net]
>>712>>710

>>709
関数の方を変えなくても、渡すとこで
auto a = hoge(*pMyClass);
でいんじゃね?
それも大変なら>>708みたいにラップするしかないけど

728 名前:デフォルトの名無しさん mailto:sage [2018/09/24(月) 19:14:36.90 ID:yIbiTIWcr.net]
>>711
オブジェクトのサイズが動的に変わるので、難しいです(合ってるかな?)


>>713
> 関数の方を変えなくても、渡すとこで
> auto a = hoge(*pMyClass);
> でいんじゃね?
> それも大変なら>>708みたいにラップするしかないけど

void hoge(MyClass abc);
なる関数 hoge() に、
MyClass* pabc;
pabc = new MyClass;
hoge(*pabc);
とする、ということですよね?
この方法では、関数呼び出し時にコピーコンストラクタが呼ばれますか?
それとも参照渡しのように、実体(?)が渡されるのでしょうか。

729 名前:デフォルトの名無しさん mailto:sage [2018/09/24(月) 19:30:44.68 ID:XuY/8j5Q0.net]
>>714
呼ばれないよ
参照渡しと同じことになる

730 名前:デフォルトの名無しさん mailto:sage [2018/09/24(月) 19:31:36.39 ID:XuY/8j5Q0.net]
あ、もちろん関数側の受け取りを参照のままにしてれば、だけどね

731 名前:デフォルトの名無しさん mailto:sage [2018/09/24(月) 19:42:51.66 ID:E4VB1fuR0.net]
>>709
MyClass abc1;
foo(abc1);

MyClass* abc2 = new MyClass;
foo(*abc2);
delete abc2;

732 名前:デフォルトの名無しさん mailto:sage [2018/09/24(月) 19:44:00.35 ID:E4VB1fuR0.net]
あっ、既に出てたわ

733 名前:デフォルトの名無しさん mailto:sage [2018/09/24(月) 19:51:26.90 ID:yIbiTIWcr.net]
>>715-718
すみません。
>>714は間違っていますね。
hoge() の定義は
void hoge(MyClass& abc);
でした。

ありがとうございます。
提案していただいた方法なら、関数側はほぼ何も変えないでできそうです。
初歩的な質問に付き合っていただき感謝します。



734 名前:デフォルトの名無しさん mailto:sage [2018/09/24(月) 20:06:20.22 ID:I/nCcJf20.net]
https://ideone.com/l7t0qz
上から取れないマウントを取りに行くスタイル。

735 名前:デフォルトの名無しさん mailto:sage [2018/09/24(月) 20:23:29.03 ID:SA5x5JnZ0.net]
ボレロ村上さんや江添さんみたいなプログラマーになりたいんですが、彼等はどうやってC++についてあんなに詳しいのでしょうか?

736 名前:デフォルトの名無しさん mailto:sage [2018/09/24(月) 20:29:49.13 ID:I/nCcJf20.net]
どっちも早いころからパソコンを触っており、
早期にはこんなに言語がなく血反吐吐いて低級言語を覚える必要が少しあり、今はその応用で食ってける。
C/C++も今ほどライブラリがなく、自作するか引っ張ってくるしかなかったうえにそもそもコード系のシャルネットワークがなかった。

737 名前:デフォルトの名無しさん mailto:sage [2018/09/24(月) 20:40:24.56 ID:dKKNaNpJ0.net]
前提として奴らは別にプログラマーとして有名なわけではない。
コードを書く能力と有名なことが反比例しているわけだがそれでもいいなら
彼らの真似事してれば同じようになれるんじゃね?

738 名前:デフォルトの名無しさん mailto:sage [2018/09/24(月) 20:50:32.86 ID:I/nCcJf20.net]
まぁ、名前を聞くようになったのはツイッターあたりからやね。
江添氏はコードのお作法がおかしいと食いついたりしてたし、委員会に近いところにいたのでそういう情報を発していた。
けど、個人ではあまりコードは書いてないみたいだな。
ボレロ氏は高専言いっててそこらへんで色々学んでconstexprライブラリで名前を売ったってところはある。
その後縮小して最近コードを書いているという話は聞いてないような。

どっちも有名になったのはこの世の不満とオタクの人権みたいなのを発していたら有名になったってところはある。と思ってる。

739 名前:デフォルトの名無しさん mailto:sage [2018/09/24(月) 21:16:51.40 ID:GIs1tf8Y0.net]
誰にでもウイークポイントはある
そこを苛める遊びに固執する阿呆は誰からも何も学べないまま
自らがウイークポイントのみからなるコンパクト星として成長するのみ
世の中の誰からも軽蔑しか受けない天涯孤独な存在だ

740 名前:デフォルトの名無しさん mailto:sage [2018/09/24(月) 21:32:17.37 ID:XuY/8j5Q0.net]
まぁ江添氏は委員会の人間だしコードあんま書いてなくても日本のC++ユーザーのために
仕様の解説してくれてるしね
ボレロ氏は・・・まぁその・・・・・生産性あるんだか無いんだかよくわからんライブラリ作ってるというか
あれはあれで勉強になるけど・・・・w

ただ初心者が「ああなりたい」ってよく言ってるのは理解に苦しむな
中途半端な知識でドヤ顔するのでなく、真摯に解説するサイトでも作ってくれりゃ価値があるけど
個人的には彼らを崇拝する人を見るたびに、もやもやした気分になる
言語は道具なんだから使ってなんぼやろ・・・

741 名前:デフォルトの名無しさん mailto:sage [2018/09/24(月) 21:37:21.19 ID:SA5x5JnZ0.net]
>>726
まあ結局言語は道具といっても、作ったものが革新性があったり、真似できないようなら人気を集めるような気がするんだよね
東方のZUNとか別にそこまで凄

742 名前:いゲームでもないけど、プログラマーとしてそこそこ尊敬されてる []
[ここ壊れてます]

743 名前:デフォルトの名無しさん mailto:sage [2018/09/24(月) 21:59:39.82 ID:dKKNaNpJ0.net]
仕事でコード書いてたらc++の最新の仕様を追えないからやらない
とか本気で言ってしまう奴は根本が腐ってると思うよ。
言ってて矛盾を感じないのかと。



744 名前:デフォルトの名無しさん mailto:sage [2018/09/24(月) 22:02:16.29 ID:orHhPIQU0.net]
目標が名声なのか、C++理解度なのか・・・
粛々とコード書き続けるのが一番

745 名前:デフォルトの名無しさん mailto:sage [2018/09/24(月) 22:40:40.71 ID:SA5x5JnZ0.net]
>>729
もちろん理解度なんだけど、何となく日本以外だと彼らしか目標とする人物が見つからなくて

746 名前:デフォルトの名無しさん mailto:sage [2018/09/24(月) 22:55:21.63 ID:CvpxIDb80.net]
ISO/IEC読んでworking draft読んでおまけにg++/clangの実装で読んで
それでみんが知らなそうな重箱をつつくような仕様拾ってきてブログのネタに
すればいいんでないの?知らんけど

747 名前:デフォルトの名無しさん mailto:sage [2018/09/24(月) 22:59:57.25 ID:XuY/8j5Q0.net]
まぁ日本だと、解説サイトで目につく人ってそんなもんか
ZUN氏挙げるのははちょっと不思議だけど・・・
以前東方に使われてる技術の解説がどこかにあったけど、
タスクシステムみたいな古くからある2Dシューティングの常套手段とかしか記憶にない
(なんか驚くようなのもあったかもしれんけど

仕事で書いてると驚くようなコードとか設計をあちこちで見かけるけど、
そういうの書くのはやっぱ誰も知らない無名の職業プログラマだったりするよ

748 名前:デフォルトの名無しさん mailto:sage [2018/09/24(月) 23:31:07.79 ID:nTOSaHPIH.net]
>>732
今もそういう夢いっぱいな話あるの?
昔のファミコンソフトがスーパーテクニックの塊だった、みたいな

最近はリソースが潤沢にあって、手抜きのとりあえず動くプログラムが蔓延しているのだと思ってた

749 名前:デフォルトの名無しさん mailto:sage [2018/09/24(月) 23:43:30.13 ID:CvpxIDb80.net]
今でもゲーム系はスーパーテクニック満載でしょ
マルチコアCPUを90%以上使い倒す世界だからな、すげーわ

750 名前:デフォルトの名無しさん mailto:sage [2018/09/24(月) 23:47:03.19 ID:XuY/8j5Q0.net]
>>733
自分は半端者なんで知識はアレだけど、GTAシリーズとかE

751 名前:Aのゲームとか
ああいうのは今でもリソース必死に使い切ってるみたいよ
(Game Programming Gemsとか読んでみたらその片鱗が見える)
スーファミ時代のような変態的なのとは方向性が違ってきてるけど
大規模な開発の上でいかにパフォーマンス損なわずに開発効率を上げるかが重視されてる

もちろん2Dのスマホゲーだったら全然使い切る必要ないだろうけど、そっち方面は詳しくない
(多分言語もC#かSwiftが主流?移植性考えたらC#だろうな
[]
[ここ壊れてます]

752 名前:デフォルトの名無しさん mailto:sage [2018/09/25(火) 00:00:26.48 ID:C9Mx85q+H.net]
へぇ〜〜〜面白い

「どの業界は超人多い」みたいのあるんだろうか

753 名前:デフォルトの名無しさん mailto:sage [2018/09/25(火) 00:05:28.27 ID:bpDEi/Vx0.net]
個人的にはF-35のソースが読んでみたいw



754 名前:デフォルトの名無しさん mailto:sage [2018/09/25(火) 06:17:40.32 ID:NMIb1H0N0.net]
>>737
さすがにF35のソースは見たことないけど、軍事関係や命に関わるコードはむしろ枯れた技術以外使わないんじゃないかな?
ECUとかはとんでもなく古い考え方(ほぼ全ての変数がグローバル)で作られてるし。
まぁECUの場合それはそれでちゃんと理由があるんだけどね。

755 名前:デフォルトの名無しさん mailto:sage [2018/09/25(火) 06:26:38.28 ID:cr5GGQ8dr.net]
多次元配列クラス Tensor があるとして、そのインスタンス a は a[2][5][3] のように要素アクセスできるとします。

unique_ptr<Tensor> pa(new Tensor);
のように Tensor のスマートポインタを作った場合、pa の指してる Tensor への要素アクセスってどうやるのでしょうか。

「Tensor」の設計の詳細が必要であれば、boost の multi_array と同じとしていただいて問題ありません。






[ 続きを読む ] / [ 携帯版 ]

前100 次100 最新50 [ このスレをブックマーク! 携帯に送る ] 2chのread.cgiへ
[+板 最近立ったスレ&熱いスレ一覧 : +板 最近立ったスレ/記者別一覧](;´∀`)<321KB

read.cgi ver5.27 [feat.BBS2 +1.6] / e.0.2 (02/09/03) / eucaly.net products.
担当:undef