トップページtech
985コメント328KB

Generic Programming with C++ Template

■ このスレッドは過去ログ倉庫に格納されています
0001デフォルトの名無しさんNGNG
C++ による Generic Programming の話をしよう。

参考図書:
Modern C++ Design
Andrei Alexandrescu, Addison-Wesley, ISBN:0-201-70431-5
(訳書: ピアソン・エデュケーション, ISBN:4-89471-435-3)
http://cseng.aw.com/book/0,,0201704315,00.html

Generic Programming - STL による汎用プログラミング
Matthew H. Austern, ASCII, ISBN:4-7561-3441-6

関連スレッド:
C++相談室 Part3
http://pc.2ch.net/test/read.cgi/tech/1003832761/

STL スレッド
http://pc.2ch.net/test/read.cgi/tech/1004287394/
0756デフォルトの名無しさんNGNG
>>755

クラスのメモリレイアウトをコントロールできない。
というわけでスクリプトでプログラムを書くときのように
手軽に、巨大なシステムを構築してしまいたいが型は
大切にしたいとき(どんなときだ?)に使う。
0757名無しさんNGNG
>>749
「プログラム設計において根本から変わってしまう」ことと、
「言語の機能をフル活用しなければならない」は相関性弱いと思うが…
後者は実装の話でしょ。

俺はcompilerのerror messageさえなんとかなれば、Lokiくらいは容認。
0758デフォルトの名無しさんNGNG
プライベートなコーディングにおいては
Loki使いまくり。正直、もう昔のGoF本に載ってる
ような野暮ったいコーディングには戻れない。
Typelistは最初は違和感あるけど、我慢して一ヶ月ぐらい
使いつづければ誰でも慣れる。typelistの新たな
使い方を考えるのはかなり厳しいが、MCDの
本に載ってるようなDPへの適用を真似る程度であれば
大したことはない。
0759デフォルトの名無しさんNGNG
MCDってなに?
0760デフォルトの名無しさんNGNG
ModernC++Designのことね。勝手に省略ゴメソ
0761デフォルトの名無しさんNGNG
「ふーん、そんなこと言える身分なの?」
「恥ずかしいことしてるのばれちゃってるのに・・」
3人はイチゴの顔をじっくりみつめる。
そしてその中の1人がそっと言った。
「しかたないわ、あ私たちめくるのやめるわ。」
イチゴはほっとした。
『許してくれるんだ・・・・』
「ありがとうございます・・・・」
0762デフォルトの名無しさんNGNG
>>761
ほえ?
0763デフォルトの名無しさんNGNG
型のコレクションをマクロ無しで扱う機能を次のC++標準に入れて欲しい。
0764デフォルトの名無しさんNGNG
>>763
現在の ANSI C++ 決めるまでにかかった時間から考えて、次の ANSI C++ 規格
が出るのは

 話し合いが始まる 2005年
 リリース目標    2008年
 実際に決まる    2010年

ぐらい?
0765デフォルトの名無しさんNGNG
コンパイラベンダの実装完了目標 2015年
実際に実装される 前に次の標準の話し合いが始まる
無限ループ?
0766デフォルトの名無しさんNGNG
つーか今の規格でもういいよ。
SQL99みたいになっても意味無し男
0767デフォルトの名無しさんNGNG
>>765
VC++はそのころになっても現在の規格にすら準拠できてなさそうだな・・・(鬱
0768デフォルトの名無しさんNGNG
LokiからBasicFastDispatcherってどうして取り除かれたの?
致命的なバグでも見つかったとか?
一番実用的なアイディアだと思っただけに残念。。
0769デフォルトの名無しさんNGNG
ポストC++を開発する良い機会だと思うけど。
0770763NGNG
もう、始まってるのさ...
http://std.dkuug.dk/jtc1/sc22/wg21/
0xだそうだからあと7年以内になんとか。
0771デフォルトの名無しさんNGNG
>>770
あと7年・・・それまでにパソコン業界はどうなっているのだろうか?
ハードディスク1TB超、CPU10GHz、メモリ10GBなんてのは当たり前に
なってそうだ。いや、これくらいなら4年もあれば実現する。

(C++)++ってのは文法違反か?
0772デフォルトの名無しさんNGNG
CPU4台くらい積むのが当たり前になってるかもね。
基本は省電力モードで休眠状態。
いわゆる論理区画みたいなもんかね。

そうなっているとすれば、そのころのOSの役割は
本来の資源管理にのみ特化しててもよさそうだね。
0773デフォルトの名無しさんNGNG
> (C++)++ってのは文法違反か?

Cの型(というか多重定義演算子の定義のされ方)による。>>771
0774デフォルトの名無しさんNGNG
10年後はC++の次ができてそうだね
0775デフォルトの名無しさんNGNG
>>773
なるほど。基本型はエラーになるようだ。

>>774
Cを拡張したのがC++だけど、もうこれ以上小手先だけで拡張できない
ほどメチャクチャになっているので、新しい言語を作った方がいいような
気がする。
CPUで言うと丁度x86みたいな様相を呈しているからな・・・・・
0776デフォルトの名無しさんNGNG
とりあえずC互換部分を(全部とはいわないけど)なるべく消して欲しい。
"..."とかも。(そうなるとModern C++ Designが困るのだが)
あとグローバル変数も要らん。
0777デフォルトの名無しさんNGNG
>>776
つまらん。
0778デフォルトの名無しさんNGNG
>>776
C++ - C ってことは、言語名は ++ ですか?

>>775
確かに template がらみだと、

「たしかに template 使えばできるけど、あまりに直感的じゃない。言語の方で
 直にサポートしてくれよ」

という機能も多いよな。でも template がこんなに強力な代物だとは、出てきた
当時は思いもよらなかったよ。
0779デフォルトの名無しさんNGNG
クラスつきのCとしてのC++からC互換の危ない部分を取り除いて
それをベースに型推論を導入してテンプレート宣言はやめる。
代わりに仕様として部分評価を導入して生成的プログラミングスタイルをサポート。
(つまり関数はデフォルトで暗黙のうちにテンプレート関数なわけ。値による特化は部分評価技術で。)

ただクラス・テンプレートの宣言をどうするかはちょっと迷うところだ。
関数型言語のように構築子を強化してクラス宣言を特殊な関数宣言とみなして
構造体アクセスのパターンマッチング機能と組み合わせてと言う路もあるが、
あまりにもCらしさからかけ離れてしまう気がするし。
(命令型C風MLみたいになってしまう。)
0780デフォルトの名無しさんNGNG
静的型付け言語の現状C++マンセー!!!
0781デフォルトの名無しさんNGNG
>>780
型推論は、強い型付けと矛盾しないけど。
0782デフォルトの名無しさんNGNG
>>781
あ、そなの?MLとか知らないからよく分からんけど。。
その辺は他の言語もやってみないとダメだね。
0783デフォルトの名無しさんNGNG
Cの怨念部分を取り払う時期がくるか
0784デフォルトの名無しさんNGNG
ちなみにAlexandrescuはMLやHaskellなどの関数型言語も、
自著で名前を何回も出すぐらいだからかなり知ってるのかもね。
0785デフォルトの名無しさんNGNG
つーか、プログラミング言語ネタで本を出すようなヤシでML知らないのはモグリ。
0786デフォルトの名無しさんNGNG
MLやHaskellにいかずとも、空リストや特殊定義でlispを思い出
す以前に、リストにアルゴリズムを施したりファンクタ
つくらせてカリーイングやったりという近年のC++の傾向そのもの
がオブジェクト指向と別方向の関数型言語指向なわけで。
lispと違って、それなりのパフォーマンスを維持しつつそういう
遊びがあるところに近時のC++の長所があると。
ただ実用から行くと、Java + generics + メモリ直接操作 くらいが
受けのいいところでしょ。
どうせ次期標準C++なんていってもせいぜい確率高い順に

hash_map他のSGI拡張、boost等のスマートポインタ、正規表現、数学等のライブラリが入るかどうか
サイズ規定のプリミティブ型が入るかどうか
typeofやらclosure/delegateやらの言語拡張が入るかどうか
マルチスレッドやネットワークのサポートが入るかどうか

とかだろ? しかも付け加えてばかりでは実装上文句が出るはず
だけど具体的にどこってのは全然見えない。そもそもVC++8のリリ
ース時期に合わせないと誰も使わないだろうな。
C99と互換性無いと駄目とかそっちの方がむしろ主流ではないの。
0787デフォルトの名無しさんNGNG
>>786
同じ文章をどこかで見たことがある気がする(デ・ジャ・ヴ?)

長所禿同
C++には多少手を加えるにしても全体としては今のままを維持してホスィ・・・
OOPらしいOOPがやりたい人はJavaでもC#でもやってりゃいいんで
0788デフォルトの名無しさんNGNG
性能と手軽さのトレードオフのある今のOO/GenericなC++でだいたい足りるわ。
今ある規格には準拠して欲しいとも思うがね。

それよりコンパイラのバグ減らせ!
0789デフォルトの名無しさんNGNG
gcc3.1+boost1.23でlambdaを使ってます。
下の結果が3ではなく、4になってしまうのですが、
どうしてでしょうか?

int i = 1;
std::cout << (_1 + i)(i = 2) << std::endl;
0790デフォルトの名無しさんNGNG
_1 って?
それにスレ違い
0791デフォルトの名無しさんNGNG
>>790
別にスレ違いじゃないだろ。genericsがらみだし。
>>789
boost 1.23??
0792デフォルトの名無しさんNGNG
>>789
一つ言えることは _1 + i と i = 2 のどちらが先に実行されるかわからないのだから
そういう書き方をしてはダメってことだ
0793デフォルトの名無しさんNGNG
>>791
あ、1.28です。
最新版の配布パッケージです。
boost::lambdaのドキュメントには

>int i = 1;
>(_1 + i)(i = 2);
>The value of the expression in the last line is 3, not 4. In other words, the lambda expression _1 + i creates a lambda function lambda x.x+1 rather than lambda x.x+i.

このように書いてあるのですが…
0794デフォルトの名無しさんNGNG
>>793
今回のとは無関係だとは思うけど一応
http://www.catnet.ne.jp/kouno/c_faq/c3.html#9
こういうのがあった。

_1 + i が内部で i の値を利用しようがしまいが未定義になっているのかもしれない。
0795デフォルトの名無しさんNGNG
未定義じゃないはず。
((int(*)(int))operator+(_1, i))(i = 2);
たしか、こんな感じになるはずだし。
0796デフォルトの名無しさんNGNG
_1

そっか、各種名前としては成立するな・・・。クソ迷惑だけど。
0797デフォルトの名無しさんNGNG
普通にx/y/z等を占有されるよりも_1/_2/_3の方がいいじゃん
0798デフォルトの名無しさんNGNG
検索してもユーザーサイトがこれぐらいしかみつからない。
http://user.ecc.u-tokyo.ac.jp/~g940455/wp/loki/
他の皆はLoki使いこなしてる?
未だにSmartPtrやFuntorを実験してる・・・
0799デフォルトの名無しさんNGNG
>>798
残念ながら使いこなすほど成熟したライブラリではないと思う。
Alexandrescu本人も実際に使ってるかはなはだ疑問。
0800デフォルトの名無しさんNGNG
ACEはLoki的な書き方をすればコードはかなり小さくなりそうな予感。
完成したライブラリではないが、それてきなものをテクニックの一つと
捉えて、どんどんコードを書いていくことは大事なことな気がする。
0801名無しさん@EmacsNGNG
お前らちゃっとTypelist使ってますか?
0802デフォルトの名無しさんNGNG
ちゃっと使ってます
0803名無しさん@EmacsNGNG
>>802
どうつかってるの?
本にのってるやつ真似てるだけ?
それとも自分で新たに技作ってやってるとか?
0804デフォルトの名無しさんNGNG
>>803
意味解析すると>>801による、

>お前らちゃっとTypelist使ってますか?

という誤文(正しくは「ちゃんと」であろう)に対して、>>802は同じ調子で、

>ちゃっと使ってます

と応答した。
これは恐らく「ちゃんと」と「チャット(chat)」を掛けている可能性が高い。
よって、>>802が本当に「ちゃんとTypelistを使いこなせているよ」
という意味で返答したのかどうかは、このレスでは判断できない。

また、これを踏まえると>>802に対しての>>803の応答は、
抽象的すぎるきらいがある。
>>802への適切な応答としては、

1)s/ちゃっと/ちゃんと/

などとし、話の流れを元に戻すか、

2)チャットは何のソフト使ってるの?

が考えられる。
0805デフォルトの名無しさんNGNG
Typelistはべつに新たに使い方を発明する必要はないな。
そういうのは一部の天才たちに任せよう:)
それよりもデザインパターンを適用したソフトウェア設計が
できるかどうかの方がよっぽど大切。これが出来ないことには
Alexandrescuの本に書いてあることの多くが使えない。

おれはよく知らないけど、Typelist自体についてもっと
勉強するには他の型付関数型言語のコーディングテクニックとかを
勉強する方がよいんじゃないの?
0806デフォルトの名無しさんNGNG
>>801-804
名古屋弁で「ちゃっと」といえば「さっと(すばやく)」くらいの意味だ。

ちゃっとやっとかんとかんわ。=さっとやっておかななければならない
0807デフォルトの名無しさんNGNG
Effective C++読み終えたよ。
大体は知ってたけどいろいろと役に立った。
次はMore Effectiveでも読むかな。
0808 ◆4COMPILE NGNG
>>807
Moreは訳がくそなので読むのに想像力と忍耐力が必要だぞ。
(ここでいうことでもないのでsage)
0809デフォルトの名無しさんNGNG
頭の中で英語に訳しながら理解すべし。(ワラ
0810名無しさん@カラアゲうまうまNGNG
bk1 で More 注文したけど入荷できずにキャンセルされちゃったよ。
思い切って洋書を注文したよ。がんがろ。
0811デフォルトの名無しさんNGNG
More Modern C++ Design
0812デフォルトの名無しさんNGNG
effective C++って第2版でどう変わったの?
0813デフォルトの名無しさんNGNG
>>808
普通に読めたよ。
0814デフォルトの名無しさんNGNG
D&E
ARM
(;´Д`)
0815デフォルトの名無しさんNGNG
>>812
標準C++の文法に準拠した新しい機能を使っている。
0816名無しさん@カラアゲうまうまNGNG
救いage
0817 ◆4COMPILE NGNG
>>813
すごいな、漏れは "コンストラクター" と、伸びる時点でかなりひいたし、
後半はわけがわからないので、原書かっちまったが・・・
0818デフォルトの名無しさんNGNG
>>817
伸ばし棒の事なんかどうでもいいから後半のわけわからないっぷりについて
おしえてください。
0819 ◆4COMPILE NGNG
>>819
たとえば、
const と コンストラクタ が混同されている部分があったりする。
そんな間違いをできるくらいで(だって普通文脈上そんな間違いできないでしょ)、
訳者は著者の書いていることを全然理解してない。
0820 ◆4COMPILE NGNG
>>819
(・∀・)サイキレス カコイイ!!

すまぬ、>>818の間違い。
0821デフォルトの名無しさんNGNG
その点ModernC++Designの村上氏は、
誤植の問題にも逐一訂正を載せてるし、
原著の修正にも載ってないものに
関しては報告してるみたいだから素晴らしいね。

翻訳もののダメっぷりばかりが目立つ
この業界の出版事情だけどいい仕事してる
ひともいるわけで、そういった人の本が
もっと売れるようになって欲しいところだね。
ダメな人を晒あげても切りがないので、
いい仕事をしている人を取り上げよう。

私は村上さんの本は信頼できると思います。
0822デフォルトの名無しさんNGNG
そういや訳してるヤシはプログラマなのか?
0823デフォルトの名無しさんNGNG
>>819
わしは脳内補正して読んだ。
0824デフォルトの名無しさんNGNG
>>819
それはすごい。
0825_1NGNG
関数ポインタを勉強してるんですが、
CTest2みたいなことは無理でしょうか?(CTest1はOKでした)
/*
int test(int a)
{
CTemp temp;
return temp.Func(*this,f,a);
}
クラス(*this)を渡して動的にテンプレートで作成させれば 何個も CTemp<???> を作らなくて済む。
*/

#include<iostream>
using namespace std;

template <typename _T>class CTemp
{public:
typedef int (_T::*Pstd)(int);
int Func(_T& ob,Pstd f1,int a)
{
return (ob.*f1)(a);
}
};

class CTest
{public:
int f(int a){ return a*2;}
int test(int a)
{
CTemp<CTest> temp;
return temp.Func(*this,f,a);
}
};


0826_2NGNG
class CTemp2
{public:
template <typename T,typename R> typedef R (T::*Pstd)(R);//typedef はtemplate化 できないのか?
template <typename T,typename R> R Func(T& ob,Pstd f1,R a)
{
return (ob.*f1)(a);
}
};

class CTest2
{public:
template <typename TM1>TM1 f(TM1 a){return a*2}
template <typename TM> TM test(TM a)
{
CTemp2 temp;
return temp.Func(*this,f,a);
}
};

int main()
{
CTest t;
cout << t.test(100);

CTest2 t2;
cout << t2.test(100);
}
0827デフォルトの名無しさんNGNG
>>826
typedef のテンプレートはまだできないよ
0828825NGNG
>>827
そうでしたか...。ちょっと変えたらできました。
class CTemp2
{
public:
template<typename T,typename R> R Func(T& ob,int (T::*f1)(R),R a)
{
return (ob.*f1)(a);
}
};

class CTest2
{
public:
int f(int a){ return a*2;}
template<typename R> R test(R a)
{
CTemp2 temp;
return temp.Func(*this,f,a);
}

};
0829名無しさん@カラアゲうまうまNGNG
http://sourceforge.net/projects/loki-lib/
0830828NGNG
下みたいにすると、
関数テンプレートを関数の引数として使用できません。
とでるんですけど、
無理なんでしょうか?
(補足:828はC++.NETならコンパイル可です。gccはオプションの設定が
よく分からないのでコンパイルできませんでした)

class CTest2
{
public:
template<typename R> R f(R a){ return a*2;}//ここを変更
template<typename R> R test(R a)
{
CTemp2 temp;
return temp.Func(*this,f,a);
}

};
0831デフォルトの名無しさんNGNG
>>830
少なくともVC++.NETならこれで通った。

template<typename R> R test(R a)
{
  int (CTest2::*tf)(R) = f<R>;
  CTemp2 temp;
  return temp.Func(*this,tf,a);
}

が、bccとかgcc2.95はICEる。gcc3.xはわからん。
0832デフォルトの名無しさんNGNG
>>831
できた!サンクス。
LokiのFunctorをVC++.NETでコンパイルできないんだけど
やっぱり書き換えないと駄目なのかな?それとも設定ミス?

template<typename R> R test(R a)
{
typename R (CTest2::*tf)(R) = f<R>;
CTemp2 temp;
return temp.Func(*this,tf,a);
}
0833デフォルトの名無しさんNGNG
>>832
LokiPortは?
0834デフォルトの名無しさんNGNG
++a+a+++a+++a+a+++a+++a+a+++a+a+++a++; // + 激しくインクリメント + //
0835デフォルトの名無しさんNGNG
>>834
ワロタ
0836デフォルトの名無しさんNGNG
ジェネリックネタは尽きたか・・・!?アゲ
0837デフォルトの名無しさんNGNG
template<class T,class S>class Typelist{
typedef T t;
typedef S s;
};
0838デフォルトの名無しさんNGNG
>>837
パブリックのメンバしかないクラスはstructを使うのが
彼のコーディング規約らしい。
あとテンプレートパラメータがプリミティブになるときにはtypename

これが一番役にたったかな。。。鬱
0839デフォルトの名無しさんNGNG
template<class T,class S>struct Typelist{
typedef T HEAD;
typedef S TAIL;
};
template<class A>struct TCA{
typedef A::HEAD A;
typedef A::TAIL B;
A a;
};
void main(void)
{
TCA<Typelist<int,double> > tca;
}
なんでエラーになるねん?
0840デフォルトの名無しさんNGNG
間違ってるから
0841デフォルトの名無しさんNGNG
>>838
> typedef A::HEAD A;
そりゃー無理だろう。
0842デフォルトの名無しさんNGNG
template<class T,class S>struct Typelist{
typedef T HEAD;
typedef S TAIL;
};
template<class A>struct TCA{
typedef typename A::HEAD HEAD;
typedef typename A::TAIL TAIL;
A a;
};
void main(void)
{
TCA<Typelist<int,double> >::HEAD tca1;
TCA<Typelist<int,double> >::TAIL tca2;
}
0843デフォルトの名無しさんNGNG
>>839
まぁでもBCCだと通ってしまうという
0844デフォルトの名無しさんNGNG
Lokiにはstruc.incの亡霊が見える。
こういう拡張は、言語の死の前兆なのだろうか、と思ってみたり。
0845デフォルトの名無しさんNGNG
著者はテンプレの制限追っかけるより
手っ取り早くcppを拡張してほしい。
C++は詰め込みすぎだ。
0846デフォルトの名無しさんNGNG
多次元配列についてはどうだ?
0847デフォルトの名無しさんNGNG
なにが?
0848デフォルトの名無しさんNGNG
最近boost-mlではMPLの話題が多いのぅ…
あれがboost本家に入ればここも盛り上がる…かな?
0849デフォルトの名無しさんNGNG
誰か俺に力を

template< typename T > class A
{
public:
//A(void){}
~A(void){ T::function_not_called(); }
};
class B
{
public:
A< class C > c;
};

int main(void)
{
new B();
}

VC.NET
A()のコメントはずすと~A()でコンパイルエラー・・・Why?
0850デフォルトの名無しさんNGNG
>>849
g++ でちょっと調べてみた。

A() がある場合、 B() をコンパイラが生成する。
で、 B() が生成された段階で、 B(){throw 0;} みたいなコードに
対応するために(だと思う) ~A<C>() がインスタンス化される。

A() が無い場合、 B() も無いことになって、このとき ~A<C>() はインスタンス化されない。

ためしに、 A(){} をコメントアウトしたまま、 B(){} を追加しても同じエラーになる。
でも、 B(); として外部参照にすると、エラーは消える。
これは、 ~A<C> が B() のコンパイル時にインスタンス化されているということだと思う。

それならと思って例外処理を無効にするオプションを追加してみたけど、
結果が変わらなかったのがよくわからないところ。
0851デフォルトの名無しさんNGNG
>>850
あんたすごいよ!
俺は思いつきもしなかった・・・
VC.NET も同様の結果。
実際のコードは B もテンプレートだったりして、あきらめるしかないか。
0852デフォルトの名無しさんNGNG
プチStateパターン。なんてのを提案してみます。

状態ごとに振る舞いを変えたいけど、Stateパターンをやるまでもないという
場合は、だいたいこんな感じでやってますよね?

// Hoge.h
class CHoge
{
  int state_;
  void age(void) {}
  void sage(void) {}
  void giko(void) {}
  void mona(void) {}
public:
  void Action(void);
};

// Hoge.cpp
typedef void (CHoge::*FUNC)();
FUNC table[] = {
  &CHoge::age,
  &CHoge::sage,
  &CHoge::giko,
  &CHoge::mona,
}

void CHoge::Action(void)
{
  // 状態ごとに振る舞いを変える。
  (this->*table[state_])();
}


こうやっていると、ひとつ状態が増えただけで、呼び出す関数が増えるから、
Hoge.hを書き換えなきゃならないのが弱点。そこで、こんなのはどうでしょう。
0853デフォルトの名無しさんNGNG
(続き)

// Hoge.h
class CHoge
{
  int state_;
  template<int> void InnerAction(void);
public:
  void Action(void);
};

// Hoge.cpp
enum {
  AGE,SAGE,GIKO,MONA,
};

template<> void CHoge::InnerAction<AGE>(void) {}
template<> void CHoge::InnerAction<SAGE>(void) {}
template<> void CHoge::InnerAction<GIKO>(void) {}
template<> void CHoge::InnerAction<MONA>(void) {}

typedef void (CHoge::*FUNC)();
FUNC table[] = {
  &CHoge::InnerAction<0>,
  &CHoge::InnerAction<1>,
  &CHoge::InnerAction<2>,
  &CHoge::InnerAction<3>
}

void CHoge::Action(void)
{
  // 状態ごとに振る舞いを返る。
  (this->*table[state_])();
}

こうすると、状態がいくら増えても、変更するのはHoge.cppだけ。
Hoge.hは変えなくてよくなります。プチStateパターンと名付けたけど、
なにげにBridgeパターンも兼ねてるわけです。
tableで「CHoge::InnerAction<0>」とマジックナンバーが入っているのは、
enum順が変わっても、tableの並びを変えなくていい、というテクです。
>>369-423を参照して下さい。

仕様が不安定な中で開発するときは割と使えると思いますけど、
どうでしょ、このテク。
0854デフォルトの名無しさんNGNG
template<>の中でifは使えないが、三項演算子なら使えるのだな。
誰かこれ使って何かしてくれよ。
0855デフォルトの名無しさんNGNG
>>854
boost::call_traits
■ このスレッドは過去ログ倉庫に格納されています