Generic Programming with C++ Template
■ このスレッドは過去ログ倉庫に格納されています
0001デフォルトの名無しさん
NGNG参考図書:
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クラスのメモリレイアウトをコントロールできない。
というわけでスクリプトでプログラムを書くときのように
手軽に、巨大なシステムを構築してしまいたいが型は
大切にしたいとき(どんなときだ?)に使う。
0757名無しさん
NGNG「プログラム設計において根本から変わってしまう」ことと、
「言語の機能をフル活用しなければならない」は相関性弱いと思うが…
後者は実装の話でしょ。
俺はcompilerのerror messageさえなんとかなれば、Lokiくらいは容認。
0758デフォルトの名無しさん
NGNGLoki使いまくり。正直、もう昔のGoF本に載ってる
ような野暮ったいコーディングには戻れない。
Typelistは最初は違和感あるけど、我慢して一ヶ月ぐらい
使いつづければ誰でも慣れる。typelistの新たな
使い方を考えるのはかなり厳しいが、MCDの
本に載ってるようなDPへの適用を真似る程度であれば
大したことはない。
0759デフォルトの名無しさん
NGNG0760デフォルトの名無しさん
NGNG0761デフォルトの名無しさん
NGNG「恥ずかしいことしてるのばれちゃってるのに・・」
3人はイチゴの顔をじっくりみつめる。
そしてその中の1人がそっと言った。
「しかたないわ、あ私たちめくるのやめるわ。」
イチゴはほっとした。
『許してくれるんだ・・・・』
「ありがとうございます・・・・」
0762デフォルトの名無しさん
NGNGほえ?
0763デフォルトの名無しさん
NGNG0764デフォルトの名無しさん
NGNG現在の ANSI C++ 決めるまでにかかった時間から考えて、次の ANSI C++ 規格
が出るのは
話し合いが始まる 2005年
リリース目標 2008年
実際に決まる 2010年
ぐらい?
0765デフォルトの名無しさん
NGNG実際に実装される 前に次の標準の話し合いが始まる
無限ループ?
0766デフォルトの名無しさん
NGNGSQL99みたいになっても意味無し男
0767デフォルトの名無しさん
NGNGVC++はそのころになっても現在の規格にすら準拠できてなさそうだな・・・(鬱
0768デフォルトの名無しさん
NGNG致命的なバグでも見つかったとか?
一番実用的なアイディアだと思っただけに残念。。
0769デフォルトの名無しさん
NGNG0770763
NGNGhttp://std.dkuug.dk/jtc1/sc22/wg21/
0xだそうだからあと7年以内になんとか。
0771デフォルトの名無しさん
NGNGあと7年・・・それまでにパソコン業界はどうなっているのだろうか?
ハードディスク1TB超、CPU10GHz、メモリ10GBなんてのは当たり前に
なってそうだ。いや、これくらいなら4年もあれば実現する。
(C++)++ってのは文法違反か?
0772デフォルトの名無しさん
NGNG基本は省電力モードで休眠状態。
いわゆる論理区画みたいなもんかね。
そうなっているとすれば、そのころのOSの役割は
本来の資源管理にのみ特化しててもよさそうだね。
0773デフォルトの名無しさん
NGNGCの型(というか多重定義演算子の定義のされ方)による。>>771
0774デフォルトの名無しさん
NGNG0775デフォルトの名無しさん
NGNGなるほど。基本型はエラーになるようだ。
>>774
Cを拡張したのがC++だけど、もうこれ以上小手先だけで拡張できない
ほどメチャクチャになっているので、新しい言語を作った方がいいような
気がする。
CPUで言うと丁度x86みたいな様相を呈しているからな・・・・・
0776デフォルトの名無しさん
NGNG"..."とかも。(そうなるとModern C++ Designが困るのだが)
あとグローバル変数も要らん。
0777デフォルトの名無しさん
NGNGつまらん。
0778デフォルトの名無しさん
NGNGC++ - C ってことは、言語名は ++ ですか?
>>775
確かに template がらみだと、
「たしかに template 使えばできるけど、あまりに直感的じゃない。言語の方で
直にサポートしてくれよ」
という機能も多いよな。でも template がこんなに強力な代物だとは、出てきた
当時は思いもよらなかったよ。
0779デフォルトの名無しさん
NGNGそれをベースに型推論を導入してテンプレート宣言はやめる。
代わりに仕様として部分評価を導入して生成的プログラミングスタイルをサポート。
(つまり関数はデフォルトで暗黙のうちにテンプレート関数なわけ。値による特化は部分評価技術で。)
ただクラス・テンプレートの宣言をどうするかはちょっと迷うところだ。
関数型言語のように構築子を強化してクラス宣言を特殊な関数宣言とみなして
構造体アクセスのパターンマッチング機能と組み合わせてと言う路もあるが、
あまりにもCらしさからかけ離れてしまう気がするし。
(命令型C風MLみたいになってしまう。)
0780デフォルトの名無しさん
NGNG0781デフォルトの名無しさん
NGNG型推論は、強い型付けと矛盾しないけど。
0782デフォルトの名無しさん
NGNGあ、そなの?MLとか知らないからよく分からんけど。。
その辺は他の言語もやってみないとダメだね。
0783デフォルトの名無しさん
NGNG0784デフォルトの名無しさん
NGNG自著で名前を何回も出すぐらいだからかなり知ってるのかもね。
0785デフォルトの名無しさん
NGNG0786デフォルトの名無しさん
NGNGす以前に、リストにアルゴリズムを施したりファンクタ
つくらせてカリーイングやったりという近年のC++の傾向そのもの
がオブジェクト指向と別方向の関数型言語指向なわけで。
lispと違って、それなりのパフォーマンスを維持しつつそういう
遊びがあるところに近時のC++の長所があると。
ただ実用から行くと、Java + generics + メモリ直接操作 くらいが
受けのいいところでしょ。
どうせ次期標準C++なんていってもせいぜい確率高い順に
hash_map他のSGI拡張、boost等のスマートポインタ、正規表現、数学等のライブラリが入るかどうか
サイズ規定のプリミティブ型が入るかどうか
typeofやらclosure/delegateやらの言語拡張が入るかどうか
マルチスレッドやネットワークのサポートが入るかどうか
とかだろ? しかも付け加えてばかりでは実装上文句が出るはず
だけど具体的にどこってのは全然見えない。そもそもVC++8のリリ
ース時期に合わせないと誰も使わないだろうな。
C99と互換性無いと駄目とかそっちの方がむしろ主流ではないの。
0787デフォルトの名無しさん
NGNG同じ文章をどこかで見たことがある気がする(デ・ジャ・ヴ?)
長所禿同
C++には多少手を加えるにしても全体としては今のままを維持してホスィ・・・
OOPらしいOOPがやりたい人はJavaでもC#でもやってりゃいいんで
0788デフォルトの名無しさん
NGNG今ある規格には準拠して欲しいとも思うがね。
それよりコンパイラのバグ減らせ!
0789デフォルトの名無しさん
NGNG下の結果が3ではなく、4になってしまうのですが、
どうしてでしょうか?
int i = 1;
std::cout << (_1 + i)(i = 2) << std::endl;
0790デフォルトの名無しさん
NGNGそれにスレ違い
0791デフォルトの名無しさん
NGNG別にスレ違いじゃないだろ。genericsがらみだし。
>>789
boost 1.23??
0792デフォルトの名無しさん
NGNG一つ言えることは _1 + i と i = 2 のどちらが先に実行されるかわからないのだから
そういう書き方をしてはダメってことだ
0793デフォルトの名無しさん
NGNGあ、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今回のとは無関係だとは思うけど一応
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そっか、各種名前としては成立するな・・・。クソ迷惑だけど。
0797デフォルトの名無しさん
NGNG0798デフォルトの名無しさん
NGNGhttp://user.ecc.u-tokyo.ac.jp/~g940455/wp/loki/
他の皆はLoki使いこなしてる?
未だにSmartPtrやFuntorを実験してる・・・
0799デフォルトの名無しさん
NGNG残念ながら使いこなすほど成熟したライブラリではないと思う。
Alexandrescu本人も実際に使ってるかはなはだ疑問。
0800デフォルトの名無しさん
NGNG完成したライブラリではないが、それてきなものをテクニックの一つと
捉えて、どんどんコードを書いていくことは大事なことな気がする。
0801名無しさん@Emacs
NGNG0802デフォルトの名無しさん
NGNG0803名無しさん@Emacs
NGNGどうつかってるの?
本にのってるやつ真似てるだけ?
それとも自分で新たに技作ってやってるとか?
0804デフォルトの名無しさん
NGNG意味解析すると>>801による、
>お前らちゃっとTypelist使ってますか?
という誤文(正しくは「ちゃんと」であろう)に対して、>>802は同じ調子で、
>ちゃっと使ってます
と応答した。
これは恐らく「ちゃんと」と「チャット(chat)」を掛けている可能性が高い。
よって、>>802が本当に「ちゃんとTypelistを使いこなせているよ」
という意味で返答したのかどうかは、このレスでは判断できない。
また、これを踏まえると>>802に対しての>>803の応答は、
抽象的すぎるきらいがある。
>>802への適切な応答としては、
1)s/ちゃっと/ちゃんと/
などとし、話の流れを元に戻すか、
2)チャットは何のソフト使ってるの?
が考えられる。
0805デフォルトの名無しさん
NGNGそういうのは一部の天才たちに任せよう:)
それよりもデザインパターンを適用したソフトウェア設計が
できるかどうかの方がよっぽど大切。これが出来ないことには
Alexandrescuの本に書いてあることの多くが使えない。
おれはよく知らないけど、Typelist自体についてもっと
勉強するには他の型付関数型言語のコーディングテクニックとかを
勉強する方がよいんじゃないの?
0806デフォルトの名無しさん
NGNG名古屋弁で「ちゃっと」といえば「さっと(すばやく)」くらいの意味だ。
ちゃっとやっとかんとかんわ。=さっとやっておかななければならない
0807デフォルトの名無しさん
NGNG大体は知ってたけどいろいろと役に立った。
次はMore Effectiveでも読むかな。
Moreは訳がくそなので読むのに想像力と忍耐力が必要だぞ。
(ここでいうことでもないのでsage)
0809デフォルトの名無しさん
NGNG0810名無しさん@カラアゲうまうま
NGNG思い切って洋書を注文したよ。がんがろ。
0811デフォルトの名無しさん
NGNG0812デフォルトの名無しさん
NGNG0813デフォルトの名無しさん
NGNG普通に読めたよ。
0814デフォルトの名無しさん
NGNGARM
(;´Д`)
0815デフォルトの名無しさん
NGNG標準C++の文法に準拠した新しい機能を使っている。
0816名無しさん@カラアゲうまうま
NGNGすごいな、漏れは "コンストラクター" と、伸びる時点でかなりひいたし、
後半はわけがわからないので、原書かっちまったが・・・
0818デフォルトの名無しさん
NGNG伸ばし棒の事なんかどうでもいいから後半のわけわからないっぷりについて
おしえてください。
たとえば、
const と コンストラクタ が混同されている部分があったりする。
そんな間違いをできるくらいで(だって普通文脈上そんな間違いできないでしょ)、
訳者は著者の書いていることを全然理解してない。
0821デフォルトの名無しさん
NGNG誤植の問題にも逐一訂正を載せてるし、
原著の修正にも載ってないものに
関しては報告してるみたいだから素晴らしいね。
翻訳もののダメっぷりばかりが目立つ
この業界の出版事情だけどいい仕事してる
ひともいるわけで、そういった人の本が
もっと売れるようになって欲しいところだね。
ダメな人を晒あげても切りがないので、
いい仕事をしている人を取り上げよう。
私は村上さんの本は信頼できると思います。
0822デフォルトの名無しさん
NGNG0823デフォルトの名無しさん
NGNGわしは脳内補正して読んだ。
0824デフォルトの名無しさん
NGNGそれはすごい。
0825_1
NGNGCTest2みたいなことは無理でしょうか?(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_2
NGNG{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デフォルトの名無しさん
NGNGtypedef のテンプレートはまだできないよ
0828825
NGNGそうでしたか...。ちょっと変えたらできました。
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);
}
};
0830828
NGNG関数テンプレートを関数の引数として使用できません。
とでるんですけど、
無理なんでしょうか?
(補足: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少なくとも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できた!サンクス。
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デフォルトの名無しさん
NGNGLokiPortは?
0834デフォルトの名無しさん
NGNG0835デフォルトの名無しさん
NGNGワロタ
0836デフォルトの名無しさん
NGNG0837デフォルトの名無しさん
NGNGtypedef T t;
typedef S s;
};
0838デフォルトの名無しさん
NGNGパブリックのメンバしかないクラスはstructを使うのが
彼のコーディング規約らしい。
あとテンプレートパラメータがプリミティブになるときにはtypename
これが一番役にたったかな。。。鬱
0839デフォルトの名無しさん
NGNGtypedef 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デフォルトの名無しさん
NGNG0841デフォルトの名無しさん
NGNG> typedef A::HEAD A;
そりゃー無理だろう。
0842デフォルトの名無しさん
NGNGtypedef 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まぁでもBCCだと通ってしまうという
0844デフォルトの名無しさん
NGNGこういう拡張は、言語の死の前兆なのだろうか、と思ってみたり。
0845デフォルトの名無しさん
NGNG手っ取り早くcppを拡張してほしい。
C++は詰め込みすぎだ。
0846デフォルトの名無しさん
NGNG0847デフォルトの名無しさん
NGNG0848デフォルトの名無しさん
NGNGあれがboost本家に入ればここも盛り上がる…かな?
0849デフォルトの名無しさん
NGNGtemplate< 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デフォルトの名無しさん
NGNGg++ でちょっと調べてみた。
A() がある場合、 B() をコンパイラが生成する。
で、 B() が生成された段階で、 B(){throw 0;} みたいなコードに
対応するために(だと思う) ~A<C>() がインスタンス化される。
A() が無い場合、 B() も無いことになって、このとき ~A<C>() はインスタンス化されない。
ためしに、 A(){} をコメントアウトしたまま、 B(){} を追加しても同じエラーになる。
でも、 B(); として外部参照にすると、エラーは消える。
これは、 ~A<C> が B() のコンパイル時にインスタンス化されているということだと思う。
それならと思って例外処理を無効にするオプションを追加してみたけど、
結果が変わらなかったのがよくわからないところ。
0851デフォルトの名無しさん
NGNGあんたすごいよ!
俺は思いつきもしなかった・・・
VC.NET も同様の結果。
実際のコードは B もテンプレートだったりして、あきらめるしかないか。
0852デフォルトの名無しさん
NGNG状態ごとに振る舞いを変えたいけど、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誰かこれ使って何かしてくれよ。
0855デフォルトの名無しさん
NGNGboost::call_traits
■ このスレッドは過去ログ倉庫に格納されています