18/09/15 08:40:54.56 8TAknpK9d.net
ここまでconstexpr1つもなしなのはみんな意図的?
451:デフォルトの名無しさん
18/09/15 09:11:50.04 pVwVWDM8M.net
>>439
つ 408
452:デフォルトの名無しさん
18/09/15 09:12:10.24 hHXkfIbs0.net
>>439 >>408
453:デフォルトの名無しさん
18/09/15 09:39:05.72 u2jcQID60.net
整数の定数くらいならconstexpr付けても付けてなくても大して変わらなくない?
const int n = 42; と constexpr const int n = 42; って何が違うの
どっちも定数式文脈で使えるでしょ
454:デフォルトの名無しさん
18/09/15 10:09:16.49 8TAknpK9d.net
>>440
>>441
節穴だった申し訳
455:デフォルトの名無しさん
18/09/15 10:28:10.96 wlkSFfZ20.net
constexpってクソださい仕様だよな
勝手に推論して最適化しとけや
456:デフォルトの名無しさん
18/09/15 11:23:26.53 oMwX4DqWa.net
>>438
関連性のある定数群をまとめる為にはスコープがあるenum classはいいんだけど、
フラグとして使うのが難しいのがちょっと難点
enum class PNG_COLOR_MASK: uint8_t{
GRAY = 0b000,
PALETTE = 0b001,
RGB = 0b010,
ALPHA = 0b100
}
enum class PNG_COLOR_TYPE: uint8_t{
GRAYSCALE = PNG_COLOR_MASK::GRAY,//できない
RGBA = PNG_COLOR_MASK::RGB | PNG_COLOR_MASK::ALPHA//できない
}
457:デフォルトの名無しさん
18/09/15 14:56:24.44 u2jcQID60.net
フラグとして使うならoperator|と&をオーバーロードするのが良いけど面倒だね
PNG_COLOR_MASK operator|(PNG_COLOR_MASK e1, PNG_COLOR_MASK e2)
{
using u_t = typename std::underlying_type<PNG_COLOR_MASK>::type;
return PNG_COLOR_MASK((u_t)e1 | (u_t)e2);
}
458:デフォルトの名無しさん
18/09/15 15:34:42.86 oMwX4DqWa.net
ここまでやって更にstatic_castも必要となるという。
459:デフォルトの名無しさん
18/09/15 16:32:07.11 I8Ewbo070.net
>>444
むしろ俺はコンパイラでやらずビルドシステムで対応すべきことだと思っているが。
なんでもコンパイラに押し込もうとする悪しき風習に思う。
460:デフォルトの名無しさん
18/09/15 19:18:14.78 XFoW6siK0.net
fstreamでも結局writeするのでFILEと比較して都合のいい方を選べばいいよ。
461:438
18/09/15 19:36:37.14 /OsufeBT0.net
enum class はスコープを限定できる代わりに、個別の型として
ガチガチに保護されるせいで数値として使いにくい欠点はあるね。
namespace PNG_COLOR_MASK {
enum {
GRAY = 0b000,
PALETTE = 0b001,
RGB = 0b010,
ALPHA = 0b100,
};
}
int grayscale = PNG_COLOR_MASK::GRAY;
int rgba = PNG_COLOR_MASK::RGB | PNG_COLOR_MASK::ALPHA;
こんな感じにnamespaceで名前なしのenumを囲むか。
素直にconstexprを使えばいいんだけど、C++11以前でも可というニッチな提案。
462:デフォルトの名無しさん
18/09/15 20:20:12.42 MJTXjpFoa.net
その場合structで囲むのもありだね。二進数リテラルはC++11以前では拡張だけど。
463:デフォルトの名無しさん
18/09/15 21:04:37.66 V75GOAR/a.net
>>446の案を利用(C++17以降?)
URLリンク(wandbox.org)
464:デフォルトの名無しさん
18/09/15 21:10:11.77 V75GOAR/a.net
少し修正
URLリンク(wandbox.org)
465:デフォルトの名無しさん
18/09/15 22:39:15.30 oE5p8K2a0.net
ようわからんがプログラムを書き始めた当初
#define CONST_A 3
だったものを
extern int g_varA = 3;
#define CONST_A g_varA
とすれはCONST_Aは一瞬で値を変更可能な「変数」g_varAに設計変更になれるキモス
(CONST_Aは定数のつもりだったが後から変数に変えたくなった場合
ただしそうしてしまうとプログラムのどこでも書き換えられてしまって危険極まりないので、
めんどくさくない限りシングルトンすべしという神の啓示に聞こえなくも無い
プログラム起動時のみに値を設定する目的であってプログラム動作中は定数扱いなのだとすれば、
シングルトンのマルチスレッド対応は特に何もしなくても良い(クリチカルセクションやミューテック巣やLOCKとか不要
まあ質問に対しては例の図画の「営業の約束」の類やな
466:デフォルトの名無しさん
18/09/15 22:48:41.06 VQoTXRx30.net
2進数書けないのは不便だと昔からおもてた
467:デフォルトの名無しさん
18/09/15 22:56:14.72 oE5p8K2a0.net
接頭辞0bというのは十六進数と紛らわしいから02にしよう
468:さまよえる蟻人間
18/09/15 22:58:34.46 2Qh39GgFd.net
02だと、8進とかぶっちゃうよ。
469:デフォルトの名無しさん
18/09/15 23:02:11.85 bZY/rtks0.net
8進がおかしい
0Oにしろ
470:デフォルトの名無しさん
18/09/15 23:06:12.86 oE5p8K2a0.net
二進数が書けたら書けたで、長ったらしくなるから桁区切りを入れさせろという要求が出るのは必至
犯人の要求はエスカレートする一方や
471:デフォルトの名無しさん
18/09/15 23:07:07.35 5HUBWRKg0.net
誰かが仕込んだバグ以外で8進数が使われてるところを見たことがない。
パメ族以外で8進リテラル使ってるやつなんているのか?
472:デフォルトの名無しさん
18/09/15 23:07:30.30 V75GOAR/a.net
C++14で桁区切りも対応してるぞ
473:デフォルトの名無しさん
18/09/15 23:17:11.26 xQnt+Dhj0.net
>>458
賛成!
474:さまよえる蟻人間
18/09/15 23:29:24.44 2Qh39GgFd.net
ダブルオー
475:デフォルトの名無しさん
18/09/15 23:35:07.74 VQoTXRx30.net
マイコンベーシックで2進数のドット絵キャラを見たときは笑劇だった
476:デフォルトの名無しさん
18/09/16 00:46:24.98 JK7FzOgWM.net
>>461
アポストロフィーがどうにも気持ち悪くて…
慣れるのかね、そのうち
477:デフォルトの名無しさん
18/09/16 06:21:32.85 TERwdiOQ0.net
int a = 123; // a = 123
int b = 0123; // b = 83
ほんとクソ仕様だなこれ
478:デフォルトの名無しさん
18/09/16 06:35:39.96 Ch2PxBqj0.net
桁区切りってISOにのっとってるの?
国によって違うけど対応してるの?
479:デフォルトの名無しさん
18/09/16 06:35:52.88 NJnAChO90.net
Unix系のファイルパーミッションは今でもしぶとく8進数だよな
大嫌いだからあの習慣早く滅亡して欲しい
480:デフォルトの名無しさん
18/09/16 07:40:39.31 R+r0qoR6M.net
>>467
可読性を高めるためのもの
コンパイラはただ読み飛ばすだけなのでお好きな記方でどうぞ
だったはず
481:デフォルトの名無しさん
18/09/16 08:43:28.35 +ao0anr70.net
>>460
unix のファイルパーミッションが3bit単位だから昔のソースではcreat()の引数に0755とか0644とか普通に書かれてる
てかそのための8進数だと思う
482:デフォルトの名無しさん
18/09/16 08:47:08.77 SOVIz+sV0.net
rwxrwxrwx
421421421
8進数なのはアタリマエ
8進数以外で表現しようがない
483:デフォルトの名無しさん
18/09/16 09:04:46.04 J7jkqE/NM.net
intelチップのマシンコードは3bit単位で意味が変わるから
ハンドアセンブル出来るひとは普通8進数使えるよ
484:デフォルトの名無しさん
18/09/16 09:08:16.62 NJnAChO90.net
stickyビットとかsetuidビットとか増えてるから本来はもう8進数じゃ足りないんだぞ
未だに引きずられて無理矢理8進数で表現してるのは害悪だから
485:デフォルトの名無しさん
18/09/16 09:14:30.28 lOWFqhA+0.net
>>465
気持ち悪いよな
アンダースコアでよかったのに何でって思う
486:デフォルトの名無しさん
18/09/16 09:19:40.62 yGlb1wug0.net
どっかに書いてあった。ユーザー定義リテラルと衝突するんだと。
487:デフォルトの名無しさん
18/09/16 09:20:40.61 AHKBmQkKa.net
ユーザー定義リテラルが先にきてて、アンダースコアだと重複してしまうから。
案としてはアンダースコアも出てたはず。
488:デフォルトの名無しさん
18/09/16 09:24:34.63 AHKBmQkKa.net
これやな。
URLリンク(cpprefjp.github.io)
489:デフォルトの名無しさん
18/09/16 09:30:17.66 Z6oeOzwN0.net
日本の数勘定として、3桁区切りより4桁区切りのほうが良いと思うの。
100,000,000と書いててもぱっと1億って分からん。
1,0000,0000のほうが分かりやすい。
ってC言語関係ないけど。
490:デフォルトの名無しさん
18/09/16 09:40:48.27 M63m8fL00.net
>>478
万事、英米基準だから…
491:デフォルトの名無しさん
18/09/16 10:16:56.42 lOWFqhA+0.net
operator "" _000 () みたいなアホなこと書かれかねないからか
なるほどthx
492:デフォルトの名無しさん
18/09/16 11:19:42.15 +ao0anr70.net
>>471
4bit区切りでいいだろ
4bit目は予備として0固定にしちゃえばいいだけ
493:デフォルトの名無しさん
18/09/16 11:23:02.16 +ao0anr70.net
>>465, >>474
URLリンク(askul.c.yimg.jp)
494:デフォルトの名無しさん
18/09/16 14:03:39.12 cGCWO0MtH.net
>>478
一億ってかけ
それ以外は認めん
495:はちみつ餃子
18/09/16 14:41:57.29 iD6L9h5X0.net
ユーザー定義リテラルで 1_億 みたいには書けるじゃろ
496:デフォルトの名無しさん
18/09/16 14:43:54.49 lOWFqhA+0.net
constexpr unsigned long long operator "" _\u5104 (unsigned long long val)
{
return val * 10000 * 10000;
}
497:デフォルトの名無しさん
18/09/16 14:58:07.76 lOWFqhA+0.net
// Header <japanese> synopsis
constexpr unsigned long long operator "" _\u4e07 (unsigned long long);
constexpr unsigned long long operator "" _\u5104 (unsigned long long);
constexpr unsigned long long operator "" _\u5146 (unsigned long long);
constexpr unsigned long long operator "" _\u4eac (unsigned long long);
constexpr unsigned long long operator "" _\u5793 (unsigned long long);
constexpr unsigned long long operator "" _\u25771 (unsigned long long);
constexpr unsigned long long operator "" _\u7a63 (unsigned long long);
constexpr unsigned long long operator "" _\u6e90 (unsigned long long);
constexpr unsigned long long operator "" _\u6f97 (unsigned long long);
constexpr unsigned long long operator "" _\u6b63 (unsigned long long);
constexpr unsigned long long operator "" _\u8f09 (unsigned long long);
constexpr unsigned long long operator "" _\u6975 (unsigned long long);
constexpr unsigned long long operator "" _\u6052\u6cb3\u6c99 (unsigned long long);
constexpr unsigned long long operator "" _\u963f\u50e7\u7947 (unsigned long long);
constexpr unsigned long long operator "" _\u90a3\u7531\u4ed6 (unsigned long long);
constexpr unsigned long long operator "" _\u4e0d\u53ef\u601d\u8b70 (unsigned long long);
constexpr unsigned long long operator "" _\u7121\u91cf\u5927\u6570 (unsigned long long);
498:デフォルトの名無しさん
18/09/16 15:01:20.18 AX2qPX270.net
mjk
499:デフォルトの名無しさん
18/09/16 15:13:55.06 NJnAChO90.net
まあ64bit整数は垓でオーバーフローしちゃうけどな
500:デフォルトの名無しさん
18/09/16 15:19:22.27 un+A0LAL0.net
アンダーバー必須?
501:デフォルトの名無しさん
18/09/16 15:23:34.17 PDH9z/EW0.net
予約語なのでユーザー定義リテラルをユーザー定義するときはないとダメ
502:デフォルトの名無しさん
18/09/16 20:49:23.78 ecoXNuEUM.net
>>482
あー、既視感はこれか…
503:デフォルトの名無しさん
18/09/16 21:37:31.50 Lm7yQOTf0.net
全然関係ない話だが
めんどくさいC,C++を習得すると
他言語学習が簡単に進む
504:デフォルトの名無しさん
18/09/16 21:46:28.57 h2MQFGAYM.net
>>492
つ VLIW
505:デフォルトの名無しさん
18/09/16 23:31:10.84 V0g35lEl0.net
他言語すべてがザコに見える
特にJAVA
506:デフォルトの名無しさん
18/09/17 00:00:35.54 x38HLuISM.net
多言語使いは問題解決能力が無いのに偉そう
特にJava
507:デフォルトの名無しさん
18/09/17 07:23:44.67 EVO8AkN40.net
ところで、C++ってどんな開発に使ってるの?
Linuxのアプリ以外で。
508:デフォルトの名無しさん
18/09/17 07:48:33.15 oxQatDsR0.net
URLリンク(github.com)
こんな感じの物が作れるようになった。win32apiだ。
コアはそれなりにできたが、UI作ろうとしたらバグで死亡ちゅう。テストは良いけど過信しないで。
VBとかC#のビジュアル開発がどれだけ楽か身に染みてきた。
ところで、[0,1]の引数のみで使える面白関数しらないかい?
logとかは線形な気がするのでもっとおかしな奴ないかい?
509:デフォルトの名無しさん
18/09/17 09:36:25.88 dZ3SMulNa.net
edcb
510:デフォルトの名無しさん
18/09/17 13:09:26.75 9OAi7Hbk0.net
>>496
アルゴリズムベンチマーク。
リークしててもそこまで問題にならんし、速度が実際どれくらい出るもんか調べるには良い。
まあcでも良さげな使い方ばっかだけど、namespaceとか多少ね。
511:デフォルトの名無しさん
18/09/17 14:24:16.64 zCVYDMXL0.net
>>496
速度が求められるアプリはC++でしょ
大規模データでシミュレーションとかJavaでは遅くて無理
512:デフォルトの名無しさん
18/09/17 14:39:27.45 r6sTx27/r.net
リークしてても?
リークしてても……?
513:デフォルトの名無しさん
18/09/17 14:44:25.11 zCVYDMXL0.net
>>501
そうだなw
盛大にリークしてたら速度にめちゃ影響するわな
514:はちみつ餃子
18/09/17 15:02:34.85 O6rb8eh90.net
ものすごい潤沢にメモリがあって処理が終わるまでに使い切ることがないという確信があれば
メモリを解放する処理を入れずに速度を優先することは無いわけではないと思うが、
それが妥当かどうかいちいち検討するコストをかけるくらいならちゃんと解放しておいた方がよろしい。
515:デフォルトの名無しさん
18/09/17 15:32:46.89 t936AOdi0.net
なんで速度を要する処理の途中でメモリを獲得するん?
なんで速度を要する処理の途中でメモリを獲得するん? 👀
Rock54: Caution(BBR-MD5:1341adc37120578f18dba9451e6c8c3b)
516:デフォルトの名無しさん
18/09/17 16:08:31.17 0/ju7MLa0.net
>>503
「ものすごい潤沢」では意味がない
処理が終わるまでに最悪何バイト使う可能性があり、
実装されているメモリは何バイトなのか、
需要と供給の具体的な比較あるのみ
517:デフォルトの名無しさん
18/09/17 16:22:22.61 kSBsQrFK0.net
サーバープログラムみたいなもんだったら
リークしてたらどこでシステム停止するかわからんし大問題に繋がるだろうが、
てきとうなベンチマーク検証ならリークしようと最悪落ちようとそこまで支障をきたすわけじゃ無いってことだよ。
てか実際問題�
518:サのくらい実験的な意味合いの強いものじゃ無いとc++は苦しい気がするんだが。
519:デフォルトの名無しさん
18/09/17 17:13:04.47 EVO8AkN40.net
C++の生産効率、バク埋め込み率、デバックのしにくさを考えると、積極的にC++を採用すべき分野って限られてくるよね。
組み込みやドライバではCが主流だし、WindowsやスマホではほぼC++は使われないし、Webの世界ではスクリプト言語だし、計算分野ではPythonやMatlabやMathmaticaだし。
仕事でC++使う機会は最近めっきり減ったわ。
520:デフォルトの名無しさん
18/09/17 17:37:23.45 3kd9gc670.net
スマポとSTL使ってればリークなんかそうそう起こらんだろ
古臭いC++のイメージで語らないほうが良いよ爺さま方
521:デフォルトの名無しさん
18/09/17 17:41:18.57 qtGPC3c90.net
スマポと言っても一秒間に数千回数万回の確保とかしてたら流石に遅くなるんじゃね?
522:デフォルトの名無しさん
18/09/17 17:53:56.99 3kd9gc670.net
unique_ptrはナマポ使ってるのと一緒よ
523:デフォルトの名無しさん
18/09/17 17:55:45.86 SBpxj18K0.net
>>509
そんな機会はめったにないし、万が一あったらそこだけナマポとかで対処できるのはC++だけ
524:デフォルトの名無しさん
18/09/17 18:07:37.03 r6sTx27/r.net
>>502
いや、どんな場合でもリークしないように書けよと思って引っかかった
525:デフォルトの名無しさん
18/09/17 18:19:02.17 GutZ/6rY0.net
まあ趣味でない限り実用度が学習コストに見合わない感じはあるな
他に比べて
526:デフォルトの名無しさん
18/09/17 18:20:26.64 zCVYDMXL0.net
オブジェクトを1個1個newする?
でかいデータだと大量にnewするオブジェクトだったら配列で1MBとかまとめてnewしないと遅いでしょ
527:デフォルトの名無しさん
18/09/17 18:42:32.24 CEV1V8yd0.net
メモリ解放にも時間かかるけどそこは計測から外します
都合のいい計測をします
528:デフォルトの名無しさん
18/09/17 19:57:02.88 HG71i9DfM.net
>>508
それで安全になるかもしれないけど
コピーしまくり、newしまくりだったりとかよくあること
C++使う理由をよく考えたほうがいいと思うわ
529:はちみつ餃子
18/09/17 20:37:10.33 O6rb8eh90.net
>>516
ムーブの恩恵があるやで。
530:デフォルトの名無しさん
18/09/17 20:53:22.59 tpLtH4DE0.net
現代の C++ は処理系もライブラリもそれなりに賢いから、任せきりにしてもそれなりの効率になる。
ほとんど任せきりにできる高級言語としての面と、必要なとこは手動で書ける低級言語としての面を合わせ持つのが C++ の強み。
531:デフォルトの名無しさん
18/09/17 21:33:50.41 YgnM5prK0.net
>>512
お前は最低でも数万行くらいの規模のコード書いてから偉そうなことを言え
532:デフォルトの名無しさん
18/09/17 21:40:52.08 5VGXhp/T0.net
最近はC++もスマートポインタが主流で
メモリリークもツールでチェックすると聞いたが
現実はどんなもんなん
533:デフォルトの名無しさん
18/09/17 22:10:33.50 oxQatDsR0.net
VCには簡易メモリっチェックをするヘッダーがある。もちろん環境依存。
スマポでリークするのはかなり筋が悪い。
534:デフォルトの名無しさん
18/09/17 22:19:24.01 CEV1V8yd0.net
>>519
それはリークの言い訳にはならんで
535:デフォルトの名無しさん
18/09/17 22:33:55.31 SBpxj18K0.net
>>519
まあどんな場合でもは言いすぎだと思うが少なくとも正常系ではリークなしを目指すのは当たり前
536:デフォルトの名無しさん
18/09/17 22:36:30.00 oxQatDsR0.net
スマポでリークするケースというと、昔のインターフェースでスマポそのものが渡せないとかかなぁ。。。
希望としてはリファクタリングしてほしいところだけどね。
537:デフォルトの名無しさん
18/09/17 23:14:55.87 YgnM5prK0.net
>>522
誰が「規模が大きければリークしていい」と言った?
言ってないことを言ったかのように相手の主張を捻じ曲げるな
>>523
>アルゴリズムベンチマーク。
>リークしててもそこまで問題にならんし
538:デフォルトの名無しさん
18/09/17 23:17:40.96 2pCWAXV50.net
リークしたらヒープエリア毎Destroyすれば良いじゃない
@マリー・アンチョワネット
539:デフォルトの名無しさん
18/09/17 23:28:41.66 YgnM5prK0.net
あぁすまん、正常系について誤解してた
まぁ個人で使うレベルなんじゃないかね、本人が問題にならん言うてるし
540:デフォルトの名無しさん
18/09/18 00:08:27.62 z2qcvEfV0.net
ウィンドーズにはApplication Verifierがあります!!11!1!
>>521
malloc()とfree()が対応しているかはばっちりワカルのでかなり役に立つが
Win32APIで直接メモリ確保したりC++でメモリアロケータを0から自作した場合はどうなるかわからん…
perfmonで指定プロセスのprivate bytesの推移を取得しつつ長時間動かして直接消費状況を確認するというのがある意味最終手段だが
リークが無い(はずの)プログラムでもなかなか安定しないという印象
多分ユーザーコードからRAIIを排除しても拾ってきたライブラリがRAIIするとかそんな感じ!
541:
18/09/18 00:14:49.89 Iw2LHuqq0.net
>>528
グローバル new 演算子
グローバル delete 演算子
を malloc()/free() を使って定義して、かつ、未解放・二重解放を検出するようにポインタを線形リストに格納してチェックする、ということなら、簡単にできます
win32api でも、たとえば heapalloc() をラップすればいいかと
デバッグ初期の単純なミスならこれで大方弾けます
542:デフォルトの名無しさん
18/09/18 00:18:57.80 k3MAuD5K0.net
>>528
MS製だからWIN32位は拾ってくれると思ってたけど、なんだってー。Orz
俺は末端のユーザだからアロケータ書いたりしないのよね。
特に自作したらメンテとか自分でやんなきゃいけない負債になるのでやりたくないなぁ。
543:デフォルトの名無しさん
18/09/18 01:01:35.82 uOah9zOu0.net
>>530
application verifierはwin32apiをhookしてるよ。
544:デフォルトの名無しさん
18/09/18 01:07:33.27 7OxZ5HAL0.net
>>517
コンテナ形式のデータばかりと思うなよ
545:デフォルトの名無しさん
18/09/18 01:31:03.51 n7K73R0GM.net
hogeはdouble型で
int temp = int(hoge);
if (temp > 0)
return temp;
else
return 0;
このような処理をしたいのですが、何か良さげな内部関数とかないですかね
546:はちみつ餃子
18/09/18 04:24:56.90 CgLDhfQ00.net
>>533
C++17 の std::clamp みたいなことがしたいのかな
547:デフォルトの名無しさん
18/09/18 04:58:47.12 1zYpCWJ70.net
>>529
ランタイムのソース読んだ事無いの?
548:デフォルトの名無しさん
18/09/18 05:16:37.52 bwjvKD0M0.net
>>533
std::max(0, int(hoge))とか
549:デフォルトの名無しさん
18/09/18 06:06:39.75 mbB60zCK0.net
>>533
_mm_max_pd とかその辺
550:デフォルトの名無しさん
18/09/18 06:32:00.57 yg1A1NBg0.net
>>525
それはリークの言い訳にはならんで
551:デフォルトの名無しさん
18/09/18 06:35:34.10 BuheiE4nM.net
アルゴリズムベンチマークなんて長期間稼働するものでもないし、プロセス終わればリークも終わる。
552:デフォルトの名無しさん
18/09/18 06:55:51.70 1W/tmI+p0.net
>>533 の言う「内部関数」ってのは、
CPUのマシン語命令を直接利用するビルトイン関数みたいな感じかな。
553:デフォルトの名無しさん
18/09/18 09:38:53.59 GYwTywmv0.net
言い訳にならんよな
数万行って具体的な数値を出してきたのは奴だし
554:デフォルトの名無しさん
18/09/18 09:39:49.43 Zf2s67R20.net
勝手に察すると、単純な話だと思う
彼の把握では、おそらくは次のようになっているハズだ
内部関数=組み込み関数(あらかじめ用意されている標準の関数)
外部関数=自作関数、ユーザ定義関数
真意を勝手に忖度すると、「自作関数を作らずにそのまま使えるような便利な関数は既に存在してはいないだろうか」という質問に見える
555:デフォルトの名無しさん
18/09/18 09:40:00.14 GYwTywmv0.net
そもそも行数でどうたらって、いつの時代劇だよ
556:デフォルトの名無しさん
18/09/18 09:40:52.00 GYwTywmv0.net
>>542
俺もそう思った
だとすると536でFA
557:デフォルトの名無しさん
18/09/18 09:49:04.25 k3MAuD5K0.net
>>531
Yes、OK!
558:デフォルトの名無しさん
18/09/18 09:55:26.47 k3MAuD5K0.net
int ookii=...
int tiisai=...
int V=...
int x = std::max(tiisai,std::min(ookii,V));
ってやると、[min,max]区間内のVが取れたような気がする。
今度C++17で入るクランプがそれ。
559:デフォルトの名無しさん
18/09/18 11:57:01.55 9q1AFd5B0.net
>>543
>>512の
>どんな場合でもリークしないように書けよ
リークしないようなコードを書くのは当たり前だが、どんなに注意してても起きるときは起きる
仮にこういう主張してるやつが居てもお前は俺と同じことを思わんのか?
「どんな場合でもバグらないように書けよ」
560:デフォルトの名無しさん
18/09/18 12:26:58.02 GYwTywmv0.net
車の事故と同じ
起きるときは起きるなんて言い訳は通用しない
まず起こすな
やっちまったら責任とれ
そういう緊張感がいるってことだ
561:533
18/09/18 12:44:39.79 TXDNyaJKM.net
ありがとうございます
max関数使わせていただきます
もう一つ別の質問なのですが、
2つのベクターの要素(1000個程度)の比較で、同じi番目の要素の内容差が10以上の要素番号(イテレータ?)を調べたいです
この操作は何回も繰り返すので出来るだけ高速化したいのですがなにか良い方法ありませんかね?
ベクターの要素はint型で内容は大体1000以下の整数です
vec1[100] = 100とvec2[100] = 300
vec1[102] = 100とvec2[122] = 300
なら100, 102のイテレータ(この後そのまま新しくforに投げるので)
562:デフォルトの名無しさん
18/09/18 13:14:20.96 l12yg0eyx.net
>>549
思わずC# LINQかPython使いたくなる内容だな。
やりたいことは結局のところ行列演算なのでEigen使うと何か方法ありそうだけど、高速化に寄与するかは不明。
563:デフォルトの名無しさん
18/09/18 14:20:03.27 Gab8FMClM.net
>>549
1000個を例えば4コアで250個ずつ並列化してさらにforの中でn個ずつ比較するとかかな…
intelは
_mm_cmpgt_epi16
armは
vcgt_s16
とかあるみたいだけど
564:デフォルトの名無しさん
18/09/18 15:33:22.77 UQgXz1AkM.net
普通MPIじゃね?
565:はちみつ餃子
18/09/18 16:41:03.37 CgLDhfQ00.net
>>549
新しく for に投げるっていうのがよくわからんのだが、
やりたいことをコードで (C++17 で導入された構造化束縛を使って) 表すと
for (const int& [element1, element2]: extract_if_big_difference(vec1, vec2)) { ほにゃらら }
みたいに書ける関数 extract_if_big_difference が定義できるといいなぁという感じ?
こうだとしたら、並列化するのは難しい気がするぞ。
566:デフォルトの名無しさん
18/09/18 16:42:40.86 l12yg0eyx.net
OpenCLでベクトル演算すれば速いんじゃね?
567:デフォルトの名無しさん
18/09/18 16:58:21.90 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;
}
568:デフォルトの名無しさん
18/09/18 17:05:52.46 ZX8OqlLQd.net
データが多いならざっくり N (2~8)分割して OpenMP とかで並列処理するのがいいよ
数百ミリ秒以上かかるなら他のコアを遊ばせておくのはもったいない
各分割の結果は独立して保持して後で統合する
569:デフォルトの名無しさん
18/09/18 17:06:36.21 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以上のところを探して何か処理ならこっちのが楽だべ
570:デフォルトの名無しさん
18/09/18 18:11:51.89 H2d9f0sTa.net
>>533の質問のレベルを見ていると、
>>549も「実装完了しないうちから最適化必要と思ってたけど実はそんなこと必要なかった」なんて落ちにはならないかなとふと思った。
571:デフォルトの名無しさん
18/09/18 18:32:34.48 RR2nvfojr.net
boost の multi_array ってさ、添字の入れ替えってできる?
例えば要素 a[i][j][k] を a[k][i][j] に、全ての i, j, k について入れ替える操作
自分で実装しなきゃ駄目?
572:デフォルトの名無しさん
18/09/18 23:03:47.37 oE0uJFU60.net
boostみたいなインチキくさいライブラリは使ったことないが
オレだったらイチイチそんなムダな入れ替えが本当に必要なのかと
まずそこを疑う
573:デフォルトの名無しさん
18/09/18 23:14:12.21 yg1A1NBg0.net
行列でそんな演算あったような
574:デフォルトの名無しさん
18/09/18 23:30:40.91 GKhblNvIr.net
>>560
無駄の意味が分からない
テンソルの掛け算するときに行列積ライブラリ使うために足組み替えたりするだろ
575:デフォルトの名無しさん
18/09/18 23:35:47.30 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);
}
...
};
576:デフォルトの名無しさん
18/09/18 23:43:07.71 G/V6WyhFd.net
stack overflow
577:デフォルトの名無しさん
18/09/19 00:26:11.52 McwJY1yY0.net
わ、わざとだから!
578:デフォルトの名無しさん
18/09/19 00:33:47.86 dEko0zDA0.net
boostとか漏れも使ったことないわ(゚∀゚)人(゚∀゚)ナカーマ
579:デフォルトの名無しさん
18/09/19 04:24:37.15 2wyJ7zTj0.net
boostはbjamが糞すぎて入れるのめんどくさくなっちゃった
580:533,549
18/09/20 03:07:15.61 fZtZJGAwM.net
遅くなってすみません
処理が重くなったのは別の部分のせいでした…
Python的考えで5桁くらいインデントしてたので勝手に遅いと思ってましたが普通に高速でした
お騒がせしました
581:デフォルトの名無しさん
18/09/20 13:40:29.54 CPfoYuVJ0.net
たかだか1000回のループでそんなに速度気になるんか(というか並列化とかベクトル化とか大げさやろ)、
と思ってたけどやっぱりか
>>558の一人勝ちやな
582:デフォルトの名無しさん
18/09/20 21:36:12.15 zLqp8E230.net
低学歴知恵遅れなら
1回ループするのに1分かかるようなコードを書きかねない
583:デフォルトの名無しさん
18/09/21 00:16:00.80 4kzBlK6i0.net
再帰使ってみたが1分かからんかった
ゆ、許された…
URLリンク(ideone.com)
584:デフォルトの名無しさん
18/09/21 00:27:26.94 4kzBlK6i0.net
1分の壁を破るには、何度も何度もそれとわからずに同じ計算をするようなアルゴリズムにしないとだめだなあ…
585:デフォルトの名無しさん
18/09/21 03:21:51.90 xr3UMDDx0.net
boostをVS2017に入れられない
586:デフォルトの名無しさん
18/09/21 13:11:38.33 JwHgudh+H.net
関数A,B、C、D、EがあってAの中でBを呼んで、Bの中でCを……
って構造があって、例えばEでエラーが出るとします。大本のAにそれを伝えてエラーにしたいんですけどどうしたらいいでしょう
BCDEの戻り値全部boolにしてfalseを返すくらいしか思いつかないです
587:デフォルトの名無しさん
18/09/21 13:20:30.45 EQpNFWj/0.net
>>574
戻り値でもいいし、引数に参照やポインタを渡してもいいし
例外でもいい
588:はちみつ餃子
18/09/21 13:40:44.63 FzfC+eZt0.net
書く分には例外を投げるのが楽じゃないの。
関数 B, C, D ではそのエラーについて忘れておくことが出来るので。
589:デフォルトの名無しさん
18/09/21 13:41:36.51 IFsUWHdO0.net
>>574
例外を投げてキャッチさせる
590:デフォルトの名無しさん
18/09/21 14:25:47.49 wDeX8uPc0.net
例外はGOTOに迫りつつある
591:デフォルトの名無しさん
18/09/21 14:34:59.25 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(); } }
592:デフォルトの名無しさん
18/09/21 14:47:07.50 JwHgudh+H.net
皆様ありがとうございました。
別関数からのまでcatchできるとは知りませんでした。>>574を参考にしつつ書いてみようかと思います。
ファイル読み込みのときはあんま例外使わないなんて記述見たんですけど別に書いても大丈夫ですよね
593:デフォルトの名無しさん
18/09/21 16:31:17.28 vcIlO6Gbr.net
スッゲェ素人なんだけどよ、他人が作ったクラスに自作関数を付け加えたいときってどうすんの?
(例えば、行列クラスに特異値分解する関数を付け加える等)
継承ってやつを勉強して使うだけ?
C++ の言語仕様と常識を勉強したいという意味でもあるので、「その他人のコードを直接編集せよ」ってのはナシで頼む
594:デフォルトの名無しさん
18/09/21 16:50:36.52 K+jLUYtn0.net
>>581
機能を追加するために継承使うのは設計的によくないよ
595:デフォルトの名無しさん
18/09/21 17:01:37.16 pko5dpD3r.net
>>582
どうするべき?
596:デフォルトの名無しさん
18/09/21 17:06:42.97 OnuHA6YMx.net
>>581
クラスの親子関係がはっきりしてるなら継承。
機能が似てるだけなら移譲。
どちらか迷ったら移譲。
597:デフォルトの名無しさん
18/09/21 17:15:33.49 K+jLUYtn0.net
>>583
void svd(Matrix &pMtx);
みたいな関数ではダメなの?
598:デフォルトの名無しさん
18/09/21 17:45:50.45 nytN4gJ8r.net
>>584
移譲という用語は初めて知ったので、勉強してみます
>>585
ダメ、ということはないと思いますしこれまではそうしてきました
しかし、行列の特異値分解は配列ではなく行列に適用するべきだという意識が強くなりました
BLAS 等の多くてややこしい引数も、「行列を渡す」という形で書くことでもう少し自分にとって読みやすくなるのではないかとも思いました
クラスだとか他人のコードの拡張といったことを勉強してみたくなったということでもあります
599:はちみつ餃子
18/09/21 18:21:14.81 FzfC+eZt0.net
>>586
なんでもかんでもメンバ関数として持たせるのはダサいというのが近年の風潮。
設計方針にもよるんだけど、機能をちょっと増やすたびに新しい型を作るのも馬鹿馬鹿しいだろう。
単なる関数として作ればそれでよいはずのことにクラスの依存関係まで出てくるの、ホントに良くない。
600:デフォルトの名無しさん
18/09/21 18:35:46.91 nikK7GUa0.net
>>584
>どちらか迷ったら移譲
やめろ、割とマジで
本来継承が好ましいものに委譲を使うと後々になって必ず破綻する
お前D&E読んでないのか?
>>587
>ダサいというのが近年の風潮
そういう言い方・考え方もやめろ
かつてC++の継承は汚いからテンプレートで代用しろ、みたいな理屈があったが全くの空回りに終わった
その間初心者は嘘の情報に騙されたりオブジェクト指向を誤解したりして、結果C++から離れていった
>単なる関数として作ればそれでよいはず
これは正しい
601:デフォルトの名無しさん
18/09/21 18:37:09.46 MaoTi4980.net
>>587
完全に同意。
クラスの数が星の数ほどあるプロジェクトで、継承してメソッド一個追加してるだけとかの経年劣化したソース見たら目眩がするわ。
オブジェクト指向の初期啓蒙として「既存のクラスは変更するな」「機能追加は継承使え」って言ってた人を恨むわ。
602:デフォルトの名無しさん
18/09/21 18:40:06.68 MaoTi4980.net
>>588
もちろん「IS-A」が成り立ってる継承が適してるものは継承使うべき。
むしろ継承を使うべきでないとこに継承使ってるほうが後々破綻するので悩んだら委譲。
603:デフォルトの名無しさん
18/09/21 18:53:16.27 nVnA1Sbpr.net
>>588-590
では特異値分解、スライシング、掛け算、足し算、エトセトラ……、という大規模な機能追加を既存のクラスに対して行ないたい場合はどのようにするべきでしょうか
604:デフォルトの名無しさん
18/09/21 19:06:55.02 MaoTi4980.net
>>591
うーん、場合によるけど全てそのクラスに対する操作ならさすがに継承するかな。
後々のメンテ考えたら可能であれば継承元のクラス変更するけど。
605:デフォルトの名無しさん
18/09/21 19:18:19.30 scCYqhjF0.net
他人が作ったクラスで勝手にいじれないんでしょ?
protectedやvirtualなメンバがあって、それを使って色々するなら当然継承すればいいけど
そうじゃない継承される前提で作られたクラスじゃないなら継承はオススメできんなあ
svd(m)をm.svd()って書きたいためだけに継承の山のようなトラップ抱え込むのは割に合わないと思うよ
どうせ親クラスのprivateはいじれないんだし
606:デフォルトの名無しさん
18/09/21 19:20:28.05 wzHnJ4yt0.net
unified call syntax 甦れ。
607:デフォルトの名無しさん
18/09/21 19:24:14.64 nikK7GUa0.net
>>591
使ってるのはuBLASだっけ?調べてないのでわからんけど・・・・
継承を前提にしたクラス(デストラクタがvirtualであり、実際継承してみても使える)なら継承もアリっちゃアリだとは思う
(責任は負わんw あくまで勉強目的でやってみるのはいいと思う)
ただ、特異値分解は知らんのでわからんけど、一般に演算クラスの機能追加は
>>587の言う通り、単純にそのクラスを受け取るグローバル関数にする方がいい
特に
>掛け算、足し算
こんなのはまさにメンバ関数にしなくても、グローバルに演算子オーバーロードを定義すれば済む
(メンバに書いてもグローバルに書いても利用者側はA * Bって書ける
あとv1.dot(v2)よりdot(v1, v2)のがわかりやすいと思うけどね
608:デフォルトの名無しさん
18/09/21 19:48:50.66 MaoTi4980.net
>>595
完全に同意。
609:デフォルトの名無しさん
18/09/21 19:58:47.83 nVnA1Sbpr.net
>>592-596
なるほど。
普通に関数にするのが、必要十分さの面で、良さそうですね。
頭の中にあったのは、自分で作った関数群が全て○○というクラスに対して使用することを想定している、と明示したかったということです。
グローバル関数の用途を明らかにする方法として、メンバ関数化すれば良いのかな、と思いました。
メンバ関数にはしないということにした場合、上のことを実現するにはどうするべきでしょうか。
コメントやノートに書くくらいしか思い付きませんが、それで良いのかな
610:デフォルトの名無しさん
18/09/21 20:09:39.68 scCYqhjF0.net
引数の型が○○やconst ○○&になるでしょ
それ以上のなにが欲しいの?
611:デフォルトの名無しさん
18/09/21 20:10:46.02 nikK7GUa0.net
そういえばBLASとは書いてたけどuBLASとは書いてなかったな
いずれにしても、その扱いたいクラスを受け取る関数だから見たらわかるっしょ
違う型を渡したらエラーになる
612:デフォルトの名無しさん
18/09/21 20:12:28.34 +2gqfJ3dM.net
>>597
どうでもいいけど最初と大分キャラ変わってるぞw
613:デフォルトの名無しさん
18/09/21 20:17:41.28 nVnA1Sbpr.net
>>598-599
わかりました。
確かに型を見たら自明ですね。
結局は
> svd(m)をm.svd()って書きたいためだけ
だったのかも知れません。
なんせそういう書き方はいかにも「ぽい」ですから。
ありがとうございます。
614:デフォルトの名無しさん
18/09/21 20:19:42.40 KRvbJL35d.net
>>601
横レスになるかもだけど多相的に関数の集合を規定したいなら[C++ traits]で検索すると幸せになれるよ
今回は不要だと思うけど後々欲しいなって思ったとき役に立つ
615:はちみつ餃子
18/09/21 20:43:37.20 FzfC+eZt0.net
>>588
いや、風潮っていうのは確かにあるよ。
かつて上手くいかなかったから今もダメとは限らない。
テンプレートの活用が失敗っていうのは言語そのものとしてのサポートが不充分だったというのがあって、
それは >>602 がいうようにトレイトの活用の知見が蓄積してきたことで風向きが変わってきてる。
今はクソみたいな SFINAE と type_traits で不格好になんとかしてるのも
C++20 でコンセプトが入ったら C++ のパラダイムがそっちに一気に傾くと思う。
Rust や Go の隆盛でプロトコル指向への理解が深まっているというのもある。
616:デフォルトの名無しさん
18/09/21 21:06:19.19 nikK7GUa0.net
・・・・・俺が何を批判したかわかってないな
「ダサい」とか「風潮」じゃなくて、何故それが好ましいか、好ましくないか、
質問者のケースに合った説明をしろっつってんの
なんで当時の「テンプレートで継承の代用」の例を出したかわからんか?
代用にはなり得ないんだよ原理的に
実行時のポリモーフィズムをテンプレートで実現できるのか?
ユーザーの入力やファイルの内容に従って実行時に作るオブジェクトを変え、かつ
それを1つの型でまとめられるのか??
type erasure(boost::any含む)とかswitchとかif使う、とかは無しでな
自分の頭でその方法が合っているか合っていないか考えずに
流行とかに流された結果が、↑で挙げたソレなんだよ
C++潰したいのかよ
617:デフォルトの名無しさん
18/09/21 21:35:12.47 MaoTi4980.net
>>604
これも横からだが、C++はもう役割を終えて衰退機だと思う。
今から積極的にC++を採用する分野は限られていて、使えるor使おうと思うエンジニアの絶対数が減るってことは衰退と同義だと思う。
いろんな言語のエッセンスを学べるので悪い言語でないとは思うけど、誰かが言った通り習得のコストに見合ったメリットがない。
盛者必衰。
618:はちみつ餃子
18/09/21 21:55:31.46 FzfC+eZt0.net
>>604
> 何故それが好ましいか、好ましくないか、
> 質問者のケースに合った説明をしろっつってんの
それは >>587 の説明で足りないか?
風潮があって、その理由は不要な複雑さが出来るからだという説明で足りないか?
この説明は質問者のケースに合致してないか?
> 代用にはなり得ないんだよ原理的に
違う機能が違う能力を持つのは当たり前だろ? 説明するまでもなく。
どちらの機能を中心に活用した「設計」がよいのか�
619:チていう話じゃないか。
620:デフォルトの名無しさん
18/09/21 22:01:19.22 nikK7GUa0.net
>>606
ああすまん、確かに言葉尻に反応したところはあったな
でも「風潮」とか「ダサい」って蛇足だよな?w
ダサいって言いたかっただけやろ?
>違う機能が違う能力を持つのは当たり前だろ?
お前>>603で
>かつて上手くいかなかったから今もダメとは限らない。
>テンプレートの活用が失敗っていうのは言語そのものとしてのサポートが不充分だったというのがあって、
テンプレートを盲信してるようだから説明したんだが。
継承をテンプレートで代用せよ、ってのは間違ってない、って言いたかったんだろ?
>C++20 でコンセプトが入ったら C++ のパラダイムがそっちに一気に傾くと思う。
とか言ってる辺りからも、オブジェクト指向は過去のものだから継承も過去のものなんだぜ、とか
抜かしたかったのがわかる
マルチパラダイムの意味わかってる?
621:デフォルトの名無しさん
18/09/21 22:15:11.22 M9VunTBo0.net
継承をテンプレートで置き換えるって失敗したというよりもすでに当たり前になっただけでは
むしろそっちはそっちで発展してるし、動的でなくてもいいケースは確かに存在している
622:デフォルトの名無しさん
18/09/21 22:20:50.92 nikK7GUa0.net
>>608
静的に解決できるものならそうだろうな
そういうケースを否定はしてないが、当時はあちこちでそういう失敗例がドヤ顔で披露されてたんだぞ
禿も指摘してるようにJavaのせいだが
623:はちみつ餃子
18/09/21 22:46:33.24 FzfC+eZt0.net
>>607
> 継承をテンプレートで代用せよ、ってのは間違ってない、って言いたかったんだろ?
違うものは違う。 代用品ではない。
継承構造の代用品としてテンプレートを使えというのではなく、
テンプレートも前提のひとつとしたデザインにしろと言ってんの。
「なにもかもをメンバ関数にするな」というのは全て非メンバ関数にしろっていう意味じゃないだろ。
624:デフォルトの名無しさん
18/09/21 23:01:04.77 nikK7GUa0.net
>>610
>>603で
>かつて上手くいかなかったから今もダメとは限らない。
>テンプレートの活用が失敗っていうのは言語そのものとしてのサポートが不充分だったというのがあって、
>それは >>602 がいうようにトレイトの活用の知見が蓄積してきたことで風向きが変わってきてる。
って言ってるよな
「かつて上手くいかなかった」って、
俺の「かつてC++の継承は汚いからテンプレートで代用しろ、みたいな理屈があったが全くの空回りに終わった」
のことだろ?言い逃れしてんじゃねーよ
ちなみに継承をテンプレートで代用、を挙げたのは、それに初心者が惑わされたからだ
ただのテクニックの紹介ではなく「C++の継承は汚い」みたいな暴言を伴ってな
お前が「ダサい」とか「風潮」とか、自分がドヤりたいがために選ぶ言葉と同じだよ
>「なにもかもをメンバ関数にするな」というのは全て非メンバ関数にしろっていう意味じゃないだろ。
質問者の「関数追加」の方法についてはお前の意見に賛同してるだろうが
625:デフォルトの名無しさん
18/09/21 23:02:28.75 ZQgI79kj0.net
質問者を放置してドヤ顔で語るオタクたち
626:デフォルトの名無しさん
18/09/21 23:10:39.91 nikK7GUa0.net
あ、ついでに言うと
>言語そのものとしてのサポートが不充分だった
ねーよ
C++98~03でも十分メタプログラミング出来てたぞ(11から確かに幅は広がったが
STLしかりModern C++ Designの著者のLokiしかり
Boostだって当時からあったからな
627:デフォルトの名無しさん
18/09/21 23:26:46.84 wfTNvghC0.net
>>605
C++に挫折でもしたの? w
ネイティブコード吐けるオブジェクト指向言語ってそんなに選択肢ないし
628:デフォルトの名無しさん
18/09/21 23:30:11.36 wzHnJ4yt0.net
FixedC++であるRustに期待はしているが・・・。
629:はちみつ餃子
18/09/21 23:41:33.16 FzfC+eZt0.net
>>611
なんでその結論に納得できるのに前提に色々言ってんだ?
テンプレートについてはそっちが言い始めたことで、別の話題だろ?
代用という言葉の使い方がちょっとずれてるだけじゃないの。
そのまま置き換えれるかという意味では代用できないし、
継承でなんとかしてたデザインをテンプレートを活用したデザインに置き換えられる (こともある)
という意味では代用ともいえる。
言葉については、「ダサい」はともかく、「風潮」に何か問題あるか? それは全くわからんな。
デザインの風潮というものは間違いなくある。
630:はちみつ餃子
18/09/22 00:00:10.67 cynlNZMd0.net
>>613
無理無理。
今だってろくでもない回りくどい仕組みでどうにかこうにか
型の制約を表現できてるってだけだもの。
初心者にそれを元にデザインさせるのは無理。
型の制約についての知見とは別に C++ の言語機能が足りてない。
631:デフォルトの名無しさん
18/09/22 00:04:20.29 0je8S2eS0.net
>テンプレートについてはそっちが言い始めたことで
ダサいとかイケてるとか風潮とかで設計を語るからだよ
お前の説明はだいぶ甘い、自分でよくわかってないものを押し付けてないか?
そういう傾向を指摘されたって気づいてるだろ?
自分のコーディングの経験が足りてないゆえに、はっきり断言できないから風潮とか出てくるんだろ?
さっさと謝ってりゃここまで言ってないんだがな
>デザインの風潮というものは間違いなくある。
そう思ってんのはお前らアマチュアだけだから。(特にお前の思ってるようなデザインについては)
>>617
何の話してんの?コンセプト?w
なんで初心者がまだ導入されてないコンセプト前提の設計しなきゃならないの?馬鹿なの?
コンセプト入ったら実行時のポリモーフィズムをテンプレートで出来るの????wwwwww
632:デフォルトの名無しさん
18/09/22 00:11:49.56 vYximTvP0.net
最初はもてはやされたけど、みんな知ってる前提になったら特に触れられもしなくなった
風潮ってこいうのだろw
633:デフォルトの名無しさん
18/09/22 00:12:42.81 0je8S2eS0.net
すまんちょっと熱くなりすぎた
論破されたことに気付かないアホ(あるいは謝ったら死ぬ病)相手にするとキリが無いわ・・・・
もうやめとく
634:デフォルトの名無しさん
18/09/22 01:40:05.82 3xdfFsZb0.net
権限の委譲というと良いものを与えているイメージだが
UML用語の委譲はどうみても仕事の丸投げとかたらい回しな印象であるイメージ
な気がする
635:572
18/09/22 02:14:06.30 3xdfFsZb0.net
昨日のプログラムを改良したったwwwww
URLリンク(ideone.com)
データ数N=300のときCore i7-860 (2.8 GHz)で8秒かかる。idoneのやつでも5秒。
N=1000だと宇宙の終わりまでかかる予定。
これで漏れも低学歴知恵遅れに晴れて仲間入りDA☆NE!
636:デフォルトの名無しさん
18/09/22 03:45:26.27 57qyxfm80.net
URLリンク(ideone.com)
高速化する話なのか低速化する話なのかは分からんけど、素直に書いたらこんな感じかなぁとか。
終わった話題かもしれんけど。
どうしても高速化したいんやったら、関数を並列実行できるようにして、
URLリンク(cpprefjp.github.io)
上記の数で分割実行かなぁとか。
フューチャー投げるのはそんなに難しくないと思う。std::async使えば簡単だし。
637:デフォルトの名無しさん
18/09/22 03:54:48.35 57qyxfm80.net
気が付いたら、absがテンプレート関数じゃなくなってた。
638:デフォルトの名無しさん
18/09/22 07:17:07.67 ieaomBGwa.net
constexprな関数はコンパイル時でも実行時でも使えるが、定数になる文脈とならない文脈で関数を使い分けしたい。そういう使い分けは可能だろうか?
例えばsqrt関数はconstexprになっていないが、
アルゴリズム的には自作関数でconstexpr対応可能
ただし速度的にはcmathのsqrtの方が何倍も早いのでconstexprでない文脈の時にはcmathのsqrtを呼び出したいのです。
639:デフォルトの名無しさん
18/09/22 07:58:27.87 0je8S2eS0.net
is_constexprで検索したらそれっぽいアイデアは出てくるけど
640:デフォルトの名無しさん
18/09/22 09:39:59.40 qCwQCuMG0.net
>>625
ビルド過程を見直せば?
バカみたいに何でもかんでもconstexprに頼る理由はない。
641:はちみつ餃子
18/09/22 12:24:16.36 cynlNZMd0.net
>>618
なんで実行時ポリモーフィズムの話なんか出てるんだ?
出来ないもんをやれなんて言ってないだろ。
関係ない要素をどんどん出してくるなよ。
何を言いたいんだ?
642:デフォルトの名無しさん
18/09/22 13:05:08.82 PHVB0Lj2M.net
templateで躓いてるんですけど皆どうやってテンプレートを勉強したんですか?
643:デフォルトの名無しさん
18/09/22 13:06:49.63 sAfENX6G0.net
車輪の再発明
644:デフォルトの名無しさん
18/09/22 13:16:51.91 EBMrcrP1a.net
何を悩んでる?
645:デフォルトの名無しさん
18/09/22 13:22:32.93 PHVB0Lj2M.net
>>631
Boostのテンプレートを読んでるのですが、理解できない点です
646:デフォルトの名無しさん
18/09/22 13:36:27.52 a9vdXzW90.net
>>632
まずはstlは一通り不自由なく使えるかな?
647:デフォルトの名無しさん
18/09/22 13:45:08.87 PHVB0Lj2M.net
>>633
はい、STLに関してはそれなりに使えます
648:はちみつ餃子
18/09/22 13:53:36.62 cynlNZMd0.net
>>632
Boost はかなり技巧的で無理やりなこともやるので、
ある程度 C++ をわかっている人でもまともに読めないこともある。
普通に入門書とかを読むところから始めるしかないんじゃね?
649:デフォルトの名無しさん
18/09/22 15:05:35.09 JTph0UBg0.net
boost読んでテンプレート勉強しようとするのは、IOCCCでCを勉強しようとするのと同じくらい無謀
650:デフォルトの名無しさん
18/09/22 23:16:14.20 Img386zI0.net
test
651:デフォルトの名無しさん
18/09/22 23:16:57.30 02eserMU0.net
アホ
652:デフォルトの名無しさん
18/09/23 00:42:54.42 cRG95Xcq0.net
boostのインチキくさそうなソケット通信とか使ってるヤツいんの
普通にsocket通信の関数で書いたほうが可読性が高そうで困る
653:デフォルトの名無しさん
18/09/23 01:28:26.89 MC3A3QT40.net
SG4に標準化提案はされてるみたいね
654:はちみつ餃子
18/09/23 03:10:01.78 SNhvYMGK0.net
>>639
Boost のことはよう知らんけど、
Boost の他のライブラリと組み合わせやすいとか、
そういう利点はないの?
655:デフォルトの名無しさん
18/09/23 09:37:53.48 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:デフォルトの名無しさん
18/09/23 11:39:09.69 A6XCmyXs0.net
std::rel_ops空間に == から != を、< から <= > >= を合成するテンプレートならあるけど
657:デフォルトの名無しさん
18/09/23 12:14:54.07 loi8GnJQ0.net
これとかに載ってなかったっけ?
URLリンク(www.amazon.co.jp)
658:デフォルトの名無しさん
18/09/23 14:13:03.08 oyuLVtOs0.net
detection idiomで検出してSFINAEで分岐させるだけでできそうだけど
659:デフォルトの名無しさん
18/09/23 14:26:07.42 Dpz6ufMn0.net
barton nackman trickやな
operator ==が定義されているかどうかの分岐はSFINAEいるんでちょっと複雑になりそうだけど
private継承する基底を選ぶような形にできるはず
660:デフォルトの名無しさん
18/09/23 16:41:12.46 d60j7qb90.net
そんなことができるざんすか。
めんどくさそうですな。
661:デフォルトの名無しさん
18/09/23 16:42:46.60 oyuLVtOs0.net
if constexprつかえばSFINAEいらんな
普段使えない環境だから出てこなかった・・・
662:デフォルトの名無しさん
18/09/23 17:06:46.21 LgC14Oo10.net
スフィ姉たまんねぇ
ていうか>>643見てnamespace rel_opsの定義見て考えたがSFINAE要らなくね?
コンパイラの挙動(関数名の解決規則?)として、
Tについてoperator==(const T& a, const T& b)そのものズバリが定義されていればそれが使われるし、
無ければその次以降にテンプレートを探しに行こうとするから、
そのときstd::rel_ops名前空間が導入されていれば勝手にテンプレートバージョンが使われる
というしくみっぽい?
663:デフォルトの名無しさん
18/09/23 17:18:52.49 oc2N8BDIM.net
>>632
バリバリのテンプレート使いいませんか?
テンプレート難し
664:デフォルトの名無しさん
18/09/23 17:45:10.35 oyuLVtOs0.net
>>649
あーたしかに
試してみたらいけた
665:デフォルトの名無しさん
18/09/23 17:58:10.59 Dpz6ufMn0.net
>>648
if constexprほとんど使ったことなかったけど便利だなー
確かに型で分岐する必要なかった
URLリンク(wandbox.org)
>>649
その方法だと、>>642で言ってるような特殊な補完を他のクラスにも適用することにならん?
それでもいいならいいけど
666:デフォルトの名無しさん
18/09/23 19:13:07.53 3hdlUg1R0.net
>>650
わかんないなら質問すればいいじゃん
何がわからないから分からないと本とかのおススメもできないだろ
667:デフォルトの名無しさん
18/09/23 21:11:00.27 ygIHva++9
URLリンク(ideone.com)
なぜデストラクタが2回呼ばれるのか分かりません。
理由を教えてください。
668:デフォルトの名無しさん
18/09/23 21:04:04.43 LgC14Oo10.net
>>652
>その方法だと、>>642で言ってるような特殊な補完を他のクラスにも適用することにならん?
ならない。ならずに済ませられることができる
補完する演算子のテンプレートの導入範囲を名前空間で限定すればおk↓↓↓
URLリンク(ideone.com)
21行目のOP_EQ_FOO_ENを定義してもしなくてもビルドが通り、Foo::operator==()の呼び出し回数を除き同じ結果になる。
ただし、operator==()についてはちょっぴり闇が深いことがわかった。
名前空間std::rel_opsにはoperator==()テンプレートが存在しない
上のサンプルではstd::rel_ops名前空間に無理矢理operator==()テンプレートを追加したが、
実際にやるときは独自の名前空間でoperator<()以外の全部(==、!=、>、<=、>=)を用意しておくことになるん
ジャマイカ
669:デフォルトの名無しさん
18/09/23 21:30:04.73 Dpz6ufMn0.net
あーすまん、目的を誤解してた
クラスのoperator ==の実装を省きたいんじゃなくて使う側で補完できればいいのか
670:デフォルトの名無しさん
18/09/24 00:24:52.05 rSek34EXa.net
5年くらい前?にテンプレートプログラミングっぽい趣旨の本があったし、基本情報に何故かPrologと同じジャンルにテンプレートが言語として載ってる辺り論理型言語っぽい事ができるみたいだが、基本C++の1機能でしか無いから、知ってる人は少ないんじゃ無い?
俺も知らない。
671:デフォルトの名無しさん
18/09/24 00:56:28.11 cIWp1XlU0.net
C++テンプレートテクニック 第2版、
επιστημη(えぴすてーめー)・高橋 晶、2014
C++ 標準化委員のεπιστημη の本だろ。
ドワンゴ江添亮も、需要があれば、こういう本を書きたいって言ってたけど
672:デフォルトの名無しさん
18/09/24 01:06:54.52 rSek34EXa.net
それそれ。
出来るっぽいってのは知ってても、実際できてる奴少ないと思われ。
673:デフォルトの名無しさん
18/09/24 01:14:19.28 Kxio7RVg0.net
テンプレート使うのに
いちいちそんな悩むもんなんか
なにかを参考にしたいようだが
たとえばtraits乱用してるようなのは読む必要も
674:ないし 逆にマネする必要がないわ
675:デフォルトの名無しさん
18/09/24 01:21:07.01 rSek34EXa.net
俺も気にした事ないけど、気になる奴は気になるんだろう。
俺の場合は整数型をどうやって文字列型にしてるんだ?ってのが疑問でむしろアセンブラに走って頭捻って理解した。
まあ人間そんなもん。
676:デフォルトの名無しさん
18/09/24 01:37:53.34 orHhPIQU0.net
テンプレートはC++の必須教養だと思ってるけど、別になくても困らないしな・・・
677:デフォルトの名無しさん
18/09/24 01:47:51.69 sBjtzBeV0.net
>>662
つ vc++ 1.x
こいつのテンプレートは泣ける
678:デフォルトの名無しさん
18/09/24 01:54:17.59 XuY/8j5Q0.net
>>657->>662
同感
はちみつと言い争ったときに
>>デザインの風潮というものは間違いなくある。
>そう思ってんのはお前らアマチュアだけだから。(特にお前の思ってるようなデザインについては)
とか書いたけど
実践ではなく仕様メインで覚えてる人(趣味でC++の知識を集めるのがメインの人であり、アマチュア)は
「これからの時代はテンプレート使った総称的プログラミングが主流」
みたいなパラダイムの変化を訴えてるけど、それはっきり言って素人が見れるコードでだけだから・・・
(C++標準ライブラリやBoost等)
テンプレート使ってとことん汎用性を高めたライブラリなんか、普通のソフト開発の現場では使われんわ
あまりにも時間がかかりすぎる
そういうごくごく一部の偏ったソースしか読んだことないから誤解するんだろう
で、その誤解した趣味グラマのネット上の言説やライターが書いた本を読んで、
初心者がC++に挫折して去っていくという・・・・・
C++なんか最初はベターCでいいんだよはっきり言って
あと最近ネット見てて(C++の)オブジェクト指向とかC時代の古いノウハウの解説が少ないのは、
単にとっくに出尽くしたからだからな、最近始めたやつは誤解したらだめよ
679:デフォルトの名無しさん
18/09/24 02:00:05.34 XuY/8j5Q0.net
訂正
Xテンプレート使ってとことん汎用性を高めたライブラリなんか
○テンプレート使ってとことん汎用性を高める開発手法なんか
680:はちみつ餃子
18/09/24 02:14:19.64 tUW1+gfS0.net
>>664
「何もかもを継承構造で解決しようとするな」の
ひとつとしてテンプレート (を C++ なら利用することになるプロトコル指向的デザイン) が出たんだし、
C++ にコンセプトの概念を持ち込もうとする機運があるほどには活用比率も高まるだろう、という程度の主張なのに、
「とことん汎用性を持たせるべき」とか「主流になる」みたいな拡大解釈はやめてくれよ。
俺はそんなこと主張してないからね!
681:デフォルトの名無しさん
18/09/24 02:32:05.77 XuY/8j5Q0.net
>>666
しつこいぞ
>テンプレートの活用が失敗っていうのは言語そのものとしてのサポートが不充分だったというのがあって
「おかしな流行が発生して初心者を惑わした」、に対して反論したんだろ?嘘つくなよ
>俺はそんなこと主張してないからね!
主流になる、って意味だろ?これ↓
>C++20 でコンセプトが入ったら C++ のパラダイムがそっちに一気に傾くと思う。
ちなみに
>コンセプトの概念を持ち込もうとする機運
コンセプトは標準化委員会や禿が言い出したことだぞ
導入されたら素晴らしいとは思うが、元々はテンプレートを使ったコードのエラーメッセージをどうにかすることと
テンプレートパラメータで満たすべき要件をコメントではなくコードで示せるようにすることだ
プロトコル指向は聞いたことないが、それはコンセプトで可能になるおまけ程度だろ
しかもそれを利用するにはテンプレート必須なわけで、コンセプトが入ろうが、
クラスなどが実際どういう仕組みなのか程度のことは把握してないと、初心者が手を出せるようなものではないし
出させるべきでもない
682:はちみつ餃子
18/09/24 02:45:26.39 tUW1+gfS0.net
>>667
変な (教え方なり使い方なりが下手くそな) 流行があったということを以て
テンプレートの活用を全否定するような言い分に反論したんだよ。
テンプレートが無くて良いと思ってるわけじゃないんだろ?
> 主流になる、って意味だろ?
今までが継承構造に頼りすぎだったのが是正されるという意味だ。
初心者への教え方については、また別の話。
ベターCからで良いという意味のことは D&E にも書かれてる基礎理念だから
そこは疑ってない。
683:デフォルトの名無しさん
18/09/24 02:59:37.96 XuY/8j5Q0.net
>テンプレートの活用を全否定するような言い分に反論したんだよ。
>>587と>>588を100回読み直せボケが
悪いけど、お前まともにメタプログラミングやってないだろ?
まともに活用して利点・欠点をはっきりわかってないやつが何偉そうに語ってんの?
しかもその理由で反論したんなら、なおさらポリモーフィズムの話で論破されただろ、
なんで認めずに自分の主張の意味を途中から変えてまで言い返してんの?
図星突かれて気分が悪いってか?
>今までが継承構造に頼りすぎだったのが是正される
誰が頼りすぎてたの??今までっていつまで?
>初心者への教え方については、また別の話
今まで何度も「こいつ初心者にテンプレート勧めてるよ・・・・何考えてんだ」と思ってたんですが
どの口で言ってんだ
684:はちみつ餃子
18/09/24 03:17:34.86 tUW1+gfS0.net
>>669
ポリモーフィズムの話ってなんだ?
初心者へじゃなくて、
君に、テンプレートの話はしてたつもりだが。
(ID 変わってるから他の人だったらスマソ)
他の人にアンカーを付けてテンプレートの話はしてないだろう。
685:はちみつ餃子
18/09/24 03:38:10.37 tUW1+gfS0.net
>>669
> 誰が頼りすぎてたの??
標準ライブラリすら。
その他はまあ、私の実感なので、違うというなら違うのかもしれない。
686:はちみつ餃子
18/09/24 03:48:16.31 tUW1+gfS0.net
「美味しんぼには我慢ならん」
「おい、辛抱しろ」
687:はちみつ餃子
18/09/24 03:48:58.75 tUW1+gfS0.net
誤爆した。 ごめん。
688:デフォルトの名無しさん
18/09/24 09:51:46.55 dKKNaNpJ0.net
本当にテンプレートが必要なものってだいたいSTLに揃ってる印象。
あとはTBBみたいにある程度低いレイヤーの抽象化ではどうしても必要にはなる。
しかしこの種類のライブラリってのは本当に信用できる奴が作ったもの以外は
使いたくねーんだわ。
めちゃくちゃデバッグコスト高いからね。
そういう意味で一般プログラマーが実装するってのは実践的ではない。
689:デフォルトの名無しさん
18/09/24 10:18:16.36 cpSL59m30.net
テンプレートは型の定義をすり替えるために使うもの
#ifdefで型切り替える方がもっと糞だからそこはテンプレートにするべき
それ以上の凝った事はしないほうがいいね
690:デフォルトの名無しさん
18/09/24 11:22:17.38 GIs1tf8Y0.net
頼りすぎつーか逆だと思うぜ
コンテナの要件なんかインターフェイスにすればすっきりするのに
紙マニュアル(pdf含む)でガタガタ書かれた口約束とかすげーイヤ
歴史的に見てもそれをやるのに充分な言語機能がもうあったのに
691:はちみつ餃子
18/09/24 11:36:08.69 tUW1+gfS0.net
>>676
現状の C++ では型の制約を表すには意味不明な SFINAE で回りくどくやってて
初心者には使いこなせない (中級者でも不安があったり面倒だったりする)
という話の文脈だから、言語機能が充分だというのはちょっと変な立場だ。
692:デフォルトの名無しさん
18/09/24 11:43:09.69 IXp/Ejzw0.net
どうーがんばっても停止性問題は機械的に解けないケースを無くせないのだから
プログラミング自体をアルゴリズム化する企てはどこかで行き詰る
藻前らは行き詰まりかたの良し悪しを議論しているにすぎないのだガハハハハハハ
693:はちみつ餃子
18/09/24 11:47:19.43 tUW1+gfS0.net
>>676-677
ひょっとして抽象クラスでやったらいいという話だろうか。
Java とかから来た人はそういうことをやりがちだけど、 C++ の設計理念からすると、
少なくとも標準ライブラリでは仮想関数テーブルを辿る実行コストを許容はしないだろうと思う。
694:デフォルトの名無しさん
18/09/24 12:24:10.58 GIs1tf8Y0.net
>>679
動的結合のコストは関数ポインタなみにはっきりしてるだろ
695:デフォルトの名無しさん
18/09/24 12:28:24.97 cpSL59m30.net
インターフェース(=データメンバーなし抽象クラス)は静的な型の制約を表現できないからダメ
696:デフォルトの名無しさん
18/09/24 12:58:55.73 XuY/8j5Q0.net
>>679
>C++ の設計理念からすると、
>少なくとも標準ライブラリでは仮想関数テーブルを辿る実行コストを許容はしないだろうと思う
滅茶苦茶言うな
URLリンク(cpplover.blogspot.com)
>>674
ついでに開発コストも高い
STLが優れてるのは、作者が長年コンテナについて熟考に熟考を重ねたライブラリだからであって
それを実現するためにテンプレートが使われたに過ぎない
テンプレート使ってりゃなんでも有用なライブラリになると勘違いしてるアホが増えた
697:デフォルトの名無しさん
18/09/24 13:04:35.46 B4Me2M7J0.net
テンプレートは即席麺的な発想でライブラリのような寝かして熟成させるワイン的な使い方には向いていない
698:デフォルトの名無しさん
18/09/24 13:10:53.22 IXp/Ejzw0.net
インターフェースはあらゆるメソッドを最初から詰め込まねばならないからイヤソ(特に単一継承の場合
お禿様も自著でそういう傾向(あらゆるメソッドが基底クラスに集中する傾向があることをこっそりカミングアウトしていたはず
テンプレートにはそういう制約がない
型引数Tにadd()メソッドがあるものとしてテンプレートを書いたら、add()メソッドがある既存クラス全部にそのテンプレートが使える
というわけで、インターフェースはそれ自体静的な型の制約のつもりなのかもしれんが、
真にかけたい制約(上の例でいうとadd()メソッドの存在だけを問題にしたいケース)に対して不必要に過剰になることが多いキモス
あとインターフェースだとコンテナの実現は具体的にはどうするんじゃ…
仮想関数テーブル参照の実行時コストだけでも許容し難いのに、間接参照がさらに必要になるんじゃ…
699:デフォルトの名無しさん
18/09/24 13:22:48.05 GIs1tf8Y0.net
インターフェイスを単一継承前提で考えるって、どんな教育を受けるとそうなるのかな
numeric_limits<uintmax_t>::max()歩譲って単一継承ってことにしても
最初から全部詰め込みなんてハメにはあまりならないし
あらゆるメソッドが基底クラスに集中するなんて事例あるか?
俺は空想論だと断言するぞ
Smalltalkのobjectみたいなクラスに何が置けるんだよ
あと、なんか仮想テーブルのコストが云々いってるやつが複数いるようだが
具体的にどのくらいか、せめてオーダーくらいわかっているのか
700:デフォルトの名無しさん
18/09/24 13:35:23.36 cpSL59m30.net
オーダーの問題じゃなくて、C++にはゼロオーバーヘッドの原則があるんだから
ゼロオーバーヘッドに出来るものはゼロオーバーヘッドにするんだよ、標準はその手本なんだから
それにオーダーなんか処理内容でなんぼでも変わるだろ
せいぜい数十万要素のコンテナしか使わないプログラムだから仮想テーブルなんかどうでもいいと主張する奴の言うことは正しいかもしれないが
数兆個の要素を扱う人にはそんなもの慰めにならん
701:デフォルトの名無しさん
18/09/24 13:56:47.91 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:デフォルトの名無しさん
18/09/24 14:02:13.87 IXp/Ejzw0.net
ていうか最後の2行で筆が滑ったorz
テンプレートで「加減算ができるクラス」という制約をかけるにはインターフェースA、Bもそもそも要らん
スゲー便利
703:デフォルトの名無しさん
18/09/24 14:25:40.72 yuMzZsdXa.net
templateはダックタイピングだとおもう
704:はちみつ餃子
18/09/24 15:09:08.71 tUW1+gfS0.net
どう説明したもんかと思ったけど、 >>684 の説明が分かりやすいな。
(Java でいうところの) インターフェイスは型の性質を事前に網羅しなきゃ
全体のデザインが定まらない。
関数が要求する性質 (インターフェイス) が増えた時に元の定義をいじるか、
mixin のような形で継承関係を作ることになる。
ちょっと機能を増やすだけでいらん継承関係を作るのは良くないという話の延長線上で
考えればインターフェイスを使ったところであまり解決にならない。
型制約 (コンセプト) は関数の側に付加するものなので、後付けが簡単だ。
結果的に型の側はその性質を持たなきゃならないことにはかわりないが、
性質を追加するのに元のクラス定義を弄らなくて済む。
-----------
最初の設計がキッチリしてたら、
クラス指向的なスタイルの方が混乱が少なくて良いかもしれないなと思い始めてきた。
でも、現実にはそうではない後付けだらけじゃん? とも思ってるわけ。
705:デフォルトの名無しさん
18/09/24 15:15:20.89 GIs1tf8Y0.net
>>687
型に対する性的制約って何?
それと事例あるか?と聞いている質問に何で長文がいるんだよ
具体的なライブラリとクラス名を挙げるだけだろうが
なるべく知名度の高い事例ほど説得力があるぞ
706:デフォルトの名無しさん
18/09/24 15:32:49.32 XuY/8j5Q0.net
>>690
コンセプトを盲信しすぎだろ
あくまで要件をコードで示せるだけだっての
それこそSTLには必ず導入されるべきものだけど、そのSTLでの不満、
つまりInputIteratorだのなんだのの要件をいちいちリファレンス参照しないとわからなかった(>>676)から
必要とされたわけで
はちみつとかは多分STLべったりで、それ以外のライブラリを読んだり
まともにソフト書いたことないから、STLがほとんど出てこない状況ってのを経験してないんだろ
>ちょっと機能を増やすだけでいらん継承関係を作るのは良くないという話の延長線上で考えれば
話を広げすぎ。
型の制約という意味でいえば、現状コンセプトを待つしかないが
多分>>685が言ってるのは、Modern C++ Designで言うところのポリシークラスみたいな話じゃね?(違うかもしれんけど
この場合はあくまで要件定義なので当てはまらないと思うけど、
>いらん継承関係を作るのは良くない
これは暴言。Andrei Alexandrescuに言ってくれば?
ポリシークラスのような、継承によって機能を取り込む設計も非常に便利だし、それこそSTLでもあちこちで使われてるんだがww
あと後半チラ裏にも程がある。何様だよ
707:デフォルトの名無しさん
18/09/24 15:33:05.07 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:デフォルトの名無しさん
18/09/24 15:39:44.60 GIs1tf8Y0.net
へーえ、vector<int>とvector<string>が掛け算できないという制約が
pure virtualを使った途端に無法状態になってしまうのか
709:デフォルトの名無しさん
18/09/24 16:03:46.76 cpSL59m30.net
じゃあ練習問題だ
IntVector::begin()の戻り値はIntIteratorで、IntIterator::value()はintを返す
StringVector::begin()はStringIteratorで、StringIterator::value()はstringを返す
そういう制約を表現するインターフェースIVectorを具体的に書いてみよう!
出来やしないのは手を動かせばすぐわかる
710:デフォルトの名無しさん
18/09/24 16:06:21.46 cpSL59m30.net
ああこれだけだと出来ちゃうか
end()もあってbegin()と同じ型のイテレーターを返すっていう制約も付けてちょうだい
711:デフォルトの名無しさん
18/09/24 16:08:34.73 GIs1tf8Y0.net
#define interface struct
template <typename T>
interface IVector
{
class iterator;
virtual iterator begin() const = 0;
};
712:はちみつ餃子
18/09/24 16:14:35.10 tUW1+gfS0.net
>>692
ポリシークラスは注入 (?) すべきポリシーをパラメタ化してるだけで、
何をパラメタにするかというデザインがきちんとしてれば有用だし、
いらん継承だとは思わないよ。
でも、現実には後になってそれがわかることもあるよねっていう話。
713:デフォルトの名無しさん
18/09/24 16:24:48.03 cpSL59m30.net
>>697
テンプレート使ってんじゃねえよ雑魚
714:デフォルトの名無しさん
18/09/24 16:34:08.72 GIs1tf8Y0.net
>>699
は? 後出しで言い訳してんじゃねえよ蛸助
インターフェイスがテンプレートになってる実例をまさか知らんのか?w
715:デフォルトの名無しさん
18/09/24 16:37:21.35 cpSL59m30.net
お前の主張通り継承で全部やれよ
そういう所が雑魚なんだよw
716:デフォルトの名無しさん
18/09/24 16:38:54.75 GIs1tf8Y0.net
捨て台詞吐いて逃亡かw
追わねえよくっだらねえ
717:デフォルトの名無しさん
18/09/24 16:41:06.83 cpSL59m30.net
そっくりそのままお返ししますわw
テンプレートと継承の出来ることと出来ないことの区別がつくまで二度と下らない妄言吐くなよ
718:デフォルトの名無しさん
18/09/24 17:18:02.91 XuY/8j5Q0.net
>>698
>現実には後になってそれがわかることも
それは
>何をパラメタにするかというデザインがきちんとしてれば
が後で変更になることもある、ってことだろうけど
そこまでの変更があったら、結局元の定義に手を出さなきゃいけないのは
どんな設計でも同じことだと思うけどなぁ
>性質を追加するのに元のクラス定義を弄らなくて済む
と言ってたが、それは結局関数とかでクラスの要件を必要以上に大きくしないように
例えばallocator_traitsみたいに、色々手間をかけて、利用するクラスへの依存を減らすのと同じじゃね?
俺にはそういうイメージしか沸かないんだが
コンセプトマップってそういうことだろ
結局テンプレートであれこれ書くことになるか、コンセプトマップであれこれ書くことになるか、ってだけ
(=開発コストは高い)
std::vectorだって、例えばアロケータは初期化時に渡さないといけないし
コピーとかしたときにアロケータはコピーしてくれなかったと思うが
それが不便だという声もある(ここでたまに取り上げられるEASTLの開発動機で触れられてる
あと、アロケータは型に依存するけど、メモリ確保なんてのはそもそも型は関係ないので
アロケータのあの設計は失敗かもね、というのもある(同じくEASTLでも触れられてる
それに対する代替案として、上で挙げたstd::pmr::memory_resourceが出てきたわけだけど、
今更STLの基本設計は変えられないのでpolymorphic_allocatorでラップするということになった
もしvectorがポリシークラスを受け取って、アロケータやメモリ管理についてもっと汎用化してたら
こういう問題は起きなかった(クッソ複雑になってるだろうけど)
これコンセプトでどうにかなるか?後になってわかってもどうにもならんよ
719:デフォルトの名無しさん
18/09/24 17:46:45.01 yIbiTIWcr.net
ヒープ領域にインスタンスを作りたいときってどうしてもポインタを意識しないとダメなの?
MyClass abc;
みたいに宣言したいんだが。
MyClass* abc;
abc = new MyClass;
みたいにするしか方法ないの?
ヒープに作りたい理由は、巨大なオブジェクトだから。
ちなみにスマートポインタは使えない (icpc 12.0.4)。
720:デフォルトの名無しさん
18/09/24 17:53:54.47 CvpxIDb80.net
コンパイラに指示できるか、という意味ではないよ
そんなのあったも紛らわしいだけだと思うけど
721:デフォルトの名無しさん
18/09/24 18:26:32.41 sIOpRstjM.net
>>705
MyClass& abc = *new MyClass;
でいけるかも知らんけど十中八九delete忘れるし後から見て分かりにくいだけだから俺ならやらない
722:デフォルトの名無しさん
18/09/24 18:31:59.03 cpSL59m30.net
struct MyClassHolder
{
MyClass* p;
MyClassHolder(): p(new MyClass()){}
~ MyClassHolder(){delete p;}
};
とか作っとけばいいんじゃない
自分でスマポ書いてるのと同じだけど
723:デフォルトの名無しさん
18/09/24 18:47:38.62 yIbiTIWcr.net
>>708
ありがとうございます。
参考にします。
ちなみにポインタをどうこうしたくない理由は、これまで MyClass のインスタンスを参照渡しするように作っていた関数を、できるだけ変更したくないからです。
参照渡しをポインタ渡しに変えて、関数内に適宜アスタリスクを挿入するだけですか? 考えるのもしんどいです。
724:はちみつ餃子
18/09/24 18:55:55.79 tUW1+gfS0.net
>>704
> 色々手間をかけて、利用するクラスへの依存を減らすのと同じじゃね?
その通りだよ。
プロトコル指向でいうプロトコルは C++ で言うならまさにトレイツに相当すると思う。
(C++ では実装を直接的に強制する方法ではないけど。)
継承構造ではなく性質でジェネリック関数を使うってだけ。
継承で表すよりも性質で表現する方がたぶん記述は細分化されることになるので、
それが手間かもしれないし、
関連するものがとっちらかる感じはあると思う。
だけど「こういう型」というよりは「こういう性質」という方がプログラムが分かりやすくない?
既に述べたように拡張が楽というのもある。
ただ、プロトコル指向的デザインでは機能を追加することは出来ても
既に問題が生じているものをスパッと綺麗に解決できるわけではないので、
いつでも元の定義を弄らずに済むほど万能とはさすがに言わないよ。
vector なんてそれこそ達人たちが検証してるだろうから、
私が思いつくようなことが入り込む余地は無いだろうし。
そこらへんは程度問題なので、積極的に (あるいは消極的に)
(テンプレートを用いた) プロトコル指向的デザインを
使うのが割に合わないという場面もそれなりに多くあると思う。
繰返すけど、そこまで万能と思ってるわけじゃない。
725:
18/09/24 19:02:18.61 63DR0NZS0.net
>>705
static 宣言する、というのはありな状況ですか?
static MyClass abc;
726:デフォルトの名無しさん
18/09/24 19:02:38.38 XuY/8j5Q0.net
こいつ金慶珠みたいなやっちゃな・・・・マジめんどくさい
727:デフォルトの名無しさん
18/09/24 19:04:43.22 XuY/8j5Q0.net
>>712は>>710宛
>>709
関数の方を変えなくても、渡すとこで
auto a = hoge(*pMyClass);
でいんじゃね?
それも大変なら>>708みたいにラップするしかないけど
728:デフォルトの名無しさん
18/09/24 19:14:36.90 yIbiTIWcr.net
>>711
オブジェクトのサイズが動的に変わるので、難しいです(合ってるかな?)
>>713
> 関数の方を変えなくても、渡すとこで
> auto a = hoge(*pMyClass);
> でいんじゃね?
> それも大変なら>>708みたいにラップするしかないけど
void hoge(MyClass abc);
なる関数 hoge() に、
MyClass* pabc;
pabc = new MyClass;
hoge(*pabc);
とする、ということですよね?
この方法では、関数呼び出し時にコピーコンストラクタが呼ばれますか?
それとも参照渡しのように、実体(?)が渡されるのでしょうか。