C++相談室 part78 ..
[2ch|▼Menu]
910:デフォルトの名無しさん
10/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:デフォルトの名無しさん
10/03/14 23:20:30
っていうオーバーロード解決に至るまでの経過を出力してくれるコンパイラないかなぁ
特殊化とかADLとか絡んでついていけない時がままある

912:デフォルトの名無しさん
10/03/14 23:25:19
言い出しっぺの法則発動

913:デフォルトの名無しさん
10/03/14 23:33:42
あ、>>910間違えてた。
誤) ・void T::swap(T&)が存在しないならば、適合するhas_swap_helperは「存在しない」。
正) ・void T::swap(T&)が存在しないならば、has_swap_helperのテンプレート引数が確定しない。

914:デフォルトの名無しさん
10/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:デフォルトの名無しさん
10/03/14 23:35:40
アンカー消えた。
>>914>>852

これくらいしか思いつかん。


916:デフォルトの名無しさん
10/03/14 23:57:05
>>907,910
どうもありがとう、なんとなくわかってきた
なるべく特殊化が強いのを優先的にリストアップして最初に合致したやつを使うということですね

917:デフォルトの名無しさん
10/03/15 00:03:50
C++使ってちょうど2年半の者です。

テンプレートメタプログラミングって
とても難解そうで ほとんど学んでいないのですが、
例えば>>890さんの場合ですとどうすればいいことになるのでしょうか。

どなたかコードを(boost::mplのような出来合いのライブラリを
使用せずに)書いてくださいませんでしょうか。

よろしくお願いします。


918:デフォルトの名無しさん
10/03/15 00:19:42
>>917
最近、C++を勉強し始めたからテンプレートを勉強していないんだけど
こんな難しそうなのを「みんな出きるのか〜」とビビってたぜ

あぁ〜安心した

919:デフォルトの名無しさん
10/03/15 00:24:32
メタプロはライブラリ作者のためのものと言い切っても過言ではない
知ってても使う場面は実はそれほど多くない(なくても実装できることが多い)し
使える場面だとしてもすでにできの良いライブラリがあるからそっちを使うことになる

920:デフォルトの名無しさん
10/03/15 00:24:39
これは静的(コンパイル時)なのか動的(実行時)なのか
とかを意識すると多少理解が楽になる

921:デフォルトの名無しさん
10/03/15 00:35:15
>>917
boost::mplを使えるようになれば自然と覚えられるよ。


922:デフォルトの名無しさん
10/03/15 01:13:45
こういうこと言うと否定されるのかもしれないけど
TMPって出来合いのライブラリを使うプログラミングだと思う
自分でメタ関数やシーケンスをフル実装してる奴とかいるのかね

そういやTMPの本が出版されたんだっけ?

923:デフォルトの名無しさん
10/03/15 01:19:46
templateでメタプログラミングするのが嫌なら別の方法でメタプログラミングすればいいよ。
template使ってる人は型レベルとの相性が良い(というか型レベルそのものだ)から好きで使ってるだけ。

924:デフォルトの名無しさん
10/03/15 05:19:50
>>917
自信ないけどこんなんでどうか
URLリンク(codepad.org)

ところで、こういうのって、boolでやるのと
struct true_tag {};
struct false_tag {};
とかを定義してやるのと、どっちがいいんだろ?

925:デフォルトの名無しさん
10/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
10/03/15 10:53:59
みなさんありがとうございます。

C++0xではテンプレートメタプログラミングをサポートするためだけにあるような
機能が増えると伺っておりましたので、そろそろ勉強し始めるときが
来たような気がしています。


927:デフォルトの名無しさん
10/03/15 12:28:21
>>922
そうだとおもう。テンプレートは作るのは地獄だけど、使うのは楽になるように作るように心がけてる。

関数テンプレートなんか型推論で殆ど型引数を書かなくてすむのに正しいコードが出るんだから、丁寧に作った関数テンプレートは使う側にとって大きなメリットがあると思う。

928:デフォルトの名無しさん
10/03/15 13:17:19
>>927
お前はテンプレートメタプログラミングってなんだか理解しているのか?

> 関数テンプレートなんか型推論で殆ど型引数を書かなくてすむのに
> 正しいコードが出るんだから、丁寧に作った関数テンプレートは
> 使う側にとって大きなメリットがあると思う。
>>922もみんなもテンプレートメタプログラミングの話をしているんだけど。。。


929:928
10/03/15 13:18:35
ああ、分かった。

>>927はTMPがTeMPlateの略だと思ってた訳か。
これで文脈が繋がった。


930:デフォルトの名無しさん
10/03/15 15:19:03
ネットの画像のURLから隠しフォルダ「Temporary Internet Files\Content.IE5」以下に検索をかけてファイルを見つけようとしています。
ファイルは見つかるんですが、URLリンク(a.com)からだとファイル名はaa[1].jpgになっています。

URLリンク(zzzzzz.com) とではファイル名の区別がつきません。Temporary Internet Filesのファイルをプロパディで
見るとURLの情報が解るのですが、この情報を参照できるような関数や方法ってありませんか?

931:デフォルトの名無しさん
10/03/15 17:08:24
環境依存OKなスレで聞きなよ

932:930
10/03/15 17:21:02
>>931
もしかして自分だけですかね?Temporary Internet Filesの特性かと思っていました。

933:デフォルトの名無しさん
10/03/15 17:31:05
それで?C++という言語の何を訊きたいの?

934:デフォルトの名無しさん
10/03/15 17:35:21
return static_cast<931::環境依存>(930の悩み); //invalid static_cast form type "932.オレだけ?" to type "世界平和"

935:930
10/03/15 17:52:06
C++で作って詰まって短絡的に聞いてしまいました、すみません。
D:\Temporary Internet Files\Content.IE5を見たところindex.datがあるので、ここでファイルとアドレスを関連付けて
\Temporary Internet Filesに表示させてる? datをC++で読み込んで目当てのファイルを見つけることは可能でしょうか?


936:デフォルトの名無しさん
10/03/15 18:01:30
     _,,_
     /´o ヽ
   ,.ィゝ     l   
    ̄ヽ     l
       l     ヽ___
     /  ,,...---`ニニニ==、,,__
     l  / ヽ ヽ ヽ ヽ ヽ ヽ ヽ l三三三>
      |  iヽ ヽ ヽ ヽ ヽ ヽ ヽ/三三/''ー- 、
     ヽ. ヽ、ヽ ヽ ヽ ヽ ヽ.∠三=‐''´>‐--‐'
       ヽ、`'''ー‐---‐'''´_,,...--‐'''´
         `''ーッ--t_,r'''´
        _/._/

937:デフォルトの名無しさん
10/03/15 18:33:35
>>935
そうでなくて、Windowsという環境依存なプログラムについては「環境依存OKなスレで聞きなよ」ってことでしょ

938:デフォルトの名無しさん
10/03/15 18:56:25
>>930

【初心者歓迎】C/C++室 Ver.71【環境依存OK】
スレリンク(tech板)l50


939:930
10/03/15 19:00:08
スレチですね。見当違いですみません…

940:デフォルトの名無しさん
10/03/15 20:13:17
>>925
二つ目のfoo_impl()はコンパイルエラー起こすだろ
関数テンプレートで部分的特殊化は無理

941:デフォルトの名無しさん
10/03/15 21:25:05
STLのvecterの配列に対してクイックソートを組んだんですが動きません

ソース : URLリンク(codepad.org)
47、48行目の再帰処理のあたりが原因だと思うのですが、誰か助けてください

942:デフォルトの名無しさん
10/03/15 21:55:20
勘だけど 43、44行目あたりかな

943:デフォルトの名無しさん
10/03/15 22:01:47
見た感じだと44行目か36行目のどっちかだな

944:デフォルトの名無しさん
10/03/15 22:10:03
見てないけど44行目かな

945:デフォルトの名無しさん
10/03/15 22:14:34
どうみても44が--

946:デフォルトの名無しさん
10/03/15 22:45:42
>>944
> 見てないけど
おいw


947:デフォルトの名無しさん
10/03/15 23:16:01
>>871です
>>876
ありがとうございます、一番参考になりました
近日中に都会に出かけるのでwあったら立ち読み&購入検討してきます

何度かパーサを書く仕事をしたので、どうしてもライブラリより構文に目が行ってしまいます
最近はそういうの流行らないみたいですね

もはやIBM流の構文チャート?やBNFで定義できるような言語じゃないとは
噂で聞いてはおりますが…

948:デフォルトの名無しさん
10/03/16 00:23:47
>>941
添え字10のアクセス違反って出てるじゃん
m_array[9]に値入れた後にjをインクリメントしてるんだろ

>>947は組み込み自体やった事なさそうな感じ

949:デフォルトの名無しさん
10/03/16 02:36:50
class hoge
{
const fuga &f;
public:
hoge() : f(fuga_sub())
{
}
};

const参照はテンポラリオブジェクトを束縛すると聞いたんですが、↑のようにするとバグります。なぜなんでしょうか?

950:デフォルトの名無しさん
10/03/16 02:37:50
fはhogeのコンストラクタスコープでしか生きてないインスタンスをさしてるから

951:デフォルトの名無しさん
10/03/16 05:58:00
>>948
ええ、組み込みは初めてです
使ってもいいライブラリはサンプル等あるんで問題ないんですが
コンストラクタの初期化リストなんて初めて見ました

トッパンのC++の本なら昔買いましたが、今更役に立ちませんよねw

952:デフォルトの名無しさん
10/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. ...

その特別ルールが役に立つのはほぼ自動変数だけ。


最新レス表示
スレッドの検索
類似スレ一覧
話題のニュース
おまかせリスト
▼オプションを表示
暇つぶし2ch

5401日前に更新/218 KB
担当:undef