1 名前:v(^・^)v mailto:sage [2010/02/13(土) 23:18:03 ] C++に関する質問やら話題やらはこちらへどうぞ。 ただし質問の前にはFAQに一通り目を通してください。 IDE (VC++など)などの使い方の質問はその開発環境のスレに お願いします。 前スレ C++相談室 part77 pc12.2ch.net/test/read.cgi/tech/1263556932/
910 名前:デフォルトの名無しさん mailto:sage [2010/03/14(日) 23:18:09 ] >>905 まず、has_swap<T>はどんな型にも適合するのでhas_swap<hoge>の実体化が行われる。 コンパイラはhas_swap<hoge>の基底クラスとして、has_swap_impl<hoge, void>を実体化しようとする。 なお、has_swap_implの第2テンプレート引数は省略されているのでデフォルトのvoidが使われる。 has_swap_impl<hoge, void>を実体化しようとした際に、 コンパイラはまず、より特殊化されたバージョンである 14行目のバージョンに適合するかのチェックを行う。 ここで問題は、typename has_swap_helper<T, &T::swap>::type が void と一致するかどうか。 ・メンバ関数としてvoid T::swap(T&)が存在するならば、has_swap_helperのテンプレート引数が確定し、 かつ4行目のテンプレートに適合するので、4行目のテンプレートが実体化され、voidになる。 すると、has_swap_impl<hoge, void>は14行目のバージョンに適合する。 ・void T::swap(T&)が存在しないならば、適合するhas_swap_helperは「存在しない」。 通常の感覚ならばエラーになりそうだが、 SFINAEの規則によってエラーとはならず、 単に14行目のバージョンが候補から除外される。 コンパイラは次に9行目のバージョンの実体化を行おうとする。 9行目は何でも適合するので、has_swap_impl<fuga, void>は9行目のバージョンに適合する。 あくまでもhas_swap_impl<hoge, void>がどれにマッチするかが問題なので、 たとえば6行目のtypedefをintに変えたりするとダメ (その場合、9行目を class U = int にすればいい)
911 名前:デフォルトの名無しさん mailto:sage [2010/03/14(日) 23:20:30 ] っていうオーバーロード解決に至るまでの経過を出力してくれるコンパイラないかなぁ 特殊化とかADLとか絡んでついていけない時がままある
912 名前:デフォルトの名無しさん mailto:sage [2010/03/14(日) 23:25:19 ] 言い出しっぺの法則発動
913 名前:デフォルトの名無しさん mailto:sage [2010/03/14(日) 23:33:42 ] あ、>>910 間違えてた。 誤) ・void T::swap(T&)が存在しないならば、適合するhas_swap_helperは「存在しない」。 正) ・void T::swap(T&)が存在しないならば、has_swap_helperのテンプレート引数が確定しない。
914 名前:デフォルトの名無しさん mailto:sage [2010/03/14(日) 23:34:08 ] #include <stdio.h> #include <stdlib.h> #include <string.h> typedef struct TestData { int id; char *name; char *sp; char *sx; int nr_param; char *param; } TestData; #define PARA(max,at,sp) ":" #max "," #at "," #sp static TestData test_array[] = { { 1, "NA", "SpA", "M", 3, PARA(0, 0, 1) PARA(2, 3, 4) PARA(5, 6, 7), }, { 2, "NB", "SpB", "???", 1, PARA(1, 2, 3), }, }; void dump_testdata(TestData *t) { int i; const char *p; printf(" Id:%d, Name:%s, Sp:%s, Sx:%s\n", t->id, t->name, t->sp, t->sx); p = t->param; for ( i = 0; i < t->nr_param ;i++) { int m, a, s; m = atoi(p = strchr(p, ':')+1); a = atoi(p = strchr(p, ',')+1); s = atoi(p = strchr(p, ',')+1); printf(" param: max:%d, attack:%d, speed:%d\n", m, a, s); } } int main(void) { dump_testdata(&test_array[0]); dump_testdata(&test_array[1]); return 0; }
915 名前:デフォルトの名無しさん mailto:sage [2010/03/14(日) 23:35:40 ] アンカー消えた。 >>914 は >>852 これくらいしか思いつかん。
916 名前:デフォルトの名無しさん mailto:sage [2010/03/14(日) 23:57:05 ] >>907 ,910 どうもありがとう、なんとなくわかってきた なるべく特殊化が強いのを優先的にリストアップして最初に合致したやつを使うということですね
917 名前:デフォルトの名無しさん mailto:sage [2010/03/15(月) 00:03:50 ] C++使ってちょうど2年半の者です。 テンプレートメタプログラミングって とても難解そうで ほとんど学んでいないのですが、 例えば>>890 さんの場合ですとどうすればいいことになるのでしょうか。 どなたかコードを(boost::mplのような出来合いのライブラリを 使用せずに)書いてくださいませんでしょうか。 よろしくお願いします。
918 名前:デフォルトの名無しさん mailto:sage [2010/03/15(月) 00:19:42 ] >>917 最近、C++を勉強し始めたからテンプレートを勉強していないんだけど こんな難しそうなのを「みんな出きるのか〜」とビビってたぜ あぁ〜安心した
919 名前:デフォルトの名無しさん mailto:sage [2010/03/15(月) 00:24:32 ] メタプロはライブラリ作者のためのものと言い切っても過言ではない 知ってても使う場面は実はそれほど多くない(なくても実装できることが多い)し 使える場面だとしてもすでにできの良いライブラリがあるからそっちを使うことになる
920 名前:デフォルトの名無しさん mailto:sage [2010/03/15(月) 00:24:39 ] これは静的(コンパイル時)なのか動的(実行時)なのか とかを意識すると多少理解が楽になる
921 名前:デフォルトの名無しさん mailto:sage [2010/03/15(月) 00:35:15 ] >>917 boost::mplを使えるようになれば自然と覚えられるよ。
922 名前:デフォルトの名無しさん mailto:sage [2010/03/15(月) 01:13:45 ] こういうこと言うと否定されるのかもしれないけど TMPって出来合いのライブラリを使うプログラミングだと思う 自分でメタ関数やシーケンスをフル実装してる奴とかいるのかね そういやTMPの本が出版されたんだっけ?
923 名前:デフォルトの名無しさん mailto:sage [2010/03/15(月) 01:19:46 ] templateでメタプログラミングするのが嫌なら別の方法でメタプログラミングすればいいよ。 template使ってる人は型レベルとの相性が良い(というか型レベルそのものだ)から好きで使ってるだけ。
924 名前:デフォルトの名無しさん mailto:sage [2010/03/15(月) 05:19:50 ] >>917 自信ないけどこんなんでどうか ttp://codepad.org/jyhjFg0S ところで、こういうのって、boolでやるのと struct true_tag {}; struct false_tag {}; とかを定義してやるのと、どっちがいいんだろ?
925 名前:デフォルトの名無しさん mailto:sage [2010/03/15(月) 06:57:33 ] >>917 これでいいっしょ。 template<typename T, bool b> void foo_impl(const T &arg) { func_true(arg); } template<typename T> void foo_impl<T, false>(const T &arg) { func_false(arg); } template<typename T> void foo(const T& arg) { foo_impl<T, T::hoge_flag>(arg); } まあTMPなんて必要性が感じられなければ無理に使うような物でもないと思うよ。 付け焼刃の知識では早々使えるコードが出てくることもない。 何に使えるのかわかってからでも使い始めるのは遅くない。 まずは既存のコードでどう使われているのか観察することだな。
926 名前:917 mailto:sage [2010/03/15(月) 10:53:59 ] みなさんありがとうございます。 C++0xではテンプレートメタプログラミングをサポートするためだけにあるような 機能が増えると伺っておりましたので、そろそろ勉強し始めるときが 来たような気がしています。
927 名前:デフォルトの名無しさん mailto:sage [2010/03/15(月) 12:28:21 ] >>922 そうだとおもう。テンプレートは作るのは地獄だけど、使うのは楽になるように作るように心がけてる。 関数テンプレートなんか型推論で殆ど型引数を書かなくてすむのに正しいコードが出るんだから、丁寧に作った関数テンプレートは使う側にとって大きなメリットがあると思う。
928 名前:デフォルトの名無しさん mailto:sage [2010/03/15(月) 13:17:19 ] >>927 お前はテンプレートメタプログラミングってなんだか理解しているのか? > 関数テンプレートなんか型推論で殆ど型引数を書かなくてすむのに > 正しいコードが出るんだから、丁寧に作った関数テンプレートは > 使う側にとって大きなメリットがあると思う。 >>922 もみんなもテンプレートメタプログラミングの話をしているんだけど。。。
929 名前:928 mailto:sage [2010/03/15(月) 13:18:35 ] ああ、分かった。 >>927 はTMPがTeMPlateの略だと思ってた訳か。 これで文脈が繋がった。
930 名前:デフォルトの名無しさん mailto:sage [2010/03/15(月) 15:19:03 ] ネットの画像のURLから隠しフォルダ「Temporary Internet Files\Content.IE5」以下に検索をかけてファイルを見つけようとしています。 ファイルは見つかるんですが、a.com/aa.jpg からだとファイル名はaa[1].jpgになっています。 zzzzzz.com/aa.jpg とではファイル名の区別がつきません。Temporary Internet Filesのファイルをプロパディで 見るとURLの情報が解るのですが、この情報を参照できるような関数や方法ってありませんか?
931 名前:デフォルトの名無しさん mailto:sage [2010/03/15(月) 17:08:24 ] 環境依存OKなスレで聞きなよ
932 名前:930 mailto:sage [2010/03/15(月) 17:21:02 ] >>931 もしかして自分だけですかね?Temporary Internet Filesの特性かと思っていました。
933 名前:デフォルトの名無しさん mailto:sage [2010/03/15(月) 17:31:05 ] それで?C++という言語の何を訊きたいの?
934 名前:デフォルトの名無しさん mailto:sage [2010/03/15(月) 17:35:21 ] return static_cast<931::環境依存>(930の悩み); //invalid static_cast form type "932.オレだけ?" to type "世界平和"
935 名前:930 mailto:sage [2010/03/15(月) 17:52:06 ] C++で作って詰まって短絡的に聞いてしまいました、すみません。 D:\Temporary Internet Files\Content.IE5を見たところindex.datがあるので、ここでファイルとアドレスを関連付けて \Temporary Internet Filesに表示させてる? datをC++で読み込んで目当てのファイルを見つけることは可能でしょうか?
936 名前:デフォルトの名無しさん mailto:sage [2010/03/15(月) 18:01:30 ] _,,_ /´o ヽ ,.ィゝ l  ̄ヽ l l ヽ___ / ,,...---`ニニニ==、,,__ l / ヽ ヽ ヽ ヽ ヽ ヽ ヽ l三三三> | iヽ ヽ ヽ ヽ ヽ ヽ ヽ/三三/''ー- 、 ヽ. ヽ、ヽ ヽ ヽ ヽ ヽ.∠三=‐''´>‐--‐' ヽ、`'''ー‐---‐'''´_,,...--‐'''´ `''ーッ--t_,r'''´ _/._/
937 名前:デフォルトの名無しさん mailto:sage [2010/03/15(月) 18:33:35 ] >>935 そうでなくて、Windowsという環境依存なプログラムについては「環境依存OKなスレで聞きなよ」ってことでしょ
938 名前:デフォルトの名無しさん mailto:sage [2010/03/15(月) 18:56:25 ] >>930 【初心者歓迎】C/C++室 Ver.71【環境依存OK】 pc12.2ch.net/test/read.cgi/tech/1264774545/l50
939 名前:930 mailto:sage [2010/03/15(月) 19:00:08 ] スレチですね。見当違いですみません…
940 名前:デフォルトの名無しさん mailto:sage [2010/03/15(月) 20:13:17 ] >>925 二つ目のfoo_impl()はコンパイルエラー起こすだろ 関数テンプレートで部分的特殊化は無理
941 名前:デフォルトの名無しさん mailto:sage [2010/03/15(月) 21:25:05 ] STLのvecterの配列に対してクイックソートを組んだんですが動きません ソース : codepad.org/YM2RidkL 47、48行目の再帰処理のあたりが原因だと思うのですが、誰か助けてください
942 名前:デフォルトの名無しさん mailto:sage [2010/03/15(月) 21:55:20 ] 勘だけど 43、44行目あたりかな
943 名前:デフォルトの名無しさん mailto:sage [2010/03/15(月) 22:01:47 ] 見た感じだと44行目か36行目のどっちかだな
944 名前:デフォルトの名無しさん mailto:sage [2010/03/15(月) 22:10:03 ] 見てないけど44行目かな
945 名前:デフォルトの名無しさん mailto:sage [2010/03/15(月) 22:14:34 ] どうみても44が--
946 名前:デフォルトの名無しさん mailto:sage [2010/03/15(月) 22:45:42 ] >>944 > 見てないけど おいw
947 名前:デフォルトの名無しさん mailto:sage [2010/03/15(月) 23:16:01 ] >>871 です >>876 ありがとうございます、一番参考になりました 近日中に都会に出かけるのでwあったら立ち読み&購入検討してきます 何度かパーサを書く仕事をしたので、どうしてもライブラリより構文に目が行ってしまいます 最近はそういうの流行らないみたいですね もはやIBM流の構文チャート?やBNFで定義できるような言語じゃないとは 噂で聞いてはおりますが…
948 名前:デフォルトの名無しさん mailto:sage [2010/03/16(火) 00:23:47 ] >>941 添え字10のアクセス違反って出てるじゃん m_array[9]に値入れた後にjをインクリメントしてるんだろ >>947 は組み込み自体やった事なさそうな感じ
949 名前:デフォルトの名無しさん mailto:sage [2010/03/16(火) 02:36:50 ] class hoge { const fuga &f; public: hoge() : f(fuga_sub()) { } }; const参照はテンポラリオブジェクトを束縛すると聞いたんですが、↑のようにするとバグります。なぜなんでしょうか?
950 名前:デフォルトの名無しさん mailto:sage [2010/03/16(火) 02:37:50 ] fはhogeのコンストラクタスコープでしか生きてないインスタンスをさしてるから
951 名前:デフォルトの名無しさん mailto:sage [2010/03/16(火) 05:58:00 ] >>948 ええ、組み込みは初めてです 使ってもいいライブラリはサンプル等あるんで問題ないんですが コンストラクタの初期化リストなんて初めて見ました トッパンのC++の本なら昔買いましたが、今更役に立ちませんよねw
952 名前:デフォルトの名無しさん mailto:sage [2010/03/16(火) 07:58:42 ] >>949 初期化リストで使った場合、コンストラクタの終わりまでしか延命されない。 規格の 12.2 p5 より。 > ... A temporary bound to a reference member in a constructor's ctor-initializer > persists until the constructor exits. ... その特別ルールが役に立つのはほぼ自動変数だけ。