トップページ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/
0693デフォルトの名無しさんNGNG
>684
VC++6で、double即値、char即値ともつっこめますた。
0694648NGNG
Boostにごっついtype_traitsの実装があることに今ごろ気付きますた・・・!!
死のう。
0695デフォルトの名無しさんNGNG
>>691は何行になるかわからんのにいちいち行ごとに
オブジェクト作るなって言いたいんじゃないのか?

そういう点でみれば>>692のは激しく的はずれ

0696デフォルトの名無しさんNGNG
gapped bufferってn行へジャンプとかが苦手じゃないの?
0697デフォルトの名無しさんNGNG
苦手といえば苦手だが克服は簡単だよ
最近のPCは速いし。
0698デフォルトの名無しさんNGNG
listと違ってn行へのジャンプが定数時間で終わるのがgapbufferじゃないのか?
0699デフォルトの名無しさんNGNG
>>698
gapped buffer って、バッファの内容をカーソル位置で分割して管理する方法だよね。
それだと、コストはこうじゃないかな。

gapped buffer
 一文字追加、削除 O(1)
 指定行の移動 O(バッファの総文字数)

リスト
 一文字追加、削除 O(一行の文字数)
 指定行への移動 O(ファイルの行数)

gapped buffer は「普段よく使うのは一文字単位の追加・削除だから、こっちを
早くしたほうが快適だ」という信念に基づくデータ構造だと思うよ。ついでに、今
時の PC を前提とするなら、どっちでも早すぎて変わらん。
0700デフォルトの名無しさんNGNG
>gapped buffer って、バッファの内容をカーソル位置で分割して管理する方法だよね。

これだと先頭から終端までジャンプするのに、バッファのコピーが発生するよね?
めちゃくちゃ遅くならない?
0701デフォルトの名無しさんNGNG
>>700
挿入・削除のタイミングでバッファ内の整理をすればよいので
全然そんなことない。

極端にでかいファイルもストレスなく開けるようにするのに便利。
0702デフォルトの名無しさんNGNG
VZは行編集バッファを別に持って、
何か書き換え始めたら行編集バッファにコピーしてきて編集し、
カーソルがその行から出たりするタイミングで書き戻してたっけ。
0703デフォルトの名無しさんNGNG
ちょっと質問 gapped bufferってデータを
head part  cursor    tail part
|-----------| + |------------|
こんな感じで持つ構造と考えて良いのでしょうか?

それとも、下の様にいくつかのフラグメントに分けて保存して、
編集時のコピー量を少なく納める構造なのでしょうか?
|-----| |-----| |----+-| |------|

日本語のサイトをいくつか検索しても、
どっちとも取れるようなどっちも違うような記述でよく分かりません
0704名無しさんNGNG
後者は変形の一つ。

>>700
正直、editorならほとんど変りがない。今や一番重いのはGUIの描画。
0705デフォルトの名無しさんNGNG
>>703
カーソル位置とギャップ位置は関係ない
ギャップは普通エディットしている部分に作られる
0706デフォルトの名無しさんNGNG
どうでもいいけど話題がスレ違い
0707デフォルトの名無しさんNGNG
ではだれかgapped bufferをgenericに実装した例をキボンヌ
0708デフォルトの名無しさんNGNG
>>707
http://www.google.co.jp/search?sourceid=navclient&hl=ja&ie=utf8&oe=utf8&q=%E3%82%AE%E3%83%A3%E3%83%83%E3%83%97%E3%83%90%E3%83%83%E3%83%95%E3%82%A1
0709デフォルトの名無しさんNGNG
gapped bufferのメリットがぜんぜんわからぬ・・・
0710デフォルトの名無しさんNGNG
http://www.jah.ne.jp/~naoyuki/Programs/Programs.html
ここにあるな
0711デフォルトの名無しさんNGNG
STLPortとLokiPort(のSmallObj)同時に使えないっすね。
STLPortのlower_boundに不具合があるんですけど、
どうにもならないですかね。
0712デフォルトの名無しさんNGNG
>>711
lower_boundにどんな不具合がありますか?
0713デフォルトの名無しさんNGNG
>>712
ぉ!
Generic Programing and the STL見てみたら、
STLPortの動作のほうが正しいですね。
// MSDNには書いてない新たな条件が・・・
LokiPortのほうの使い方に問題があるみたいですね
0714デフォルトの名無しさんNGNG
boostのTypeTraitsのコード読んでたんだが
ちょっと前、Lokiの移植で話題になってたVCで
テンプレートの部分的な特殊化をエミュレーションしてる部分に
こんなコメントかいてあるんだけどあれのどこが not legal なの?
ーー以下引用ーーー

// the following VC6 specific implementation is *NOT* legal
// C++, but has the advantage that it works for incomplete
template<class T1>
struct is_same_part_1 {
template<class T2> struct part_2 { enum { value = false }; };
template<> struct part_2<T1> { enum { value = true }; };
};

ーー引用ココまでーー
他のコンパイラでは動かないのかな?
0715デフォルトの名無しさんNGNG
.NET Framework SDKについてるC++のコマンドラインコンパイラでは
Lokiを使えますか?
0716デフォルトの名無しさんNGNG
>>715
過去ログよめ
0717デフォルトの名無しさんNGNG
>>716
過去ログにはVC++.NETとあるだけなので、VisualStudioなのか
.NET Framework SDKだけでも大丈夫なのかわかりませんが。
0718デフォルトの名無しさんNGNG
>>717
一応、最適化のオプションが使えなくなってるだけで、
あとは普通にManagedも吐ければ、通常コンパイルもできる

まずは使ってから質問しろ。
lokiが使いたいだけならgccにしろ。
0719デフォルトの名無しさんNGNG
>>718
使うかどうかまだ決めてないんで。
情報どうも。
0720デフォルトの名無しさんNGNG
>>719
LokiPortを使えば?
http://www.geocities.com/rani_sharoni/LokiPort.html
0721デフォルトの名無しさんNGNG
VC7.0のコンパイラって何処で落とせますか??
0722デフォルトの名無しさんNGNG
>>721
http://msdn.microsoft.com/netframework/
0723デフォルトの名無しさん NGNG
VC7.0はtypeof演算子は使える?
g++だといけるんだけど。
0724デフォルトの名無しさんNGNG
>>723
それがGeneric Programmingと何の以下略
0725デフォルトの名無しさんNGNG
>>724
コンパイラへのプログラミングにおいて
限られた道具が増えることは、かなり重要なことだと思うけど・・・

今のところ、どう使うか考えてるところではあるんだけどね:)
0726デフォルトの名無しさんNGNG
処理系依存の話は、できれば余所でお願いしたいところだが。

(まぁ C++ の template 自体、完全実装してる処理系はほとんどないから、
処理系依存に近いのが現状だけどさ)
0727デフォルトの名無しさんNGNG
http://www-cdserver.fnal.gov/cd_public/sag/J16/J16.htm
http://www-cdserver.fnal.gov/cd_public/sag/J16/J16_files/slide0042.htm

• typedef templates:
template< class T >
typedef std::map< std::string, T > Dictionary;
Dictionary<double> d;
Dictionary<PhoneNumber> phonebook;

• typeof() compile-time operator:
template< class T >
void foo( T t ) {
  typeof( f(t) ) y = f(t);
… ;
}

こりゃ凄いと思うがどうよ。
0728デフォルトの名無しさんNGNG
あ、凄いのはtypedef templateの方ね(笑
0729デフォルトの名無しさんNGNG
どっちもホスィ・・・
0730デフォルトの名無しさんNGNG
typeofって拡張だろ?
0731デフォルトの名無しさんNGNG
>>730
標準に含めて欲しいっていう提案はされてるみたい
0732デフォルトの名無しさんNGNG
なるほど、スレ違いってうまい言葉だなあ
0733標準化委員会NGNG
typeofはもうすぐ導入予定です
0734デフォルトの名無しさんNGNG
typeofはいいから早くANSIに対応してくれよ>VC++

g++ってあれだけがんばってるのに、ユーザーは
相変わらずCでゴリゴリ書くのが好きな人ばっかりで、
なんか哀れだよね。
0735デフォルトの名無しさんNGNG
typeof萌え、標準にすぐ入れるべし、
0736デフォルトの名無しさんNGNG
typeofはテンプレートのないCに取り入れられた方が
劇的にコーディングスタイルが変わりそう。
0737デフォルトの名無しさんNGNG
>>736
マクロプログラミングですか?
イヤだなぁ
0738デフォルトの名無しさんNGNG

#define foreach( itr, cont ) for( typeof( (cont).begin() ) itr = (cont).begin(); itr!=(cont).end(); ++itr )
0739デフォルトの名無しさんNGNG
template<typename T>struct SA{
   template<typename A,typename B>struct TSA{TSA(){cout<<"A"<<endl;}};
   template<>struct TSA<T,int>{TSA<T,int>(){cout<<"B"<<endl;}};
   template<>struct TSA<T,double>{TSA(){cout<<"C"<<endl;}};←これが警告になって、しかも無視されるのがわからない。なんで?
};
0740名無しさん@カラアゲうまうまNGNG
オーバーロードの曖昧さ?
0741デフォルトの名無しさんNGNG
Cスタイルの文字列を受け取れるテンプレートで、
const char* を受け取れるようにしとけば動作するけど、
template< unsigned N > f( const char (&x)[N] );
にバージョンを用意しとけば、文字列リテラルを受け取ったときに、
N で文字列長を受け取れる分、より効率的に処理できるようです。
ですが、↑みたいなテンプレートを使ってるのをほかで見たことがありません。
なにか問題があるからなのでしょうか?
それとも、見つけれて無いだけで、めずらしくもない方法なんでしょうか?
0742デフォルトの名無しさんNGNG
>>741
boos::type_traits::is_array
0743デフォルトの名無しさんNGNG
^boos^boost
0744741NGNG
>>742
配列型の判別はできても、boostのやつには N が取れないように見えますが、
同じことができるってことですか?
0745デフォルトの名無しさんNGNG
LokiPortのis_arrayにも似たような記述があるが
環境依存な部分も少なからずあるみたい。
ただ単にサイズを自動的に取得したいという目的ならば不要かと。
const char* との共存ができないようだし。(VC7)
普通にstring(literal, sizeof(literal))で問題無いかと。
0746デフォルトの名無しさんNGNG
もうtemplateは疲れた。
0747デフォルトの名無しさんNGNG
正直、Lokiの延長みたいのが仕事で使われるようになったら、
この業界辞める。もっとらくちんなの希望。
0748デフォルトの名無しさんNGNG
>>747
ライブラリ作るのとそれ使うのとでは全然違うと思われ
0749デフォルトの名無しさんNGNG
>>747
激しく同意。
STLのように使うだけのライブラリとはちょっと違う。
プログラム設計において根本から変わってしまうような
ものだと思う。
というかそろそろ言語の機能をフル活用しなければならない
っていう呪縛から逃れたいところだね。C++使ってるひとには
自分も含めて、この傾向が強いから。
0750デフォルトの名無しさんNGNG
自分が便利だと思う機能をしっかりと使えればいーんじゃネーノ?


……と思ったが、そうすると他人のプログラムの保守ができんな。
0751デフォルトの名無しさんNGNG
機能は、必要を感じた時に初めてその使用の検討をするべき。
templateなんて特にそうだと思うぞ。
俺は無いと困るみたいな状況に陥ったことがないので、
使ったことは無いが。w
0752デフォルトの名無しさんNGNG
>>751
> 機能は、必要を感じた時に初めてその使用の検討をするべき。
とはいえ、全く知らないと

 これを使えば簡単に済むのに

っつーことに気づかぬ罠。
0753デフォルトの名無しさんNGNG
templateで一番威力を発揮するのはコンテナでしょ。
その辺だけ使えればいいんじゃないの?
構文汚いけど。
0754デフォルトの名無しさんNGNG
関数オブジェクトもなかなか
0755デフォルトの名無しさんNGNG
GenScatterHierarchyとGenLinearHierarchy最高。
さてこれをどう使ったらいいものやら。。
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 のどちらが先に実行されるかわからないのだから
そういう書き方をしてはダメってことだ
■ このスレッドは過去ログ倉庫に格納されています