1 名前:デフォルトの名無しさん mailto:sage [04/11/25 21:11:32] C++ のジェネリックプログラミングの話をしましょう。 以下のスレッドを統合するスレです。 STLスレッド Part1 pc.2ch.net/tech/kako/1004/10042/1004287394.html Part2 pc3.2ch.net/tech/kako/1026/10267/1026793823.html 【C++】Boost使い集まれ! pc3.2ch.net/test/read.cgi/tech/1033830935/ (html化待ち?) Generic Programming with C++ Template pc.2ch.net/tech/kako/1008/10085/1008593126.html 【C++】template 統合スレ -- STL/Boost/Loki, etc. pc2.2ch.net/tech/kako/1037/10377/1037795348.html 【C++】template 統合スレ -- Part2 pc2.2ch.net/test/read.cgi/tech/1047978546/ (html化待ち) 【C++】template 統合スレ -- Part3 pc5.2ch.net/test/read.cgi/tech/1066493064/ (html化待ち) 【C++】template 統合スレ -- Part4 pc5.2ch.net/test/read.cgi/tech/1083550483/ (html化待ち) 【C++】template 統合スレ -- Part5 pc5.2ch.net/test/read.cgi/tech/1091522597/ 関連スレ、その他リンクは >>2-5 あたりに。
720 名前:716 mailto:sage [2005/07/07(木) 08:08:12 ] 我ながら非道い sl->next = NULL;を削って sl->next = new simple_list; を sl->next = (c != 100000-1) ? new simple_list : NULL; とでも >>718-719 最適化をすっかり忘れていました。 なぜだかsumを返すようにしてもhogeの方が消えてしまうのですが もう少し試行錯誤してみます。 いずれにせよ力づけられました。ホッとしています。 レスありがとうございました。
721 名前:デフォルトの名無しさん mailto:sage [2005/07/07(木) 08:20:05 ] >>720 返すだけで戻り値を使ってないんじゃ、と消えるかもしれないな。 チェックもかねて、画面に値を出すようにすれば大丈夫じゃない? (そこまでやっても、ただの定数に置き換えてしまうコンパイラとかあるかもしれない。) 最終的にはアセンブリを吐かせて確認するといい。
722 名前:716 mailto:sage [2005/07/07(木) 08:25:49 ] 最適化無しで719さんの方法で15%ほど速く >>721 もしかしたらtemplateだったせいかも知れないです。インライン化されていたのかな。 templateを外したらhogeも出ました hoge: 5.579 ms hage: 5.313 ms (vc++6) 朝からお騒がせしました、お二人(三人?)に再度感謝です
723 名前:デフォルトの名無しさん mailto:sage [2005/07/07(木) 08:31:10 ] その程度の処理だとlistは兎も角、vectorは普通の配列と全く同じ速度出るよ。 #つーか、gccでもVC++でもstlの有無で全く同じ(質の)コード吐くんだけどね。
724 名前:デフォルトの名無しさん mailto:sage [2005/07/07(木) 18:13:33 ] >>723 VCだと vector>=配列 になるときもない?(誤差範囲内だけど) GCCは vector使うと少し遅くなる気がした。
725 名前:デフォルトの名無しさん mailto:sage [2005/07/07(木) 18:23:22 ] その辺は具体的なコードを提示して比較でもしない限りなんとも言えないなぁ。 そもそも最適化で消えないコードでって条件になっちゃうし。
726 名前:デフォルトの名無しさん mailto:sage [2005/07/07(木) 18:30:29 ] vectorのiteratorは大抵の処理系/STL実装で非デバッグ時には単なるポインタだろ。
727 名前:デフォルトの名無しさん mailto:sage [2005/07/07(木) 18:34:16 ] >>722 ちなみに std::list が double-linked list だということは知ってるよな
728 名前:デフォルトの名無しさん mailto:sage [2005/07/07(木) 23:52:14 ] doubleじゃないSTLのlistを提示しない限りそのレスは無意味
729 名前:デフォルトの名無しさん mailto:sage [2005/07/08(金) 00:55:24 ] >>728 おれは>727じゃないけど、なんで?
730 名前:デフォルトの名無しさん mailto:sage [2005/07/08(金) 01:02:35 ] そういえばslistは標準じゃないんだな。 STLPortにはあるけど。
731 名前:デフォルトの名無しさん mailto:sage [2005/07/08(金) 20:43:04 ] 次のようなコードがあるとします: struct base1 { base1(int x) {}; }; struct base2 { base2(int x, int y) {}; }; // IF<P,T,F>クラステンプレートは、Pが非0のときT、0のときFをIF::typeにtypedefする template <int N> struct derived : public IF<N,base1,base2>::type {}; このとき引数の数が異なるコンストラクタを持つ基底クラスをテンプレートで切り替え、 派生クラスのコンストラクタから、基底クラスのコンストラクタを呼び出したいのです: derived<1> d(0); // base1から継承し、コンストラクタは引数1 derived<0> d(0, 1); // base2から継承し、コンストラクタは引数2 基底クラスのコンストラクタを呼び出すときには、派生クラスの初期化リストを使います。 ところが、派生クラスのコンストラクタ初期化リストでは、基底クラスのコンストラクタ 以外呼べませんから、次のように多重定義できません: // Nが非0だとすると derived(int x) : base1(x) {}; derived(int x, int y) : base2(x, y) {}; // error! 基底クラスはbase1 このように基底クラスをテンプレートで替える場合に、うまく派生クラスのコンストラクタの 引数の数を調整するようなテクニックがあれば、ご教示いただけると幸いです。 また、異なるアプローチもあればコメントください。
732 名前:デフォルトの名無しさん mailto:sage [2005/07/08(金) 20:50:10 ] 俺にはderivedをNの値によって特殊化する方法しか思いつかない。
733 名前:デフォルトの名無しさん mailto:sage [2005/07/08(金) 22:22:17 ] 試しにこう書いてみたら g++ 3.4.4 cygming special では通ったんだが。 derived(int x) : IF<N,base1,base2>::type(x) {} derived(int x, int y) : IF<N,base1,base2>::type(x,y) {}
734 名前:731 mailto:sage [2005/07/09(土) 02:41:09 ] >>732-733 レスありがとうございました。 >733の方法で、パパ、うまくできそうです。 続きがんばります!
735 名前:デフォルトの名無しさん mailto:sage [2005/07/09(土) 08:17:21 ] どうもネットの世界の「ご教示」とか「ご教授」って浮いた言葉だなぁ。
736 名前:デフォルトの名無しさん mailto:sage [2005/07/10(日) 00:59:18 ] 実は初めてこの構文を知ったんだけどさ >ttp://www.comeaucomputing.com/techtalk/templates/#esprobs > >template <class T> >T foo(T blah) >{ > xyz object; > T someInt; > >// (略) > > someInt = object.mt<int>(99.99); // AA: ill-formed > someInt = object.template mt<int>(99.99); // BB: well-formed > > return someInt; >} ってなってて AA は ill-formed になってるんだけど、 object はテンプレートパラメータに依存してないんだから template をつけなくても問題ないと思うんだけど。実際 g++ 3.4.4 だと通るし、. の前をテンプレートパラメータに 依存するように書き換えるとエラーが出る。 規格参照箇所 14.2-4 > When the name of a member template specialization appears after . or -> in a postfix-expression, or after > nested-name-specifier in a qualified-id, and the postfix-expression or qualified-id explicitly depends on a > template-parameter (14.6.2), the member template name must be prefixed by the keyword template. > Otherwise the name is assumed to name a non-template.
737 名前:デフォルトの名無しさん mailto:sage [2005/07/10(日) 02:07:52 ] template <typename T> class Hoge { public: typedef std::vector<T> Container; typedef Container::iterator Iterator; private: Container v; }; と書いて、Hoge<int> hoge; とか呼ぶと、implicitなtypenameだと警告を言われます。 iteratorを表現するにはどのように記述すべきなのでしょうか。
738 名前:デフォルトの名無しさん mailto:sage [2005/07/10(日) 02:09:19 ] >>737 gcc version 3.2 20020927 (prerelease) です。
739 名前:737 mailto:sage [2005/07/10(日) 02:11:47 ] www.tietew.jp/cppll/archive/10073 によると、 typename Container::iterator Iterator; と書くみたいですね。これって常識なのかしら。
740 名前:デフォルトの名無しさん mailto:sage [2005/07/10(日) 02:27:11 ] >>739 その場合、typenameは必須。
741 名前:デフォルトの名無しさん mailto:sage [2005/07/10(日) 02:36:16 ] 常識
742 名前:デフォルトの名無しさん mailto:sage [2005/07/10(日) 04:36:52 ] 当然
743 名前:デフォルトの名無しさん mailto:sage [2005/07/11(月) 10:24:40 ] >>739 特殊化があるC++では、Tが確定しないと型推論が困っちゃうんで、 typedef typename Container::iterator Iterator; って感じで。 typename Container::iterator Iterator; も可能。 Container<int> v; なら何とかなるはずだけど、explicitにtypenameしましょうという仕様。
744 名前:デフォルトの名無しさん mailto:sage [2005/07/16(土) 20:53:42 ] >型推論が困っちゃう そうなのか? Tが確定しないと、特殊化のあるC++ではstd::vector<T>::iteratorが typedefされた型名か、メンバ(メンバ変数・関数)かが分からないから コンパイラへのヒントとして型名であることを明示するのを義務付けてるんでは?
745 名前:デフォルトの名無しさん [2005/07/19(火) 22:11:08 ] 全然わかってないけど質問します。 テンプレートクラスの実装って全てヘッダーでやらないといけないんですか? .cppの方でやるとリンカーエラーが出てリンクできないのですが!? (全部ヘッダーにコピペしたら通った)
746 名前:デフォルトの名無しさん mailto:sage [2005/07/19(火) 22:14:53 ] 追加 だが、しかしそれをやると2重定義になる… どうすればいいんじゃーーーー
747 名前:デフォルトの名無しさん mailto:sage [2005/07/19(火) 22:20:05 ] >>745 テンプレートの定義をcppファイルに書きたければ、宣言と定義の両方にexportを付けるだけ。 しかしほとんどのコンパイラで使えない。(使えるコンパイラが全くないわけではない) というわけで普通はヘッダにインラインで全て書く。 ごく稀に明示的実体化が使われることはあるが。
748 名前:デフォルトの名無しさん mailto:sage [2005/07/19(火) 22:48:35 ] >>747 明示的実体化ってまさか、 template class c<bool>; template class c<char>; template class c<unsigned char>; みたいに延々と cpp ファイルに書いていくわけ?
749 名前:デフォルトの名無しさん mailto:sage [2005/07/19(火) 23:06:05 ] g++にはextern templateってのがあるね。
750 名前:デフォルトの名無しさん mailto:sage [2005/07/19(火) 23:11:50 ] >748 そゆこと。
751 名前:745 mailto:sage [2005/07/19(火) 23:17:21 ] やってみた>>747 make -k all g++ -Wall main.cpp Class.cpp -c g++ -Wall main.o Class.o -o a.exe main.o(.text+0x25):main.cpp: undefined reference to `Class<int>::Class[in-charge]()' collect2: ld returned 1 exit status make: *** [all] Error 1 ムリポ >>749 を含めて出直してくる。これはイマの私の頭ではいくら考えても答えが出ない。 本を読むかg++のマニュアルを漁るか…
752 名前:デフォルトの名無しさん mailto:sage [2005/07/19(火) 23:44:58 ] >>751 g++のinclude/bits/istream.tccより // Inhibit implicit instantiations for required instantiations, // which are defined via explicit instantiations elsewhere. // NB: This syntax is a GNU extension. #if _GLIBCPP_EXTERN_TEMPLATE extern template class basic_istream<char>; extern template istream& ws(istream&); extern template istream& operator>>(istream&, char&); extern template istream& operator>>(istream&, char*)
753 名前:デフォルトの名無しさん mailto:sage [2005/07/23(土) 19:33:12 ] template <class T> class foo; template <class T> class baa{ friend foo; int n; public: baa() : n(777){} }; template <class T> class foo : public baa<T>{ int hoge; public: void set_val( baa<T>& arg ){ hoge = arg.n; } }; int main(){ baa<int> b; foo<int> f; f.set_val( b ); return 0; } インデントが全角スペースですいません これだとarg.nにアクセス出来ないのですが、間違っている場所を教えて頂けないでしょうか friend foo; が、やっぱり template <class T> friend foo; なんでしょうか
754 名前:デフォルトの名無しさん mailto:sage [2005/07/23(土) 19:45:24 ] >>753 g++ でコンパイルすると、 :4: error: ISO C++ forbids declaration of `foo' with no type :4: error: `foo' is neither function nor member function; cannot be declared friend まぁそれは置いとくとして、 friend class foo<T>; で通ったよ。
755 名前:753 mailto:sage [2005/07/23(土) 19:59:42 ] >>754 やっぱりclass指定しますよね 書き込む前にチェックしたサイトで、指定が無かったので、自分が間違っていたのかと そうか、再度template <class T>付けるのは馬鹿でした。 VC6なので、Tが同じじゃなかったらアウトだったかも・・・良かった。 本当に助かりました。コンパイルまでして頂いてすいません。ありがとうございました。
756 名前:デフォルトの名無しさん mailto:sage [2005/07/23(土) 20:13:13 ] baaっての…なんかプログラムがアホっぽくなるな。
757 名前:デフォルトの名無しさん mailto:sage [2005/07/23(土) 22:22:39 ] >>755 friend かどうかっていう問題なのか? baa<T>::n が private か protected/public かどうかっていう問題では?
758 名前:デフォルトの名無しさん mailto:sage [2005/07/23(土) 22:47:57 ] >>757 vtableを避けるための小細工なんです 眉をしかめる人が多いと思いますが、自分しか使わないのでお見逃しを
759 名前:デフォルトの名無しさん mailto:sage [2005/07/23(土) 23:36:56 ] >>758 よくわからないな。>>753 のを template <class T> class baa{ protected: int n; public: baa() : n(777){} }; とすると VC6 だと vtable に関して状況が変わるの?
760 名前:デフォルトの名無しさん mailto:sage [2005/07/23(土) 23:51:14 ] 753がprotectedを知らなかったというオチ?
761 名前:デフォルトの名無しさん mailto:sage [2005/07/24(日) 00:21:24 ] >>759 失礼、深読みしすぎてました。 しかしすいません、そうなると>>757 で頂いたレスの意図が分からないです。 protectedすると、引数で他のbaaを受け取ったとき、nにアクセス出来るのでしょうか。
762 名前:760 mailto:sage [2005/07/24(日) 00:40:00 ] 753のコードでは、bar<T>::nがprotectedならfoo<T>::set_valの中でarg.nにアクセスできると思っていたがそうではなかったようだ。 スマソ
763 名前:デフォルトの名無しさん mailto:sage [2005/07/24(日) 01:03:17 ] >>761 アクセスできると思ってた。けど間違ってたのなら失礼。 ・基本 class から 派生 class を public 継承したとき、 ・基本 class の protected member である n について、 ・派生 class から this の n にアクセスできる。 ・派生 class から this 以外の n にアクセスできない。 ということかな?も一回勉強しなおそ。 ・ある class の private member である n について、 ・その class から this の n にアクセスできる。 ・その class から this 以外の n にアクセスできる。 というのは間違いないと思うんだけど。 あと自分の VC7 は、これに関して template class かそうでないかによって コンパイル結果が違うのもよくわからない。
764 名前:デフォルトの名無しさん mailto:sage [2005/07/24(日) 02:17:54 ] 勉強しなおした。>>763 は間違い多数につきスルーよろしく。失礼しますた。
765 名前:デフォルトの名無しさん mailto:sage [2005/07/28(木) 18:38:46 ] Compile-time if で型でなく値を返すにはどうすればいいのでしょうか? int v= boost::mpl::if_c< (sizeof(T) <= sizeof(double)), 10, 20 >::Value はだめでした
766 名前:デフォルトの名無しさん mailto:sage [2005/07/28(木) 19:41:12 ] >>765 boost::mpl::int_ を使って、型にマップすればいい。
767 名前:デフォルトの名無しさん mailto:sage [2005/07/28(木) 19:56:38 ] >>765 struct R0 { enum {value = 10}; }; struct R1 { enum {value = 20}; }; template <typename T> int func () { typedef typename boost::mpl::if_c <(sizeof (T) <= sizeof (double)), R0, R1>::type Result; return Result::value; }
768 名前:デフォルトの名無しさん mailto:sage [2005/07/29(金) 10:42:43 ] template<CONTANER> class CmyContaner { typedef CONTANER::iterator iterator_type; }; としたらコンパイル通らなかったんですが、 CONTANER::iteratorはできないってことなのでしょうか?
769 名前:デフォルトの名無しさん mailto:sage [2005/07/29(金) 11:35:24 ] >>768 -typedef CONTANER::iterator iterator_type; +typedef typename CONTANER::iterator iterator_type;
770 名前:デフォルトの名無しさん mailto:sage [2005/07/29(金) 15:37:41 ] そのままじゃ型名かメンバ変数かわからんからね。 > CONTANER 北斗の拳の主題歌を思い出すスペルミスだな。
771 名前:デフォルトの名無しさん mailto:sage [2005/07/29(金) 16:46:27 ] >>768 ここもだね -template<CONTANER> +template<typename CONTANER>
772 名前:デフォルトの名無しさん [2005/07/30(土) 08:40:48 ] template<Functor> class MyMethod { public: Functor f_ MyMethod(Functor f):f(f_) {} value() { f_(10); } }; class MyClass { public: struct MyFunctor{ operator()(int a) { std::cout << a; }myFunc; //MyMethod<MyFunctor> myMethod(myFunc);//コンパイル通らない MyMethod<MyFunctor> myMethod(MyFunctor);//なぜかコンパイル通る value(){ myMethod.value();//左側がクラス 構造体 共用体でありません と怒られる } }; クラスの中でfunctorを定義したら動かなくなりました。 回避方法はないのでしょうか?
773 名前:デフォルトの名無しさん mailto:sage [2005/07/30(土) 09:48:49 ] >>772 >クラスの中でfunctorを定義したら動かなくなりました。 クラスの外でfunctorを定義したらそれ動く?
774 名前:デフォルトの名無しさん mailto:sage [2005/07/30(土) 13:47:17 ] >772 とりあえず } が 1 個足りない。 } myFunc; の前に 1 個ある、でいいのか? >MyMethod<MyFunctor> myMethod(MyFunctor); これだと MyFunctor 型の引数をとり、MyMethod<MyFunctor> 型を返すメンバ関数 myMethod を 宣言しているんじゃまいか? >//MyMethod<MyFunctor> myMethod(myFunc);//コンパイル通らない なんでメンバ変数を宣言してるのに初期化しようとしてるの? MyMethod<MyFunctor> myMethod; MyClass() : myMethod(myFunc) {} じゃねーのか?あと↑だと myFunc との初期化順序が問題になる場合があるかも。 今回の場合、MyClass() : myMethod(MyFunctor()) でいいような気もするが。
775 名前:772 [2005/07/30(土) 14:59:26 ] すみません } が1つぬけてました。 template<Functor> class MyMethod にclass の外で定義したfunctorを使うと 意図したとうりの動きをすることを確認しています。
776 名前:デフォルトの名無しさん mailto:sage [2005/07/30(土) 15:06:57 ] >>775 >class の外で定義したfunctorを使うと >意図したとうりの動きをすることを確認しています。 本当に? コピペにかなりミスがあると思うよ MyMethod::value() MyClass::MyFunctor::operator()(int a) の返値の型は? もし本当に動くなら処理系を教えてね
777 名前:776 mailto:sage [2005/07/30(土) 15:09:07 ] たぶんこんなことしたいのかな template <typename Functor> struct MyMethod { Functor f_; MyMethod (Functor f): f_(f) {} void value () {f_ (10);} }; struct MyClass { struct MyFunctor { void operator () (int a) { std::cout << a; } } myFunc; MyMethod <MyFunctor> myMethod; MyClass (): myFunc (), myMethod(myFunc) {} void value() {myMethod.value();} };
778 名前:デフォルトの名無しさん mailto:sage [2005/08/02(火) 22:23:20 ] template<X> class CHoge {public: CHoge( X= typeof(x) ) {} }; なんてできないの? 自動で型判別してほしい。 自動判別した型を使ってCompile-time Ifもできるとさらにいいんだけど
779 名前:デフォルトの名無しさん mailto:sage [2005/08/02(火) 23:18:35 ] >>778 >自動で型判別してほしい。 >自動判別した型を使ってCompile-time Ifもできるとさらにいいんだけど これらはできるけど 例で何がしたいのかさっぱり分かりません
780 名前:デフォルトの名無しさん mailto:sage [2005/08/05(金) 23:15:18 ] template< ArrayType > function( ArrayType array) { Compile-time If (ArrayType はポインタの配列?) { int a= array[0]->value; }else{ int a= array[0].value; } こんなことがしたい
781 名前:デフォルトの名無しさん mailto:sage [2005/08/05(金) 23:30:47 ] type_traitsでいいんじゃないの?
782 名前:デフォルトの名無しさん mailto:sage [2005/08/06(土) 00:52:15 ] 個人的には値の配列とポインタの配列を静的多相に扱おうとする行為そのものに 異議を申し立てたい.
783 名前:デフォルトの名無しさん mailto:sage [2005/08/06(土) 02:36:31 ] 次のようなコードが、Visual C++では通るけどGCCでは通りません。 オブジェクトの名前と番号の型を保持する構造体を用意 template<class S,class I> struct Types { typedef S String; typedef I Integer; }; この定義を受け取って型を定義するベースクラスを作成 template<class T> struct Base { typedef typename T::String StringType; typedef typename T::Integer IntegerType; }; そして、これを利用するサブクラスを作成。 template<class T> struct Derived : public Base<T> { StringType name; //!< ここでコンパイルエラー IntegerType number; //!< 同様 }; typedef Types<std::string,int> StdTypes; Derived<StdTypes> derived;
784 名前:デフォルトの名無しさん mailto:sage [2005/08/06(土) 02:38:23 ] 続き 以下のように書けばGCCでもコンパイルは通ります。 typename Derived::StringType name; typename Derived::IntegerType number; こんな面倒な書き方しかできないなら、 わざわざベースクラスにtypedefした意味がないんですが 何かいい方法ありませんか?
785 名前:デフォルトの名無しさん mailto:sage [2005/08/06(土) 02:58:54 ] >>783-784 Base の定義中に typename が必要な理由を知っていれば、無理だと予想が付くだろうに。
786 名前:デフォルトの名無しさん mailto:sage [2005/08/06(土) 07:54:33 ] >>783-784 俺だったら Base::Stringと書けないか Derivedの中にusing Base::String;と書けばStringが使えないか の2つをまず試してみる。これでできるかどうかはもちろんしらんが。
787 名前:デフォルトの名無しさん mailto:sage [2005/08/06(土) 09:04:33 ] Baseを使うなら、 typename Base<T>::StringType name; typename Base<T>::IntegerType number; こうなるから、これこそ、 > わざわざベースクラスにtypedefした意味がない ので、>>784 のやり方が良いだろう。 VC++もそのうち>>783 は駄目になることでしょう。
788 名前:デフォルトの名無しさん mailto:sage [2005/08/06(土) 09:32:41 ] >>784 それVC7.1のバグらしい。 面倒見が良すぎて、typenameを本来ならば書かなければならない 所を、曖昧さがない場合は無くても通してしまう。 VC7.1でもちゃんと typename は書くべき。
789 名前:デフォルトの名無しさん mailto:sage [2005/08/06(土) 12:59:29 ] このスレの難読コードをみて おれにとて C++はなかたことになた
790 名前:デフォルトの名無しさん mailto:sage [2005/08/06(土) 13:03:53 ] そんなだから、未だに君にとってこの程度が「難読コード」なんだよ。
791 名前:デフォルトの名無しさん mailto:sage [2005/08/06(土) 13:07:40 ] 俺もtemplateのコードは可読性が低いと思うよ 唯一の弱点だな
792 名前:デフォルトの名無しさん mailto:sage [2005/08/06(土) 13:32:35 ] テンプレートとC++「本体」って明らかに別の言語だよな。 概念の異なる2つの言語が混在してるんだから、 可読性が低いのは当たり前。
793 名前:デフォルトの名無しさん mailto:sage [2005/08/06(土) 15:19:32 ] >>792 じゃあどういう構文にすればいいよ?
794 名前:デフォルトの名無しさん mailto:sage [2005/08/06(土) 19:15:56 ] 構文の話なのかな。
795 名前:デフォルトの名無しさん mailto:sage [2005/08/06(土) 19:21:27 ] >>784 template<class T> struct Derived : public Base<T> { typedef Base <T> Base_; typedef typename Base_::StringType StringType; typedef typename Base_::IntegerType IntegerType; StringType name; IntegerType number; };
796 名前:デフォルトの名無しさん mailto:sage [2005/08/06(土) 20:27:48 ] >>795 意味無いじゃん。
797 名前:神゜ mailto:sage [2005/08/06(土) 20:49:53 ] そろそろ俺の出番か?
798 名前:デフォルトの名無しさん mailto:sage [2005/08/06(土) 21:04:29 ] >>784 ベースクラスがテンプレート依存でなければ StringType,IntegerType は見えるが、そうでない場合は 795 のように書く必要がある。 実はずっと前の GCC で VC7.1 みたくエラーにならない時期が あったんだが、バージョン上げたらエラーになったんで仕様を 確認したことがあったのを思い出したよ。
799 名前:デフォルトの名無しさん mailto:sage [2005/08/06(土) 23:17:54 ] >>798 2.95あたりは確かそうだったね
800 名前:デフォルトの名無しさん mailto:sage [2005/08/07(日) 16:48:53 ] template<class A> struct Foo { template<class B> struct Bar { }; }; このBarだけを特殊化するのって、GCCでは template<>template<> struct Foo<int>::Bar<int> って書かなきゃならないんだね。 VC++7.1では template<> struct Foo<int>::Bar<int> で通るんだけど、これはバグなのかな?
801 名前:デフォルトの名無しさん mailto:sage [2005/08/07(日) 16:55:26 ] >>800 どっちが規格に準じてるかによるね
802 名前:デフォルトの名無しさん mailto:sage [2005/08/07(日) 17:00:26 ] >>800 14.7.3.17 より "If the declaration of an explicit specialization for such a member appears in namespace scope, the member declaration shall be preceded by a template<> for each enclosing class template that is explicitly specialized." template<> template<> ... と繰り返すのが正解っぽい。
803 名前:デフォルトの名無しさん mailto:sage [2005/08/07(日) 17:10:09 ] >>800 gccを信じてそちらに合わせておけ。
804 名前:デフォルトの名無しさん mailto:sage [2005/08/07(日) 17:27:08 ] >>800 gccのバージョンは何? g++ 3.3.5 だとそれ両方とも通るんだけど 新しいのは通らないのかな?
805 名前:デフォルトの名無しさん mailto:sage [2005/08/07(日) 18:19:07 ] template <class T> typename enable_if<boost::is_integral<T>, void>::type foo(T t) {} で関数を定義したりできないのはわかるけど これでclassのコンストラクターを定義したりしなかったりを決めると コンストラクターに戻り値が定義されています と怒られる。何か方法ないのでしょうか? template <class T> class A{ typename enable_if<boost::is_integral<T>, void>::type A(T t) { } }
806 名前:デフォルトの名無しさん mailto:sage [2005/08/07(日) 18:44:57 ] >>805 SFINAEは戻り値の型でやる方法と(デフォルト)引数の型でやる方法の2通りできて, コンストラクタの場合は戻り値の型を指定できないですから引数の型のほうでやります. template<class T> class T{ A(T t, typename enable_if<boost::is_integral<T> >::type * = 0){} }; こんな感じで.逆に演算子関数の場合は余計なデフォルト引数を指定できないので 戻り値型で,という感じになると思います.
807 名前:デフォルトの名無しさん mailto:sage [2005/08/07(日) 22:38:01 ] enable_ifが何をするもんなのか、未だにわかんねえ。 てか、何年英語の勉強してもboostのドキュメントさえ読めない俺ってすげえよ。 よっぽど英語の才能が無いんだな。
808 名前:デフォルトの名無しさん mailto:sage [2005/08/07(日) 22:41:04 ] テメェは自己紹介がしたいだけだろ 分からねぇんだったらイチイチ出てくんな
809 名前:デフォルトの名無しさん mailto:sage [2005/08/07(日) 22:50:40 ] >>807 SFINAEによるオーバーロードセットのコントロールを簡単に 行うためのユーティリティ。 英語分からなくてもC++分かるんならひたすらソース詠めば 何となく見えてくる、かもよ。
810 名前:デフォルトの名無しさん mailto:sage [2005/08/07(日) 22:53:46 ] >>808 なにキレてんのキミ。 相手以上の駄レス書いてたら意味無いのに。
811 名前:デフォルトの名無しさん mailto:sage [2005/08/07(日) 22:59:07 ] 駄レスとかいってたら、ほとんどがそうだろw
812 名前:デフォルトの名無しさん mailto:sage [2005/08/07(日) 23:00:10 ] ほとんどがそうならなおのこと 突然特定のレスにキレる理由が無いよ。
813 名前:デフォルトの名無しさん mailto:sage [2005/08/07(日) 23:03:27 ] 自己顕示欲丸出しの厨房がウザイだけだろ まあ、どこにでもいるからいちいちキレるのもどうかと思うが
814 名前:デフォルトの名無しさん mailto:sage [2005/08/07(日) 23:16:33 ] キレて説教するほうがよっぽど自己顕示欲激しいと思う。 世に言う自爆ですな。アホくさ。
815 名前:デフォルトの名無しさん mailto:sage [2005/08/07(日) 23:17:52 ] www.boost.org/libs/utility/enable_if.html ここの「1.2 Background」は、何が問題だって言ってるんですか?
816 名前:デフォルトの名無しさん mailto:sage [2005/08/07(日) 23:20:01 ] 説教がどう自己顕示欲につながるんだ??
817 名前:デフォルトの名無しさん [2005/08/07(日) 23:22:14 ] >>814 ワロス
818 名前:デフォルトの名無しさん mailto:sage [2005/08/07(日) 23:29:27 ] >>816 キレるたびにいちいちスレ違いの書き込みするような奴が 自己顕示欲薄いって言い張る気?
819 名前:デフォルトの名無しさん [2005/08/07(日) 23:30:34 ] enable_ifがわからんってののどこが自己顕示欲に繋がるのかもわからんけどな
820 名前:デフォルトの名無しさん [2005/08/07(日) 23:30:49 ] >>818 藻前もキレてるじゃん あと煽り耐性なさ過ぎ いい加減スルーしろよ
821 名前:デフォルトの名無しさん mailto:sage [2005/08/07(日) 23:31:47 ] >>815 いや,そこの部分は別に何かが問題だなんて書いてないです. 単にSFINAEというのがどう機能するか(そしてなぜそのような機能が必要なのか) を説明しているだけです.
822 名前:デフォルトの名無しさん mailto:sage [2005/08/07(日) 23:32:15 ] 816が煽りには見えないけどなあ。 普通にズレてるだけで。
823 名前:デフォルトの名無しさん mailto:sage [2005/08/07(日) 23:32:55 ] >>815 あっと,「もしSFINAEがなければこういうことが問題だよね」というのは書いてますけれど.
824 名前:デフォルトの名無しさん [2005/08/07(日) 23:35:03 ] >>822 分かったからもう出てくんな
825 名前:デフォルトの名無しさん mailto:sage [2005/08/07(日) 23:40:11 ] 本日の推奨NG 「。」「顕示」「煽り」「キレ」 すっきりして(・∀・)イイ!!
826 名前:デフォルトの名無しさん mailto:sage [2005/08/08(月) 02:07:36 ] expressional template VC.net2003だと、ちょっと複雑な式を書いただけで コンパイル通らない。 そういうものなの? gccなら通るのかな
827 名前:デフォルトの名無しさん mailto:sage [2005/08/08(月) 02:12:44 ] >>826 その「ちょっと複雑な式」とやらを晒すとレスが付くかもしれない。
828 名前:デフォルトの名無しさん [2005/08/08(月) 03:35:21 ] >>826 現存する如何なるコンパイラでも通らない程複雑(広義の)なコードに問題ありに100円。
829 名前:デフォルトの名無しさん mailto:sage [2005/08/08(月) 04:40:19 ] ネストが17超えるとか?
830 名前:デフォルトの名無しさん mailto:sage [2005/08/08(月) 15:16:31 ] いろんな要素が混じってるので必ずしもexpressional templateが 原因でないのかもしれないけど boost::numeric::ublas::matrix & A(){return A_ } boost::numeric::ublas::matrix & B(){return B_ } B() = prod( A(), A())*3 + B() + .... こんな感じかな.全部はさらせないのですまそ
831 名前:デフォルトの名無しさん mailto:sage [2005/08/09(火) 01:41:27 ] >>830 エラー貼ったがいいよ もし膨大なら 再現するコンパイル可能な最小のコードを貼って
832 名前:831 mailto:sage [2005/08/09(火) 01:45:25 ] >コンパイル可能な おっとコンパイルは通らないのか >あなたがコンパイル通らないことを理不尽に思う に訂正 ようするにテストする側の身になってコードを 貼ってください
833 名前:デフォルトの名無しさん mailto:sage [2005/08/09(火) 11:45:51 ] >>830 >こんな感じかな.全部はさらせないのですまそ じゃあ、他の人にエラーの原因を調べてもらうのも諦める事ですな。 証拠不十分なまま、証言台に立つような物ですぞ。
834 名前:デフォルトの名無しさん mailto:sage [2005/08/20(土) 08:39:28 ] だれもいない
835 名前:デフォルトの名無しさん mailto:sage [2005/08/20(土) 20:28:20 ] ホントにだれもいないのかよ
836 名前:デフォルトの名無しさん [2005/08/20(土) 20:39:26 ] いねーよ
837 名前:デフォルトの名無しさん mailto:sage [2005/08/20(土) 20:40:28 ] 質問やら話題があれば人は自然と集まってくる。
838 名前:デフォルトの名無しさん mailto:sage [2005/08/20(土) 20:52:57 ] おまえら ”てんぷれーと”にだまされてないか? ”しーぷらぷらのてんぷれーと”って結局あれだよ。 中途半端。 そう中途半端。 LISPに比べたら。 全然読み易くならない。 いろんな括弧であふれてLISPの方がまだサルのように読みやすい。 まあここにタムロしてるおまえらの言い分は判ってるよ こうだろ、静的カタカタ型が重要なんです! LISPじゃすぴーどでないよプププ とかな。 ばーか。 カタなんかより柔軟性なんだよこのご時世はよ カタカタうるせーのなんのって、笑うわ。 C++考えた奴みたいにハゲろ 全員
839 名前:デフォルトの名無しさん mailto:sage [2005/08/20(土) 20:59:39 ] 確かに、「ネイティブコード吐く言語じゃないと速度が」 とか必死に言ってる奴に優秀なプログラマはいないな。
840 名前:デフォルトの名無しさん mailto:sage [2005/08/20(土) 21:10:42 ] しーぷらぷらの処理系。 てんぷれーとバグだらけ。 笑うわ。 いったい何年てんぷれーとやってんだよ おまえらがべんだーの修正待つあいだに おれLISPで新しいマクロどっさり作る 生産性バカたけぇーわLISPはよ LISPはカタないからすぴーどでないよプププて、 そりゃ頭がかてえ証拠だな。 そんな奴は引退したほーがいいんじゃねーかなあ LISPにカタないなら組み込めよ、ハゲども ぶーとすとらっぷとか考えろよ わかるか?ぶーとすとらっぷって。 しーぷらぷらにはそんながいねんはないかもなあ。 最適化なんかやりやすいなーすいすいいけるぜ こんすの海の中にいると不満なんてすぐ解消する それがLISP。 まあ頭のかたいカタカタ野郎は やっぱりC++考えた奴みたいにハゲろ 全員
841 名前:デフォルトの名無しさん mailto:sage [2005/08/20(土) 21:16:51 ] >>839 よりは優秀だけどね。
842 名前:マイク ◆yrBrqfF1Ew mailto:sage [2005/08/20(土) 21:31:32 ] C++をしーぷらぷらなんて言うのは無能。
843 名前:デフォルトの名無しさん mailto:sage [2005/08/20(土) 21:59:52 ] C++でLisp系の俺言語&処理系作るのが最近の俺の趣味なんだが、 なんかこいつの仲間と思われたくないな、恥ずかしくて。
844 名前:デフォルトの名無しさん mailto:sage [2005/08/20(土) 22:59:08 ] >>842 シープラスプラス? それともシーたすたす?
845 名前:デフォルトの名無しさん mailto:sage [2005/08/20(土) 23:33:28 ] しーいんくりめんと
846 名前:デフォルトの名無しさん mailto:sage [2005/08/20(土) 23:43:58 ] C++ 後置ということは、まだ本当のC++にはであてないわけだ
847 名前:デフォルトの名無しさん mailto:sage [2005/08/20(土) 23:45:24 ] C++には出会えている ++Cに出会えてないだけ
848 名前:デフォルトの名無しさん mailto:sage [2005/08/21(日) 00:37:45 ] 838は、C++のテンプレートが読みにくく、 コンパイラのバグのことも分かっていて、 C++作った人物についても詳しいようだな
849 名前:デフォルトの名無しさん mailto:sage [2005/08/21(日) 00:48:03 ] Schemeの純粋指向にはあこがれるけど、Lispはどうでもいいや。 継続は面白いな。 >LISPはカタないからすぴーどでないよプププて、 型が無いと遅くなるつうのは初耳ですが、どこの情報?
850 名前:デフォルトの名無しさん mailto:sage [2005/08/21(日) 01:06:13 ] >>849 VBのバリアント型みたくデータ側に型情報があるから オブジェクトを参照するたびに動的な判定が毎回必要ってことだよ。 型判定に値の取り出しとか最低でもCの3倍以上のコストが掛かる。 Rubyが遅いのもこれがかなり影響してる。
851 名前:デフォルトの名無しさん mailto:sage [2005/08/21(日) 01:09:17 ] でも日本語は不自由なようだ。
852 名前:851 mailto:sage [2005/08/21(日) 01:09:45 ] >>838
853 名前:デフォルトの名無しさん mailto:sage [2005/08/21(日) 01:25:23 ] > オブジェクトを参照するたびに動的な判定が毎回必要ってことだよ。 随分ダサい実装ですね。
854 名前:デフォルトの名無しさん mailto:sage [2005/08/21(日) 01:41:07 ] そのダサイ実装を越えたところに桃源郷が
855 名前:デフォルトの名無しさん mailto:sage [2005/08/21(日) 01:41:43 ] ももげんごう?
856 名前:デフォルトの名無しさん mailto:sage [2005/08/21(日) 12:12:15 ] ももげんごう(←なか変換できない)
857 名前:デフォルトの名無しさん mailto:sage [2005/08/21(日) 14:42:55 ] 桃源郷=Xanadu キサナドゥ
858 名前:デフォルトの名無しさん mailto:sage [2005/08/22(月) 00:38:44 ] >>850 正直、有名なコンパイラならそんなださい実装は少ないよ。 Common Lispには型指定の構文があるくらいだし。
859 名前:デフォルトの名無しさん mailto:sage [2005/08/23(火) 09:18:30 ] 数値計算したい人は 速度気にしないならlistでなくてMatlab使う
860 名前:デフォルトの名無しさん mailto:sage [2005/08/23(火) 15:06:35 ] >>858 CLOS基地外氏ね スレ違いだし
861 名前:デフォルトの名無しさん mailto:sage [2005/08/23(火) 15:34:43 ] だれもいないからとか言うから
862 名前:デフォルトの名無しさん mailto:sage [2005/08/23(火) 16:29:46 ] 人稲杉なので、チラシの裏 boost::bind は、bind( f, _1, _2, a, b, _1 ) を行うことで、 func::return_type ( A1 & a1, A2 & a2 ) というファンクタを返すけど、 この _1 や _2 を、_decimal や、_text、_float のような書式指定プレイスホルダに 置き換えて、以下のようにすれば、タイプセーフな printf が出来るなと 考えたことがあった。 function< void( int ) > f = format( cout, "a = ", _hex, endl ); // ↑ cout << "a=" << %x << endl; と同じ事を行うファンクタを返す。 f( 10 ); // cout << "a=" << hex << 10 << endl; f("aaa"); // コンパイルエラー 上の形とは違うけどその思想に基づいて実際に作ってみたことがある。 でも結局実用では (w)sprintf しか使わなかった。勉強にはなったけどね。 template プログラミングは楽しいけど、冷静なるとしなくていいことまで テンプレート化してたりしていることがあるので気をつけないと。
863 名前:デフォルトの名無しさん mailto:sage [2005/08/23(火) 17:12:40 ] >>862 > 冷静なるとしなくていいことまでテンプレート化してたりしていることがある 昨夜、そんな関数テンプレートを必死で非テンプレート関数に直してた・・・。 数日前に必死で関数テンプレートにした箇所だったのだけど・・・。
864 名前:デフォルトの名無しさん mailto:sage [2005/08/24(水) 12:24:27 ] template<typename X_TYPE> void xxx(X_TYPE x) {} として型の自動認識の手間減らしは多用するな
865 名前:デフォルトの名無しさん mailto:sage [2005/08/24(水) 13:32:40 ] そうね。時々やる。いっそのこと型を書くのはオプションにして MLみたいに型推論してくれればいいのにと思う。
866 名前:デフォルトの名無しさん mailto:sage [2005/08/24(水) 17:50:00 ] C++ 0xだとそんな機能が追加されるとかされないとか。
867 名前:デフォルトの名無しさん [2005/08/28(日) 09:36:27 ] テンプレートがちんぷんかんぷんでまったく理解できない私に 理解できるようになる方法を教えてください。まじで。
868 名前:デフォルトの名無しさん mailto:sage [2005/08/28(日) 11:02:49 ] 引数の型を使うときに決められるんだよ。
869 名前:デフォルトの名無しさん mailto:sage [2005/08/28(日) 11:35:27 ] >>867 騙されたと思ってstd::min()でも使って味噌。
870 名前:デフォルトの名無しさん mailto:sage [2005/08/28(日) 13:22:51 ] せめてstd::vector くらい使わないとありがたみ沸かないだろう。
871 名前:デフォルトの名無しさん mailto:sage [2005/08/28(日) 18:04:02 ] >>867 つ[C++ Templates(英文)]
872 名前:デフォルトの名無しさん mailto:sage [2005/08/29(月) 06:58:30 ] STL バンザイ
873 名前:デフォルトの名無しさん mailto:sage [2005/08/29(月) 21:56:02 ] STLとboostが無かったら俺C++使いつづけて無かったよ。
874 名前:デフォルトの名無しさん mailto:sage [2005/08/29(月) 22:30:29 ] 俺もそうだ。
875 名前:デフォルトの名無しさん mailto:sage [2005/09/03(土) 00:21:09 ] 会社でtemplate使うなって言われたんだけど… 何故?
876 名前:デフォルトの名無しさん mailto:sage [2005/09/03(土) 00:24:13 ] 会社で使いこなせるヤシがいないからと邪推
877 名前:デフォルトの名無しさん mailto:sage [2005/09/03(土) 00:31:06 ] 代わりにLISP使え もっと困るかもな へへ
878 名前:デフォルトの名無しさん mailto:sage [2005/09/03(土) 03:19:35 ] >>875 それは、あなたが馬鹿だからです。
879 名前:デフォルトの名無しさん mailto:sage [2005/09/03(土) 03:26:37 ] お前だけは使うなって言われたなら そうかもしれないけどさ
880 名前:デフォルトの名無しさん mailto:sage [2005/09/03(土) 09:13:41 ] >>875 まともな会社にうつるべし
881 名前:デフォルトの名無しさん mailto:sage [2005/09/03(土) 09:55:32 ] >>875 会社に聞け。 ここで聞くようなやつは>>878 に決定。
882 名前:デフォルトの名無しさん mailto:sage [2005/09/03(土) 10:02:04 ] >>881 なんでそんな必死にこの話題にフタしたがるの? コンプレックスでも刺激された?w
883 名前:デフォルトの名無しさん mailto:sage [2005/09/03(土) 11:09:31 ] >>882 頭、大丈夫か?
884 名前:デフォルトの名無しさん mailto:sage [2005/09/03(土) 14:45:37 ] VC6のプログラム保守してるとかじゃないのか>875
885 名前:デフォルトの名無しさん mailto:sage [2005/09/03(土) 22:33:39 ] >>883 大丈夫だよ。 質問に答えられない誰かさんの頭は大丈夫じゃないみたいだけど。
886 名前:デフォルトの名無しさん mailto:sage [2005/09/04(日) 03:17:12 ] ・移植性重視 ・扱える開発者が少ない or メンテする人が固定とは限らない のどっちかだろうねえ 後者の事情のほうが多いと思うけども
887 名前:デフォルトの名無しさん mailto:sage [2005/09/09(金) 02:16:23 ] 管理職の団塊世代が、ピュアなC以外理解できないとか
888 名前:デフォルトの名無しさん mailto:sage [2005/09/09(金) 22:28:28 ] 名前空間→記述が冗長すぎる テンプレート→制限が多すぎる クラス→継承が可読性を悪化させる その他→コンパイル時間が長すぎる
889 名前:デフォルトの名無しさん mailto:sage [2005/09/09(金) 23:39:18 ] C++→俺が解からない
890 名前:デフォルトの名無しさん mailto:sage [2005/09/09(金) 23:45:15 ] 俺が解からない→みんなも解からない
891 名前:デフォルトの名無しさん mailto:sage [2005/09/10(土) 02:04:02 ] >>886 >移植性重視 templateって移植性下がるの?
892 名前:デフォルトの名無しさん mailto:sage [2005/09/10(土) 02:33:11 ] 例えばGCCと心中するつもりならGCCで動けばOKって人もいるでしょ
893 名前:デフォルトの名無しさん mailto:sage [2005/09/10(土) 02:46:27 ] >>891 ある程度ISO C++に準拠したコンパイラがない環境には移植できなったりだとか。
894 名前:デフォルトの名無しさん mailto:sage [2005/09/10(土) 03:16:30 ] 少なくとも、vc7.1とgccの両方で動くテンプレートくらい書けないと 話にならないと思うけど。
895 名前:デフォルトの名無しさん mailto:sage [2005/09/10(土) 12:53:08 ] VC7.1とgcc3.3以降で動くテンプレート書くのは簡単だろ、どっちもほぼ100%標準準拠なんだから。 むしろVC6とかgcc3.2とかで動くか動かないか判断する方が難しいと思われ。
896 名前:デフォルトの名無しさん mailto:sage [2005/09/10(土) 13:14:28 ] >>895 VC6とgcc3.2以前はもうあきらめた。 というかエラーメッセージすらとんちんかんな時があるのが頭痛い。 昔の仕事のプロジェクトコードのメンテでちょっとしたテンプレート書いてとかで 引っかかると泣きたくなる。
897 名前:デフォルトの名無しさん mailto:sage [2005/09/10(土) 13:25:22 ] >>894-895 まるで、複数コンパイラで有効なテンプレートを書くのが上級者であるかのような言い方だな。 そういった汎用性のあるテンプレートは入門者レベルの機能しか使ってない。 君らは、入門者レベルのテンプレートしか書いたことないんだろ?
898 名前:デフォルトの名無しさん mailto:sage [2005/09/10(土) 13:31:55 ] スレの存在を否定するような行為が、目下のベストな対処法 「技巧に走らない」
899 名前:デフォルトの名無しさん mailto:sage [2005/09/10(土) 14:04:38 ] >>897 > であるかのような言い方だな。 印象だけでものを書く場合、その印象がトンチンカンだと 残りの文章がすべてトンチンカンになるから今後は気をつけな。
900 名前:デフォルトの名無しさん mailto:sage [2005/09/10(土) 14:25:57 ] シンプル伊豆ベスト
901 名前:デフォルトの名無しさん mailto:sage [2005/09/10(土) 15:15:35 ] >>897 「入門者レベル」とか「汎用性のある」とか、 自分が「上級者」じゃない事がバレバレなんですがw まぁ、恥の上塗りだけはしないようになw
902 名前:名無しさん@そうだ選挙に行こう [2005/09/10(土) 18:43:40 ] >>888 つまり、templateに限らずC++は糞だって事で包茎?
903 名前:名無しさん@そうだ選挙に行こう mailto:sage [2005/09/10(土) 19:37:56 ] ていうかお前が包茎。
904 名前:名無しさん@そうだ選挙に行こう mailto:sage [2005/09/10(土) 19:45:33 ] 24時間テレビ C++ は地球を救う
905 名前:名無しさん@そうだ選挙に行こう mailto:sage [2005/09/10(土) 20:09:37 ] >>902 ,904 んなこたーない。
906 名前:名無しさん@そうだ選挙に行こう mailto:sage [2005/09/10(土) 22:11:14 ] >>894 は馬鹿だな。
907 名前:名無しさん@そうだ選挙に行こう mailto:sage [2005/09/11(日) 01:31:57 ] 894は、VC以外でも通るように、typenameちゃんと書けとか その程度の意味じゃねえの?
908 名前:名無しさん@そうだ選挙に行こう mailto:sage [2005/09/11(日) 05:40:17 ] 言語仕様が複雑すぎて処理系が追いつかないのは本末転倒 言語仕様満たしてから最適化とかやれよ馬鹿ベンダーはよ 現実逃避してんじゃねーよ
909 名前:名無しさん@そうだ選挙に行こう [2005/09/11(日) 07:05:25 ] ヒント:需要と供給
910 名前:名無しさん@そうだ選挙に行こう mailto:sage [2005/09/11(日) 09:16:30 ] つまりDelphiが最強ということになるな。
911 名前:名無しさん@そうだ選挙に行こう mailto:sage [2005/09/11(日) 09:37:08 ] Delphi知らないんだけどtemplateみたいなのあるの?
912 名前:名無しさん@そうだ選挙に行こう mailto:sagen [2005/09/11(日) 09:44:31 ] あるか!
913 名前:名無しさん@そうだ選挙に行こう mailto:sage [2005/09/11(日) 09:52:58 ] なぜ怒る・・・。 そこがDelphi信者のコンプレックスなのか?
914 名前:名無しさん@そうだ選挙に行こう mailto:sage [2005/09/11(日) 09:57:55 ] でもDelphiってすごいよね 一代でここまでメジャーになった言語パッケージってないでしょ それともPascalの下積みがあったから?
915 名前:名無しさん@そうだ選挙に行こう mailto:sage [2005/09/11(日) 10:18:13 ] >>914 世間ではC#の方がメジャーだと思うがね。
916 名前:名無しさん@そうだ選挙に行こう mailto:sage [2005/09/11(日) 10:20:04 ] C#は単なるM$の宣伝力だと思うけど
917 名前:名無しさん@そうだ選挙に行こう mailto:sage [2005/09/11(日) 11:13:26 ] >>916 CとかC++から名前の連続性もあるしね。
918 名前:名無しさん@そうだ選挙に行こう mailto:sage [2005/09/11(日) 12:07:50 ] C#なんて使って製品開発とかしてる香具師っているの?
919 名前:名無しさん@そうだ選挙に行こう mailto:sage [2005/09/11(日) 14:40:54 ] 天下のM$がVBで真似したぐらいだからな 当時はRADは斬新な開発環境だった
920 名前:名無しさん@そうだ選挙に行こう mailto:sage [2005/09/11(日) 15:18:44 ] Delphi使いこそプログラマの頂点ということか。
921 名前:名無しさん@そうだ選挙に行こう mailto:sage [2005/09/11(日) 16:34:19 ] Delphiが当初からMS謹製であったならば、VBだ、MFCだ、ATLだ、WTLだ、 STLだ、.Netだ、C#だ、C++/CLIだといったことで右往左往することもなく 10年間一貫とした言語体制、RAD環境、爆速コンパイル、コンポーネント化 による高い生産性等々を皆が維持・共有できたかと思うと残念でならないよ。
922 名前:名無しさん@そうだ選挙に行こう mailto:sage [2005/09/11(日) 16:49:55 ] C#って、Delphi作った香具師が理想の言語として設計したんだろ。 Delphi信者御苦労様w
923 名前:名無しさん@そうだ選挙に行こう mailto:sage [2005/09/11(日) 18:34:04 ] まだDel厨いたのか そろそろ博物館に行けよ
924 名前:名無しさん@そうだ選挙に行こう mailto:sage [2005/09/11(日) 20:14:45 ] 博物館の恐竜が一緒に浮かれて踊ったぜ
925 名前:名無しさん@そうだ選挙に行こう mailto:sage [2005/09/11(日) 23:35:20 ] >>921 STLだけその中で異質だな。
926 名前:デフォルトの名無しさん mailto:sage [2005/09/12(月) 09:47:06 ] 予想通り嫌Del厨が暴れることになったか・・・
927 名前:デフォルトの名無しさん mailto:sage [2005/09/12(月) 11:54:51 ] つか、スレ違いうぜぇですよ?
928 名前:デフォルトの名無しさん mailto:sage [2005/09/12(月) 11:58:56 ] >>924 子門乙
929 名前:デフォルトの名無しさん [2005/09/14(水) 15:45:52 ] template< typename char_type, tepename char_traits > std::basic_ostream< char_type, char_traits >& operator<< ( std::basic_ostream< char_type, char_traits >& stream, const int& value ) { stream << "value = " << value << endl; return stream; } この関数内で文字列リテラル"value = "を char_type がcharなら、"value = " char_type がwcharなら、L"value = " にしたいんですが、どうしたら良いでしょうか?
930 名前:デフォルトの名無しさん mailto:sage [2005/09/14(水) 16:12:57 ] >>929 テンプレートの特殊化か、オーバーライドで解決させる。 ex) inline char const * choice( char const * s, wchar_t const *, char ) { return s; } inline wchar_t const * choice( char const *, wchar_t const * s, wchar_t ) { return s; } stream << choice("value=",L"value=",char_type()) << value << endl;
931 名前:929 mailto:sage [2005/09/14(水) 16:31:48 ] >>930 #define literal_str( char_type, str ) choice( str, L##str, char_type##() ) 付きで採用しますた。 ありがとうございました。
932 名前:デフォルトの名無しさん mailto:sage [2005/09/14(水) 17:21:04 ] >>931 二番目の##は余計。
933 名前:929 mailto:sage [2005/09/14(水) 21:31:05 ] だからなんだよこのタコ助!
934 名前:デフォルトの名無しさん mailto:sage [2005/09/14(水) 22:41:20 ] 確かに余計だな。
935 名前:929 mailto:sage [2005/09/15(木) 00:04:09 ] >>933 >>929 の著作権は私にあります。 なんなら出るとこ出ても・・ と思いましたがきっと>>933 は 私にインスパイヤされて誕生した新種なんでしょう。 今回はかんべんしてやります。
936 名前:デフォルトの名無しさん mailto:sage [2005/09/15(木) 11:53:02 ] template <class T> void f1(T t) { f2(t); } void f2(int) {} int main() { f1(1); } というコードは正しいのでしょうか? VC7.1 ではコンパイル可能で comeau ではコンパイルできません。
937 名前:デフォルトの名無しさん mailto:sage [2005/09/15(木) 12:50:56 ] >>936 comeauだとなんてエラーが出るの?
938 名前:636 mailto:sage [2005/09/15(木) 13:09:16 ] >>637 identifier "f2" is undefined detected during instantiation of "void f1(T) [with T=int]" というエラーです。strict mode のみのようです。 ちなみに、ユーザ定義型の場合は期待通りにコンパイルできました。 template <class T> void f1(T t) { f2(t); } struct a{}; void f2(a) {} namespace adl { struct a{}; void f2(a) {} } int main() { f1(a()); f1(adl::a()); } このコードはコンパイル成功。
939 名前:デフォルトの名無しさん mailto:sage [2005/09/15(木) 14:23:18 ] >>936 gcc3.4.4(MinGW) で、-Wallで通る。
940 名前:デフォルトの名無しさん mailto:sage [2005/09/15(木) 14:26:00 ] >>938 プロトタイプ宣言したら?
941 名前:デフォルトの名無しさん mailto:sage [2005/09/15(木) 14:31:54 ] >>938 f2()のプロトタイプ宣言が必要っぽい。
942 名前:デフォルトの名無しさん mailto:sage [2005/09/15(木) 16:28:36 ] Incompatibilities Between ISO C and ISO C++, David R. Tribble david.tribble.com/text/cdiffs.htm#C90-impl-func ・ Implicit function declarations > C++ does not allow implicit function declarations. It is invalid to call a function > that does not have a previous declaration in scope. > > C99 no longer allows functions to be implicitly declared. > The code above is invalid in both C99 and C++.
943 名前:デフォルトの名無しさん mailto:sage [2005/09/15(木) 17:47:26 ] >>936 標準の (14.6.4.2/1) をそのまま読む限りでは, unqualified name lookup として 解決される名前は point of definition の文脈のみが考慮されて, associated namespaces を用いた名前解決(要するにADL)では,point of definitionと point of instantiation の双方の文脈が考慮されるみたいですね.なので, >>936 の f1(1) という呼び出しにおける f1 中の f2(t) に対する名前解決の場合, unqualified name lookup では f2 の呼び出しを定義している場所(point of definition) からは f2 という名前は解決されないので失敗し,さらに f2(t) は int を引数とした 呼び出しのために associated sets of namespaces and classes も空 (3.4.2/2) の ため,ADL 経由でも f2 は見つからずに,結果 f2(t) という関数呼び出しに対応する 名前の解決が失敗する. 一方で,>>938 の f1(a()) 及び f1(adl::a()) という呼び出しにおける f1 中の f2(t) に対する名前解決の場合,>>936 と同様 unqualified name lookup による名前解決は 失敗する.ところが,a 及び adl::a はユーザ定義型で,各々グローバルと adl が associated namespace になる.この場合,f2(t) という呼び出しが定義されている 場所 (point of definition) と f1 がインスタンス化された場所 (point of instantiation) 双方の文脈が名前解決において考慮される.結果, point of instantiation の文脈で void f2(a) と void adl::f2(adl::a) が visible のため,これらの名前解決が成功する. と,こういう感じだと思います.ちなみに VC++7.1 の挙動は,dependent name だろうが non-dependent name だろうが,ADL 経由だろうがなかろうが,全て point of instantiation の文脈も考慮するという実装になっているための結果で, これは標準に準拠した挙動ではないです.
944 名前:943 mailto:sage [2005/09/15(木) 17:49:27 ] あ,すいません.長々と書きましたけれど結論としては, 936のコードは(標準に準拠していないという意味で)正しくないと思います.
945 名前:936 mailto:sage [2005/09/15(木) 22:07:49 ] >>943 なるほど。 実体化の時点で名前の解決を行っても、 実体化の時点の文脈が考慮されるとは限らないんですね。 皆様、ありがとうございました。
946 名前:デフォルトの名無しさん mailto:sage [2005/09/15(木) 22:41:25 ] template<class T> class Foo { public: ...; private: class Bar { public: ...; bool operator()(const Bar& l, const Bar&r) const; private: T m_value; int misc_info; }; std::multiset<Bar, Bar::Comp> m_bars; }; m_bars の先頭・末尾に番人(misc_value などは他のメ ンバと同様にアクセス可能にしたもの)を導入したいの ですが、どういうアプローチで作れば良いでしょうか?
947 名前:デフォルトの名無しさん mailto:sage [2005/09/16(金) 01:33:46 ] >>946 undeclared identifier `misc_value'
948 名前:デフォルトの名無しさん mailto:sage [2005/09/16(金) 09:43:59 ] >>946 テンプレート関係ないやん。
949 名前:デフォルトの名無しさん mailto:sage [2005/09/18(日) 16:56:08 ] STLportではコンパイルできるけれど、 g++のSTLではエラーが出てしまうようなコードってどんなものがあるでしょうか? vectorやstringくらいしか使ってないんですが、コンパイルでエラーが出ます。。
950 名前:デフォルトの名無しさん mailto:sage [2005/09/18(日) 17:25:59 ] エラーメッセージ書かん奴には答えない
951 名前:デフォルトの名無しさん mailto:sage [2005/09/18(日) 17:33:35 ] >>949 氏ね!
952 名前:デフォルトの名無しさん mailto:age [2005/10/05(水) 16:55:29 ] template<int num, int count> struct power{ enum { value = power<num, count-1>::value * num }; }; template<int num> struct power<num, 1>{ enum { value = num }; }; template<int num> struct power<num, 0>{ enum { value = 0 }; }; template<> struct power<0, 0>{ enum { value = 0 }; }; ∋oノハヽo∈ ( ´D`) <テンプレート ♪ で、計算♪計算♪ age♪ age♪ (つ┳9 (_)┃_) ━§━ § ⌒ヽ〃⌒ヽ〃 int main() { //2の8乗 cout << power<2, 8>::value << endl; return 0; }
953 名前:デフォルトの名無しさん mailto:sage [2005/10/05(水) 18:45:40 ] >template<int num> struct power<num, 0>{ enum { value = 0 }; }; それはどうかと思うぞ。
954 名前:デフォルトの名無しさん mailto:sage [2005/10/05(水) 19:02:12 ] template<int num> struct power<num, 0>{ enum { value = 1 };};
955 名前:デフォルトの名無しさん mailto:sage [2005/10/05(水) 19:13:50 ] <0,0>,<num,1>の特殊化は必要ないな
956 名前:デフォルトの名無しさん mailto:sage [2005/10/05(水) 21:12:57 ] むしろこうしてコンパイル時エラーにしろよ。 template<> struct power<0, 0>{};
957 名前:デフォルトの名無しさん mailto:sage [2005/10/05(水) 21:24:22 ] 0^0って数学的にはどうなるの?
958 名前:ヽ(´ー`)ノ ◆.ogCuANUcE mailto:sage [2005/10/05(水) 22:22:38 ] >>956 n^0 = 1
959 名前:ヽ(´ー`)ノ ◆.ogCuANUcE mailto:sage [2005/10/05(水) 22:23:20 ] スマン。レス番間違えた orz
960 名前:デフォルトの名無しさん mailto:sage [2005/10/05(水) 22:28:09 ] >>957-958 一方で0 ^ n = 0となっているから問題になる。 ところで^と言えばXORの立場が。
961 名前:デフォルトの名無しさん mailto:sage [2005/10/06(木) 12:22:20 ] VC6のtemplate関数ってバグある気がするんだけど... template<typename T> void test(); 引数無し呼んだときに解決できてないみたい... template<typename T> void test(const T&); みたいにすればオーバーロードで解決できるのか、大丈夫みたいなんだが...
962 名前:デフォルトの名無しさん mailto:sage [2005/10/06(木) 12:36:11 ] いまどきそんな化石コンパイラに文句言われても…
963 名前:デフォルトの名無しさん mailto:sage [2005/10/06(木) 13:39:14 ] 化石以前にtemplateに関しては欠陥コンパイラですから・・・
964 名前:デフォルトの名無しさん mailto:sage [2005/10/06(木) 17:42:46 ] そもそもC++コンパイラじゃないですから
965 名前:デフォルトの名無しさん mailto:sage [2005/10/06(木) 22:25:31 ] 少なくともANSI/ISO C++準拠とは言えないな。
966 名前:デフォルトの名無しさん mailto:sage [2005/10/07(金) 04:44:36 ] じゃーVC7はどうですか?
967 名前:デフォルトの名無しさん mailto:sage [2005/10/07(金) 05:23:27 ] 7.1はかなりまとも。
968 名前:デフォルトの名無しさん mailto:sage [2005/10/07(金) 12:23:52 ] 7と7.1は全然違うぞ 7はかなり微妙
969 名前:デフォルトの名無しさん mailto:sage [2005/10/07(金) 13:11:10 ] 7はCStringにバグがあったね。STL周りもちょっと不安定なところがあった気もする。
970 名前:デフォルトの名無しさん mailto:sage [2005/10/07(金) 14:50:27 ] 7.1って具体的にclのどのバージョン? 今 Microsoft(R) 32-bit C/C++ Optimizing Compiler Version 13.10.3077 for 80x86 っての使ってるけど
971 名前:デフォルトの名無しさん mailto:sage [2005/10/07(金) 15:06:35 ] VS.net(VC.net)2003か、VCTK2003のやつが7.1 13.10.3077なら7.1だな。VS.net2003の方のやつだろ。
972 名前:デフォルトの名無しさん mailto:sage [2005/10/14(金) 17:36:27 ] codeguruに記事の投稿してみたがレビュー通んないとだめなんだね
973 名前:デフォルトの名無しさん [2005/10/18(火) 15:57:25 ] age
974 名前:デフォルトの名無しさん mailto:sage [2005/10/26(水) 22:29:10 ] 人稲杉なので、バカネタを投下。 www.hakusi.com/up/src/up5538.zip.html Boost.Lambda みたいに Expression Template を使った、引数に対して安全なフォーマットライブラリ。 Boost.Function や、Boost.Bind と組み合わせることが可能。 以前作成したものと違い、オマケ機能だが入力も可能で、ワイド文字にも対応。 ただ、 _ と % だらけで見た目がキモイ上に、実用性がイマイチ謎。 Expression Template の資料として。 // 出力 string strA, strB; sprint( strA, "1 " % !_x[6] % "/" % _s, 10, "aaaa" ); // sprintf( str, "%#6x/%s", 10, "aaaa" ); みたいな。 sprint( strB, "2 " % (!_x[6]*='0') % "/" %_s, 10, "aaaa" ); // sprintf( str, "%#06x", 10, "aaaa" ); みたいな。 cout << strA << endl; // 1 0xa/aaaa と出力 cout << strB << endl; // 2 0x000a/aaaa と出力 // 入力 int xA, xB; string yA, yB; sscan( strA, "1 " % _ws % _x % "/" % _s, xA, yA ); // 空白部分はスキップさせる sscan( strB, "2 " % _x % "/" % _s[3], xB, yB ); // 文字列部分は3文字のみ取得 // 出力 print( cout, "xA = " % _d % "\nyA = " % _s % _endl, xA, yA ); print( cout, "xB = " % _d % "\nyB = " % _s % _endl, xB, yB ); // xA = 10 // yA = aaaa // xB = 10 // yB = aaa と出力
975 名前:デフォルトの名無しさん mailto:sage [2005/10/27(木) 00:15:14 ] >>974 せっかくなので便乗しておきますね.将来の話なのでアレですけれど. www.open-std.org/jtc1/sc22/wg21/docs/papers/2004/n1603.pdf
976 名前:デフォルトの名無しさん mailto:sage [2005/10/29(土) 10:05:49 ] 難読コンテスト会場はここですか?
977 名前:デフォルトの名無しさん [2005/10/31(月) 13:08:43 ] >>974 すげー--w 確かに scanf っぽいこと出来るし。 でも、Perl みたいで汚いな。使おうとは思わんけど。
978 名前:デフォルトの名無しさん mailto:sage [2005/10/31(月) 13:59:50 ] >>974 マジキモス
979 名前:デフォルトの名無しさん mailto:sage [2005/11/02(水) 14:02:41 ] >>974 良くこんなん書く気になるなあ。
980 名前:デフォルトの名無しさん mailto:sage [2005/11/02(水) 14:40:35 ] >>975 boostな人達はあれば便利だけど、一般人的にはどうなのかなあ?
981 名前:デフォルトの名無しさん mailto:sage [2005/11/02(水) 16:19:39 ] >>980 どの辺が便利なのか理解に苦しむ。
982 名前:デフォルトの名無しさん mailto:sage [2005/11/03(木) 13:49:05 ] >>980 型安全な printf, scanf というのが一番インパクトが大きいと思います. 後,lambda のような(擬似的な)可変長テンプレート引数を使ったライブラリの コンパイル時メッセージが見やすくなるというのもあるかと. >>981 Boost な人にとっては,これまでプリプロセッサなどで力技で実装していた Function, Tuple, MPL, Lambda など多くのライブラリの実装が 非常に楽に見通しよく実装できるようになり,便利になると思います.
983 名前:デフォルトの名無しさん mailto:sage [2005/11/03(木) 15:15:01 ] >>982 コンパイルエラーなどたいして問題じゃないけどね。 それよりもデバッグの方が大変。
984 名前:デフォルトの名無しさん mailto:sage [2005/11/03(木) 15:19:33 ] 変な拡張するより単にプリプロセッサを名前空間対応にすればいいだけちがうの?
985 名前:デフォルトの名無しさん mailto:sage [2005/11/03(木) 15:30:42 ] >>984 それじゃプリプロセッサにならないでしょ。
986 名前:デフォルトの名無しさん mailto:sage [2005/11/03(木) 17:19:51 ] え、C/C++のプリプロセッサってトークン理解してるはずなんだけどなあ。 商用じゃプリプロセスと同時に解析するのが主流だし。 テンプレート引数程度の局所的変更じゃ根本的解決にならないでしょ。
987 名前:デフォルトの名無しさん mailto:sage [2005/11/03(木) 17:26:54 ] 名前空間を通常のものとプリプロセッサで共有しようとすると 泥沼になる気がする。(例えば # define STD_BEGIN namespace std{ とか) pp専用の名前空間ならwaveが実験的に対応している。
988 名前:デフォルトの名無しさん mailto:sage [2005/11/03(木) 22:37:23 ] プリプロセッサと言えば、C++/CLIでとんちきな拡張してるよ。 スペース区切りキーワードってやつ。 www.microsoft.com/japan/msdn/vs05/visualc/TransGuide.asp
989 名前:デフォルトの名無しさん mailto:sage [2005/11/04(金) 00:29:44 ] プリプロセッサと本体の間のフォーマットってANSIか何かで標準規格ある? #132 "hogehote.h" たいていはこんなの出るんだよね?
990 名前:デフォルトの名無しさん mailto:sage [2005/11/04(金) 01:08:57 ] 次スレ立てて良いですか?
991 名前:デフォルトの名無しさん mailto:sage [2005/11/04(金) 01:21:16 ] C++相談室で十分だと思うんだ。
992 名前:デフォルトの名無しさん mailto:sage [2005/11/04(金) 01:32:58 ] ハゲドー 一年もかかってやっと1スレなペースだし
993 名前:デフォルトの名無しさん mailto:sage [2005/11/04(金) 01:40:20 ] >>983 > コンパイルエラーなどたいして問題じゃないけどね。 断言君さようなら
994 名前:デフォルトの名無しさん mailto:sage [2005/11/04(金) 11:26:29 ] 断言君だって。なにその俺様用語w オナニーマクロだらけの糞コード書いてる奴は 日本語にもそれが出るね。
995 名前:デフォルトの名無しさん mailto:sage [2005/11/04(金) 12:12:24 ] 断言君 の検索結果 約 926,000 件中 1 - 10 件目 (0.27 秒)
996 名前:デフォルトの名無しさん mailto:sage [2005/11/04(金) 12:25:58 ] 俺も>>983 を支持する。 ランタイムエラーが恐ろしいのであって、 コンパイルエラーなどコンパイラとの対話交渉に過ぎない。
997 名前:デフォルトの名無しさん mailto:sage [2005/11/04(金) 13:14:27 ] てかさ、コンパイルエラーが出てたら、 そもそも実行ファイルはビルドされて無いんじゃないか? ワーニングなら分かるけど。
998 名前:デフォルトの名無しさん mailto:sage [2005/11/04(金) 13:49:38 ] つぎスレ立てるかどうか迷っているんだが このスレのタイトルをよく吟味したら 「統合」:いくつかの物を一つにまとめあわせること このように辞書では出ている。 つーことは「STL相談室」も「BOOSTを語れ」も入らないよーな気がした。 それとも、ここのつぎスレが要らないのか? そんな疑問を抱いてしまって、俺には次スレを立てる勇気がない。 さあ。次をたてる勇者はだれか。
999 名前:デフォルトの名無しさん mailto:sage [2005/11/04(金) 13:53:56 ] boostは微妙だがSTLスレもこのスレも必要なし あっても混乱するだけ
1000 名前:デフォルトの名無しさん mailto:sage [2005/11/04(金) 14:02:28 ] STLを使うと実行ファイルのサイズが10倍になるから スレは統合すべきだと思います。
1001 名前:1001 [Over 1000 Thread] このスレッドは1000を超えました。 もう書けないので、新しいスレッドを立ててくださいです。。。