1 名前:デフォルトの名無しさん mailto:sage [2017/10/10(火) 00:11:34.01 ID:nc/5PI4P0.net] 次スレを立てる時は本文の1行目に以下を追加して下さい !extend:on:vvvvv:1000:512 C++に関する質問やら話題やらはこちらへどうぞ。 ただし質問の前にはFAQに一通り目を通してください。 IDE (VC++など)などの使い方の質問はその開発環境のスレにお願いします。 前スレ C++相談室 part131 mevius.2ch.net/test/read.cgi/tech/1501295308/ このスレもよろしくね。 【初心者歓迎】C/C++室 Ver.101【環境依存OK】 mevius.2ch.net/test/read.cgi/tech/1500329247/ ■長いソースを貼るときはここへ。■ 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
883 名前: mailto:sage [2017/11/20(月) 00:14:41.52 ID:Y8ntE/6M0.net] いきなりレベルの低い話で割り込んで恐縮です。 よろしくお願いいたします。 久々にJava から C++ に移行して、簡単なイテレータパターンを実装しました。 Java で書いた https://ideone.com/DJ9pI5 を元に C++ で書いてみたのがこれです。 https://ideone.com/FwNlc4 ここで、コンテナにあたる Aggregateクラス(具象クラスは BookShelf) の中に イテレータ(Iterator:具象クラスは BookShelfIterator) を作成して返すメンバ関数 iterator() を定義していますが、 C++ だからデストラクタも定義しないとね、と考えて 当初、Aggregate クラスに仮想メンバ関数 delete_iterator() を書いて Aggregate::iterator() と Aggregate::delete_iterator() を対にするように作っておりました。 しかし教科書をみると Aggregate::delete_iterator() みたいなデストラクタはそもそも定義しないようで、 普通に Iterator *it = BookShelf(具象クラス)->iterator(); delete it; でなんの問題もないようです。 なぜ、これで問題がないのかトンと見当がつきません。 イテレータを作った具象クラスの中でデストラクタを定義する、というのならば分かりやすいのですが、 抽象クラスのポインタをキャストもせずに直接 delete できるのは、どういうからくりになっているのでしょうか? よろしくお願いいたします。
884 名前:デフォルトの名無しさん mailto:sage [2017/11/20(月) 00:34:03.39 ID:uuALJ8Da0.net] >>863 > 上記を覆したければ、alias無しで different type alias の最適化がかかっている例を持って来い。 これでいいかな。 https://wandbox.org/permlink/RNDO0CIl9UpsaRwQ
885 名前:デフォルトの名無しさん mailto:sage [2017/11/20(月) 00:41:55.57 ID:uuALJ8Da0.net] >>863 ごめんまちがえた。 >869 じゃわかんないね。 https://wandbox.org/permlink/vuQgmlWOUcxhu5jW
886 名前:デフォルトの名無しさん mailto:sage [2017/11/20(月) 00:53:02.54 ID:H8zFncfx0.net] >>869 せこいわw gcc7.2.0(そこの最新版)で%eにしたら見えるがな。 まあ努力はご苦労様。 とはいえ、gcc4.4.7ならこのコードでも顕在化するし、「aliasが要る」という要件が怪しいのは認める。 この最適化はまだ発展途上のようだね。
887 名前:デフォルトの名無しさん mailto:sage [2017/11/20(月) 01:07:57.23 ID:H8zFncfx0.net] >>870 おっとすまん、輻輳してしまったが、869で問題なく分かったぞ。 そして両方とも、gcc7.2.0にするか、globalにすると直る。 したがって、 different type alias で問題が発生するのには 「aliasが要る」という俺の見解は間違いだ。 ただ、過度の最適化による不具合を防ぐ努力は行われており、 gcc4..4.7→gcc7.2.0でこのコードに関しては修正されてる。 とはいえgcc7.2.0でもどこまで動くか分かった物ではないね。
888 名前:デフォルトの名無しさん mailto:sage [2017/11/20(月) 01:11:14.23 ID:uuALJ8Da0.net] >>872 さぁ、お前の罪を数えろ。
889 名前:デフォルトの名無しさん [2017/11/20(月) 01:32:56.30 ID:Veq8ZMOx0.net] 何で素直に謝罪できないんだろうね。
890 名前:はちみつ餃子 mailto:sage [2017/11/20(月) 01:42:11.88 ID:mEO8F9pQ0.net] >>868 それが virtual の効果だとしか。 基底で virtual 宣言したメンバ関数群はそのポインタをまとめたテーブルが作られ、オブジェクトはそのテーブルを指すポインタを持つ。 派生のオブジェクトは派生側の関数群を指すポインタテーブルへのポインタを持つ。 だから virtual を使うと「変数の型ではなくオブジェクトが呼出すべきメンバ関数を知っている」という状況を作れるんだよ。 ただ、基底のデストラクタを virtual に指定しないときでも見かけ上は型システムをパスしてしまいコンパイルエラーにならない場合がある。 これは未定義だからやっちゃダメだよ。
891 名前:はちみつ餃子 mailto:sage [2017/11/20(月) 01:59:59.63 ID:mEO8F9pQ0.net] >>868 ,875 Wikipedia にも解説があるやないけ https://ja.wikipedia.org/wiki/%E4%BB%AE%E6%83%B3%E9%96%A2%E6%95%B0%E3%83%86%E3%83%BC%E3%83%96%E3%83%AB
892 名前: mailto:sage [2017/11/20(月) 02:35:52.58 ID:Y8ntE/6M0.net] >>875-876 うーん、普通のポリモフィズムの話が同様に適用できるんですね… Base<-Derived1 Base<-Derived2 の基底・派生関係のとき Base *p = new Derived1() ならば、delete p; は delete (Derived1 *)p; Base *p = new Derived2() ならば、delete p; は delete (Derived2 *)p; となる、と考えていいでしょうか。 Base *p = new Derived1() ならば、p->method(); は p->method_Dirived1(); Base *p = new Derived2() ならば、p->method(); は p->method_Dirived2(); という話と同じなんですね。 んーなせ Aggregate::delete_iterator() を作らなくちゃ、と考えたのか逆にわからなくなってしまいました… ありがとうございました。
893 名前: mailto:sage [2017/11/20(月) 02:59:04.07 ID:Y8ntE/6M0.net] 次に >>868 のテンプレート版を書いてみました。 https://ideone.com/LO68r5 void * (Java の Object)をキャストするのを嫌ったという理由になります。 >>868 >class Iterator >virtual void *next() = 0; >class BookShelfIterator : public Iterator { }; >void *BookShelfIterator::next() >Book *book = (Book *)it->next(); https://ideone.com/LO68r5 そこで不思議に思ったことなんですが、 コンストラクタは template <typename T> class Derived : Base { public: Derived(){}; }; とテンプレート引数 T をコンストラクタ名をつけなくていい(public: Derived<T>(){}; としない)のに、 デストラクタは template <typename T> class Derived : Base { public: ~Derived<T>(){}; }; (クラスのメンバ関数宣言) template <typename T> Derived<T>::~Derived<T>() { } (クラスのメンバ関数定義) とテンプレート引数 T をデストラクタ名につけないといけないのでしょうか?何か分かりやすい理由はありますでしょうか?
894 名前:はちみつ餃子 mailto:sage [2017/11/20(月) 03:03:42.40 ID:mEO8F9pQ0.net] >>877 キャストとは意味が違うんだよ。 上でさんざん議論してる static type と dynamic type の話とも関係あるのかなぁ? 入り組んでてよくわからん。 型はあくまでも Base* で、仮想関数テーブルを辿って必要な関数を呼び出すってだけだ。 繰返すけど、 Base のデストラクタに virtual がついてないときに Base のポインタに対して delete すると Base のデストラクタが呼び出されるだけになってまうので気をつけてな。 派生クラスのデストラクタが空っぽのときでもデストラクタが呼び出される必要はあるらしいぞ。
895 名前: mailto:sage [2017/11/20(月) 03:12:59.68 ID:Y8ntE/6M0.net] >>878 の続きです。 同じく、テンプレート版 https://ideone.com/LO68r5 にて一点不満におもったことがあります。 >>878 では基底クラスの記述について、 template <typename T> class Iterator { public: virtual T *next() = 0; }; 派生クラスは template <typename T> class XXXIterator : Iterato<T> { public: T *next(); }; template <typename T> T *XXXIterator::next() { ... } と書きました。 しかし本当は、基底クラスを純粋に一個にしたいと希望しているのです。 つまり基底クラスにテンプレート引数Tを書きたくない。 class Iterator { public: virtual ○○○ *next() = 0; }; と基底クラスを一つだけにしぼりつつ、 派生クラスにテンプレート引数を使用して記述することは可能でしょうか?○○○に書けるなにかいい記述はないでしょうか? テンプレート引数を使用した具象クラスに対応する、テンプレート引数を使用しない抽象クラスを書くことは可能でしょうか?
896 名前:はちみつ餃子 mailto:sage [2017/11/20(月) 03:15:21.39 ID:mEO8F9pQ0.net] >>878 付けなくてもいいし、付けても通るってのは私は今初めて知った。
897 名前:はちみつ餃子 mailto:sage [2017/11/20(月) 03:23:45.23 ID:mEO8F9pQ0.net] >>880 強引なキャストで出来る可能性はあるかもしれないけど、 常識的な方法では出来ないと思う。 ただ、そもそもそういう継承関係を作る必要は無いんじゃないか。
898 名前: mailto:sage [2017/11/20(月) 03:26:59.22 ID:Y8ntE/6M0.net] >>879 ありがとうございます。 meyers の effective C++ 第7章を読み返しています C++ には Java の fainal がないので、うっかり、std::string や std::vector を派生させてしまうところでした、危ないなあ…
899 名前:デフォルトの名無しさん mailto:sage [2017/11/20(月) 03:30:13.52 ID:iECo0Ul80.net] >>868 混乱するならシンプルに設計したら?例えばこんな感じ?登録して表示するだけなら簡単でしょ? #include <stdio.h> #include <string> #include <vector> class Book{ public: std::string name; Book(std::string _name) :
900 名前: name(_name){} void show(){printf("%s\n",name.c_str());} }; class Books{ public: std::vector<Book *>m_list; Books(){} ~Books(){for (auto p : m_list) if (p) delete p;} void addBook(Book *p){m_list.push_back(p);} }; int main(){ Books books; books.addBook(new Book("aa"));books.addBook(new Book("bb")); books.addBook(new Book("cc"));books.addBook(new Book("dd")); for (auto p : books.m_list) p->show(); // iterator使いたいなら //for (auto it = books.m_list.begin(); it != books.m_list.end; it++) (*it)->show(); return 0; } [] [ここ壊れてます]
901 名前:はちみつ餃子 mailto:sage [2017/11/20(月) 03:34:54.09 ID:mEO8F9pQ0.net] >>880 Java のことはあまり知らんので元ネタにした Java 版の方をよく見てなったけど、 interface のかわりに抽象クラスを使おうとしてたのか。 似たような機能に見えちゃうかもしれないけど、インターフェイスを強制する方法としては抽象クラスはあまり良くない。 C++ 的にはコンパイル時にディスパッチする多相と実行時の多相があって、 抽象クラスは実行時にディスパッチする仕組みなのでコンパイル時に確定するはずのことを実行時にするのはクソザコという風潮。 だけど「コンセプト」の機能が C++ に導入されるのが延び延びになってていまだ入ってないので、 traits とか SFINAE とかを使ったまわりくどいメタプログラミングで代用してるのが実情なんだ。
902 名前: mailto:sage [2017/11/20(月) 03:45:45.65 ID:Y8ntE/6M0.net] >>881 >付けなくてもいいし うーん、デストラクタの場合はテンプレート引数をつけないとおこられちゃいます… ×https://ideone.com/x5FrwU 69行目 ○https://ideone.com/FUJ3OO 69行目 よくわらからないな…
903 名前:はちみつ餃子 mailto:sage [2017/11/20(月) 03:53:09.38 ID:mEO8F9pQ0.net] >>886 いや、型名の方には付ける必要あるよ ×: template <typename T> TShelf::~TShelf() { delete [] (this->t_s); } 〇: template <typename T> TShelf<T>::~TShelf() { delete [] (this->t_s); } △: 知らんかった template <typename T> TShelf<T>::~TShelf<T>() { delete [] (this->t_s); }
904 名前: mailto:sage [2017/11/20(月) 03:57:21.44 ID:Y8ntE/6M0.net] >>884 はい、すごくよくわかります!! std::vector とか、std::list とかstd::deque とかは、たぶんいけると思います。 mevius.2ch.net/test/read.cgi/tech/1434079972/14 mevius.2ch.net/test/read.cgi/tech/1434079972/19 なんとなくデザパタ本を読み返していて、車輪の再発明に没頭してしまいましたが、C# のデザパタ本、というのも聞かないし、もうデザパタは古いのかな…
905 名前:デフォルトの名無しさん mailto:sage [2017/11/20(月) 03:58:54.21 ID:O993TKuI0.net] マジか 役に立つ日が来るかどうかはシランケド
906 名前: mailto:sage [2017/11/20(月) 03:59:06.77 ID:Y8ntE/6M0.net] >>887 ありがとうございます。確認いたしました。
907 名前:デフォルトの名無しさん mailto:sage [2017/11/20(月) 03:59:26.41 ID:O993TKuI0.net] ↑ >>887
908 名前: mailto:sage [2017/11/20(月) 04:12:32.38 ID:Y8ntE/6M0.net] >>885 夜遅くにコメントいただきありがとうございます。 >C++ 的にはコンパイル時にディスパッチする多相と実行時の多相があって、 理解できます。コンパイル時に確定できるのなら最大限それに努める思想はたとえば constexpr にも現れていると思いました。 >抽象クラスは実行時にディスパッチする仕組みなのでコンパイル時に確定するはずのことを実行時にするのはクソザコという風潮。 うーん、たぶん私が周回遅れなだけだと思いますが、じゃあ、ひところ、あれほどまでにもてはやされたデザインパターンは、どこにいってしまったのでしょう…もう誰もやらないのかな…
909 名前:はちみつ餃子 mailto:sage [2017/11/20(月) 04:13:43.35 ID:mEO8F9pQ0.net] >>887 なんでこうなってるかっていうのは割と感覚的にやっちゃってるからうまいこと説明できひんのやけど。 クラステンプレートの中に関数テンプレートも書けたりするので template<class T> class foo { public: template<class U> void bar(void); }; 実装書くときはどれがどれに掛かってるかわかるようにせんといかん template<class T> template<class U> void foo<T>::bar(void) { } みたいな話なんじゃないかとコンパイラの気持ちになる仁奈ちゃんの気持ちになってた。
910 名前:はちみつ餃子 mailto:sage [2017/11/20(月) 04:30:34.82 ID:mEO8F9pQ0.net] >>892 抽象クラスを使うパターンなんてのがあるわけ? GoF 本とか読んだことないから知らんけど。 それはインターフェイスをまとめた何かを作れって話とかじゃないの? C++ の抽象クラスを使えって話とは違ったりしそうだけど。 デザインパターンはあくまでデザインの話なんだから言語の具体的な機能はその時代に有るものでやるしかないし、 よりよい機能が提供されるようになったら使うだろ、そりゃ。 抽象クラスを使うやり方しかできないなら「デザイン」を学び取れてないってこった。 まあ今は C++ への理解も十分でないからってのもあるだろうけどさ。 ところで QZ って C++ スレの常連みたいに思ってたけど、 その割にアレなのでひょっとして共通トリップだったりするの?
911 名前: mailto:sage [2017/11/20(月) 04:42:32.81 ID:Y8ntE/6M0.net] >>894 >その割にアレなのでひょっとして共通トリップだったりするの? 単に、あれよあれよと、また、次から次へと忘れていくので、ぜんぜん進歩しないだけなのでした。 こんな感じ… https://www.youtube.com/watch?v=Hflpt1-kAl4
912 名前:デフォルトの名無しさん mailto:sage [2017/11/20(月) 07:05:19.03 ID:8Dez9ldp0.net] 手元に古いGoF日本語訳(1999年初版)があったので覗いてみたら、 Iteratorのサンプル(C++)が>>880 みたいに抽象クラスで実装されていてびっくりした。 抽象クラスを使わなくても、処理の共通化を考えないなら問題ないし、 共通化したい場合でも、そこだけテンプレート化すればよいような気がする。 https://ideone.com/sFzBq4
913 名前:デフォルトの名無しさん [2017/11/20(月) 08:00:57.16 ID:GfOPAtNP0.net] VC++とか今でこそまともだけど昔はテンプレート周りがうんこすぎて風呂釜洗剤教の人のやり方に頼らざるを得なかったらしいね
914 名前:デフォルトの名無しさん [2017/11/20(月) 09:24:05.14 ID:9q5rB25R0.net] そういう「まとも」を求めてVCを選ぶのは情弱のすることだ 意味の違う「まとも」で定評のあるコンパイラであって
915 名前:デフォルトの名無しさん [2017/11/20(月) 09:46:04.69 ID:Veq8ZMOx0.net] Vistaまではgccでコンパイルしてたらしいからな。
916 名前:デフォルトの名無しさん [2017/11/20(月) 10:17:12.94 ID:5dn4op1oM.net] 初心者なんですがusing使い方を教えて下せえ
917 名前:デフォルトの名無しさん mailto:sage [2017/11/20(月) 10:36:08.17 ID:Fx3rJ6pW0.net] usingは時代によって使える機能が異なる 昔はnamespaceから使える宣言を取り出す役割 最近は=を用いてtypedefの簡略化っぽい書き方が出来る
918 名前:デフォルトの名無しさん mailto:sage [2017/11/20(月) 10:42:51.51 ID:Fx3rJ6pW0.net] 将来的にはusingがプロパティの役割まで担ってくれると余計な予約後増やさなくて済む希ガス
919 名前:デフォルトの名無しさん mailto:sage釣 [2017/11/20(月) 12:17:25.71 ID:OatlO4rKM.net] >>897 最初なんてタダのマクロだったし、 4.xだってテンプレート使うと名称長さ制限にかかったり STLのBUGは何時までたってもそのままだし
920 名前:デフォルトの名無しさん [2017/11/20(月) 14:57:25.95 ID:ZHV8ZCmh0.net] ratioのバグとかinitializer_listとかね しっかりしているようで時おり大ボケで笑いを取る謎な会社だ
921 名前:デフォルトの名無しさん mailto:sage [2017/11/20(月) 16:59:42.71 ID:CB3KD7K4p.net] >>883 重箱の隅だけどC++にもfinal導入されたよ、C++11からだっけ stlに付いてるかどうかは覚えてないけどw
922 名前:デフォルトの名無しさん [2017/11/20(月) 17:06:25.94 ID:ZHV8ZCmh0.net] 重箱の隅じゃあんめえ 仮想デストラクタがないことと継承禁止は近いが違う
923 名前:はちみつ餃子 mailto:sage [2017/11/20(月) 17:20:13.60 ID:mEO8F9pQ0.net] std::vector とかを public 継承してもスライシングが起こらないように使う分には全然問題ないわけだしな。 でも人間はアホだからスライシングするし、スライシングしたときにコンパイルエラーにしてくれないから避けようっていう「習慣」なだけで、 言語機能としてはデストラクタが仮想になってないからといって継承が禁止されているってわけではないんだ。 そこらへんは確かに意味づけが違う。
924 名前:デフォルトの名無しさん mailto:sage [2017/11/20(月) 17:54:47.05 ID:4sV97R+K0.net] デザパタは基本的にGC言語向きだしな C++とは相性が良くない
925 名前:デフォルトの名無しさん mailto:sage [2017/11/20(月) 19:05:49.28 ID:RcaXyFV8d.net] C++の基本的なコーディングを学ぶのにオススメな書籍あるかな? テクニック集とかもあると読んでみたいと思っている
926 名前:デフォルトの名無しさん [2017/11/20(月) 19:11:23.76 ID:q0WTO8Pn0.net] EffectiveC++シリーズ Exceptional C++ C++ Coding Standards あたりの定番中の定番でいいだろ
927 名前:デフォルトの名無しさん mailto:sage [2017/11/20(月) 20:12:37.95 ID:rJCmscgl0.net] ここって本職でやってる人らばっかりなんかね 日曜プログラマが気安く書き込んでもいいのだろうか
928 名前:はちみつ餃子 mailto:sage [2017/11/20(月) 20:21:38.03 ID:mEO8F9pQ0.net] >>911 いいよ。 俺も趣味プログラマだけど偉そうに書き込んでるし。
929 名前:デフォルトの名無しさん mailto:sage [2017/11/20(月) 21:53:59.25 ID:gqHMI2DN0.net] GoF本のうち Stateパターンは抽象クラス必須 Abstractなんちゃら系も抽象クラス必須 な印象
930 名前:デフォルトの名無しさん mailto:sage [2017/11/20(月) 22:05:37.00 ID:vFwnmuVP0.net] >>911 プロがここでうんちく垂れてたら引くわな
931 名前:デフォルトの名無しさん mailto:sage [2017/11/20(月) 22:07:59.95 ID:H8zFncfx0.net] >>873 最新版で該当ケースを探せず、 わざわざ5年前の版を持ち出してきてまで俺ツエーしたいヘタレを相手にしてしまい、すいませんでしたー gcc4.4.7(2012/3/13)の時点で対応できて無いという情報はものすごく役に立ちますー(棒) つかマジで、賢いつもりなら最新版で該当ケース探してgccに報告しろよ。 問題に遭遇したらとりあえず最新版、というのは基本だ。 ここを問題視する奴がgcc4.4.7なんて今使ってるわけないだろ。お前は馬鹿なのか? お前のその努力は誰の為にも役に立ってないだろ。 これは多分に政治的問題で、コンパイラ屋がごねているだけだ。 既に言ったとおり、 reinterpret_cast相当のことがなされている場合、その関数単位で -fno-strict-aliasing すればいいだけで、 これに関して技術/仕様的問題は何もない。 ただ、「ソースさえ正しければこんな問題は発生しない」とか言って、コンパイラ屋がごねてるんだよ。 だから、力関係が逆転すればいきなり全部直ってもおかしくない。 gcc7.2.0がどっちのアプローチ、 つまり、上記の通りばっさり最適化を切ってしまい、最適化ケースを積み上げる方向にしたのか、 或いは従来どおり、過度の最適化を検出し、最適化を防ぐケースを積み上げることにしたのかは、俺は知らない。 ただ、どちらのケースであっても、最新版で上手く行かないケースがあれば、それはgccにとっては有用な情報なんだよ。 それをわざわざ旧版で、しかも隠してしれっととか、意味無いしせこいわw 最新版で出現しないから焦ったか?小物感ありあり。 > まぁそんなことは無いんだけどさ。 とか言うから、お?釣りか?ならここは全力で釣られてやるさ、該当事例持って来いよ!って流れなのに、 事前に該当事例用意しておかずに釣りとかアホかテメーは。 君が最新版で完全にアウトなケースを用意してれば、ああこれは完全に俺の負けですサーセン、とお後がよろしかったのに、 gcc4.4.7であることにも触れず俺ツエーするとか、小物過ぎて泣ける。 お前もうちょっとスレの流れを考えろよ。
932 名前:デフォルトの名無しさん mailto:sage [2017/11/20(月) 22:13:38.04 ID:cvRta7BJM.net] >>908 GoF本はc++とsmalltalkだったろ
933 名前:デフォルトの名無しさん mailto:sage [2017/11/20(月) 22:48:11.84 ID:gqHMI2DN0.net] テンキー風のボタンの並びでモードによって意味が変わる(Num Lock ON/OFFのもっと複雑化したようなやつ というユザーインターフェースの実装はStateパターンのどくだんば そこまでレトロなのでなくてもGUIでお絵かきツールを集めたツールボックスなUIとか作ると Abstructなんちゃらパターンのどれかを再発明しているケースが多いと思う
934 名前:デフォルトの名無しさん mailto:sage [2017/11/20(月) 23:04:17.12 ID:vFwnmuVP0.net] ←なぜか変換できない
935 名前:デフォルトの名無しさん mailto:sage [2017/11/20(月) 23:35:39.24 ID:mEO8F9pQ0.net] 独擅場 ← どくせんじょう
936 名前:はちみつ餃子 mailto:sage [2017/11/21(火) 00:48:45.97 ID:KkY90WH60.net] >>913 昨日 >>885 でまわりくどいメタプログラミングと言ってたのがそれだ。 State パターンのように特定のメンバ関数を持っていることを強制したいときには それを判定するトレイツを作って対応する。 たとえば >>886 にあるコードを対象に考えて、 「あるクラスがそのクラス自身のポインタを返す next という名前のメンバ関数を持っているか」 を判定するトレイツはこうなる。 template<class T> class has_next { template<class U, class V = T> struct helper : std::false_type {}; template<class U> struct helper<U, typename std::enable_if<std::is_same<decltype(std::declval<U>().next()), U*>::value, T>::type> : std::true_type {}; public: static const bool value = helper<T>::value; }; C++ 標準の type_traits を真似してるので使い方もだいたい同じ。 static_assert(!has_next<TShelfIterator<Book>>::value, "TShelfIterator must has next() method."); みたいに書いておけば TShelfIterator<Book> がメンバ関数 next を持っていることが保証される。 持っていなければコンパイル時にエラーになるから。 ここではひとつのメンバ関数を判定するだけのものを作ったけど、 Boost にはもっと汎用的にいい感じにかけるやつが有った気がする。 知らんけど。
937 名前:デフォルトの名無しさん mailto:sage [2017/11/21(火) 01:13:43.73 ID:H+r6aFWv0.net] そんなくそレガシーなtraits 久々に見た…
938 名前:デフォルトの名無しさん mailto:sage [2017/11/21(火) 17:31:41.16 ID:6BA+Ife8d.net] あるファイルに下のような文字が書き込まれていて xxxx=3 これの3を取得する完璧無欠なロジックなにかないかな
939 名前:デフォルトの名無しさん [2017/11/21(火) 17:32:59.03 ID:uRVBPn0b0.net] 完璧無欠とは?
940 名前:デフォルトの名無しさん mailto:sage [2017/11/21(火) 17:36:16.46 ID:6BA+Ife8d.net] >>923 俺様のアルゴリズムは完璧だぜ!!! ってだけ まあそんなのないんだけど書き込みたかった
941 名前:デフォルトの名無しさん mailto:sage [2017/11/21(火) 18:10:16.89 ID:B2ib4/wIa.net] 正規表現でよくない?
942 名前:デフォルトの名無しさん mailto:sage [2017/11/21(火) 19:05:58.85 ID:DIhAB+/L0.net] リバースイテレータをfindしてイコールでセパレート。 って、数行から見つけるのか。 構文解析とかか?
943 名前:デフォルトの名無しさん mailto:sage [2017/11/21(火) 19:38:49.19 ID:6BA+Ife8d.net] >>926 数行から見つける 設定値の中から見つける 実際は #xxxはdddの設定値 xxx=1 #yyyはcccの設定値 yyy=3 こんなのが繰り返し書かれてる 正規表現確かに良さそう忘れてた
944 名前:デフォルトの名無しさん mailto:sage [2017/11/21(火) 19:53:50.67 ID:GhiisSyt0.net] (?<=^xxx=)\d+$
945 名前:デフォルトの名無しさん mailto:sage [2017/11/21(火) 20:30:32.65 ID:0pu32Yjt0.net] float演算がdoubleよりも遅いってアジですか?
946 名前: mailto:sage [2017/11/21(火) 21:02:58.77 ID:xJ15vzkZ0.net] >>929 何が計算するかによる、としか
947 名前:デフォルトの名無しさん mailto:sage [2017/11/21(火) 21:12:53.35 ID:0pu32Yjt0.net] さいですか
948 名前:デフォルトの名無しさん mailto:sage [2017/11/21(火) 21:19:38.81 ID:muR8Mwv6r.net] >>922 ほれ https://wandbox.org/permlink/YK6UEOGxMToYE1SK
949 名前:デフォルトの名無しさん mailto:sage [2017/11/21(火) 21:44:16.41 ID:6BA+Ife8d.net] >>932 すんごく綺麗なコードありがとう 見事に魔改造して糞コードにしてしまう自信がある
950 名前:デフォルトの名無しさん [2017/11/21(火) 21:55:27.92 ID:6jcLJvUW0.net] >>927 そういう設定ファイル的なものを読むならkeyとvalueのペアのリストつまりmapを返す実装を考えた方がいい
951 名前:デフォルトの名無しさん mailto:sage [2017/11/21(火) 22:16:59.77 ID:6BA+Ife8d.net] >>934 俺もそうは思ってるのだけどその読み込む処理をどうしたら綺麗にできるかなぁって悩みなんだ マップ作ったあとに検索が綺麗なのかなとは思ってる
952 名前:はちみつ餃子 mailto:sage [2017/11/21(火) 22:33:26.16 ID:KkY90WH60.net] 文法的には LL(1) かな? 素朴なパーサコンビネータでも充分に足りるのでその手のライブラリを導入すると楽にパーサを作れると思う。 それはともかく、「>>922 みたいな」というだけの仕様では ・数値以外が設定値にくることもあるのか? ・要素に改行を含められるのか? ・エスケープも出来るようにするのか? 等々が読み取れないし、多分 >>922 は考えてないんじゃないかなと思う。 オレオレ設定ファイルフォーマットを考えるくらいなら TOML とかいったよくあるフォーマットを採用すれば ライブラリが充実してたりして便利なので考えてみるといいかも。
953 名前:デフォルトの名無しさん [2017/11/21(火) 22:42:43.82 ID:uRVBPn0b0.net] ってかboostのPropertyTreeにiniパーサーがあるからそれ使うといいよ
954 名前:デフォルトの名無しさん mailto:sage [2017/11/21(火) 22:42:58.28 ID:6BA+Ife8d.net] >>936 回答すると 数値以外もありうる 改行は値として入れない エスケープってなんだろう? xxxに関しては最大16文字の文字列(大文字小文字計52文字の組み合わせ) たったこれだけでも深いね ソフトウェアって神秘
955 名前:デフォルトの名無しさん mailto:sage [2017/11/21(火) 23:00:05.88 ID:GhiisSyt0.net] ini-parser
956 名前:てのがなかなか良さそう picojson,rapidxmlなどが好きな人にはいいかも [] [ここ壊れてます]
957 名前:デフォルトの名無しさん mailto:sage [2017/11/22(水) 02:34:39.84 ID:9vladmL60.net] 構文解析したいならbisonでも使ったらいいんじゃね?
958 名前:デフォルトの名無しさん [2017/11/22(水) 03:34:34.44 ID:ft6g9THr0.net] ム板で公開されたのがあったじゃないか。
959 名前:デフォルトの名無しさん mailto:sage [2017/11/22(水) 10:29:13.01 ID:wHcXBwMz0.net] >>938 >>922 の完璧無欠なロジックてのは 最初に完璧無欠な入力規則を作ってから議論できるものだろ >数値以外もありうる 数値だけでもいろんな型があるわけだしこの程度じゃ何も語れない xxxx=3のような単純な形式はINIファイルとか>>936 のようなのとか利用するのが便利 最近はXML形式が推奨されてる ただしどれもが完璧無欠とは言えないけど
960 名前:デフォルトの名無しさん [2017/11/22(水) 10:59:36.64 ID:jvBgNmmT0.net] >>942 どこの最近?
961 名前:デフォルトの名無しさん mailto:sage [2017/11/22(水) 11:55:13.96 ID:/unloUf+0.net] XMLは配列が直接表現できないし手で書くのがクソめんどくさいし見づらい その点JSONの方がずっとマシなんだけど標準JSONだとコメント書けない
962 名前:デフォルトの名無しさん mailto:sage [2017/11/22(水) 12:48:47.95 ID:PiUoYWXr0.net] 適材適所、の一言で片付く問題 好きな方使え
963 名前:デフォルトの名無しさん [2017/11/22(水) 13:52:54.31 ID:gFgFfMOWM.net] 人が書く設定ファイルならtomlがパースのしやすさと書きやすさでバランスが良いと思う
964 名前:デフォルトの名無しさん mailto:sage [2017/11/22(水) 16:17:23.80 ID:HDCbnteD0.net] >>946 dein.vimで使われてるの見て知ったけどまったくと言っていいほど広まらないね >>944 ド定番のYAMLでいいじゃん
965 名前:はちみつ餃子 mailto:sage [2017/11/22(水) 20:12:53.57 ID:Rn9KsJdK0.net] Cargo の設定ファイルも TOML やぞ。 モダーンな言語のモダーンなツールは TOML がトレンド。 これ。 YAML みたいにインデントで構造を表現するのってパースめんどくさい。 個人的に YAML は不格好に見えて好きじゃないっていう主観もあるんだけど、 YAML ってそんなに定番ってほど目にしたことが無いな〜と思って考えたら たぶん俺の巣は Scheme スレやからやな。 Lisp 界隈では設定ファイルにはS式を使ってまうもんな。
966 名前:デフォルトの名無しさん mailto:sage [2017/11/22(水) 21:00:11.47 ID:h+KIZtFy0.net] luaなんかもよく使われるけど、schemeやluaが設定ファイルとして使われるのは 呼び出し側の言語が同じであるか、他の用途で使うためにすでに組み込んでる場合がほどんどで 設定ファイルだけの為にLL組み込むにはお手軽とは言えないかな TOMLはいいとは思うんだけど 自分が使うなら仕様が固まってからの1.0〜は必須で ↓で300程度は使われてからかな $ apt-file search toml | grep "\.toml$" | wc -l 0 $ apt-file search json | grep "\.json$" | wc -l 3611 $ apt-file search yaml | grep "\.yaml$" | wc -l 1480
967 名前:デフォルトの名無しさん mailto:sage [2017/11/22(水) 21:10:35.27 ID:W0SJQGiTM.net] 最近この手の話題に疎いからtomlとか知らんかったのでちょっとググったけどまあ好きなの使えや って感想しかないわ https://gist.github.com/miyakogi/e8631ce5f7c956db2313
968 名前:はちみつ餃子 mailto:sage [2017/11/22(水) 21:16:10.07 ID:Rn9KsJdK0.net] パースの楽さだけで言えば JSON が優勝だけど人が手書きするには色々アレだからな。
969 名前:デフォルトの名無しさん mailto:sage [2017/11/22(水) 21:20:22.39 ID:3/I2dLA90.net] 好きなの使えっつっても全部導入して試すの面倒や
970 名前:デフォルトの名無しさん mailto:sage [2017/11/22(水) 21:56:28.30 ID:+hB2MqUt0.net] ES5以降ケツコンマOKになったんだからJSONも新規格にすりゃいいのに。
971 名前:デフォルトの名無しさん mailto:sage [2017/11/22(水) 23:47:16.65 ID:AAzHTorM0.net] >>936 正規表現で済んでいるのになんでスタックが要るんじゃ!!!!!!11!1!!!!
972 名前:はちみつ餃子 mailto:sage [2017/11/23(木) 00:25:32.50 ID:fj1LdTry0.net] >>954 意味がわからないので説明して。
973 名前:デフォルトの名無しさん mailto:sage [2017/11/23(木) 00:36:02.97 ID:h8NdPAUM0.net] 文脈自由文法は解析にスタック(理論上は無限の段数のやつ)が要るクラスだが 正規言語は有限状態マシンで済む言語のクラス 今話題の設定言語は無限の入れ子は持たなそうなので正規言語で逝ける、
974 名前:デフォルトの名無しさん mailto:sage [2017/11/23(木) 00:37:37.76 ID:h8NdPAUM0.net] と、 言いたいのでわ…
975 名前:はちみつ餃子 mailto:sage [2017/11/23(木) 01:07:08.12 ID:fj1LdTry0.net] ん〜、そのへんの学問的な分類はよう知らんけど、取りうる状態は有限でもバックトラックは起こるしそのためのスタックは要るんちゃう? 同じ文法の構文解析器を作ればどっちのアプローチでもスタックの消費量はかわらんと思うんだけど。 より制限の強い方で「十分」っつーならそれはわかる。 C++ 標準に入ってる機能で出来りゃ楽だしな。 ただ、正規表現ライブラリだとエラーの検出場所の伝達方法とかで融通が利かなかったりするので、 ユーザーが入力する設定ファイルを解析するパーサを作るとなると作りこみ難いという感触があるかな。
976 名前:デフォルトの名無しさん mailto:sage [2017/11/23(木) 06:39:00.31 ID:NFzuGiE50.net] 「チョムスキー階層」でググれ
977 名前:デフォルトの名無しさん mailto:sage [2017/11/23(木) 07:23:17.08 ID:NFzuGiE50.net] >>958 >ん〜、そのへんの学問的な分類はよう知らんけど、取りうる状態は有限でもバックトラックは起こるしそのためのスタックは要るんちゃう? 非決定性有限オートマトンは決定性有限オートマトンに変換できるので、 バックトラックが一切起こらない形に書き換えることは可能。 lexなんかだと、そのような変換を行ったコードを生成していたはず。 ただし、プログラム言語などで一般的に使われる正規表現は、 ここでいう正規言語を拡張したものなので、この限りではない。
978 名前:デフォルトの名無しさん mailto:sage [2017/11/23(木) 14:40:51.51 ID:QeiOUUJtx.net] C++のプロジェクトに戻りたい。
979 名前:デフォルトの名無しさん mailto:sage [2017/11/23(木) 18:06:46.17 ID:5yPMgLrz0.net] どうぞどうぞ
980 名前:デフォルトの名無しさん mailto:sage [2017/11/23(木) 18:56:01.32 ID:h8NdPAUM0.net] もう次スレ要らないのでは
981 名前: mailto:sage [2017/11/23(木) 19:03:52.53 ID:fGVRHt7J0.net] またまた低レベルな質問で恐縮しております。よろしくお願いいたします。 https://ideone.com/MXvhkC ここまで実装できている状態で、演算子 += を定義するには、どのように書けばいいでしょうか? なお実際に作業している対象は自作の多桁長演算ライブラリで、operator+=() を operator=() や operator+() を再利用できればうれしいな、と考えております。 operator+() や operator=() に書いていることを、繰り返して書くのは避けたいと考えているのです。
982 名前:デフォルトの名無しさん mailto:sage [2017/11/23(木) 19:07:30.71 ID:IGgCkWwq0.net] 普通はoperator+=()を実装してから、それを使ってoperator+を実装する
983 名前: mailto:sage [2017/11/23(木) 19:44:55.34 ID:fGVRHt7J0.net] >>965 なるほど https://ideone.com/t89oo1 しかし、+=, -= ならまだしも、 *=, /=, %= を考えると、なんだか似たようなコードを二箇所に書きそうな雰囲気がします…
984 名前:デフォルトの名無しさん mailto:sage [2017/11/23(木) 19:54:00.12 ID:IGgCkWwq0.net] だからboostにこんなのがあったりする https://boostjp.github.io/tips/operators.html
985 名前:デフォルトの名無しさん mailto:sage [2017/11/23(木) 19:56:33.11 ID:5nCr5Wf60.net] CRTP使って自動実装
986 名前:はちみつ餃子 mailto:sage [2017/11/23(木) 20:01:00.33 ID:fj1LdTry0.net] >>964 なんで friend がついてんの?
987 名前:デフォルトの名無しさん mailto:sage [2017/11/23(木) 20:17:56.76 ID:j5z8beti0.net] >>967 これってなんでprivate継承なのか分からない
988 名前:はちみつ餃子 mailto:sage [2017/11/23(木) 20:23:32.48 ID:fj1LdTry0.net] >>970 スライシングを起こさないようにじゃないの。 デストラクタを virtual にすると要らん仮想関数テーブルが作られちゃうからな。 それでいて定義する関数は friend 関数にしてるから外側からでも見えるんだな。
989 名前: mailto:sage [2017/11/23(木) 20:46:50.20 ID:fGVRHt7J0.net] >>969 こんな小題でもいろいろと試されるんですね… たしかに operator+=() は、意味からいっても friend である必要はまったくないですね。 一方 operator==(), operator+() は式の表現としての対象性を保存したいので、friend をつけたいと考えています。 operator<<() に対しては friend を必ずつけないといけないようですが、その理由はよくわかっていません。 https://ideone.com/pR0EP1
990 名前:デフォルトの名無しさん [2017/11/23(木) 22:59:38.32 ID:vKpvx9Uha.net] IDE使っていて思うのがtemplate関数でデフォルト引数classAを設定すれば、 template<typename T=classA> void Test(T tmp){ tmp.func(1, 2, 3); } 上記のtmp.のところでclassAの関数とかが出て来るようになると嬉しいとか思ったり コンセプトとかで対応できるようになるんでしょうか?
991 名前:デフォルトの名無しさん mailto:sage [2017/11/23(木) 23:16:02.95 ID:WYrOiD8s0.net] mix-inもまともに知らないやつがなぜ回答してるのか…
992 名前:デフォルトの名無しさん mailto:sage [2017/11/24(金) 00:17:10.75 ID:mELw8YtS0.net] >>973 言語仕様っていうよりIDEの性能のような。 コンセプトまで構文解析してサジェストするようになれば確かにできるかもしれんけど。
993 名前:デフォルトの名無しさん mailto:sage [2017/11/24(金) 01:03:21.71 ID:/7rxT1Yr0.net] >>973 技術的には可能だからlibclangでなんとかなるようになるなら誰かやってくれるかもね コード補完にプラグインを使えないIDEなら開発元にリクエストするしかない
994 名前:デフォルトの名無しさん mailto:sage [2017/11/24(金) 01:39:31.39 ID:Z3szivMI0.net] mix-inで理解が止まっている人がなんか吼えてますな
995 名前:デフォルトの名無しさん mailto:sage [2017/11/24(金) 08:42:41.97 ID:ZeExn92sr.net] >>973 コンセプトはシンタックスの誤りを判定するのみで型情報を持っていないため その補完は期待できない
996 名前:デフォルトの名無しさん mailto:sage [2017/11/24(金) 09:00:16.20 ID:nFkUcp0I0.net] >>977 boost operatorsのprivate継承がmix-in以外のなんだと思ってるんだ?
997 名前:デフォルトの名無しさん mailto:sage [2017/11/24(金) 10:03:13.88 ID:dhAYmdbT0.net] 静的リフレクションが欲しい
998 名前:デフォルトの名無しさん mailto:sage [2017/11/24(金) 10:21:33.74 ID:Un7I7rhA0.net] 後のプリプロセッサである
999 名前:デフォルトの名無しさん [2017/11/24(金) 12:38:49.19 ID:p8RxfMqqa.net] C++を勉強しようとしてるんだが 基本的にCの書き方が一般なのか C++の書き方が一般なのか教えてもらいたい
1000 名前:デフォルトの名無しさん [2017/11/24(金) 12:51:25.91 ID:l1+FhW7v0.net] コーディングスタイル? そんなの好きにすればいいよ
1001 名前:デフォルトの名無しさん mailto:sage [2017/11/24(金) 13:21:28.52 ID:w0OmJEj50.net] >>982 Cの書き方とかC++の書き方とか一般的とかない 「一般的」なるものを求めたいならメジャーなIDEのデフォルトのオートフォーマットだろうな
1002 名前: mailto:sage [2017/11/24(金) 13:44:06.80 ID:ZNkp8uW60.net] >>964 結局こうなりました https://ideone.com/SUSTBj
1003 名前:はちみつ餃子 mailto:sage [2017/11/24(金) 14:07:55.96 ID:lG8HVUMw0.net] >>985 operator+= の返却値は参照にしといた方が辻褄が合うので良いよ
1004 名前:デフォルトの名無しさん mailto:sage [2017/11/24(金) 14:10:30.10 ID:/RqU0h4Pd.net] 関数内で作ったベクターやマップは関数を抜けたらメモリ解放されると考えてよかです?
1005 名前:はちみつ餃子 mailto:sage [2017/11/24(金) 14:13:40.22 ID:lG8HVUMw0.net] >>987 記憶クラスによる。
1006 名前:デフォルトの名無しさん mailto:sage [2017/11/24(金) 14:25:57.62 ID:/RqU0h4Pd.net] >>988 記憶クラスによるとは スマホで打ってるから書式とかガタガタだけど下みたいなことしてる createmapってのを抜けたときにvectorもmapも解放されると信じている vector XX( *map) { 要素数二個のstring型のvectorデータを作成 return vector<string> ←要素数2 } createmap () { map<string,string> y { vector<string> tmp = XX(&y) y.insert( tmp[1] , tmp[2]) } }
1007 名前:デフォルトの名無しさん [2017/11/24(金) 14:36:50.33 ID:9/UAKu4i0.net] うん、信じていい XXから抜けるときにムーブコンストラクタでtmpへ移動され createmapから抜けるときに解放される このときoperator deleteが呼び出されるが operator deleteがどのようなタイミングで解放しているかには依存すべきでない 我々が関心を持つべきはoperator deleteが呼び出されるタイミングで実装の詳細ではない
1008 名前:はちみつ餃子 mailto:sage [2017/11/24(金) 15:15:03.03 ID:lG8HVUMw0.net] >>989 static 付きで宣言してればプログラムの終わりに解体されるし、 new で作れば delete されたときが解体されるし、 そうでなければスコープの終わりに解体される。 「関数内で作った」というだけでは情報不足。 >>989 のような例であればスコープの終わりで解体されることは保証される。 それと >>990 はムーブコンストラクタの話を出してるけど C++17 以降ではこういう場合は RVO の発動が必須になってなかったっけ?
1009 名前:デフォルトの名無しさん [2017/11/24(金) 15:33:02.71 ID:9/UAKu4i0.net] >>991 990だが、何を言っているのか、悪いがよくわからん XXがcreatemapとは別の翻訳単位から外部結合されている場合でも その何だ、ムーブコンストラクタの回避(?)が必須になったのか?
1010 名前:はちみつ餃子 mailto:sage [2017/11/24(金) 16:06:58.81 ID:lG8HVUMw0.net] >>992 そう。 RVO 必須だからコピーコンストラクタもムーブコンストラクタも無いクラスでも OK っていう新しいルール。 https://wandbox.org/permlink/X6g7JSpkSl82VvtZ
1011 名前:デフォルトの名無しさん [2017/11/24(金) 16:44:55.52 ID:9/UAKu4i0.net] >>993 OK? それは03でも同じことやん
1012 名前:はちみつ餃子 mailto:sage [2017/11/24(金) 16:48:44.24 ID:lG8HVUMw0.net] >>994 いや >>993 みたいなのは C++14 以前では NG になるよ。
1013 名前:デフォルトの名無しさん mailto:sage [2017/11/24(金) 16:54:03.03 ID:WoNXR2ax0.net] C++相談室 part133 mevius.5ch.net/test/read.cgi/tech/1511509970/
1014 名前:デフォルトの名無しさん mailto:sage [2017/11/24(金) 16:58:12.64 ID:jkTO/gHT0.net] 乙。
1015 名前:デフォルトの名無しさん mailto:sage [2017/11/24(金) 17:04:12.57 ID:BCw6/Ft50.net] 彼。
1016 名前:はちみつ餃子 mailto:sage [2017/11/24(金) 17:07:25.34 ID:lG8HVUMw0.net] >>999 なら長門有希は俺の嫁
1017 名前:はちみつ餃子 mailto:sage [2017/11/24(金) 17:07:54.81 ID:lG8HVUMw0.net] >>1000 なら双葉杏も俺の嫁
1018 名前:1001 [Over 1000 Thread.net] このスレッドは1000を超えました。 新しいスレッドを立ててください。 life time: 45日 16時間 56分 20秒
1019 名前:過去ログ ★ [[過去ログ]] ■ このスレッドは過去ログ倉庫に格納されています