[表示 : 全て 最新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

528 名前:はちみつ餃子 mailto:sage [2018/09/17(月) 20:37:10.33 ID:O6rb8eh90.net]
>>516
ムーブの恩恵があるやで。

529 名前:デフォルトの名無しさん mailto:sage [2018/09/17(月) 20:53:22.59 ID:tpLtH4DE0.net]
現代の C++ は処理系もライブラリもそれなりに賢いから、任せきりにしてもそれなりの効率になる。
ほとんど任せきりにできる高級言語としての面と、必要なとこは手動で書ける低級言語としての面を合わせ持つのが C++ の強み。

530 名前:デフォルトの名無しさん mailto:sage [2018/09/17(月) 21:33:50.41 ID:YgnM5prK0.net]
>>512
お前は最低でも数万行くらいの規模のコード書いてから偉そうなことを言え

531 名前:デフォルトの名無しさん mailto:sage [2018/09/17(月) 21:40:52.08 ID:5VGXhp/T0.net]
最近はC++もスマートポインタが主流で
メモリリークもツールでチェックすると聞いたが

現実はどんなもんなん

532 名前:デフォルトの名無しさん mailto:sage [2018/09/17(月) 22:10:33.50 ID:oxQatDsR0.net]
VCには簡易メモリっチェックをするヘッダーがある。もちろん環境依存。
スマポでリークするのはかなり筋が悪い。

533 名前:デフォルトの名無しさん mailto:sage [2018/09/17(月) 22:19:24.01 ID:CEV1V8yd0.net]
>>519
それはリークの言い訳にはならんで

534 名前:デフォルトの名無しさん mailto:sage [2018/09/17(月) 22:33:55.31 ID:SBpxj18K0.net]
>>519
まあどんな場合でもは言いすぎだと思うが少なくとも正常系ではリークなしを目指すのは当たり前

535 名前:デフォルトの名無しさん mailto:sage [2018/09/17(月) 22:36:30.00 ID:oxQatDsR0.net]
スマポでリークするケースというと、昔のインターフェースでスマポそのものが渡せないとかかなぁ。。。
希望としてはリファクタリングしてほしいところだけどね。

536 名前:デフォルトの名無しさん mailto:sage [2018/09/17(月) 23:14:55.87 ID:YgnM5prK0.net]
>>522
誰が「規模が大きければリークしていい」と言った?
言ってないことを言ったかのように相手の主張を捻じ曲げるな
>>523
>アルゴリズムベンチマーク。
>リークしててもそこまで問題にならんし



537 名前:デフォルトの名無しさん mailto:sage [2018/09/17(月) 23:17:40.96 ID:2pCWAXV50.net]
リークしたらヒープエリア毎Destroyすれば良いじゃない
@マリー・アンチョワネット

538 名前:デフォルトの名無しさん mailto:sage [2018/09/17(月) 23:28:41.66 ID:YgnM5prK0.net]
あぁすまん、正常系について誤解してた
まぁ個人で使うレベルなんじゃないかね、本人が問題にならん言うてるし

539 名前:デフォルトの名無しさん mailto:sage [2018/09/18(火) 00:08:27.62 ID:z2qcvEfV0.net]
ウィンドーズにはApplication Verifierがあります!!11!1!

>>521
malloc()とfree()が対応しているかはばっちりワカルのでかなり役に立つが
Win32APIで直接メモリ確保したりC++でメモリアロケータを0から自作した場合はどうなるかわからん…

perfmonで指定プロセスのprivate bytesの推移を取得しつつ長時間動かして直接消費状況を確認するというのがある意味最終手段だが
リークが無い(はずの)プログラムでもなかなか安定しないという印象
多分ユーザーコードからRAIIを排除しても拾ってきたライブラリがRAIIするとかそんな感じ!

540 名前: mailto:sage [2018/09/18(火) 00:14:49.89 ID:Iw2LHuqq0.net]
>>528
グローバル new 演算子
グローバル delete 演算子
を malloc()/free() を使って定義して、かつ、未解放・二重解放を検出するようにポインタを線形リストに格納してチェックする、ということなら、簡単にできます
win32api でも、たとえば heapalloc() をラップすればいいかと
デバッグ初期の単純なミスならこれで大方弾けます

541 名前:デフォルトの名無しさん mailto:sage [2018/09/18(火) 00:18:57.80 ID:k3MAuD5K0.net]
>>528
MS製だからWIN32位は拾ってくれると思ってたけど、なんだってー。Orz
俺は末端のユーザだからアロケータ書いたりしないのよね。
特に自作したらメンテとか自分でやんなきゃいけない負債になるのでやりたくないなぁ。

542 名前:デフォルトの名無しさん mailto:sage [2018/09/18(火) 01:01:35.82 ID:uOah9zOu0.net]
>>530
application verifierはwin32apiをhookしてるよ。

543 名前:デフォルトの名無しさん mailto:sage [2018/09/18(火) 01:07:33.27 ID:7OxZ5HAL0.net]
>>517
コンテナ形式のデータばかりと思うなよ

544 名前:デフォルトの名無しさん mailto:sage [2018/09/18(火) 01:31:03.51 ID:n7K73R0GM.net]
hogeはdouble型で
int temp = int(hoge);
if (temp > 0)
return temp;
else
return 0;

このような処理をしたいのですが、何か良さげな内部関数とかないですかね

545 名前:はちみつ餃子 mailto:sage [2018/09/18(火) 04:24:56.90 ID:CgLDhfQ00.net]
>>533
C++17 の std::clamp みたいなことがしたいのかな

546 名前:デフォルトの名無しさん mailto:sage [2018/09/18(火) 04:58:47.12 ID:1zYpCWJ70.net]
>>529
ランタイムのソース読んだ事無いの?



547 名前:デフォルトの名無しさん mailto:sage [2018/09/18(火) 05:16:37.52 ID:bwjvKD0M0.net]
>>533
std::max(0, int(hoge))とか

548 名前:デフォルトの名無しさん mailto:sage [2018/09/18(火) 06:06:39.75 ID:mbB60zCK0.net]
>>533
_mm_max_pd とかその辺

549 名前:デフォルトの名無しさん mailto:sage [2018/09/18(火) 06:32:00.57 ID:yg1A1NBg0.net]
>>525
それはリークの言い訳にはならんで

550 名前:デフォルトの名無しさん mailto:sage [2018/09/18(火) 06:35:34.10 ID:BuheiE4nM.net]
アルゴリズムベンチマークなんて長期間稼働するものでもないし、プロセス終わればリークも終わる。

551 名前:デフォルトの名無しさん mailto:sage [2018/09/18(火) 06:55:51.70 ID:1W/tmI+p0.net]
>>533 の言う「内部関数」ってのは、
CPUのマシン語命令を直接利用するビルトイン関数みたいな感じかな。

552 名前:デフォルトの名無しさん mailto:sage [2018/09/18(火) 09:38:53.59 ID:GYwTywmv0.net]
言い訳にならんよな
数万行って具体的な数値を出してきたのは奴だし

553 名前:デフォルトの名無しさん mailto:sage [2018/09/18(火) 09:39:49.43 ID:Zf2s67R20.net]
勝手に察すると、単純な話だと思う
彼の把握では、おそらくは次のようになっているハズだ

内部関数=組み込み関数(あらかじめ用意されている標準の関数)
外部関数=自作関数、ユーザ定義関数

真意を勝手に忖度すると、「自作関数を作らずにそのまま使えるような便利な関数は既に存在してはいないだろうか」という質問に見える

554 名前:デフォルトの名無しさん mailto:sage [2018/09/18(火) 09:40:00.14 ID:GYwTywmv0.net]
そもそも行数でどうたらって、いつの時代劇だよ

555 名前:デフォルトの名無しさん mailto:sage [2018/09/18(火) 09:40:52.00 ID:GYwTywmv0.net]
>>542
俺もそう思った
だとすると536でFA

556 名前:デフォルトの名無しさん mailto:sage [2018/09/18(火) 09:49:04.25 ID:k3MAuD5K0.net]
>>531
Yes、OK!



557 名前:デフォルトの名無しさん mailto:sage [2018/09/18(火) 09:55:26.47 ID:k3MAuD5K0.net]
int ookii=...
int tiisai=...
int V=...

int x = std::max(tiisai,std::min(ookii,V));

ってやると、[min,max]区間内のVが取れたような気がする。
今度C++17で入るクランプがそれ。

558 名前:デフォルトの名無しさん mailto:sage [2018/09/18(火) 11:57:01.55 ID:9q1AFd5B0.net]
>>543
>>512
>どんな場合でもリークしないように書けよ
リークしないようなコードを書くのは当たり前だが、どんなに注意してても起きるときは起きる
仮にこういう主張してるやつが居てもお前は俺と同じことを思わんのか?

「どんな場合でもバグらないように書けよ」

559 名前:デフォルトの名無しさん mailto:sage [2018/09/18(火) 12:26:58.02 ID:GYwTywmv0.net]
車の事故と同じ
起きるときは起きるなんて言い訳は通用しない
まず起こすな
やっちまったら責任とれ
そういう緊張感がいるってことだ

560 名前:533 mailto:sage [2018/09/18(火) 12:44:39.79 ID:TXDNyaJKM.net]
ありがとうございます
max関数使わせていただきます

もう一つ別の質問なのですが、
2つのベクターの要素(1000個程度)の比較で、同じi番目の要素の内容差が10以上の要素番号(イテレータ?)を調べたいです
この操作は何回も繰り返すので出来るだけ高速化したいのですがなにか良い方法ありませんかね?
ベクターの要素はint型で内容は大体1000以下の整数です
vec1[100] = 100とvec2[100] = 300
vec1[102] = 100とvec2[122] = 300
なら100, 102のイテレータ(この後そのまま新しくforに投げるので)

561 名前:デフォルトの名無しさん mailto:sage [2018/09/18(火) 13:14:20.96 ID:l12yg0eyx.net]
>>549
思わずC# LINQかPython使いたくなる内容だな。
やりたいことは結局のところ行列演算なのでEigen使うと何か方法ありそうだけど、高速化に寄与するかは不明。

562 名前:デフォルトの名無しさん mailto:sage [2018/09/18(火) 14:20:03.27 ID:Gab8FMClM.net]
>>549
1000個を例えば4コアで250個ずつ並列化してさらにforの中でn個ずつ比較するとかかな…
intelは
_mm_cmpgt_epi16
armは
vcgt_s16
とかあるみたいだけど

563 名前:デフォルトの名無しさん mailto:sage [2018/09/18(火) 15:33:22.77 ID:UQgXz1AkM.net]
普通MPIじゃね?

564 名前:はちみつ餃子 mailto:sage [2018/09/18(火) 16:41:03.37 ID:CgLDhfQ00.net]
>>549
新しく for に投げるっていうのがよくわからんのだが、
やりたいことをコードで (C++17 で導入された構造化束縛を使って) 表すと

for (const int& [element1, element2]: extract_if_big_difference(vec1, vec2)) { ほにゃらら }

みたいに書ける関数 extract_if_big_difference が定義できるといいなぁという感じ?

こうだとしたら、並列化するのは難しい気がするぞ。

565 名前:デフォルトの名無しさん mailto:sage [2018/09/18(火) 16:42:40.86 ID:l12yg0eyx.net]
OpenCLでベクトル演算すれば速いんじゃね?

566 名前:デフォルトの名無しさん mailto:sage [2018/09/18(火) 16:58:21.90 ID:Zf2s67R20.net]
こんなのだと速そうな気がする

vec3 = vec1 - vec2;
filter(vec3, 10, index);

void filter(const vector vec3, const int limit, int index[]){
int j=0;
for(int i=0; i<vec3.size(); i++){
if(vec3[i] >= limit){
index[j++] = i;
}else if(vec3[i] <= -limit){
index[j++] = i;
}
}
index[j] = -1;
return;
}



567 名前:デフォルトの名無しさん mailto:sage [2018/09/18(火) 17:05:52.46 ID:ZX8OqlLQd.net]
データが多いならざっくり N (2〜8)分割して OpenMP とかで並列処理するのがいいよ
数百ミリ秒以上かかるなら他のコアを遊ばせておくのはもったいない

各分割の結果は独立して保持して後で統合する

568 名前:デフォルトの名無しさん mailto:sage [2018/09/18(火) 17:06:36.21 ID:GYwTywmv0.net]
>>549
vectorじゃなくvalarrayだが。。。
int main()
{
int const n = 10; //おまえさんのリクは 1000 だったな

//このへん前置きは置いといて
mt19937 eng;
random_device dev;
eng.seed(dev());
uniform_int_distribution<int> dis(-20, 20);
auto rnd = [&eng, &dis]() { return dis(eng); };
auto print = [](auto& ct) { for(auto& x : ct) cout << x << '\t'; cout << endl; };

valarray<int> vec1(n);
generate(begin(vec1), end(vec1), rnd);
print(vec1);

valarray<int> vec2(n);
generate(begin(vec2), end(vec2), rnd);
print(vec2);

cout << endl;

//ここが本題
valarray<bool> mask = abs(vec1 - vec2) >= 10;
vec1[!mask] = 0;
vec2[!mask] = 0;
print(vec1);
print(vec2);
}
差が10以上のところを探して何か処理ならこっちのが楽だべ

569 名前:デフォルトの名無しさん mailto:sage [2018/09/18(火) 18:11:51.89 ID:H2d9f0sTa.net]
>>533の質問のレベルを見ていると、
>>549も「実装完了しないうちから最適化必要と思ってたけど実はそんなこと必要なかった」なんて落ちにはならないかなとふと思った。

570 名前:デフォルトの名無しさん mailto:sage [2018/09/18(火) 18:32:34.48 ID:RR2nvfojr.net]
boost の multi_array ってさ、添字の入れ替えってできる?

例えば要素 a[i][j][k] を a[k][i][j] に、全ての i, j, k について入れ替える操作

自分で実装しなきゃ駄目?

571 名前:デフォルトの名無しさん [2018/09/18(火) 23:03:47.37 ID:oE0uJFU60.net]
boostみたいなインチキくさいライブラリは使ったことないが
オレだったらイチイチそんなムダな入れ替えが本当に必要なのかと
まずそこを疑う

572 名前:デフォルトの名無しさん mailto:sage [2018/09/18(火) 23:14:12.21 ID:yg1A1NBg0.net]
行列でそんな演算あったような

573 名前:デフォルトの名無しさん mailto:sage [2018/09/18(火) 23:30:40.91 ID:GKhblNvIr.net]
>>560
無駄の意味が分からない
テンソルの掛け算するときに行列積ライブラリ使うために足組み替えたりするだろ

574 名前:デフォルトの名無しさん mailto:sage [2018/09/18(火) 23:35:47.30 ID:Re9liTgW0.net]
できた!
template<typename T>
class MyMatrix3D : Matrix3D {
...
virtual T get(size_t i, size_t j, size_t k) {
return get(k, i, j);
}
...
};

575 名前:デフォルトの名無しさん mailto:sage [2018/09/18(火) 23:43:07.71 ID:G/V6WyhFd.net]
stack overflow

576 名前:デフォルトの名無しさん mailto:sage [2018/09/19(水) 00:26:11.52 ID:McwJY1yY0.net]
わ、わざとだから!



577 名前:デフォルトの名無しさん mailto:sage [2018/09/19(水) 00:33:47.86 ID:dEko0zDA0.net]
boostとか漏れも使ったことないわ(゚∀゚)人(゚∀゚)ナカーマ

578 名前:デフォルトの名無しさん mailto:sage [2018/09/19(水) 04:24:37.15 ID:2wyJ7zTj0.net]
boostはbjamが糞すぎて入れるのめんどくさくなっちゃった

579 名前:533,549 mailto:sage [2018/09/20(木) 03:07:15.61 ID:fZtZJGAwM.net]
遅くなってすみません
処理が重くなったのは別の部分のせいでした…
Python的考えで5桁くらいインデントしてたので勝手に遅いと思ってましたが普通に高速でした
お騒がせしました

580 名前:デフォルトの名無しさん mailto:sage [2018/09/20(木) 13:40:29.54 ID:CPfoYuVJ0.net]
たかだか1000回のループでそんなに速度気になるんか(というか並列化とかベクトル化とか大げさやろ)、
と思ってたけどやっぱりか
>>558の一人勝ちやな

581 名前:デフォルトの名無しさん [2018/09/20(木) 21:36:12.15 ID:zLqp8E230.net]
低学歴知恵遅れなら
1回ループするのに1分かかるようなコードを書きかねない

582 名前:デフォルトの名無しさん mailto:sage [2018/09/21(金) 00:16:00.80 ID:4kzBlK6i0.net]
再帰使ってみたが1分かからんかった
ゆ、許された…
ttps://ideone.com/kHFd61

583 名前:デフォルトの名無しさん mailto:sage [2018/09/21(金) 00:27:26.94 ID:4kzBlK6i0.net]
1分の壁を破るには、何度も何度もそれとわからずに同じ計算をするようなアルゴリズムにしないとだめだなあ…

584 名前:デフォルトの名無しさん mailto:sage [2018/09/21(金) 03:21:51.90 ID:xr3UMDDx0.net]
boostをVS2017に入れられない

585 名前:デフォルトの名無しさん mailto:sage [2018/09/21(金) 13:11:38.33 ID:JwHgudh+H.net]
関数A,B、C、D、EがあってAの中でBを呼んで、Bの中でCを……
って構造があって、例えばEでエラーが出るとします。大本のAにそれを伝えてエラーにしたいんですけどどうしたらいいでしょう
BCDEの戻り値全部boolにしてfalseを返すくらいしか思いつかないです

586 名前:デフォルトの名無しさん mailto:sage [2018/09/21(金) 13:20:30.45 ID:EQpNFWj/0.net]
>>574
戻り値でもいいし、引数に参照やポインタを渡してもいいし
例外でもいい



587 名前:はちみつ餃子 mailto:sage [2018/09/21(金) 13:40:44.63 ID:FzfC+eZt0.net]
書く分には例外を投げるのが楽じゃないの。
関数 B, C, D ではそのエラーについて忘れておくことが出来るので。

588 名前:デフォルトの名無しさん mailto:sage [2018/09/21(金) 13:41:36.51 ID:IFsUWHdO0.net]
>>574
例外を投げてキャッチさせる

589 名前:デフォルトの名無しさん mailto:sage [2018/09/21(金) 14:25:47.49 ID:wDeX8uPc0.net]
例外はGOTOに迫りつつある

590 名前:デフォルトの名無しさん mailto:sage [2018/09/21(金) 14:34:59.25 ID:lJw3kOTN0.net]
>>574
典型的な例外の出番だ
void E() { throw std::runtime_error("error at E()"); }
void D() { E(); }
void C() { D(); }
void B() { C(); }
void A() { try { B(); } catch(std::exception& err) { std::cerr << err.what(); } }

591 名前:デフォルトの名無しさん mailto:sage [2018/09/21(金) 14:47:07.50 ID:JwHgudh+H.net]
皆様ありがとうございました。
別関数からのまでcatchできるとは知りませんでした。>>574を参考にしつつ書いてみようかと思います。
ファイル読み込みのときはあんま例外使わないなんて記述見たんですけど別に書いても大丈夫ですよね

592 名前:デフォルトの名無しさん mailto:sage [2018/09/21(金) 16:31:17.28 ID:vcIlO6Gbr.net]
スッゲェ素人なんだけどよ、他人が作ったクラスに自作関数を付け加えたいときってどうすんの?
(例えば、行列クラスに特異値分解する関数を付け加える等)

継承ってやつを勉強して使うだけ?

C++ の言語仕様と常識を勉強したいという意味でもあるので、「その他人のコードを直接編集せよ」ってのはナシで頼む

593 名前:デフォルトの名無しさん mailto:sage [2018/09/21(金) 16:50:36.52 ID:K+jLUYtn0.net]
>>581
機能を追加するために継承使うのは設計的によくないよ

594 名前:デフォルトの名無しさん mailto:sage [2018/09/21(金) 17:01:37.16 ID:pko5dpD3r.net]
>>582
どうするべき?

595 名前:デフォルトの名無しさん mailto:sage [2018/09/21(金) 17:06:42.97 ID:OnuHA6YMx.net]
>>581
クラスの親子関係がはっきりしてるなら継承。
機能が似てるだけなら移譲。
どちらか迷ったら移譲。

596 名前:デフォルトの名無しさん mailto:sage [2018/09/21(金) 17:15:33.49 ID:K+jLUYtn0.net]
>>583
void svd(Matrix &pMtx);
みたいな関数ではダメなの?



597 名前:デフォルトの名無しさん mailto:sage [2018/09/21(金) 17:45:50.45 ID:nytN4gJ8r.net]
>>584
移譲という用語は初めて知ったので、勉強してみます


>>585
ダメ、ということはないと思いますしこれまではそうしてきました
しかし、行列の特異値分解は配列ではなく行列に適用するべきだという意識が強くなりました
BLAS 等の多くてややこしい引数も、「行列を渡す」という形で書くことでもう少し自分にとって読みやすくなるのではないかとも思いました
クラスだとか他人のコードの拡張といったことを勉強してみたくなったということでもあります

598 名前:はちみつ餃子 mailto:sage [2018/09/21(金) 18:21:14.81 ID:FzfC+eZt0.net]
>>586
なんでもかんでもメンバ関数として持たせるのはダサいというのが近年の風潮。
設計方針にもよるんだけど、機能をちょっと増やすたびに新しい型を作るのも馬鹿馬鹿しいだろう。
単なる関数として作ればそれでよいはずのことにクラスの依存関係まで出てくるの、ホントに良くない。

599 名前:デフォルトの名無しさん mailto:sage [2018/09/21(金) 18:35:46.91 ID:nikK7GUa0.net]
>>584
>どちらか迷ったら移譲
やめろ、割とマジで
本来継承が好ましいものに委譲を使うと後々になって必ず破綻する
お前D&E読んでないのか?

>>587
>ダサいというのが近年の風潮
そういう言い方・考え方もやめろ
かつてC++の継承は汚いからテンプレートで代用しろ、みたいな理屈があったが全くの空回りに終わった
その間初心者は嘘の情報に騙されたりオブジェクト指向を誤解したりして、結果C++から離れていった

>単なる関数として作ればそれでよいはず
これは正しい

600 名前:デフォルトの名無しさん mailto:sage [2018/09/21(金) 18:37:09.46 ID:MaoTi4980.net]
>>587
完全に同意。
クラスの数が星の数ほどあるプロジェクトで、継承してメソッド一個追加してるだけとかの経年劣化したソース見たら目眩がするわ。
オブジェクト指向の初期啓蒙として「既存のクラスは変更するな」「機能追加は継承使え」って言ってた人を恨むわ。

601 名前:デフォルトの名無しさん mailto:sage [2018/09/21(金) 18:40:06.68 ID:MaoTi4980.net]
>>588
もちろん「IS-A」が成り立ってる継承が適してるものは継承使うべき。
むしろ継承を使うべきでないとこに継承使ってるほうが後々破綻するので悩んだら委譲。

602 名前:デフォルトの名無しさん mailto:sage [2018/09/21(金) 18:53:16.27 ID:nVnA1Sbpr.net]
>>588-590
では特異値分解、スライシング、掛け算、足し算、エトセトラ……、という大規模な機能追加を既存のクラスに対して行ないたい場合はどのようにするべきでしょうか

603 名前:デフォルトの名無しさん mailto:sage [2018/09/21(金) 19:06:55.02 ID:MaoTi4980.net]
>>591
うーん、場合によるけど全てそのクラスに対する操作ならさすがに継承するかな。
後々のメンテ考えたら可能であれば継承元のクラス変更するけど。

604 名前:デフォルトの名無しさん mailto:sage [2018/09/21(金) 19:18:19.30 ID:scCYqhjF0.net]
他人が作ったクラスで勝手にいじれないんでしょ?
protectedやvirtualなメンバがあって、それを使って色々するなら当然継承すればいいけど
そうじゃない継承される前提で作られたクラスじゃないなら継承はオススメできんなあ
svd(m)をm.svd()って書きたいためだけに継承の山のようなトラップ抱え込むのは割に合わないと思うよ
どうせ親クラスのprivateはいじれないんだし

605 名前:デフォルトの名無しさん mailto:sage [2018/09/21(金) 19:20:28.05 ID:wzHnJ4yt0.net]
unified call syntax 甦れ。

606 名前:デフォルトの名無しさん mailto:sage [2018/09/21(金) 19:24 ]
[ここ壊れてます]



607 名前::14.64 ID:nikK7GUa0.net mailto: >>591
使ってるのはuBLASだっけ?調べてないのでわからんけど・・・・
継承を前提にしたクラス(デストラクタがvirtualであり、実際継承してみても使える)なら継承もアリっちゃアリだとは思う
(責任は負わんw あくまで勉強目的でやってみるのはいいと思う)

ただ、特異値分解は知らんのでわからんけど、一般に演算クラスの機能追加は
>>587の言う通り、単純にそのクラスを受け取るグローバル関数にする方がいい
特に
>掛け算、足し算
こんなのはまさにメンバ関数にしなくても、グローバルに演算子オーバーロードを定義すれば済む
(メンバに書いてもグローバルに書いても利用者側はA * Bって書ける
あとv1.dot(v2)よりdot(v1, v2)のがわかりやすいと思うけどね
[]
[ここ壊れてます]

608 名前:デフォルトの名無しさん mailto:sage [2018/09/21(金) 19:48:50.66 ID:MaoTi4980.net]
>>595
完全に同意。

609 名前:デフォルトの名無しさん mailto:sage [2018/09/21(金) 19:58:47.83 ID:nVnA1Sbpr.net]
>>592-596
なるほど。
普通に関数にするのが、必要十分さの面で、良さそうですね。

頭の中にあったのは、自分で作った関数群が全て○○というクラスに対して使用することを想定している、と明示したかったということです。
グローバル関数の用途を明らかにする方法として、メンバ関数化すれば良いのかな、と思いました。

メンバ関数にはしないということにした場合、上のことを実現するにはどうするべきでしょうか。
コメントやノートに書くくらいしか思い付きませんが、それで良いのかな

610 名前:デフォルトの名無しさん mailto:sage [2018/09/21(金) 20:09:39.68 ID:scCYqhjF0.net]
引数の型が○○やconst ○○&になるでしょ
それ以上のなにが欲しいの?

611 名前:デフォルトの名無しさん mailto:sage [2018/09/21(金) 20:10:46.02 ID:nikK7GUa0.net]
そういえばBLASとは書いてたけどuBLASとは書いてなかったな
いずれにしても、その扱いたいクラスを受け取る関数だから見たらわかるっしょ
違う型を渡したらエラーになる

612 名前:デフォルトの名無しさん mailto:sage [2018/09/21(金) 20:12:28.34 ID:+2gqfJ3dM.net]
>>597
どうでもいいけど最初と大分キャラ変わってるぞw

613 名前:デフォルトの名無しさん mailto:sage [2018/09/21(金) 20:17:41.28 ID:nVnA1Sbpr.net]
>>598-599
わかりました。
確かに型を見たら自明ですね。

結局は
> svd(m)をm.svd()って書きたいためだけ
だったのかも知れません。
なんせそういう書き方はいかにも「ぽい」ですから。

ありがとうございます。

614 名前:デフォルトの名無しさん mailto:sage [2018/09/21(金) 20:19:42.40 ID:KRvbJL35d.net]
>>601
横レスになるかもだけど多相的に

615 名前:関数の集合を規定したいなら[C++ traits]で検索すると幸せになれるよ
今回は不要だと思うけど後々欲しいなって思ったとき役に立つ
[]
[ここ壊れてます]

616 名前:はちみつ餃子 mailto:sage [2018/09/21(金) 20:43:37.20 ID:FzfC+eZt0.net]
>>588
いや、風潮っていうのは確かにあるよ。
かつて上手くいかなかったから今もダメとは限らない。
テンプレートの活用が失敗っていうのは言語そのものとしてのサポートが不充分だったというのがあって、
それは >>602 がいうようにトレイトの活用の知見が蓄積してきたことで風向きが変わってきてる。

今はクソみたいな SFINAE と type_traits で不格好になんとかしてるのも
C++20 でコンセプトが入ったら C++ のパラダイムがそっちに一気に傾くと思う。
Rust や Go の隆盛でプロトコル指向への理解が深まっているというのもある。



617 名前:デフォルトの名無しさん mailto:sage [2018/09/21(金) 21:06:19.19 ID:nikK7GUa0.net]
・・・・・俺が何を批判したかわかってないな
「ダサい」とか「風潮」じゃなくて、何故それが好ましいか、好ましくないか、
質問者のケースに合った説明をしろっつってんの
なんで当時の「テンプレートで継承の代用」の例を出したかわからんか?
代用にはなり得ないんだよ原理的に
実行時のポリモーフィズムをテンプレートで実現できるのか?
ユーザーの入力やファイルの内容に従って実行時に作るオブジェクトを変え、かつ
それを1つの型でまとめられるのか??
type erasure(boost::any含む)とかswitchとかif使う、とかは無しでな

自分の頭でその方法が合っているか合っていないか考えずに
流行とかに流された結果が、↑で挙げたソレなんだよ
C++潰したいのかよ

618 名前:デフォルトの名無しさん mailto:sage [2018/09/21(金) 21:35:12.47 ID:MaoTi4980.net]
>>604
これも横からだが、C++はもう役割を終えて衰退機だと思う。
今から積極的にC++を採用する分野は限られていて、使えるor使おうと思うエンジニアの絶対数が減るってことは衰退と同義だと思う。
いろんな言語のエッセンスを学べるので悪い言語でないとは思うけど、誰かが言った通り習得のコストに見合ったメリットがない。
盛者必衰。

619 名前:はちみつ餃子 mailto:sage [2018/09/21(金) 21:55:31.46 ID:FzfC+eZt0.net]
>>604
> 何故それが好ましいか、好ましくないか、
> 質問者のケースに合った説明をしろっつってんの

それは >>587 の説明で足りないか?
風潮があって、その理由は不要な複雑さが出来るからだという説明で足りないか?
この説明は質問者のケースに合致してないか?

> 代用にはなり得ないんだよ原理的に

違う機能が違う能力を持つのは当たり前だろ? 説明するまでもなく。
どちらの機能を中心に活用した「設計」がよいのかっていう話じゃないか。

620 名前:デフォルトの名無しさん mailto:sage [2018/09/21(金) 22:01:19.22 ID:nikK7GUa0.net]
>>606
ああすまん、確かに言葉尻に反応したところはあったな
でも「風潮」とか「ダサい」って蛇足だよな?w
ダサいって言いたかっただけやろ?

>違う機能が違う能力を持つのは当たり前だろ?
お前>>603
>かつて上手くいかなかったから今もダメとは限らない。
>テンプレートの活用が失敗っていうのは言語そのものとしてのサポートが不充分だったというのがあって、
テンプレートを盲信してるようだから説明したんだが。
継承をテンプレートで代用せよ、ってのは間違ってない、って言いたかったんだろ?

>C++20 でコンセプトが入ったら C++ のパラダイムがそっちに一気に傾くと思う。
とか言ってる辺りからも、オブジェクト指向は過去のものだから継承も過去のものなんだぜ、とか
抜かしたかったのがわかる
マルチパラダイムの意味わかってる?

621 名前:デフォルトの名無しさん mailto:sage [2018/09/21(金) 22:15:11.22 ID:M9VunTBo0.net]
継承をテンプレートで置き換えるって失敗したというよりもすでに当たり前になっただけでは
むしろそっちはそっちで発展してるし、動的でなくてもいいケースは確かに存在している

622 名前:デフォルトの名無しさん mailto:sage [2018/09/21(金) 22:20:50.92 ID:nikK7GUa0.net]
>>608
静的に解決できるものならそうだろうな
そういうケースを否定はしてないが、当時はあちこちでそういう失敗例がドヤ顔で披露されてたんだぞ
禿も指摘してるようにJavaのせいだが

623 名前:はちみつ餃子 mailto:sage [2018/09/21(金) 22:46:33.24 ID:FzfC+eZt0.net]
>>607
> 継承をテンプレートで代用せよ、ってのは間違ってない、って言いたかったんだろ?

違うものは違う。 代用品ではない。

継承構造の代用品としてテンプレートを使えというのではなく、
テンプレートも前提のひとつとしたデザインにしろと言ってんの。

「なにもかもをメンバ関数にするな」というのは全て非メンバ関数にしろっていう意味じゃないだろ。

624 名前:デフォルトの名無しさん mailto:sage [2018/09/21(金) 23:01:04.77 ID:nikK7GUa0.net]
>>610
>>603
>かつて上手くいかなかったから今もダメとは限らない。
>テンプレートの活用が失敗っていうのは言語そのものとしてのサポートが不充分だったというのがあって、
>それは >>602 がいうようにトレイトの活用の知見が蓄積してきたことで風向きが変わってきてる。
って言ってるよな
「かつて上手くいかなかった」って、
俺の「かつてC++の継承は汚いからテンプレートで代用しろ、みたいな理屈があったが全くの空回りに終わった」
のことだろ?言い逃れしてんじゃねーよ


ちなみに継承をテンプレートで代用、を挙げたのは、それに初心者が惑わされたからだ
ただのテクニックの紹介ではなく「C++の継承は汚い」みたいな暴言を伴ってな
お前が「ダサい」とか「風潮」とか、自分がドヤりたいがために選ぶ言葉と同じだよ

>「なにもかもをメンバ関数にするな」というのは全て非メンバ関数にしろっていう意味じゃないだろ。
質問者の「関数追加」の方法についてはお前の意見に賛同してるだろうが

625 名前:デフォルトの名無しさん mailto:sage [2018/09/21(金) 23:02:28.75 ID:ZQgI79kj0.net]
質問者を放置してドヤ顔で語るオタクたち

626 名前:デフォルトの名無しさん mailto:sage [2018/09/21(金) 23:10:39.91 ID:nikK7GUa0.net]
あ、ついでに言うと
>言語そのものとしてのサポートが不充分だった
ねーよ

C++98〜03でも十分メタプログラミング出来てたぞ(11から確かに幅は広がったが
STLしかりModern C++ Designの著者のLokiしかり
Boostだって当時からあったからな



627 名前:デフォルトの名無しさん mailto:sage [2018/09/21(金) 23:26:46.84 ID:wfTNvghC0.net]
>>605
C++に挫折でもしたの? w
ネイティブコード吐けるオブジェクト指向言語ってそんなに選択肢ないし

628 名前:デフォルトの名無しさん mailto:sage [2018/09/21(金) 23:30:11.36 ID:wzHnJ4yt0.net]
FixedC++であるRustに期待はしているが・・・。






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

前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