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

【C++】template 統合スレ -- Part5

レス数が900を超えています。1000を超えると表示できなくなるよ。
0001デフォルトの名無しさんNGNG
C++ のジェネリックプログラミングの話をしましょう。
以下のスレッドを統合するスレです。
STLスレッド
Part1 http://pc.2ch.net/tech/kako/1004/10042/1004287394.html
Part2 http://pc3.2ch.net/tech/kako/1026/10267/1026793823.html

【C++】Boost使い集まれ!
http://pc3.2ch.net/test/read.cgi/tech/1033830935/ (html化待ち?)

Generic Programming with C++ Template
http://pc.2ch.net/tech/kako/1008/10085/1008593126.html
【C++】template 統合スレ -- STL/Boost/Loki, etc.
http://pc2.2ch.net/test/read.cgi/tech/1037795348/
【C++】template 統合スレ -- Part2
http://pc2.2ch.net/test/read.cgi/tech/1047978546/ (html化待ち)
【C++】template 統合スレ -- Part3
http://pc5.2ch.net/test/read.cgi/tech/1066493064/
【C++】template 統合スレ -- Part4
http://pc5.2ch.net/test/read.cgi/tech/1083550483/
関連スレ、その他リンクは >>2-5 あたりに。
0809デフォルトの名無しさんNGNG
http://www.meta-comm.com/engineering/boost/200411020208/boost_1_32_0.tar.bz2
ftp://ftp.ruby-lang.org/pub/ruby/ruby-1.8.1.tar.gz
http://www.meta-comm.com/engineering/boost/200411020208/boost_1_32_0.tar.gz
ftp://ftp.ruby-lang.org/pub/ruby/ruby-1.8.1.tar.gz
http://www.meta-comm.com/engineering/boost/200411020208/boost_1_32_0.zip
ftp://ftp.ruby-lang.org/pub/ruby/ruby-1.8.1.tar.gz
0810デフォルトの名無しさんNGNG
>>808
注目すべき最新の変更及び追加は?
0811デフォルトの名無しさんNGNG
kita-ってやらないのkita-って
0812デフォルトの名無しさんNGNG
809は何?
0813756NGNG
マジですか?
boost/date_time/tz_db_base.hpp 直って無いような気が・・・?
0814デフォルトの名無しさんNGNG
>>807
draft tar ball 置いてあるよ。
0815デフォルトの名無しさんNGNG
>>814
正規ってことでは
0816デフォルトの名無しさんNGNG
spiritのast_parseでCの=演算子のように右から左への結合をする方法は無いでしょうか?
ast_tree_policyのソースを見たところ問答無用で左から右に結合しているようなので
やむを得ず独自のpolicyを書きましたが、
結構長いのでバージョン間の互換性などを考えるとast_parseで出来たほうがうれしいです。
0817デフォルトの名無しさんNGNG
boost::mplで boost::mpl::plusにboost::mpl::int_<1>を
バインドってできないのかな?
//こういう感じで
typedef bind_c<
boost::mpl::plus
,boost::mpl::lambda::_1< boost::mpl::int_<1> >
>::type plus1;
0818デフォルトの名無しさんNGNG
>>817
typedef bind< plus<>, _1, int_<1> > b;
cout<<b::apply<int_<10> >::type::value<<endl;
0819デフォルトの名無しさんNGNG
あと

template<class Int> struct plus1 : public plus<Int, int_<1> >{ };
cout << plus1<int_<10> >::value << endl;

とか

typedef plus<_1, int_<1> > plus1;
cout << apply<plus1, int_<10> >::type::value << endl;
0820817NGNG
>>818-819
thx.
(bind+lambda)の場合はメタ関数クラスになるから直接applyできて、
外部applyは(lambda)と(bind+lambda)の両方okと。
継承版はすっきりしてイイですね。

0821デフォルトの名無しさんNGNG
lambdaはいいとして
bindって何に使うの?
0822デフォルトの名無しさんNGNG
Lisp(scheme)で言うと、

(lambda (x y) (+ x y))という加算lambda式(二引数関数)がある時、

((lambda (x y) (+ x y)) 5) → (lambda (y) (+ 5 y))

という引数の部分的なapplyに相当するのがbind。

(bind (lambda (x y) (+ x y)) '1st 5)
0823デフォルトの名無しさんNGNG
カリー化だね
0824デフォルトの名無しさんNGNG
おい、俺は今なあ、英語の筆記体のrがうまく書けなくて、
それでギリシャ語の「ラムダ」に似てるから、ラムダみたいに書けばいいのかと思って
調べてみたらラムダはrじゃなくてlだったということがわかったところだぞ。
そして偶然このスレを見たらlambdaとか書いてあって驚きだよ。
これがシンクロニシティってやつなのか?
0825スレ違いだがNGNG
>>823
逆。uncurry。
0826確かにすれ違いだがNGNG
え?逆?
0827デフォルトの名無しさんNGNG
カレー食いたくなってきた
0828デフォルトの名無しさんNGNG
>824
てゆうかガンマでそ
0829デフォルトの名無しさんNGNG
>>828

>>824 は「筆記体のr」と言っております。
0830デフォルトの名無しさんNGNG
低レベル者で申し訳ないですが
構造体を vectorやmap等に積み込む時ってどうします?
auto_pointer系に詰めて乗せるのが一般的なんですか?
0831デフォルトの名無しさんNGNG
>>830
コピーが低コストならそのままコンテナの要素にする。
コピーできないor高コストならboost::shared_ptrとかに乗せる。
0832デフォルトの名無しさんNGNG
>>831
newで生成した場合
そのままコンテナ要素にしたらdeleteがめんどいような・・・
0833デフォルトの名無しさんNGNG
>>832
newで生成したのならboost::shared_ptrとかに乗せたらいいじゃない。
0834デフォルトの名無しさんNGNG
ttp://www.tietew.jp/cppll/archive/7539
これをみてちょっと良いなと思ったのですが、
boost辺りで同じ事を出来ないでしょうか?lambdaなどを見てるとなんだか出来そうで。

このライブラリを使えればベストなのですが、なかなか
0835デフォルトの名無しさんNGNG
>>834
>boost辺りで同じ事を出来ないでしょうか?
自分で同じこと(スコープ区切るだけ)をすれば良いだけではないですか?
その記事に書いてあること以上の何をお望みですか?
局所関数の簡単な生成?
0836デフォルトの名無しさんNGNG
>>835
ええと、要するに関数内関数の話です
struct辺りを使ってトリッキーに実現は出来るけど、あんまし読みやすくならないんですよね
これはなかなか可読性も良く、速度も落ちないみたいなんでいいなと
0837デフォルトの名無しさんNGNG
俺なら普通に関数に分けるけどね。
0838デフォルトの名無しさんNGNG
関数内関数を擬似的に実現させる方法はいろいろあると思うんだけど、
テンプレート引数に使えるのはある?
てゆーか、ありえる?
0839デフォルトの名無しさんNGNG
テンプレート引数として渡すには最低でもファイル内スコープを持ってないとダメだからたぶん無理だろう。
0840デフォルトの名無しさんNGNG
>>838
boost::lambdaで強引に書くくらいかな…
0841デフォルトの名無しさんNGNG
ところで何でローカルクラス等だと渡せないの?
外部リンケージとテンプレートみたいにコンパイラの中の人の仕事を楽にするため?
0842デフォルトの名無しさんNGNG
>>841
インライン展開しない/できないときのため
0843デフォルトの名無しさんNGNG
本物はやっぱり便利でっせ

EnumFindWindows(caption) {
 int find = 0;
 int b = malloc(512);
 EnumWindows(lambda __stdcall(hwnd, lparam) {
  GetWindowText(hwnd, b, 512);
  if (!strcmp(b ,caption))
  find = hwnd;
  return find ? 0 : 1;
},0);
 free(b);
 return find;
}
0844デフォルトの名無しさんNGNG
>838
http://do.sakura.ne.jp/~junkroom/cgi-bin/megabbs/readres.cgi?bo=lounge&vi=999294620&res=159&fi=no
インライン化を諦めるならこういうやり方もあるにはあるんですが・・・.
0845デフォルトの名無しさんNGNG
>>843
このスレ的に、EnumWindowsはSTLSoft使って欲しい。
0846デフォルトの名無しさんNGNG
>>838
つい最近cppllに出てたもの
ttp://www.tietew.jp/cppll/archive/11286
0847デフォルトの名無しさんNGNG
>>846
内部関数から親関数のローカル変数って参照できる?

そういやPascalってどうなんだろ
たしか内部関数作れるんだよね。
0848デフォルトの名無しさんNGNG
>>846
ただの内部関数はそれこそイディオムが成立するくらい誰でも出来るのです。
このスレ的にはテンプレート化することが重要なのれす。
0849デフォルトの名無しさんNGNG
Pascalはスタックポインタ、フレームポインタとは別のレジスタを保存して
静的スコープの外側へのリンクを張りながら呼び出すんで。
0850デフォルトの名無しさんNGNG
>>846
ただの関数ポインタとして扱われるからリンケージが関係なくなるのかな
0851デフォルトの名無しさんNGNG
>>847
846さんの方法だと無理です.
local functorなら参照したいローカル変数のポインタを明示的に渡すことで,
一応可能にはなると思います.
0852デフォルトの名無しさんNGNG
>>851
functorだとテンプレート引数に出来ないというジレンマ
0853デフォルトの名無しさんNGNG
>>847
元の関数がメンバ関数だと使えない手法だけど、
ttp://www.tietew.jp/cppll/archive/2507
みたく関数をクラス化してしまうのはどう?
元の関数でローカル変数だったものはメンバ変数にしてしまえば
当然だけどメンバ関数から利用可能だし。
0854デフォルトの名無しさんNGNG
>852
なので844みたいなのを考えてみました.
でも,よく考えれば846さんの方法でもbindすればある程度のことは可能ですね.

#include <string>
#include <algorithm>
#include <iostream>
#include <boost/lambda/bind.hpp>
int main(){
using namespace std; using namespace boost::lambda;
struct local{
static bool match(string const &l, string const &r)
{ return l == r; }
};
string a[] = {"Marc", "Shawn", "George", "Robert"};
string match = "George";
string *found = find_if(a, a + 4, bind(local::match, _1, match));
cout << found - a << endl;
}
0855デフォルトの名無しさんNGNG
>>854
関数内関数を作ったつもりだろうけど結局static関数をつくったら意味が無いという罠だけどね
0856デフォルトの名無しさんNGNG
static関数だとなんで意味無いの?
0857デフォルトの名無しさんNGNG
>856
インライン展開されないんじゃない?
0858デフォルトの名無しさんNGNG
>>847
inner関数が実行されている時は、
outer関数も実行されている時。
これは関数のスコープ規則によって必ず約束される。

inner関数にグローバルスコープを持たせると、
この制約が破られるから、>>838は駄目。

Lisp/Schemeのようにクロージャで環境問題を解決するか、
局所的なスコープを持った引数を渡されたテンプレートの特殊化は、
局所的なスコープを持つとする必要がある。
member関数の場合、型システムに帰着できるが、
inner関数はスコープ問題になってしまうので、C++は避けているんだろう。
0859デフォルトの名無しさんNGNG
>>856
thisがなくていいの? ってことでしょ。
0860デフォルトの名無しさんNGNG
外部リンケージを持たない型をテンプレートに渡せるようにすればいいだけじゃん。
名前のバッティングとかいろいろ言ってるけどそんなの無名namespaceと同じ方法で解決できるし。
0861デフォルトの名無しさんNGNG
「名前のバッティング」って具体的にどのレス?
0862デフォルトの名無しさんNGNG
>>860
inline 関数中で定義されたクラスをどうするかっつー問題が。
0863デフォルトの名無しさんNGNG
>>860は自由変数をどう扱うかっていう、
Lispの世界で環境問題って言われている問題を理解してないんでしょう。

関数のスコープとライフタイムの一致は、古典的手続き型言語の一つの特徴。
Pascalがもっとも端的。
0864デフォルトの名無しさんNGNG
windowsでフルパスからpathを作成したいのですが、
どうすべきなのでしょうか?
(VC7.1,boost1.31,boost1.32draft)

boost::filesystem::path full_path("c:\test");

//c:\test error
//c:/test error
0865デフォルトの名無しさんNGNG
>>864
ttp://www.boost.org/libs/filesystem/doc/portability_guide.htm#name_check-_functions
0866デフォルトの名無しさんNGNG
Javaはfinal指定しておけば関数の外に出てからも参照できるね。
0867デフォルトの名無しさんNGNG
"c:\test""c:\test""c:\test""c:\test""c:\test""c:\test""c:\test""c:\test"
"c:\test""c:\test""c:\test""c:\test""c:\test""c:\test""c:\test""c:\test"
"c:\test""c:\test""c:\test""c:\test""c:\test""c:\test""c:\test""c:\test"
"c:\test""c:\test""c:\test""c:\test""c:\test""c:\test""c:\test""c:\test"
"c:\test""c:\test""c:\test""c:\test""c:\test""c:\test""c:\test""c:\test"
0868デフォルトの名無しさんNGNG
ま、"c:\\test"だわな。
0869デフォルトの名無しさんNGNG
質問です

class Hoge{
};

typedef boost::shared_ptr<Hoge*> pHoge;

class Mage : public Hoge{
vector<pHoge> array;
public:
Mage(){
pHoge o = this;
array.push_back( o );

for( int i = 0; i < 3; i++ ){
pHoge buf( new Hoge );
array.push_back( buf );
}
}

~Mage(){
array.clear();
}
}

このように派生元(Hoge)のポインタと
新規に追加する(Hoge)との混合の array を生成すると
array.clear()時に失敗してしまいます

これを解決する方法があれば教えてください
0870デフォルトの名無しさんNGNG
>>869
おもしろくない。
0871デフォルトの名無しさんNGNG
>>869
それコンパイル通らねえだろ。
0872デフォルトの名無しさんNGNG
コードがメチャクチャだし、テンプレート引数がHoge*なのもおかしい
0873デフォルトの名無しさんNGNG
書き直します

class Hoge{
};

typedef boost::shared_ptr<Hoge*> pHoge;

class Mage : public Hoge{
vector<pHoge> array;
public:
Mage(){
pHoge o( this );
array.push_back( o );

for( int i = 0; i < 3; i++ ){
pHoge buf( new Hoge );
array.push_back( buf );
}
}

~Mage(){
array.clear();
}
};

が、>テンプレート引数がHoge*なのもおかしい というのはなぜでしょうか?

Mageに継承されたHoge自身を array の先頭に格納し、
後々 pHoge buf( new Hoge ); のように
別のデータを追加していきたいと考えているのですが…
0874デフォルトの名無しさんNGNG
>>873
boost::shared_ptrの使い方をもう一回調べて来い
0875デフォルトの名無しさんNGNG
そもそもshared_ptrとはなんぞやから調べたほうが良いと思う。
0876デフォルトの名無しさんNGNG
> typedef boost::shared_ptr<Hoge*> pHoge;

typedef boost::shared_ptr<Hoge> pHoge;
ちゃうんかと。
0877デフォルトの名無しさんNGNG
>>876
それはわかっとる。それに、気づくのが遅いよ君。
0878デフォルトの名無しさんNGNG
やれやれ
0879デフォルトの名無しさんNGNG
boost::filesystem::pathの罠

path t("c:\\1-2-3",native);
// t /= "4 5 6"; //ERROR
// t /= path("4 5 6"); //ERROR
t /= path("4 5 6",native);//OK

毎回native入力するの面倒な気が...
0880デフォルトの名無しさんNGNG
>>879
そんな駄目ライブラリは窓から投げ捨てろ
0881デフォルトの名無しさんNGNG
>>880
CUIならいいのー? にゃんにゃん
0882デフォルトの名無しさんNGNG
>>881
CUIでも窓なら駄目。
0883デフォルトの名無しさんNGNG
boost::filesystemの作者がアンチM$だしな
0884デフォルトの名無しさんNGNG
アンチMSとかの問題じゃなくてスペース含んだパスの取り扱いの問題だろ?
試してないがスペースをエスケープすればいいんでないの?
0885デフォルトの名無しさんNGNG
>>879
http://www.boost.org/libs/filesystem/doc/path.htm#name_check-_mechanism

path::default_name_check(native);
path t("c:\\1-2-3"); // OK
t /= path("4 5 6"); // OK
0886デフォルトの名無しさんNGNG
どっちにしろマルチバイト文字扱えないんだからWindowsじゃ使えないだろ
0887デフォルトの名無しさんNGNG
Rubydesubetekaiketu !!!!!!!!!!!!!!!
0888879NGNG
>>885
thanks.
そんな方法があったとは...

>>886
separatorと検出する方法(MBCSを使う)を
外部指定できれば、可能性ないかな?
0889デフォルトの名無しさんNGNG
唯一、MBCSのことを考えてくれたMicrosoftも.NETに移行だし、
もう、C++でMBCSというのは、完全に無いんだろうな。
0890デフォルトの名無しさんNGNG
>>889
C++/CLI
0891デフォルトの名無しさんNGNG
>>888
マルチバイト対応もワイドキャラクタ対応も数時間あれば出来るようなことだが
作者にその気がないのでしょうがない。
0892デフォルトの名無しさんNGNG
>>891
ほんとにやる気ないの?
ttp://article.gmane.org/gmane.comp.lib.boost.devel/113105
0893デフォルトの名無しさんNGNG
どうせboost::filesystemなんて標準には含まれないのは分ってるんだから
どっちでもいいのでは。使いたくないのなら使わなきゃいいだけなのでは
0894デフォルトの名無しさんNGNG
>>893
なんで分かってるの?
0895デフォルトの名無しさんNGNG
>>894
C++を動かす環境にファイルシステムがあるとは限らないから。
0896デフォルトの名無しさんNGNG
fopenとかfstreamとかどうなるんだ
0897デフォルトの名無しさんNGNG
標準のfopenやfstreamは名前を指定してストリームを作成する汎用の手段を提供してるに過ぎない。
開くストリームは例えば特定のメモリ領域に名前をつけたものだったり、
極端な話WebページをGETしてもいい。
ファイルシステムとは違う。
0898デフォルトの名無しさんNGNG
現状含まれていないのを根拠に、将来含まれないのが分かってるというのかね?
0899デフォルトの名無しさんNGNG
>897
へりくつー
0900デフォルトの名無しさんNGNG
>>899
無知ー
0901デフォルトの名無しさんNGNG
>>895
freestanding と hosted environment をゴッチャにしてないか?
0902デフォルトの名無しさんNGNG
おとうさまー
0903デフォルトの名無しさんNGNG
(棒読み)
0904デフォルトの名無しさんNGNG
マルチバイトじゃパラメタライズできんから、
テンプレートマクロ集というカテゴリで出すにはふさわしくないだけでしょ。
出すならまた別のライブラリに含める形で。
0905デフォルトの名無しさんNGNG
結論: 日本語をちゃんと扱いたきゃRubyを使え馬鹿ども
0906デフォルトの名無しさんNGNG
>>904
> マルチバイトじゃパラメタライズできんから、

君、レベル低すぎ。

0907デフォルトの名無しさんNGNG
あほか。エンコードごとに
operator[]やfindやsubstrも変更だろ。
場合によっては効率面でopertor[]を
ランダムアクセス禁止にしなければならなくなる。
0908デフォルトの名無しさんNGNG
パラメタライズ出来るじゃん(w
レス数が900を超えています。1000を超えると表示できなくなるよ。