トップページ⇒tech
741コメント230KB

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

■ このスレッドは過去ログ倉庫に格納されています
0001デフォルトの名無しさんNGNG
C++ のジェネリックプログラミングの話をしましょう。
以下のスレッドを統合するスレです。

STLスレッド
Part1 http://pc.2ch.net/tech/kako/1004/10042/1004287394.html
Part2 http://pc3.2ch.net/test/read.cgi/tech/1026793823/

【C++】Boost使い集まれ!
http://pc3.2ch.net/test/read.cgi/tech/1033830935/

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/

関連スレ、その他リンクは >>2-5 あたりに。
0002デフォルトの名無しさんNGNG
関連スレ
C++相談室 part17
http://pc2.2ch.net/test/read.cgi/tech/1047560042/l50

リンク
STLPort
 http://www.stlport.org/

boost
 http://www.boost.org/

Loki
 http://freshmeat.net/projects/lokilibrary/
 http://www.geocities.com/rani_sharoni/LokiPort.html

ISO/IEC 14882
Programming languages -- C++
 http://webstore.ansi.org/ansidocstore/product.asp?sku=ISO%2FIEC+14882%2D1998
 http://www.kuzbass.ru/docs/isocpp/
0003デフォルトの名無しさんNGNG
boostに関する有名な日本語サイト

・boost info
http://user.ecc.u-tokyo.ac.jp/~g940455/wp/boost/

・Hattareme Programming
http://www.dodgson.org/lab/hat/

・Let's boost
http://www.kmonos.net/alang/boost/

・Regex
http://www.s34.co.jp/cpptechdoc/article/regexpp/

・Boostを使おう
http://www.emaki.minidns.net/Programming/tools/Boost/
0004デフォルトの名無しさんNGNG
otu
0005デフォルトの名無しさんNGNG
リンク追加
http://pc2.2ch.net/test/read.cgi/tech/1047927332/
0006デフォルトの名無しさんNGNG
>>5
HSPかよ!!
0007デフォルトの名無しさんNGNG
リンク修正
【C++】Boost使い集まれ!
http://pc2.2ch.net/test/read.cgi/tech/1033830935/
0008デフォルトの名無しさんNGNG
>>1 乙カレー。
0009デフォルトの名無しさんNGNG
>>940
新スレヨロ
0010デフォルトの名無しさんNGNG
リンク追加
http://pc.2ch.net/test/read.cgi/prog/1045323654/l50
0011デフォルトの名無しさんNGNG
オモシロイリンクダナ
  ( ・∀・)   | | ガッ
 と    )    | |
   Y /ノ    人
    / )    <  >__Λ∩
  _/し' //. V`Д´)/  
 (_フ彡        /  ←>>10
0012デフォルトの名無しさんNGNG
意地でもマ板にリンクしたい奴の数→(1)
0013デフォルトの名無しさんNGNG
意地でもマ板にリンクしたい奴の数→(65536)
0014デフォルトの名無しさんNGNG
shared_ptrから生ポインタを取り出す方法を教えてください。
というか、shared_ptrから別の型のポインタにキャストする方法を
教えてください。
0015デフォルトの名無しさんNGNG
>>14
get()
0016デフォルトの名無しさんNGNG
(Any *)&*sp;
0017デフォルトの名無しさんNGNG
>>14 他にもこんなのがある。
template<typename T, typename U>
shared_ptr<T> shared_static_cast(shared_ptr<U> const & r); // never throws

template<typename T, typename U>
shared_ptr<T> shared_dynamic_cast(shared_ptr<U> const & r);

template<typename T, typename U>
shared_ptr<T> shared_polymorphic_cast(shared_ptr<U> const & r);

template<typename T, typename U>
shared_ptr<T> shared_polymorphic_downcast(shared_ptr<U> const & r); // never throws
0018デフォルトの名無しさんNGNG
どうもありがとう。用意されているならそれを使ってみます。

ところでなんで>>16のやつって間に&が必要なんですか?
0019デフォルトの名無しさんNGNG
(Any &)*sp;
0020デフォルトの名無しさんNGNG
VC6でSTLPort使てた時Debugでビルドした時
void Foo(const std::vector<std::string>& v)
{
  std::vector<std::string>::iterator it;
  for(it = const_cast<std::vector<std::string>::iterator>(v.begin()); it != v.end(); ++it){
    ...
  }
}
で、
error C2440: 'const_cast' :
ってでます。

VC6付属のSTLではリリースビルド、デバッグビルドともにエラーは出ません。
STLPortを使った時もリリースビルドならエラーは出ません。

今はifdefでSTLPort使てた時Debugビルドの時だけ
void Foo(std::vector<std::string>& v)
{
  std::vector<std::string>::iterator it;
  for(it = v.begin(); it != v.end(); ++it){
    ...
  }
}
とconstを外したものを使うようにしていますが
ソースが見にくくてしょうがないです。
何か良い方法はありませんか?
0021デフォルトの名無しさんNGNG
void Foo(const std::vector<std::string>& v)
{
  std::vector<std::string>::const_iterator it,last;
  for(it = v.begin(); it != last; ++it){
    ...
  }
}

つーかSTLをもっとちゃんと勉強しましょう
Effective STLとかね
0022デフォルトの名無しさんNGNG
あ、
last=v.end()
を追加してくれーーーーーー
0023デフォルトの名無しさんNGNG
>>21
ありがとうございます。
>>つーかSTLをもっとちゃんと勉強しましょう
つくづく実感しました。

0024デフォルトの名無しさんNGNG
gcc 3.2.2 で boost::lambda が使えない?

#include <iostream>
#include <algorithm>
#include <vector>
#include <boost/bind.hpp>
#include <boost/mem_fn.hpp>
#include <boost/lambda/lambda.hpp>

int main(int argc, char** argv) {
std::vector<char*> v;
std::for_each(argv, argv + argc, boost::bind(boost::mem_fn(&std::vector<char*>::push_back), &v, _1));
std::for_each(v.begin(), v.end(), std::cout << boost::lambda::_1 << std::endl);
return 0;
}
0025デフォルトの名無しさんNGNG
>>24
std::for_each(v.begin(), v.end(), std::cout << boost::lambda::_1 << '\n');
で我慢しとけ。
std::endl は認識できない。
0026デフォルトの名無しさんNGNG
for(it = c.begin(); it != c.last;() ++it) のかわりに for_each を使ったほうがいい局面って
少ないような気がする。
0027デフォルトの名無しさんNGNG
>>26
気のせい。
0028デフォルトの名無しさんNGNG
list < shared_ptr<MyClass> > ls;

というリストから、ls.erase(iter)などで要素を削除するときに、
リストから削除されるのは、基本的にポインタだけなのですよね。
このようなスマートポインタの場合、ちゃんとポインタが指すオブジェクトも
解放されるのですか?

また、普通のポインタの場合は、ちゃんと自分でdeleteもしないといけないのですか?
0029デフォルトの名無しさんNGNG
>>28
スマートポインタの場合、ちゃんとポインタが指すオブジェクトも解放されるのです。
普通のポインタの場合は、ちゃんと自分でdeleteもしないといけないのです。
003024NGNG
>>25
サンクス。でも何だか悔しい…(´・ω・`)ショボーン

>>26
そうかなぁ、俺は逆に for 使って書く方が少ないかも。
 int hoge[] = {0, 1, 2, 3, 4};
 for (i = hoge.begin() ; i != hoge.end() ; ++i) {
  ....
 }
って書けんだろ?やってる事が同じなのに、コンテナに入ってるか
配列に入ってるかの違いだけで、アクセスする方法も変わるのは、
なんだか美しくない気がする(なんじゃそりゃ)。
0031デフォルトの名無しさんNGNG
>>30
lambdaに << std::endl; が通らないのは、よくわからんが
endlのテンプレート・パラメータがうまく解決できてないからのような
気がする。boost::lambdaが改良されればこのコードも通ると思う。
0032デフォルトの名無しさんNGNG
>>30
boost::arrayを使えばいいやん
0033デフォルトの名無しさんNGNG
うぉーーー!!てっきりもうメンテされてないのかと
思ったら pooma 生きてんじゃん!!

ttp://www.codesourcery.com/pooma/pooma

感動age
0034デフォルトの名無しさんNGNG
shared_ptrを明示的に解放するにはどうしたらいいんですか?
まさかNULLとか関係ないポインタを代入させて(参照を0にすることで)
解放するわけじゃあないですよね。
0035デフォルトの名無しさんNGNG
>>34
Q.Why doesn't shared_ptr provide a release() function?
A.shared_ptr cannot give away ownership unless it's unique()
because the other copy will still destroy the object.
とDOC中にありますので、明示的な解放はヤバイという事です。
0036デフォルトの名無しさんNGNG
む。じゃあNULLを指せばいいのかな(笑
0037デフォルトの名無しさんNGNG
>>36
それも危なげ。

class A {
public:
A() { std::cout << "A()" << std::endl; }
~A() { std::cout << "~A()" << std::endl; }
};

int main()
{
boost::shared_ptr<A> a(new A);
boost::shared_ptr<A> b(a);

std::cout << a.use_count() << std::endl;
a.reset((A*)0);
std::cout << b.use_count() << std::endl;
}
0038デフォルトの名無しさんNGNG
というか、なんで明示的な解放が必要なのか?
0039デフォルトの名無しさんNGNG
int main()
{
boost::shared_ptr<A> a(new A);
boost::shared_ptr<A> b(a);

std::cout << a.use_count() << std::endl;
std::cout << *b->p << std::endl;
a.reset((A*)0);
std::cout << b.use_count() << std::endl;
std::cout << *b->p << std::endl; // あぼ〜ん!!
}
0040デフォルトの名無しさんNGNG
じどうてきにかいほうしてくれないから
0041デフォルトの名無しさんNGNG
スマソあぼ〜んはしないわ。
0042デフォルトの名無しさんNGNG
だったらなまぽにしなされ
0043デフォルトの名無しさんNGNG
>>40
だったらスマートポインタなんて使うなYO!
0044デフォルトの名無しさんNGNG
だったらぬるぽいんたを使いなされ。
0045デフォルトの名無しさんNGNG
え、みんなスマートポインタを使うときは解放しないの?
0046デフォルトの名無しさんNGNG
しませんガッ何か?
0047デフォルトの名無しさんNGNG
え、みんなガーベッジコレクション使う時は解放しないの?
0048デフォルトの名無しさんNGNG
ガベコレの場合は手動で開放する場合もあると思うんだが…。
デカいデータを扱った時とか。100% 開放してくれるわけじゃないし。
0049デフォルトの名無しさんNGNG
手動で開放?
あるオブジェクトを指定して解放というのは一般的な言語でできるの?
0050デフォルトの名無しさんNGNG
shared_ptr の話だろ?
> デカいデータを扱った時とか。100% 開放してくれるわけじゃないし。
って何だ?相互参照しまくりって事か?
0051デフォルトの名無しさんNGNG
>>49
Boehm GC。ていうか C++ スレだし。

>>50
参照されてないからって100%開放されるわけじゃないよ。
0052デフォルトの名無しさんNGNG
shared_ptrって参照カウンタらしいから
参照が0になれば開放されるのかと思っていた
0053デフォルトの名無しさんNGNG
>>52
いや、開放されないのは GC だって…文脈読んでくれよ…。
shared_ptr はメモリリークしない??
005450NGNG
話が見えないんだが、今 shared_ptr とガベコレとの全く違う話が
並行してるのか?

>>51
どーゆー時に開放されないのか教えてたもれ。
ソース追った感じだとリファレンスカウントゼロになった時点で
checked_delete(ptr)、すなわち delete p が呼ばれてるようだが・・・
0055デフォルトの名無しさんNGNG
>>54
その通りだよ。下のプログラムではaもbも0にリセットした途端に
Aのデストラクタが呼ばれる。

int main()
{
boost::shared_ptr<A> a(new A);
boost::shared_ptr<A> b(a);

std::cout << a.use_count() << std::endl;
std::cout << *b->p << std::endl;
a.reset((A*)0);
std::cout << *b->p << std::endl;
std::cout << b.use_count() << std::endl;
b.reset((A*)0);
std::cout << "still running." << std::endl;
}
005650=54NGNG
>>55≠51なんだよな?
じゃないと全然
> 参照されてないからって100%開放されるわけじゃないよ。
の説明になっていないように見えるんだが…。
0057デフォルトの名無しさんNGNG
>>56
boost::shared_ptrのDOCを隅から隅まで読んでみたが、確かに
「参照している数が0になった途端にデストラクタが呼ばれる」とは
どこにも書いてないね。
メモリリークを起こさず、CopyConstructible and Assignable なので
標準コンテナに入れられるような事しか書いてない。
0058デフォルトの名無しさんNGNG
>56
>参照されてないからって100%開放されるわけじゃないよ

これはおそらくBoehm GCが保守的なGCを行っているので(他のゴミ値がオブジェクトへのポインタの可能性があるので)
そういったのだと思う
005950=54=56NGNG
ちょっと待てぇ〜。大混乱中。俺は>50で
> shared_ptr の話だろ?
と書いたら>51で
> >>50
> 参照されてないからって100%開放されるわけじゃないよ。
と書かれたんだから、
「shared_ptr でも参照されてない時でも開放されない場合がある」
って>51は言ってるんだよな?ここで
「『ガベコレの場合は』参照されていない時でも(まだ)開放されない場合がある」
とか言ってるわけじゃないんだろ?とりあえず>51降臨してくれ。
気になって夜も眠れ・・・たけどさ(w
# もし>53=>51なら文脈読めてないのは>53の方なわけだが…

なんかアラシみたいになってスマソ
006059NGNG
すまんが>51降臨期待ageさせて頂きまふ。
006159NGNG
あぁ、なんか分かったぞ。とりあえず>>48は>>47のネタレスへのレスなんだな。
だから本来は放置していいはずなんだな。なんだ、それだけか。
お騒がせスマソ。
0062デフォルトの名無しさんNGNG
つまり、shared_ptrが指すオブジェクトを今すぐ解放したい場合は、
どうすればいいのだ?
0063デフォルトの名無しさんNGNG
delete p.get();
0064sageNGNG
shared_ptr<foo> *p = new shared_ptr<new foo>;

// ima sugu
delete p;
0065デフォルトの名無しさんNGNG
C++使いは手当たり次第に外部ライブラリ試している暇があったら
一度は費用対効果というものを真剣に考えてみる必要がある。
習得コストや可読性を考えるとほとんどの開発者が
コストを回収しきれていないのが現実。
そのコストを貴重な休日で穴埋めしたいならそれでもいいけどさ。
0066デフォルトの名無しさんNGNG
はなしに関連性がないけど
vc7ってtemplateの部分特殊化みとめてないんですね。
0067デフォルトの名無しさんNGNG
>>65
コピペウザイ
0068デフォルトの名無しさんNGNG
>>65
マジレスすると標準ライブラリだけでゴリゴリ書いてるコードの方が
汚なくて読めないし、生産効率も悪い。
ほとんど同じコードをダラダラ書いてるのが綺麗だとでも思ってんの?
セオリックをまとめた外部ライブラリは習得しても無駄じゃない。

// いや、メタプログラミングとかはアレだけさ
0069デフォルトの名無しさんNGNG
>>62
そのshared_ptrが指すオブジェクトがあって
そのオブジェクトを指す、すべてのshared_ptrを今すぐ廃棄する
0070デフォルトの名無しさんNGNG
>>68
非標準ライブラリってそう簡単に導入できるものじゃないと思うけど。
実際に導入したプロジェクトの規模・人数・ライブラリの種類ってどんなもんなの?
0071デフォルトの名無しさんNGNG
うちの会社は標準ライブラリのSTLですら使用禁止ですが、何か?
0072デフォルトの名無しさんNGNG
>>71
バグ取りとか大変そうですね
0073デフォルトの名無しさんNGNG
>>71
ごちそうを目の前にして食べられずにいるような心理状態か。
まあマ板向けの話題だな。
0074デフォルトの名無しさんNGNG
>>71
API直書きですか?
それでMFCとか使ってたら笑えるけどな
0075デフォルトの名無しさんNGNG
まあ、ライセンスの関係もあるから仕事で使うときは注意がいるわな。
0076デフォルトの名無しさんNGNG
いや、周りがCしか使えない人ばかりで
その人たちが言うにはSTLなんて信用できないそうだ
0077デフォルトの名無しさんNGNG
お前たちの書くコードよりも遥かに信用できるワイ!ってあの人が言ってました
0078デフォルトの名無しさんNGNG
STLのコードの方が信頼できるけど
厨がSTLを使って書いたコードは信頼出来ない
0079デフォルトの名無しさんNGNG
STLは両刃の剣age
0080デフォルトの名無しさんNGNG
T* の引数をとって、そこに値を格納するようなAPI に対してboost::shared_ptr<T>を
使うにはどうしたらよいのでしょうか?
一時変数を使うしかないですか?
0081デフォルトの名無しさんNGNG
boost::shared_ptr<T>::get
0082デフォルトの名無しさんNGNG
>>81
カウンタ値がおかしくなるに一票
0083デフォルトの名無しさんNGNG
>>82
渡されたAPIがshared_ptrのカウンタに干渉する可能性は無いわけだが。
0084デフォルトの名無しさんNGNG
>>80
shared_ptr<T> p( new T());
f(p.get());
0085デフォルトの名無しさんNGNG
>80ですが、T**の引数の間違いでした。すいません。
0086デフォルトの名無しさんNGNG
shared_ptr<T> sp;
T *p;
func(&p);
sp.reset(p);
0087デフォルトの名無しさんNGNG
>>80
そのAPIから返されたポインタをdeleteで削除することにしていいのか?
そういう引数を使って返すということは、freeか専用の解放APIとかじゃないか?
0088デフォルトの名無しさんNGNG
>>85
ひょっとしてDirectXとかのCOMのAPIじゃないの?
だとしたらCComPtrがいい。COMに適したスマートポインタ
違っていたらまことにあいすまん
0089デフォルトの名無しさんNGNG
すまんで許されるのかね?
0090デフォルトの名無しさんNGNG
跪け!命乞いをしろ!
0091デフォルトの名無しさんNGNG
バルス!?
0092デフォルトの名無しさんNGNG
めがぁぁ、めがぁぁ(#ノωノ)
0093デフォルトの名無しさんNGNG
天プレートの城ラピュタ
0094デフォルトの名無しさんNGNG
アニオタうざい。他んとこでやれよ。
0095デフォルトの名無しさんNGNG
>>89-93
ワラタ
のりのいいプルグラマ(・∀・)イイ!!
0096デフォルトの名無しさんNGNG
>>94
君もね
0097sageNGNG
boost::spiritに俺様の指向性アンテナがビンビンなんだが
業務で使うのがVC6/7なんで試そうかどうか悩み中。

誰か試してないか?
0098デフォルトの名無しさんNGNG
>>97
boost::spiritは1.30から加わったパーサもどきらしいですね。
今Boost-jpで日本語訳をするかどうか検討中。

#それよりも1.29の訳を早く終わらせねば。
0099デフォルトの名無しさんNGNG
enumに浮動小数使えるコンパイラ無いの?
0100デフォルトの名無しさんNGNG
>>99
enumは整数の列挙

100gat
0101デフォルトの名無しさんNGNG
>>98
あれ、「もどき」なのか?
0102デフォルトの名無しさんNGNG
>>101
俺もよくわからん。cppllでパーサとして使えるというのが流れて
いたから。もどきではなくてもしかして本物か?
そうするとC++でPHPなんか書けてしまうとか?
0103ヽ(´ー`)ノNGNG
こっからサンプルコード見れる。マジでビビった(;´Д`)すげぇ
http://cvs.sourceforge.net/cgi-bin/viewcvs.cgi/boost/boost/libs/spirit/example/application/
0104デフォルトの名無しさんNGNG
>>103
Boost1.30出てるから、落として解凍した方がいいよ。
0105デフォルトの名無しさんNGNG
イカレてるな
0106デフォルトの名無しさんNGNG
STLには多倍長の計算ができないですよね。
みなさんは必要なときどうやっていますか?
足し算引き算くらいだったら自分で作れるけど、
巨大な数と巨大な数の割り算とか実装するのは大変なので。
0107デフォルトの名無しさんNGNG
多倍長整数のクラスをどっかから拾ってきてコンテナに放り込めばいいだけでは?
0108デフォルトの名無しさんNGNG
どっかから?
0109デフォルトの名無しさんNGNG
おれたちのせかいから!
0110ヽ(´ー`)ノNGNG
>>104
ありがとう、落としてみたよ。19日に 1.30 出てたんだね。
新しく増えてるモノで遊んでます。

>>106
boost::rational のドキュメントに、
> Note: Should the boost library support an unlimited-precision integer
> type in the future
とあるので、将来的には boost::integer なんてできるかも、できないかも。
0111デフォルトの名無しさんNGNG
どっか=イラクの大統領宮殿
0112デフォルトの名無しさんNGNG
>>106
GMPでもMintでも好きなのを使えばよい。
0113デフォルトの名無しさんNGNG
>>110
boost-sandbox にある bigint はどう?

http://cvs.sourceforge.net/cgi-bin/viewcvs.cgi/boost-sandbox/boost-sandbox/boost/bigint.hpp?rev=HEAD&content-type=text/vnd.viewcvs-markup
0114デフォルトの名無しさんNGNG
>>108-109
SaGaかな…難しいとこだが…
0115デフォルトの名無しさんNGNG
教えてください

標準C++ライブラリで、うまいことワイド文字(列)をマルチバイト文字(列)に
変換したり、その逆の処理をするクラスないし関数ありませんか?
0116デフォルトの名無しさんNGNG
>>115
ここ template スレだから。
0117デフォルトの名無しさんNGNG
>>115
微妙にスレ違いだが、テンプレートを利用するなら、std::ctype を使えばいいかも。


std::wstring source = L"(・∀・)";
std::string result( source.size(), char() );
const std::ctype< wchar_t >& ct = use_facet<std::ctype<char> >( std::locale() );
ct.narrow(source.data(),source.data()+source.size(),' ',&result[0]);
assert( result == "(・∀・)" );

うまく良くかは知らん。

0118117NGNG
なんかいろいろ間違えてたっぽい。
いろいろ手直しして、VC++.NET で動作確認。

std::localeloc( "japanese" );
std::locale::global( loc );

std::wstring source( L"(・∀・)" );
std::string result( source.size()*2, char() );
const std::ctype< wchar_t >& ct = std::use_facet< std::ctype<wchar_t> >( loc );
ct.narrow( &*source.begin(),&*source.end(),'?',&result[0]);

std::wcout << L"wide : " << source << std::endl;
std::cout << "narrow : " << result << std::endl;

結果
wide  : (・∀・)
narrow : (・∀・)
0119117NGNG
マルチバイト文字列からワイド文字列へは、

std::string source( "(・∀・)" );
std::wstring result( source.size(), wchar_t() );
const std::ctype< wchar_t >& ct = std::use_facet< std::ctype<wchar_t> >( loc );
ct.widen( &*source.begin(),&*source.end(),&result[0]);

とすればいい。

おしまい。
0120デフォルトの名無しさんNGNG
>>119
実際にはほとんどの環境で使えない罠。
0121115NGNG
>>117
ありがとうございます。参考になりました。
でも、>>119 をみると、どこでもつかえるわけではないようですね。
うーむ。2バイト文字ってまだイマイチなんですね…
0122デフォルトの名無しさんNGNG

【質問】
下記のTYPENAMEにはクラスDDDDを継承した物が入らなければならない、
という事を実装する方法はありますか?
もし、ありましたらそれを教えてください。

template < typename TYPENAME > class AAAA {};
class BBBB : public DDDD {};
class CCCC {};
class DDDD {};

AAAA<BBBB> aaaa_bbbb; // ok
AAAA<CCCC> aaaa_cccc;// ng
AAAA<DDDD> aaaa_dddd; // ok
0123デフォルトの名無しさんNGNG
無い
0124デフォルトの名無しさんNGNG
>>122
LokiでSUPERSUBCLASSとSelectorを組み合わせて・・とか
0125デフォルトの名無しさんNGNG
Lokiで

STATIC_CHECK(SUPERSUBCLASS(DDDD, TYPENAME), TYPENAME_must_be_a_subclass_of_DDDD);
0126122NGNG
Loki ですか。見てみます。
どうもありがとう。
0127デフォルトの名無しさんNGNG
Lokiの SUPERSUBCLASS(B, D)ってBがDのあいまいなベースクラス
のときはコンパイルエラーになるんだね。

class Base{ };
class Derived1 : public Base { };
class Derived2 : public Base { };
class DerivedD : public Derived1, public Derived2 { };

SUPERSUBCLASS(Base, DerivedD);
↑
これダメ
0128デフォルトの名無しさんNGNG
class Derived1 : virtual public Base { };
class Derived2 : virtual public Base { };
じゃねーのか?
0129デフォルトの名無しさんNGNG
AAAAの実装のどっかにTYPENAME型をDDDD型の参照で受けるコード混ぜとけ。
0130デフォルトの名無しさんNGNG
>>128
もちろんそれならOK

>>129
わざわざLokiを持ち出す必要がないときは
それがお手軽でいいね。
0131デフォルトの名無しさんNGNG
今boost::shared_ptrを初めて使い、
言語が変わったと思うくらい感動してるのですが…。

VC6のメンバ自動表示が効かなくなるのは
やはりどうしようもないのでしょうか?

boost::shared_ptr<MyClass> mc( new MyClass() );
mc->
   ↑ここでいつも出るやつです。
0132sageNGNG
どうしようもないれす
0133デフォルトの名無しさんNGNG
やはりそうですか…レスありがとうございました
ガックリ_| ̄|〜〜○ヌルポー
0134デフォルトの名無しさんNGNG
というか、原理的に不可能だと思うのよ。それは流石に。
0135デフォルトの名無しさんNGNG
「原理的に」だとコンパイルも出来ないですが
0136デフォルトの名無しさんNGNG
boost::shared_ptr<MyClass> mc( new MyClass() );
mc.operator->()->

とかってすれ。で、メンバを選択後、".operator->()" を削除すると。・・・うざー。
0137デフォルトの名無しさんNGNG
>>136
試したけど、出ない気がする…
0138デフォルトの名無しさんNGNG
ひょっとしてshared_ptr系のメンバ表示させようしたら、参照カウンタがインクリメントされたりとかしない?

あと、shared_ptr系のポインタ欲しい場合

HOGE* func(){
shared_ptr<HOGE > hoge_sp(new HOGE );

return hoge_sp.get();
}
//HOGE*が デリートされたらマズー?

shared_ptr<HOGE > func(){
shared_ptr<HOGE > hoge_sp(new HOGE );

return hoge_sp;
}
//なんかカウンタがあやしいことになtってそー
//返り値でエラーのチェックもできなそー

void func( shared_ptr<HOGE >& hoge_sp ){
hoge_sp =shared_ptr<HOGE >( new HOGE );
}
//引数とるのめんどくさーーー。

の、どれが適当でつか?ていうか、みなさんどういう風にしてます?
0139デフォルトの名無しさんNGNG
shared_ptr<HOGE > func(){
return shared_ptr<HOGE >(new HOGE );
}
0140デフォルトの名無しさんNGNG
>>138
> shared_ptr<HOGE > func(){
> shared_ptr<HOGE > hoge_sp(new HOGE );
>
> return hoge_sp;
> }
に何の問題があるのかさっぱりわからんのだが?
0141138NGNG
shared_ptrの正しい使い方がよくわからんので、すんまそん。

えーと、 func の中でfucn2を実行して,func2がうまくいった場合のみポインタかえしたんだけど、
失敗したら、shared_ptrにNULLポインタ代入できないからどうしましょうと、、、、

shared_ptr<HOGE > func(){

if( ! func2 ){
shared_ptr<HOGE > hoge_sp(new HOGE );
hoge_sp.get().m_is_func2 = true
hoge_sp.get()->Init();//func2がうまくいったのでhoge_spの処理などしてみる
return hoge_sp;
}
else{
//func2 が失敗したから なんか失敗したことを返したいのだが。。。
//thorwはなしの方向で・・・・。
shared_ptr<HOGE > hoge_sp(new HOGE ); //とりあえず new?
hoge_sp.get().m_is_func2 = false;
return hoge_sp;
}
}

なんか激しく違う感じが。。。

普通はnewしたあとに何らかの処理をしないで、すぐreturn するもん?
0142デフォルトの名無しさんNGNG
boost::optionalじゃね?
0143デフォルトの名無しさんNGNG
Standard Template Library プログラミング on the Web
http://www005.upp.so-net.ne.jp/episteme/html/stlprog/

ガイシュツ?
0144デフォルトの名無しさんNGNG
>>143

既出ではないが、遅すぎ。
あと、それを示すなら↓これを忘れちゃいかんよ。

Standard Template Library プログラミング をコキおろすスレ
http://jbbs.shitaraba.com/computer/bbs/read.cgi?BBS=5651&KEY=1048756904
0145デフォルトの名無しさんNGNG
>>141
よくわからんが、お前が書いた文章を最大限に汲み取って考えると、こうか?

shared_ptr<HOGE > func(){
shared_ptr<HOGE > hoge_sp;
if( ! func2() ){
hoge_sp.reset(new HOGE );
hoge_sp->Init();
}
return hoge_sp;
}
0146138NGNG
>>145
そんな感じ。

int test()
{
shared_ptr<HOGE > ret = func();

if(hoge.get()== NULL) return "アボーン";
}

でいいのか・・・。
みなさん、ども、ありがとうございますた。


ていうか、実はC言語でも使えるように _std_callとかつかってshered_ptrが握ってる
ポインタ返す場合どうしたらよろしいのかと、思ったわけでして、
shared_ptr<HOGE > func();
以外の方法ないのかなーと、聞こうとして、ぜんぜん別な こと聞いてマスタ。
0147138NGNG
>>142
今、boost::optional みてみた。
いいすね、これ。
0148デフォルトの名無しさんNGNG
>>146
そのコードもはてしなく意味不明だがともかく、
 hoge = shared_ptr<HOGE>(); // 何もポインタを突っ込んでないshared_ptrはNULL扱いになる
 if( !hoge ) return "アボーン"; // get() しないでも ! でnullチェックできる
くらいは覚えといた方がいいぞ。

> ていうか、実はC言語でも使えるように _std_callとかつかってshered_ptrが握ってる
> ポインタ返す場合どうしたらよろしいのかと、思ったわけでして、
自分のコードじゃない外部の関数に渡すその瞬間で、
shared_ptr<>のget()を使って生ポインタに戻すので大抵は十分だと思われ。
0149デフォルトの名無しさんNGNG
shared_ptr<HOGE > hoge_sp(new HOGE );
↑こんなん書いといて、「thorwはなしの方向」って、そりゃムリだ。
0150138NGNG
みなさま、どうもありがとうございました。
ドキュメントとソースきちんと除いてから、でなおしてきます。
0151デフォルトの名無しさんNGNG
Modern C++ Design と Generic programming―STLによる汎用プログラミング

どっち買った方がいいかなぁ。資金的に両方は無理なのよ。
0152デフォルトの名無しさんNGNG
>>151
前者はLokiのデザインパターンを中心に書かれている。初心者には無理。
後者はSTLの本当に基本的な部分が詳細に書かれている。初心者向き。
本当は両方欲しいんだけどね・・・・全然傾向が違う本だから。
0153151NGNG
>>152
thx. じゃ、Genericの方にしとこうっと・・・

ま、今日株が下がらなければ両方20冊ずつぐらい買えたのだが・゜・(ノД`)・゜・。
小泉とブッシュは早く氏ね
0154名無しさん@XEmacsNGNG
typedef templateが実装されている処理系ってない?

仕様はけっこう固まったよね。
http://www.cuj.com/experts/2012/sutter.htm

// ちなみに仕事で使うわけではありません。
0155デフォルトの名無しさんNGNG
どうにも弱ってます。質問お願いしたいのですが、
vectorのreserve等で確保した領域を、
明示的に解放する方法というのは無いのでしょうか?
0156デフォルトの名無しさんNGNG
>>155
こうやると大抵縮んでくれるよ。処理系によってはこれでも駄目な場合が
あるから一応確認してね。

int main()
{
std::vector<int> v;

v.reserve(1000);
std::cout << "capacity = " << v.capacity() << std::endl;
std::vector<int>(v.begin(), v.end()).swap(v);
std::cout << "capacity = " << v.capacity() << std::endl;
}
0157デフォルトの名無しさんNGNG
std::vector<int>(v).swap(v);
こう書いた方が簡単だね。
0158155NGNG
>>156-157
すいません、理解するのに時間がかかりそうなので、
先にお礼をさせてください。レスありがとうございました。

しかし、これはすごい・・・・荒技ですね。
ちょっと恐かったりも(笑
0159デフォルトの名無しさんNGNG
mapってイテレータで順次アクセスできるけど
内部的にはリストか何か保持してるの?
0160デフォルトの名無しさんNGNG
>>158
Effective STLの17項「swap技法」というのを読んでご覧。
>>159
赤黒木で深さ優先探索というのをやっている物が多いそうだ。
0161デフォルトの名無しさんNGNG
>>160
さすが凄いことしてるな。ちょっと勉強してみるか。がりがと。
0162デフォルトの名無しさんNGNG
>>160
参考資料の紹介ありがとうございます。
早速図書館で調べてきます。
0163デフォルトの名無しさんNGNG
>>156
なんでこれで縮むんだろうか?
わからん・・・
0164デフォルトの名無しさんNGNG
>>163
確か、allocator_typeが同じであれば
単に内部配列のポインターを入れ替えてる
だけだったハズ。処理系にもよるけど。

>std::vector<int>(v).swap(v);
コンストラクタでいきなりメンバー呼び出してもOKなの?
…しらんかった…。
0165デフォルトの名無しさんNGNG
>>164
コンストラクタで呼び出しているのではなく、
キャストによってできあがった一時オブジェクトに対してメンバーを呼び出しているんです。
0166デフォルトの名無しさんNGNG
>>165
>キャスト
ああぁ…そういうことか。
すばらスィ勘違い。

つっこみTHX
0167デフォルトの名無しさんNGNG
漏れはこっちのほうが分かりやすくて好きだ。
v.swap(vector<int>(v));

>>164
std::stringとかでよく、s1 + s2 + s3;などと書くのと一緒。
これは結局、std::string(s1 + s2).operator+(s3);
0168デフォルトの名無しさんNGNG
しまった!v.swap(vector<int>(v));はうそ。
一時オブジェクトは非const参照で渡せなかった・・・
0169164NGNG
どうも納得いかなくて試してみたら、
ヤパーリコンストラクタだった…。

#include <iostream>
using namespace std;
struct clsA{
clsA(){cout<<"clsA::clsA()"<<endl;}
clsA(const clsA& a){cout<<"clsA::clsA(const clsA&)"<<endl;}
void swap(clsA& a){cout<<"clsA::swap(clsA&)"<<endl;}
operator clsA(){cout<<"clsA::operator clsA() const"<<endl;return *this;}
operator clsA&(){cout<<"clsA::operator clsA&() const"<<endl;return *this;}
};
void main(void)
{
clsA a;
clsA(a).swap(a);
}

----
clsA::clsA()
clsA::clsA(const clsA&)
clsA::swap(clsA&)
(コンパイラ:VC5)

でもそうなるとなぜclsA a.swap(a);がダメなのかよくわからん…。
ってか、スレ違いでスマソ。
0170164NGNG
×:でもそうなるとなぜclsA a.swap(a);がダメ
○:でもそうなるとなぜclsA a().swap(a);がダメ
0171デフォルトの名無しさんNGNG
>>170
それやると a が空っぽになっちゃうだろ。
0172164NGNG
>>171
あ、clsAはあくまでもテスト用のクラスなので、
記述も例えで書いてあります。
ちなみにswap(clsA&)は表示以外なにもしない。
0173デフォルトの名無しさんNGNG
SampleMFC error LNK2005:
"public: __thiscall _STL::basic_string<char,class _STL::char_traits<char>,
class _STL::allocator<char> >::~basic_string<char,class _STL::char_traits<char>,
class _STL::allocator<char> >(void)"
(??1?$basic_string@DV?$char_traits@D@_STL@@V?$allocator@D@2@@_STL@@QAE@XZ)
は既に定義されています。

意味がわからない
0174デフォルトの名無しさんNGNG
>>173
ですね
0175デフォルトの名無しさんNGNG
_
0176デフォルトの名無しさんNGNG
>>169
コンストラクタだった、ではない。
キャストのときには一時オブジェクト作成のためにコンストラクタが呼ばれるってだけ。
0177デフォルトの名無しさんNGNG
>>176
clsA(a)がキャスト?

clsA(a)は、"Explicit type conversion (functional notation)"
(clsA)aは、"Explicit type conversion (cast notation)"
なんだが、前者をキャストと呼ぶのか?
0178デフォルトの名無しさんNGNG
呼ぶという事にしてあげといて下さい
0179 ◆hMJAPH9PWA NGNG
キャストとコンストラクタなんてやってることは同じなんじゃ…


static_cast<int>(0) // キャスト
static_cast<std::string>("foo")// キャストだが呼ばれるのはコンストラクタ
int(0)//関数スタイルのキャスト

clsA(a)(aはclsAのインスタンス)をキャストと呼ぶのは違和感あるけどね。
0180176NGNG
>>177
その両者を総称してキャストと呼んじゃってたよ。
適切な語は何? 明示的型変換かな?
0181デフォルトの名無しさんNGNG
「キャスト」は式。
「明示的型変換」も式。
「型変換」は動作。
「コンストラクタ」は関数。

キャストまたは明示的型変換で型変換が行われる。
型変換にはコンストラクタが使われる。

・・・ということでよろしいか?
0182164NGNG
>>179
ホントだ。
なんかキャストとコンストラクタ
の境界があいまいになってきた(w

>>165
>コンストラクタで呼び出しているのではなく、
粘着だけど、ヤパーリコンストラクタ。

ちなみにこれ↓でもOK。
clsA().swap(a); //デフォルトコンストラクタ+メンバ呼び出し
clsA(val1, val2).swap(a); //2引数以上のコンストラクタ+メンバ呼び出し
(VC5)
0183デフォルトの名無しさんNGNG
>>182
>>181で納得できないのか?
0184デフォルトの名無しさんNGNG
>>183
>clsA().swap(a);
型変換ではないだろ
0185デフォルトの名無しさんNGNG
関数テンプレートでTを推測するのは
便利でありがたいのだが…

引数でしか推測しないのかな?
戻り値ではだめっぽいのだが

template<typename T>
inline T
f(const char *s)
{
return reinterpret_cast<T>(g(s));
}
0186デフォルトの名無しさんNGNG
>>185
戻り値で推測ができないこともない
0187185NGNG
>>186
どういうこと?

推測ができないこともないのは
コンパイラベンダの努力しだい?

それともプログラマの努力しだい?
template<typename T>
inline void
f(T &t, const char *s)
{
t = g(s);
}
というのも考えたが、これだと
X x;
f(x, s);
となってしまい
const X x = f(s);
のようにconstを使えないのでいやーんと
挫折したのよ…
0188185NGNG
>>187
すまん、↑のは
const X x = f<X>(s);
のような気がする
0189デフォルトの名無しさんNGNG
template<class T> inline void f(char *s)
{...}

const X x=f<X>(s);
0190189NGNG
うそ。
s/inline/T/
0191186NGNG
>>187
プログラマの努力しだい。 発想を変えて考えてみよう。
0192185NGNG
>>191
なに!?ということは方法があるのだな…
つまり最終的には
const X x = f(s);
と書けるのか?
型引数を指定する<>を書かずに
0193デフォルトの名無しさんNGNG
ままま、まさかー!
0194デフォルトの名無しさんNGNG
>>192
書けます。
0195185NGNG
もしや

template<typename T>
inline T
f(const char *s, const T &dummy)
{
return reinterpret_cast<T>(g(s));
}

const X x = f(s, x);
とかするのか?
0196186NGNG
ただVC7ではどうも理想どうり逝きません。
gccでは無事動きました。 VC6・・・は多分動いたと思います。

>>195
違います。
0197185NGNG
186さん、少し考える時間をもらってもいいですか?
10分ほど。

日付が変わったらもう一度かきこむよ。
わかったか、わからなかったか。
その時の返事に答えをきぼんぬ。
0198185NGNG
すまん、186さん、ヒントください。

関数オブジェクト
T operator()(const char *s) const;
みたいなのをつかいますか?つかわないですか?
0199デフォルトの名無しさんNGNG
関数オブジェクト・・・か、うーんおしいような気がする
0200185NGNG
>>199
だめだ、わかんないよ…
わかんないので質問したんだけど

正解をお願いします
0201デフォルトの名無しさんNGNG
struct f{ f(const char* s); template<typename T> operator T() cosnt; };
0202186NGNG
class Foo
{
const char *p_;
public:
Foo(const char *p):p_(p){}

template <class T>
operator T() const
{ return *(T *)(p_); }
};

Foo foo(const char *p)
{ return Foo(p); }


const int i=foo(p);
const float f=foo(p);
と出来ます。

って先に>201にかかれてますか?
0203デフォルトの名無しさんNGNG
なんだよー、ががーり
0204デフォルトの名無しさんNGNG
>>203
そんなものだよ、人生は
0205185NGNG
あ〜
頭をガツンとやられた感じだ

つまりは暗黙の型変換
(の際に仕掛けを発動させる)
をするということですか?
0206185NGNG
ちなみに、これって、戻り値最適化とかが
うまく働きますか?
0207デフォルトの名無しさんNGNG
>>205
そう、その変換が起きるまで処理を遅延させる
0208デフォルトの名無しさんNGNG
>>206
それはコンパイラによるけど

template <class T>
operator &T() const;

処理内容によってはこのように参照を返すとか。

あまり複雑にやり過ぎると最適化かかりにくくなることはあるから、あまり使わないほうがいいのかもね
0209185NGNG
>>208
>あまり複雑にやり過ぎると最適化かかりにくくなることはあるから、あまり使わないほうがいいのかもね

素直に最初のままにつかっておくことにするよ

ところで、そもそもの質問で、
「関数テンプレートは戻り値をTを推測するための材料に使わない」
ということは、そうなのでしょうか?
0210sageNGNG
最適化の都合ではなくて、構文解析のしくみ上の問題だった気がする。
だれかフォローしてくれ
0211デフォルトの名無しさんNGNG
>>209
C++は戻り値を
int func() { ... };

// int n = func();
func();
捨てて文にすることもできる言語なので、戻り値の型は推測には使えない。

戻り値を受け取っている式の時だけ推論して、そうでない使い方の時はエラー、
という仕様も考えられなくはないが、>>210氏の書いてるように
構文上の自分の「子」以外の属性を使う…というのは言語定義が
かなり複雑になるので避けたのだろう。
0212デフォルトの名無しさんNGNG
class A;
class B;

void f(A);
void f(B);

A g();
B g();


f(g());
0213sageNGNG
class A {};
class B : public A {};
class C : public A {};

void f(A);
void f(B);
void f(C);

A g();
B g();
C g();


f(g());

どれだゴルぁ
0214デフォルトの名無しさんNGNG
何がいい対価サパーリわからんが、ここは template すれだ。すれ違い。
C++ では引数が同じで戻り値だけ異なる関数は多重定義できん。
どれだ以前にコンパイルエラーだ、ヴぉけ。
0215デフォルトの名無しさんNGNG
> A g();
> B g();
> C g();

これが通るコンパイラがあるのかどうか知らないが・・・。
0216デフォルトの名無しさんNGNG
言いたいことはなんとなくわかった。
>>201のfを
void func(A);
void func(B);
の関数に突っ込んだら
func(f(s));
「どれだゴルぁ」ってことでないかい?


多分「あいまいだゴルァ!」いわれるのでは
0217デフォルトの名無しさんNGNG
次のようなコードがVCではコンパイルできて
gccではコンパイルできないのですが、
このコードは仕様上、認められているのでしょうか?

struct A
{
  template<class T>
  void Func(){}
};

template<class T>
void FuncA()
{
  A a;
  a.Func<T>();
}
0218デフォルトの名無しさんNGNG
>>217

template<typename T>
struct A
{
void Func() { std::cout << typeid(T).name() << std::endl; }
};

template<typename T>
void FuncA()
{
A<T> a;
a.Func();
}

int main()
{
FuncA<int>();
}
0219デフォルトの名無しさんNGNG
>gccではコンパイルできないのですが
情報なさすぎ
0220デフォルトの名無しさんNGNG
>>219
すいません。

mingw(gcc-3.2.1)では
void FuncA()
{
  A a;
  a.Func<int>();
}
のように普通の関数の中で 明示的にテンプレート引数を指定して
メンバ関数テンプレートを呼び出すことはできたのですが、
>>217のソースのようにテンプレート関数の中で呼び出すと
FuncAを実体化させない場合でも
a.Func<T>(); の部分で

parse error before `>' token

とエラーが出て、コンパイルできなかったんです。
ただ、VC.NETではFuncAを実体化させた場合でも
させない場合でも、コンパイルできたので、
ソースが間違っているのか、gccがその構文に対応していないのか
どちらなのかが知りたくて質問しました。

>>218
えっと....これはどう解釈したら?
VCでの出力は int
mingwでの出力は何故か i
になったのですが...。
0221デフォルトの名無しさんNGNG
>>220
i は int の i です。doubleは多分 d になると思います。
0222デフォルトの名無しさんNGNG
>>220
a.template Func<T>();
でどうよ?(自信無し)
0223217NGNG
>>222
おおっ、コンパイルできるようになりました。
ありがとうございます。

型名の前に付けるtypenameみたいな物が必要なんですね。
0224デフォルトの名無しさんNGNG
>>222
第3版のC.13.6「限定子としてのtemplate」だね。
a.Func<T>(); とした時点でコンパイラにはFunc()がメンバテンプレートで
あることが分かっていないので、'<'が比較演算子だと見なされてエラー
になる。
0225デフォルトの名無しさんNGNG
待て。>>217 のソースの場合、a.Func<T>(); の時点で
a の型は T によらず決定しているから、Func が
テンプレートであることはコンパイラでわかるはずだが。
0226デフォルトの名無しさんNGNG
>>220
FAQ type_info::name()の結果は実装依存。
0227デフォルトの名無しさんNGNG
>>225
構文解析時には文法知識だけでやっていて、他のクラスがどうなってるか、
なんてことまでは考えていないのでは?
0228デフォルトの名無しさんNGNG
>>227
C++ はそれで済むような文法にはなってない。

例えば
 std::string * x;
が"typename"無しでも(掛け算ではなく)変数宣言として扱われるのは、
それより前でstd::stringがクラス名として宣言されてることを
コンパイラが知っているからだし、あるいは上の例で
 A a;
 a.Func<std::string>();
なら"template"無しでも通るのは、(<が不等号なのではなく) a.Func が
メンバ関数テンプレートであることをコンパイラが知っている、からだ。

>>217、Comeau C++ なら通るからgccのバグだと思う。
0229デフォルトの名無しさんNGNG
Comeauも万能ではない
0230デフォルトの名無しさんNGNG
tvmet 1.0.0 Release!
ttp://sourceforge.net/projects/tvmet/
0231デフォルトの名無しさんNGNG
tvmetと
boost::ublasの
違いを簡単に教えてくれー。

とりあえず、ライセンス読んだり、インストールとかめんどいんで
boost::ublasつかってますけど。
0232デフォルトの名無しさんNGNG
すいません。誰か教えてください。

ユニコードファイルを読み込みたいのですが、
wstringのgetlineを使っても、うまく改行を認識してくれないらしく、
2行目以降が読み込めません。

そのファイルの改行コードは、0x0d 0x00 0x0a 0x00 なんですが、
これを認識して正しくgetlineするにはどうしたらいいでしょうか。
0233あぼーんNGNG
 ( ・∀・)< こんなのみつけたっち♪
http://muryou.gasuki.com/moe/hankaku10.html
http://muryou.gasuki.com/moe/hankaku09.html
http://muryou.gasuki.com/moe/hankaku08.html
http://muryou.gasuki.com/moe/hankaku07.html
http://muryou.gasuki.com/moe/hankaku06.html
http://muryou.gasuki.com/moe/hankaku05.html
http://muryou.gasuki.com/moe/hankaku04.html
http://muryou.gasuki.com/moe/hankaku03.html
http://muryou.gasuki.com/moe/hankaku02.html
http://muryou.gasuki.com/moe/hankaku01.html
0234かおりん祭りNGNG
http://saitama.gasuki.com/kaorin/
〜oノハヽo〜 / ̄ ̄ ̄ ̄ ̄ ̄ ̄                
  ( ^▽^) < こんなのがございまーす♪ 
= ⊂   )   \_______
= (__/"(__) トテテテ...
0235デフォルトの名無しさんNGNG
>>232
STLは何使ってんの
とりあえずVC++に付属のSTLはwchar_tの改行処理にバグがある
0236デフォルトの名無しさんNGNG
そうです。VC++.netを使っています。
バグがあるって…パッチとか出ていないんですかねぇ。
0237デフォルトの名無しさんNGNG
>>236
STLはソース状態で公開されてるんだから自分で修正すればいいじゃん。
0238ヽ(´ー`)ノNGNG
>>231
tvmet の Usage を読んでたら、Introduction に
> "Tiny" means dimension less than about 10.
と書いてあるので、それ以上の次元を扱う場合には tvmet は使えないかも。
その分パフォーマンスとか記述の簡便さなんかが期待できるけど、
ublas と比べてる Benchmark は見付けれなかっし、俺にはどっちも
変態的なコードに見える。ライセンスは GPL なんで、利用は制限される。

boost::ublas は Fortran で書かれた BLAS というのが元になっていて、
相当の機能は実装しているようなので、これと同じように扱えると思う。

tvmet のウリが良く分かんないな…。機能も ublas の方が多いように思うけど
数学に疎いのでちょっと分からんです。俺なら boost::ublas かなぁ、
どうせ boost 入れるんだし…。

…こんなんで参考になる?(;´Д`)
0239デフォルトの名無しさんNGNG
>>238
thx

GPL->LPGL
かなりでっかくのってましたね。
でも、結局LPGLでもめんどいんで、やめました。

あと、boost::ublasにcross_product(外積のvector版)欲しかったんですがないようなんで(outer_prodだとマトリクスがかえる、、、)、
簡単な3D演算程度しか使用しないので、結局自分のうんこライブラリ使うことにしますた。
ていうか、次回からはクオータニン使おう。。。boostにはいってるし。

ちなみにわたしも数学疎いです。
0240ヽ(´ー`)ノNGNG
quoternion…これはイイかもしれない。3D の演算用なんだろうか…覚えておこう。
サンクス。
0241Addicted to C++ ◆CPP8mJMMbA NGNG
fstreamみたいなfvectorって既存のライブラリでありませんか?
class(struct)はfstream::read,writeでファイルにデータメンバのみ
保存・ファイルから読み取りするような香具師なんですが。
0242sageNGNG
std::ostream_iteratorとかその周りを調べれ
0243QNGNG
#include <iostream>
#include <string>
#include <vector>
#include <algorithm>
using namespace std;
class line_iterator
{
istream*in;
stringline;
boolis_valid;
voidread(){if(*in)
getline(*in, line);
is_valid = (*in) ? true : false;}
public:
typedef input_iterator_tagiterator_category;
typedef stringvalue_type;
typedef ptrdiff_tdiffrence_type;
typedef const string*pointer;
typedef const string&reference;
line_iterator() : in(&cin), is_valid(false){}
line_iterator(istream& s) : in(&s){read();}
reference operator*(){return line;}
pointer operator->(){return &line;}
line_iterator operator++(int){line_iterator tmp = *this;read();return tmp;}
bool operator==(const line_iterator& i) const{return (in == i.in && is_valid == i.is_valid) || (is_valid == false && i.is_valid == false);}
bool operator!=(const line_iterator& i) const{return !(*this == i);}
};
0244QNGNG
int main()
{
line_iterator iter(cin);
line_iterator end_of_file;

vector<string> V(iter, end_of_file);
sort(V.begin(), V.end());
copy(V.begin(), V.end(), ostream_iterator<string>(cout, "\n"));

return 0;
}

これってVC7だと

d:\VS.NET\Vc7\include\vector(109): error C2665: 'std::_Iter_cat' : 12 の
オーバーロードは 1 番目の引数を 'line_iterator' から要求の型に変換できません。

って出るんですけど、何かおかしいところありますか?
0245sageNGNG
line_iteratorがiteratorの派生クラスでないのにはわけがあるの?
0246Addicted to C++ ◆CPP8mJMMbA NGNG
>>242
えーと、ランダムアクセスしたいのですけれども。
自作しないと無理ですかね。
0247sageNGNG
Windowsならメモリマップドファイルをラップすれば簡単にできそうだけどね。
ごめん、そういうのはみたことない。
0248デフォルトの名無しさんNGNG
>>241
意味わからん。
0249hageNGNG
>>246
fstreamはランダムアクセスできるじゃん。
0250QNGNG
>>245
Generic本の最初の例なので意図は不明です。
0251デフォルトの名無しさんNGNG
前スレでStlPortのライセンスがアレなのによく使う気になるな、みたいな発言があったがものの見事に
放置されてるので非常に気になる。

どうアレなんでしょうか?
0252デフォルトの名無しさんNGNG
>>251
俺のつたない英語力では別に問題なさそうだったよ。
0253デフォルトの名無しさんNGNG
>>251
ケースバイケース
場合によっては使えるし場合によっては使えない。
0254デフォルトの名無しさんNGNG
そんなレスが何の参考になるのかと小一時間(ry
0255ヽ(´ー`)ノNGNG
> This material is provided "as is", with absolutely no warranty
> expressed or implied. Any use is at your own risk.
…だよね。別に問題ないと思うけど。
元の発言者は「フリーウェアを使うのはダメだ」とかいう人なんじゃない?笑
0256251NGNG
なんかアメリカの特許がどーのって書かれてるくだりとかって、どうもアレだよねとかいわれると
そうかな?と思ってしまわないでもないです。

ところでstlport使用の際にドキュメントとかに使用してますみたいな旨は書かなくてよろしいんですかね?

ほんとソフトウェアの使用許諾書とかライセンスって長々とかいてあっていや。
stlportは1ページと短いけどさ。
0257デフォルトの名無しさんNGNG
とりあえず筆頭は爺…
等と言って信者を呼ぶのはやめておこう。
0258デフォルトの名無しさんNGNG
VC++6.0,WindowsXPです。
以下のようなコードでコンパイルエラーがでます。


#include <map>

class CTest {
  std::map<int, CTest> m_map;
};

int main() {
  return 0;
}


vc98\include\utility(26) : error C2079: 'second' が 未定義の class 'CTest' で使用されています。
  vc98\include\xtree(28) : コンパイルされたクラスのテンプレートのインスタンス化 'std::pair<int const ,class CTest>' の参照を確認してください
  vc98\include\map(46) : コンパイルされたクラスのテンプレートのインスタンス化 'std::_Tree<int,struct std::pair<int const ,class CTest>,
struct std::map<int,class CTest,struct std::less<int>,class std::allocator<class CTest> >::_Kfn,struct std::less<int>,
class std::allocator<class CTest> >' の参照を確認してください
  My Documents\test\test.cpp(4) : コンパイルされたクラスのテンプレートのインスタンス化 'std::map<int,class CTest,struct std::less<int>,
class std::allocator<class CTest> >' の参照を確認してください


map<int, CTest*> とするとエラーは出なくなります。
自分自身のクラスを map に直接格納することはできないのですか?
0259デフォルトの名無しさんNGNG
>>258
コピーコンストラクタが定義されてないからじゃないの?
めんどかったら参照(&)入れとけ。

class CTest {
  std::map<int, CTest&> m_map;
};

と、言ってみる。
0260258NGNG
>>259
コピーコンストラクタを明示的に定義しても同じエラーが出ます。

参照を入れるとまた別のコンパイルエラーが大量に出てきます。
参照をコンテナに格納することはできないと聞いているのですが。
0261デフォルトの名無しさんNGNG
>>260
コンテナをインスタンス化するためのテンプレートパラメータの型がまだ完成して無いから無理じゃない?
vectorは実装によってはポインタしか使わないから可能だね。
0262259NGNG
すまん、できんかった。

ところで、クラスのインスタンスを直接コンテナにぶち込むのはどうかと思うが・・・。
普通はポインタいれない?
0263258NGNG
>>261
やはりそうですか。

>>262
ttp://www.geocities.com/nobukichi/Stl/lec008.html
以前コレとかを読んで考えたこともあるのですが,
やはりポインタを格納したほうが良いのでしょうか。
本を読んで勉強してみることにします。


あと,もう一つ質問なのですが,
>>258のように,わけの分からないエラーが出てきたときは,どのように対処したら良いのでしょうか。
あのエラーメッセージでは,どこがどうおかしいのかさっぱり分からないのですが。
0264デフォルトの名無しさんNGNG
>>263
ふつうは 258 のエラーでわかる。
そうでなくてもエラーメッセージの出てるソース見ればたいていわかる。
vc98\include\utility の 26 行目を見てみてはどうか?
0265262NGNG
>>263
boost::shared_ptr をぶち込むぱなしです。めんどくさいときや、コピーが気にならないときはオブジェクト格納してますが。

エラーメッセージは慣れかな?
0266258NGNG
>>264
そうですか…精進します。
とりあえず vc98\include\utility とかいろいろ見て考えてみます。

皆様ありがとうございました。要はもっと勉強しろってことですね。
0267デフォルトの名無しさんNGNG
>>258
mapの実装に依るけど、もしmapのオブジェクト自体に
ルートノードが入っていて、その中にCTestが直接
入っていたら、m_map.root.data<CTest>というような
構造になって引っかかる、ということでは?
0268デフォルトの名無しさんNGNG
http://jbbs.shitaraba.com/computer/2100/jsweb_1.html
0269デフォルトの名無しさんNGNG
>>267
単純に大きさが確定してないオブジェクトを入れようとしてるからだろ。
0270デフォルトの名無しさんNGNG
>>258
VC6+STLport、WinXP で何の問題もなくコンパイルできたわけだが。

たぶんVCのSTLが腐ってる。
0271デフォルトの名無しさんNGNG
CTest().m_map[0].m_map[1].m_map[2].m_...
0272デフォルトの名無しさんNGNG
>>267
> mapのオブジェクト自体にルートノードが入っていて
んなわけねぇだろ。
0273267NGNG
>>272
そうか?効率は置いておくとしても、
template <class X, class Y>
struct MapNode {
  int flags;
  X mid_index;
  MapNode *left;
  MapNode *right;
  Y leaf_value; /* might be uninitialized */
};
なんて実装は考えられないか?
0274272NGNG
>>273
何のメリットも無いな。
考えられない。
0275デフォルトの名無しさんNGNG
もちつけ
0276デフォルトの名無しさんNGNG
ってか、ここの人って反論されると
いきなりキレる人多いよね。
多分一部の人だけだと思うけど。
やっぱり、

 な け な し の プ ラ イ ド を 壊 さ れ る

のがいやなのかな(w
0277デフォルトの名無しさんNGNG
>>276
>反論されると いきなりキレる人多いよね。
そんなのどこのスレでも同じようなもんだろ
0278276NGNG
>>277
確かに荒れてないスレの方が少ない罠。

見ててそんな印象をもっただけ。
まぁ、漏れの勘違いなら構わないんだが。
0279デフォルトの名無しさんNGNG
キレる奴と煽る奴、それが2ch。
0280デフォルトの名無しさんNGNG
276は煽る奴
0281デフォルトの名無しさんNGNG
charの配列を、vector<char>にそのまま代入したいのですが、
現在は下のように一つずつ代入する方法で行っています。

char buf[10000];
vector<char> v;

v.resize(10000);
for (int i = 0; i < 10000; i++) v[i] = buf[i];

ただ、この方法では配列の数が増えたときにすごい重いので、
もっと簡潔な方法がありませんでしょうか。
0282デフォルトの名無しさんNGNG
vector<char> v( &buf[0] , &buf[10000] );
0283デフォルトの名無しさんNGNG
>>281
> 配列の数が増えたときにすごい重いので、
ホントに計った?
0284デフォルトの名無しさんNGNG
forのところの

i++ → ++i

にしてみる。

最適化されたらいっしょになるかな?
0285デフォルトの名無しさんNGNG
>>281
vector<char> v( &buf[0] , &buf[9999] );なのでは?

0286デフォルトの名無しさんNGNG
>>281
iteratorとcopyを使ってみては?
g++ 3.2だと-O3しても倍以上速いね。
0287デフォルトの名無しさんNGNG
>>285
STLでは終端は末尾のひとつ後ろを指定します
0288デフォルトの名無しさんNGNG
charをintにする。
0289デフォルトの名無しさんNGNG
>>284
iはintだから変わらん
0290デフォルトの名無しさんNGNG
template< typename T, std::size_t N >
inline void arrcpy( std::vector<T>& target, T const (&source)[N] )
{
 target.resize( N );
 std::memcpy( &target[0], source, N );
}

>>281
どうよ?
0291デフォルトの名無しさんNGNG
>>290は禍根を残すタイプ!!
0292デフォルトの名無しさんNGNG
>>290
×std::memcpy( &target[0], source, N );
○std::memcpy( &target[0], source, sizeof(T)*N );

ダロ?
0293デフォルトの名無しさんNGNG
>>292は禍根ウォン越すタイプ!!
0294デフォルトの名無しさんNGNG
>>292
そうそう。よくあるバグ。
スレとあんま関係ないけどさ、
このサイズ忘れるの防止できないかね。
今までこれ系のバグで開発止まった事何回もある・・。
0295デフォルトの名無しさんNGNG
ttp://www.stlsoft.org
こんなのハケーン致しますた!
0296デフォルトの名無しさんNGNG
なにこれ。
0297295NGNG
簡単に言うと boost ショボイ版みたいな感じですかねぇ。
0298デフォルトの名無しさんNGNG
>>294
memcpyなんて使わないからいい。
target.assign( &source[0] , &source[N] );
0299ヽ(´ー`)ノNGNG
C 言語用に static_assert を作ってハァハァしてたら、
すでに cppll に同じようなモノがあった(´・ω・`)ショボーン

せっかくなんで、URL 張っておきます。
http://www.tietew.jp/cppll/archive/7417
0300デフォルトの名無しさんNGNG
>>299
テンプレートでないところでstatic_assertって必要になる?
0301山崎渉NGNG
(^^)
0302ヽ(´ー`)ノNGNG
>>300
うーん、あんまないかも…遊びで作ってただけなんで。型のサイズチェックとかかなぁ。
gcc 限定で、const_cast とか…これぐらいしか思い付かん(;´Д`)Cスレの方が良かったかな。

#define CONST_CAST(__type, __p_instance) \
__extension__({ \
  typeof(__p_instance) __instance = __p_instance; \
  STATIC_ASSERT( \
    __builtin_types_compatible_p(const __type, typeof(__instance)) \
  ); \
  (__type)(__instance); \
})
0303デフォルトの名無しさんNGNG
std::stringからdoubleやintに変換したい場合、スマートな方法はないでしょうか?
0304デフォルトの名無しさんNGNG
boost::轢死cal_cast
0305デフォルトの名無しさんNGNG
>>303
それか、std::stringstreamを使って組む。
boost::歴史cal_castは内部的にはこれを使っている。
0306デフォルトの名無しさんNGNG
>>304
vc6でエラーでるからって轢死はないだろw
0307デフォルトの名無しさんNGNG
vc7でもwarning出るしな
0308デフォルトの名無しさんNGNG
ttp://okazaki.incoming.jp/danpei/software/
ここのvectorもどきってどうなの?
えろい人、教えて!
0309えろえろNGNG
>>308
見た。 いらね。
STLのvector使っとけ。

0310デフォルトの名無しさんNGNG
>>308
漏れも見た。
・配列拡張にrealloc→operator=の定義によっては誤動作
・新しく取得したメモリにmemset(0)→vtableが死んでる
・例外安全でない
・constを正しく使っていない

いらね。っていうかダメダメ。
0311デフォルトの名無しさんNGNG
>>309-310
ありがとう、エロい人達!
0312山崎渉NGNG
   ∧_∧
  (  ^^ )< ぬるぽ(^^)
0313山崎渉NGNG
   ∧_∧
  (  ^^ )< ぬるぽ(^^)
0314↑NGNG
なんか前の山崎渉の方がよかった...
0315デフォルトの名無しさんNGNG
激しく同意
0316山埼渉NGNG
(^^)
0317デフォルトの名無しさんNGNG
↑山「埼」渉かよ!
0318デフォルトの名無しさんNGNG
山埼渉カコイイ
0319デフォルトの名無しさんNGNG
STLPortを導入するため、DOS窓でVCVARS32.BATを
実行したところ、環境変数の領域が足りません、と言われました。
どうすれば領域を増やせるのでしょうか?

ちなみに↓のサイトを見て、同様に導入しようとしてます。
ttp://www.emaki.minidns.net/Programming/tools/STLport/
0320デフォルトの名無しさんNGNG
>>319
CMD.EXEを使う。
0321319NGNG
DOS窓のプロパティで設定できました。
command.com /E:1024、という風にしてもできるようですね。
ありがとうございます。
0322デフォルトの名無しさんNGNG
Loki::AssocVector::insertAssocVector っておかしくねーか?
↓
iterator insert(iterator pos, const value_type& val)
{
if (pos != end() && operator()(*pos, val) &&
(pos == end() - 1 ||
!operator()(val, pos[1]) &&
operator()(pos[1], val)))
{
return Base::insert(pos, val);
}
return insert(val).first;
}
0323デフォルトの名無しさんNGNG
vc6 stlport でboost::numeric::interval って使えないの?

cmath系がstd::hoge でエラーでて動かないし、

他にもエラーでまくり。
0324デフォルトの名無しさんNGNG
>std::hoge
using std::hoge;

_STLP_NO_なんちゃらでstd::をグローバルネームスペースに変換しちまえばいいんだが
そうすると、今度はiostreamのほうでひっかかるという罠。
0325STL初心者 ◆Saqno3S4wc NGNG
VC6にStlPortを入れたのですが
StlPortのStlを使ってコンパイルされていることを
確かめる方法はありませんか?
0326デフォルトの名無しさんNGNG
>>322
変かなあ
posが指す位置と入れる値によっっちゃ順序が狂うが...
これっていかんの?
0327デフォルトの名無しさんNGNG
>>325
コンパイルされたバイナリがSTLport使ってるかどうかか?
シンボル見ればなんとなくわかるんでないかい?

STLportをincludeしてるかどうかの判別をしたいなら、
#if defined(_STLPORT_VERSION) でいけるはず
0328STL初心者 ◆Saqno3S4wc NGNG
>>327
報告めちゃ遅ですみません。
STLPortが使えているようです。
ありがとうございました。
0329デフォルトの名無しさんNGNG
Loki VC 6 Port - Version 0.5
ttp://fara.cs.uni-potsdam.de/~kaufmann/?page=Startseite
お前らこんなのあるじゃないですか。外出?
0330sageNGNG
lokiはマニアックすぎて使ってないや。
STLportとboostで満腹
0331デフォルトの名無しさんNGNG
boostも最近マニアックネタが多いと思うが。spiritとか
0332デフォルトの名無しさんNGNG
>>329
stlport とは食べ合わせよくないです。

でもシングルトンはつかわさせていただいてます。
つくるのもめんどいし。
0333デフォルトの名無しさんNGNG
>>329
前スレにも出てた。ずっと前から既出。

Loki は多少マニアックかもしれないが、使いやすいし
コードは STL の何十倍も読みやすい。
強力な Functor と Singleton は手放せないね。

Loki で一番難しいのは、強力な TypeList をどう使うかということだと思う。
0334デフォルトの名無しさんNGNG
> 強力な Functor と Singleton は手放せないね。
boost じゃダメなの?
0335デフォルトの名無しさんNGNG
Lokiで重宝してるのはSmartPtrだな〜。
0336デフォルトの名無しさんNGNG
>>334
boostにsingletonなんてあった?
0337デフォルトの名無しさんNGNG
>>336
ttp://www.boost.org/libs/pool/doc/implementation/singleton.html
じゃぁLokiと比べるとショボすぎですかね・・・
0338デフォルトの名無しさんNGNG
VS2002では問題なく使えてて
STLportをVS2003で使いたいんやけど
ヘッダーのどこを変えればいいの?
0339デフォルトの名無しさんNGNG
>>338
http://www.stlport.com/dcforum/DCForumID7/1408.html
↑見とけば?
0340デフォルトの名無しさんNGNG
Functorkon今度つかってみよ。
この前、factory使って簡単だなぁって思ったんで。
0341デフォルトの名無しさんNGNG
保守age

ところで、Loki の人こと、A.Alex が
ttp://cuj.com/experts/2106/alexandr.htm とか
ttp://cuj.com/experts/2104/alexandr.htm で
例外も飛ばせる ASSERT マクロとか、
例外発生時に、発生位置と発生させた式を、診断メッセージと一緒に例外に埋め込む
ENFORCE マクロとかを紹介してるわけだけど、どう思う?

VC7.1 だと、__LINE__ がうまく展開されなくて、泣けてくるんだけど。
0342デフォルトの名無しさんNGNG
もうみんな飽きたの?
0343デフォルトの名無しさんNGNG
boost::shared_ptrとlokiのsmart_ptrはどう違うんですが?
基本的に同じで両方とも循環参照には対応していないという事でいいんでしょうか?
0344デフォルトの名無しさんNGNG
lokiの方はわからないけどのboost::shared_ptrの方はboost::weak_ptrと組み合わせれば循環参照には対応できる。
ttp://www.kmonos.net/alang/boost/classes/weak_ptr.html
0345デフォルトの名無しさんNGNG
相談です。
boost::lambdaで、構造体の内部変数にアクセスすることはできないでしょうか。
具体的には
map<int, int> m;
for_each(m.begin(), m.end(), cout << (_1.first));
みたいなことをやりたいのですが…。
当然、上のソースをコンパイルすると_1はplaceholderクラスなので、そんなメンバは存在しないとエラーが出ます。
俺はこうやってやっている、という例はありませんでしょうか?

(目的だけ考えればoperator <<なりを実装すればいいんですが、lambdaがとても便利なので他にも使える汎用的な書き方が欲しいと思いまして…)
0346デフォルトの名無しさんNGNG
(&_1)->first
これどうですか?(未確認)
0347345NGNG
その書き方では無理でしたが、試すうちにこれで通りました。
bind(&pair<const int, int>::first, _1)
constを忘れていたがために6時間を無駄にしました…アイタタ。

0348デフォルトの名無しさんNGNG
以下のようなコードでVisualC++だと(*1)の箇所でテンプレートの
インスタンス化云々のエラーが出ます。gccでは出ません。
こういうもどかしさを解消する流儀はないでしょうか。

class type1;
class type2;

template <typename T> struct type_selector;
struct type_selector<tag1> { typedef type1 type; };
struct type_selector<tag2> { typedef type2 type; };

template <typename T>
class derived : public type_selector<T>::type { // (*1)
 ...
};
0349デフォルトの名無しさんNGNG
>>348
template <typename T> struct type_selector{ typedef dummy type; }

としたら通ったぞ
0350348NGNG
>>349
むひょー!素晴らC。こんなテクが知りたかったんです。
どうもありがとう。

ポイントは dummy に型が未確定のものを指定することですね。
(組み込み型や既に確定している型を指定した場合は駄目でした。)
おいらは
template <typename T> struct type_selector{ typedef T type; }
ってしました。
0351デフォルトの名無しさんNGNG
C++のtemplateって中途半端な気が。

//2つの文字列の比較
equal<"hoge", "hoge">::is_valid
//浮動小数点のtemplateパラメータ
log10<123.456>::value
//文字列を出力
md5<__FILE__ __LINE__ __TIME__>::value

みたいな事ができて、
あと、プリプロセッサマクロで乱数生成できたらうれしいのに。
0352デフォルトの名無しさんNGNG
なにいってんのかわかんないけど
template<class T> inline bool equal(const T *a, const T *b) { return !strcmp(a, b); }
でいいんでないの?

コンパイル時に解決したいならlokiあたりをよく読んでみれ。
回りくどいとか見た目がわかりづらいというなら話が変わるが。
0353ヽ(´ー`)ノNGNG
> あと、プリプロセッサマクロで乱数生成できたらうれしいのに。
ここは template スレですが?…と一応突っ込みを入れておくとして、
boost::preprocessor を使えば多分乱数作れるよ、やったことないけど。

あと tempalte の使い方がキモイ。ていうか意味分かんね。
0354デフォルトの名無しさんNGNG
初歩的な質問ですが、templateって、宣言部と実装部を分けたり出来ないのでしょうか?
template関数作りましたが、長いので実装部を.cppファイルに移動したいのですが。
0355デフォルトの名無しさんNGNG
>>354
.cppファイルに移動した後、それを .h 内でインクルードしる。
0356デフォルトの名無しさんNGNG
>>355
そのやり方しかできないVCがキモクテいやだ。

でもVC楽だ・・・。
0357デフォルトの名無しさんNGNG
VCでうまいやり勝たなかったっけ?

互換性に影響のない拡張ならそのうち標準に準拠するさ。
きっと。
0358Addicted to C++ ◆cpp/Sz/v02 NGNG
>>354
export
0359デフォルトの名無しさんNGNG
あるいは、明示的なインスタンス生成。
0360デフォルトの名無しさんNGNG
>>358
サンプルコードきぼんにゅ
0361デフォルトの名無しさんNGNG
生配列の要素数を定数式で表現するための関数テンプレートを思いついた。
とりあえず、gccでは通る。
けど、名前が思いつかない。
だれかいい名前つけてやって。

#include <cstddef>

template< typename T , std::size_t N >
char const ( &xxxxx( T (&)[N] ) )[N];

int const array[] = { 436,346,23,0,58,5678,32,0,4573 };
struct X
{
 static std::size_t const num_elements = sizeof( xxxxx( array ) );
};
0362動画直リンNGNG
http://homepage.mac.com/hitomi18/
0363デフォルトの名無しさんNGNG
>>361
最後に sizeof 取る部分まで含めて、LENGTH とか lengthof とか
いうマクロにして使ってる人が多いと思う。
0364デフォルトの名無しさんNGNG
ほんとだ。
http://www.cuj.com/articles/1999/9907/9907i/9907i.htm?topic=articles
(↑ここに載ってる奴は構造体のパディングで死にそうだけど)
0365デフォルトの名無しさんNGNG
http://www.kmonos.net/wlog/23.php
こっちなら大丈夫そうだ。
0366デフォルトの名無しさんNGNG
クラス名・変数名に迷ったら書き込むスレ
http://pc2.2ch.net/test/read.cgi/tech/1046541730/l50

>>361
こんなスレもあるぞ。
0367デフォルトの名無しさんNGNG
>>361

前スレ
http://pc2.2ch.net/tech/kako/1037/10377/1037795348.html の、
673-686 あたりに目を通すとヨイカモ。

0368デフォルトの名無しさんNGNG

template プログラミングのキモは遅延コンパイルにあると思うのだがどうか。
0369361NGNG
>>367
お、3ヶ月越しのデジャブかよ。
だが、宣言のキモさで一歩リードしてる。

ト、イウコトニシタイノデス。
0370山崎渉NGNG
━―━―━―━―━―━―━―━―━[JR山崎駅(^^)]━―━―━―━―━―━―━―━―━―
0371 NGNG
あげ
0372デフォルトの名無しさんNGNG
char型の二次元配列buf[256][256]の
配列vectorを宣言するやり方がわかりません。
0373デフォルトの名無しさんNGNG
保守
0374デフォルトの名無しさんNGNG
std::vector<std::vector<char> > buf(256, std::vector<char>(256));
0375デフォルトの名無しさんNGNG
>>372

class buf
{
char value[256][256];
public:
typedef char type[256];
operator type*(){ return value; }
};

std::vector< buf > a;
0376名無しNGNG
>>374と>>375で>>372の解釈の仕方が違う?
0377 ◆qQ4COMPILE NGNG
>char型の二次元配列buf[256][256]の配列vector
3次元配列のvector?
4次元配列?
0378デフォルトの名無しさんNGNG
言語依存の問題ヲ一つ:
template<class T>struct NonPointer
{ typedef T non_pointer; };
template<class T>struct NonPointer<T*>
{ typedef T non_pointer; };
これヲVC7で表現できないかなー?
0379デフォルトの名無しさんNGNG
>>378
それってVC7.1じゃ駄目なの?
おれのはVC6だから当然無理だけど。
あと、VC6だとtemplate引数にint値が使えないのが痛い。
0380デフォルトの名無しさんNGNG
>>379
class じゃなくて typename つかえばいいじゃんとかじゃなくて?
0381デフォルトの名無しさんNGNG
>>380
379じゃねーが、VC6だと↓が困ったことになる、って話かと。

#include<iostream>
template<int N> void f() {std::cout << N << std::endl;}
int main() {
f<1>(); f<2>(); f<3>();
}
0382デフォルトの名無しさんNGNG
>>381
intじゃなくても関数の明示的な特殊化は軒並みダメだよ
0383デフォルトの名無しさんNGNG
>>382
ここよんでみ!
http://www.fides.dti.ne.jp/%7Eoka-t/cpplab-vc6-func-template-bug.html
ココヨンデミ♂♂♂♂♂♂♂♂♂♂♂♂♂♂♂♂♂♂♂♂♂♂♂♂♂♂
0384382NGNG
スマン、単語を間違えた
特殊化じゃなくてインスタンス化だた
0385デフォルトの名無しさんNGNG
おれっちのfunctionをけなして
namespace FN
{
    namespace IN
    {
        class Null{};

        template<
         typename R,
         typename T1 = Null,
         typename T2 = Null,
         typename T3 = Null
            >struct fnimp{ typedef R (*pf)(T1,T2,T3); };
0386デフォルトの名無しさんNGNG

        template<
         typename R,
         typename T1,
         typename T2
            >struct fnimp<R,T1,T2,Null>
            { typedef R (*pf)(T1,T2); };
        template<
         typename R,
         typename T1
            >struct fnimp<R,T1,Null,Null>
            { typedef R (*pf)(T1); };
        template<
         typename R
            >struct fnimp<R,Null,Null,Null>
            { typedef R (*pf)(); };
    }
    template<
     typename R,
     typename T1 = IN::Null,
     typename T2 = IN::Null,
     typename T3 = IN::Null

0387デフォルトの名無しさんNGNG
>struct function
{
     typedef typename IN::fnimp<R,T1,T2,T3>::pf pf;
     function(pf p) : pt(p){}

     R operator () (T1 t1,T2 t2,T3 t3){ return pt(t1,t2,t3); }
     R operator () (T1 t1,T2 t2) { return pt(t1,t2); }
     R operator () (T1 t1) { return pt(t1); }
     R operator () () { return pt(); }
private:
     pf pt;
};
}
0388デフォルトの名無しさんNGNG
ネストの深いifブロックをおもいだすな
0389デフォルトの名無しさんNGNG
>>385-387
バーカバーカ
0390デフォルトの名無しさんNGNG
ちょっと質問です。えらい人教えて。
半年ほど前に、エンディアンの変更をするテンプレート関数を作った。
namespace detail{
template< size_t Distance>
struct byte_swap {
static void do_swap( byte *x) {
std::swap( *x, *( x + Distance));
byte_swap< Distance - 2 >::do_swap( x + 1);
}
};
template<>
struct byte_swap< 1 > {
static void do_swap( byte *x) {
std::swap( *x, *( x + 1));
}
};
template<>
struct byte_swap< 0 > {
static void do_swap( byte *x) {}
};
}
template< typename T >
inline void swap_endian( T &x){
detail::byte_swap< sizeof( T ) - 1 >::do_swap( reinterpret_cast< byte *>( &x));
}
こんな感じ。で、エンディアンの異なるファイルを構造体で一括して読み込んでから
各メンバをスワップさせたいんですが、いちいち各メンバにswap_endian( a.first);
のように書くのがアホくさいんです。構造体のメンバにforeach見たいにアクセスする
方法ってないでしょうか?実行時はできないだろうけど、コンパイル時にやれないことも
ないんじゃないかと思うんだけど、まったくわかんない。
0391ぷらぷらーNGNG
struct Nil{};
template <class A,class B=Nil> struct TL{ typedef A head; typedef B tail; };
template <class TL> struct Tuple : public Tuple<typename TL::tail>{
 typename TL::head a;
 template <class Fun> void each(Fun f){
  f(a);
  Tuple<typename TL::tail>::each(f);
 }
};
template <> struct Tuple<Nil>{
 template <class Fun> void each(Fun f){}
};
struct Printer{
 template <class T> void operator()(T val){
  std::cout<<typeid(T).name()<<" "<<val<<std::endl;
 }
};
Tuple<TL<int,TL<short,TL<char> > > > tuple;
tuple.each(Printer());

タプルの要素を順に書き出します。
構造体をタプルで作れば同じように、メンバに順にアクセスできます。

普通の構造体のメンバ変数のforeachは不可能と思われます。
0392390NGNG
>>391
ありがとうございます。
おとなしく、ひとつずつ手書きすることにします。やっぱむりかー
0393デフォルトの名無しさんNGNG
>>392
タプルにはできないんでつか
0394デフォルトの名無しさんNGNG
>>391
Tuple個人的には気に入りましたがこれでは無理かと。
構造体のサイズって一定じゃない(アライメント調整すれば別だけど)
struct temp{char , int };
これで話せば、Tupleでトレースするには、
sizeofで場所を突き止めるんだよね。(なまえ使えないから)
charの場所(&temp)のつぎはint。場所は(&temp+1)ここじゃなから
swapなんてとんでもない。間違っていたらごめん。
0395390NGNG
>>393
自分が、タプルのことがよくわかっていない屁たれということがひとつ。
あと、目的の構造体を使ったライブラリがすでにあるんで、
タプルはやめておきます。
0396デフォルトの名無しさんNGNG
巡回参照問題を解決したスマートポインタを誰かが作っていたような記憶があるのですが、
どこかに置いてないか知っている人いますか?
自分で作ろうと思ったら意外と難しいな・・・・
0397デフォルトの名無しさんNGNG
ちょっとした調べものに
http://mypage.odn.ne.jp/home/dongrico
0398デフォルトの名無しさんNGNG
>>396
俺もホスィ。
もし見つけたらこのスレに貼ってくれ、頼む。

GC無しで実現出来ればかなり使えるジャン。
0399デフォルトの名無しさんNGNG
>>396
循環参照問題を解決ってことは参照カウントではない手法なんだろうけど、
GCを行うメモリ管理方式?
それとも参照カウントと弱参照の組み合わせ(boostのshared_ptrとweak_ptr)?
0400デフォルトの名無しさんNGNG
あなたが探してるのってこれだよね?この中にあったよ♪
http://angelers.free-city.net/index.html
0401デフォルトの名無しさんNGNG
>>396
http://groups.yahoo.com/group/boost/files/ に幾つか。
0402デフォルトの名無しさんNGNG
>>396
lokiのスマートポインタって解決してなかったけ?

ところで、vc6,stlportで
std::string hoge("hoge");
std::string moe( hoge.begin(), hoge.end );

を、/MD /MDd のオプションでビルドすると、
error LNK2001: 外部シンボル ""__declspec(dllimport) public: __thiscall _STL::basic_string< ・・・略
は未解決です。test.exe : fatal error LNK1120: 外部参照 1 が未解決です。

stlportのライブラリのビルドに失敗してる?
それ以外のオプションならきちんとビルドできるのにな・・・。
0403402NGNG
_STLP_DEBUG
消したらとおった・・・。

デバッグモードoffにしろということか・・・。
0404デフォルトの名無しさんNGNG
>>402
ライブラリをビルドしたときには_STLP_DEBUGが付いてなかったんだろう。
0405デフォルトの名無しさんNGNG
stlのsetとかmapって二分木ですよね。
これらに要素を追加して、その内容をファイルにセーブする場合、
begin()〜end()の順でセーブして、読み込むときにinsert()で追加していくと
読み込んだ後のsetとかの検索速度は悪くなりますか?
悪くなる場合、検索速度の改善方法は一般的にはどのような方法がありますか?
0406デフォルトの名無しさんNGNG
↓のようにコンテナはpublicで継承して使っても
よろしいのでしょうか?

struct Person{
  int Age;
  string Name;
};

class Community : public std::list<Person*> {
  ...
};
0407402NGNG
/D "_STLP_DEBUG"
で stlportビルドしてみたけど、ダメポですた。凄い人、教えてー。

>>406
stlのコンテナは継承してはいけないはず。
効率を上げるため、仮想デストラクタがないから(確かめたことないけど)。
0408デフォルトの名無しさんNGNG
>405
ただの二分木はあまりつかわない。
赤黒木あたりで実装されることが多いので、効率は悪くならない。
0409デフォルトの名無しさんNGNG
>>405
二分木といってもAVL木か赤黒木なんかで挿入と同時に平衡処理をしてるはずなので大丈夫かと
0410405NGNG
>>408,409
普通は二分木ではなく赤黒木(勉強不足でよく知りませんが)で
心配無用なのですね。サンクス
0411デフォルトの名無しさんNGNG
>>406
Community* commp = new Community;
こういう事しなければよろしいかと
0412ぷらぷらーNGNG
>>411
それは別にいいんじゃないですか?
いけないのは↓こういうことをしたときですよね。

std::list<Person*> *p=new Community;
delete p;


>>406
is-aの関係よりhas-a関係にしたほうがいいと言われると思います。
0413406NGNG
レスありがとうございます。
has-aの関係にします。
0414デフォルトの名無しさんNGNG
>>401
>>402
どうもです、とりあえず一つあたってみたのですがソースが読めない・・・
どういうアイディアを使ってどういう構造になっているのでしょうね、難しい。
この問題は簡単に解決とは絶対にできなさそうですね、週末また頭ひねって考えよう
ところで、巷で良いという噂の Modern C++ Design には、このアルゴリズムが載っていないか知りませんか?
本屋に無いので注文せざるを得ないのですが、注文して載ってなかったらとても悲しいので。
0415デフォルトの名無しさんNGNG
>>412
すみません。おれが書き込みミスってた。(ミスりすぎ)

std::listはvirtualなデストラクタ持ってないってことですね。
補足してちょっとミエはってみたり。
0416デフォルトの名無しさんNGNG
>>414
> どうもです、とりあえず一つあたってみたのですがソースが読めない・・・
覚えてないが、どれも基本的に Mark and Sweep だったような。

あと、Loki / Modern C++ Design には循環参照があっても使えるような
スマートポインタは含まれてないぞ。あのフレームワークを使って
実現することは出来るだろうが…。
0417デフォルトの名無しさんNGNG
>402
シンボルの未解決というのは、ライブラリをリンクしてないからでは?
0418デフォルトの名無しさんNGNG
vcのstlportがヘボイからです。
0419デフォルトの名無しさんNGNG
vcってdinkumじゃなくてstlportになったの?
0420デフォルトの名無しさんNGNG
STLPortはコンパイラオプションでwchar_tの扱いが違うだけでリンクできないんだよなぁ・・・
VC++のデフォのSTLはどうやって解決してんだ?
0421デフォルトの名無しさんNGNG
質問です。テンプレートを使うのは今日が初めてです。

template <class T> class A{
T data;
}

A<int> x;
A<CFile> y;

としたとき、xやyからテンプレート型名を取得する事はできないでしょうか?
つまり、ここでいうintやCFileのことです。
x::Tとできればいいのですが、できませんでした。(VC++.NETにて)

(もちろん、変数名があればテンプレートの型名は一意に決まるとは思うけど、マクロに使いたいから。型を変更するとき何カ所も変更する仕様にしたくないし、型を気にしなくていいマクロにしたいのです。)
0422デフォルトの名無しさんNGNG
>>421
それは今のテンプレート仕様の欠点。
だからtypeofの導入が強く求められてる。

テンプレート関数の引数に渡せば型は得られるがその関数内部でしか使えないので特定用途に限られる。

template< typename T > void func( T a )
{
// func に x を渡せば、T は A< T >、y を渡せば A<CFile>
}
0423デフォルトの名無しさんNGNG
>>421
どんなマクロを目論んでるんだろ。
templateだけじゃ実現できないようなことなの?
0424421NGNG
>>422
そうですか・・・。やはり、マクロに型名を毎回埋め込む事にします。

>>423

#define PROPERTY(classname, propget, proplet) \
classname.PropertyGetHandler = (classname::ktype (*)(void*))(propget);\
classname.PropertyLetHandler = (classname::ktype (*)(void*, classname::ktype))(proplet);\
classname.Parent = this

としたかったんです。

実装は
ktype (*PropertyGetHandler)(void *Parent);
operator ktype(){
KTASSERT_C(PropertyGetHandler, "書き込み専用プロパティを読み込もうとしました。");
return PropertyGetHandler(Parent);
}
てな感じで(Getのみ書いてます)。クラスのコンストラクタでPROPERTY(Width, GetWidth, SetWidth)と書いておけば、
n = Width;なら、現在の幅を取得、
Width = n;なら、現在の幅を設定、
とできるので、分かりやすくていいかな、と。

単にメンバとして実装しないのは、カプセル化のためですが、カプセル化されてないように見えてカプセル化されてるってのがおもしろい・・・って思っただけで。まぁ、GetWidth()・SetWidth()って普通にすればいいんだけどね・・・。

まぁ、マクロに型名埋め込む事にしますわ。
0425名無しさん@LinuxザウルスNGNG
>>424
templateだけで実現できそうな気がするな
まあマクロなしだとthisを渡すのは消せないが。
0426421NGNG
いま考えたら、void *Parentもテンプレートにしちゃえばキャストが要らなくなってマクロが簡単になりますね。
でも、それだと、
CProp<int>Left;
CProp<int>Right;
CProp<int>Top;
が、
CProp<CWin, int>Left;
CProp<CWin, int>Right;
CProp<CWin, int>Top;
に成っちゃう・・・(CWinはこのプロパティを持っているクラスの名称)けどこれは仕方ないかな。
0427デフォルトの名無しさんNGNG
>>426
こんなの書いてみた
template<typename T> class Setter {
T& val_;
public:
Setter(T& v):val_(v){}
void operator()(T v) {val_=v;}
};
template<typename T> class ReadOnlySetter {
public:
ReadOnlySetter(){}
ReadOnlySetter(T&){}
void operator()(T v) {std::cout << "read only property assignment" << s
td::endl;}
};
template<typename T> class Getter {
const T& val_;
public:
Getter(const T& v):val_(v){}
T operator()() {return val_;}
};
template<typename T, typename S = Setter<T>, typename G = Getter<T> > class Prop
{
S set_;
G get_;
public:
Prop(S s, G g) :set_(s) ,get_(g) {}
Prop(T& v) :set_(v) ,get_(v) {}
const T& operator =( const T& newval ) { set_(newval); return newval; }
operator T() { return get_(); }
};
0428427NGNG
使用例
class Frame {
int width_;
int readonly1_;
class GetReadOnly2 {
const int& s_;
public:
GetReadOnly2(int& s):s_(s){}
int operator()(){ return s_*2; }
};

public:
Prop<int> Width;
Prop<int, ReadOnlySetter<int> > ReadOnly1;
Prop<int, ReadOnlySetter<int>, GetReadOnly2> ReadOnly2;

Frame()
:width_(0)
,readonly1_(1)
,Width(width_)
,ReadOnly1(readonly1_)
//,ReadOnly2(ReadOnlySetter<int>(), GetReadOnly2(readonly1_))
,ReadOnly2(readonly1_)
{}
};
0429デフォルトの名無しさんNGNG
テンプレート使いすぎるともうどんどんメタ言語のようになっていくな
0430427NGNG
>>428は
Frame f;としたときに
f.Width でf.width_を読み書き
f.ReadOnly1 で代入は阻止、読むと readonly1_が読める
f.ReadOnly2 も代入は阻止、読むと readonly1_ * 2 が得られる
てなかんじ
初歩的だけど(^^;
getterとsetterにそれぞれ関数オブジェクトを渡すことでいろいろできると。
0431デフォルトの名無しさんNGNG
#include "boost/function.hpp"

template< typename ValueType >
class property
{
public:
  typedef ValueType value_type;
  typedef boost::function< value_type () > getter_type;
  typedef boost::function< void ( value_type const& ) > setter_type;

  explicit property( getter_type const& g , setter_type const& s ) : m_getter( g ) , m_setter( s ) {}
  explicit property( getter_type const& g ) : m_getter( g ) {}

  operator value_type () const { return m_getter(); }
  property& operator = ( value_type const& rhs ){ m_setter( rhs ); return *this; }

private:
  getter_type const m_getter;
  setter_type const m_setter;
};
0432デフォルトの名無しさんNGNG
#include <iostream>
#include "boost/bind.hpp"
class X
{
  int m_x;
  int get(){ std::cout << "get" << std::endl; return m_x; }
  void set( int i ){ std::cout << "set " << i << std::endl; m_x = i; }
public:
  property< int > p;
  X() : p( boost::bind( &X::get , this ) , boost::bind( &X::set , this , _1 ) ) {}
};
int main()
{
  X x;
  x.p = 1;
  std::cout << x.p << std::endl;
  x.p = 100;
  std::cout << x.p << std::endl;
  return 0;
}
// ワーイ、boostサイコー
0433デフォルトの名無しさんNGNG
不要な部分を添削してみた。

struct X {
...
int p;
...
};

int main()
{
X x;
x.p = 1;
std::cout << x.p << std::endl;
x.p = 100;
std::cout << x.p << std::endl;
return 0;
}
0434デフォルトの名無しさんNGNG
>>433
(w
0435デフォルトの名無しさんNGNG
>>432,431
最高にイかしてるけど、普通にXメンバーfunc、callした方が
イイ罠。
0436デフォルトの名無しさんNGNG
>>435
すべてのメンバ変数(属性)はアクセサを経由して使うって決めれば
統一感もあるし凝った細工も要らないね。
0437デフォルトの名無しさんNGNG
がーん・・・。operator=って継承できねぇ・・・。
0438デフォルトの名無しさんNGNG
operatorにstaticが使えないのしらなくて悩んだことあるな。
0439デフォルトの名無しさんNGNG
VC7のstd::vector::clearは持っている領域を解放して、reserveで設定した
容量も無効にしてくれるみたいなんですが、これは規格に合っている動作なんでしょうか?
swap技法みたいなのもありますし、erase(begin(), end())と同じだと思っていたんですけど……
解放されないのをあてにして書いたコードは書き換え無いと。

ちなみにVC6やgcc3はerase(begin(), end())を呼んでいるだけみたいです。
0440デフォルトの名無しさんNGNG
>>439
clear()したときに、領域をどのように開放するかは実装依存で、
swap技法を使えばどの実装でも解放されることになってる。
0441デフォルトの名無しさんNGNG
|ω・`) すいませんSwap技法てなんですか?
0442デフォルトの名無しさんNGNG
>>441
Effective C++からの一連の本嫁〜

とにかく
v.swap( std::vector<int>() );
こんな調子で作っただけの一時オブジェクトと交換する手法
0443439NGNG
>>440
ということは、出来るだけ解放させたくない(これまでに確保した領域を
再利用したい)場合はclear()ではなくerase(begin(), end())を呼んだ方が
いいってことですね。

>>441
EffectiveSTL 第17項 余分な容量を取り除くには「swap技法」を使おう
を参照のこと。
0444440NGNG
>>443
規格を見たら clear()は erase(begin(), end())と同じと、
書いてありました。ちゃんと見ずに言ってスマソ。

結局、VCがそういう仕様である限り erase(begin(), end())
としたほうが良いのは、かわりないけど。
0445デフォルトの名無しさんNGNG
>>444
VC7.1のvectorは:
>void clear()
>{// erase all elements
>erase(begin(), end());
>}
になってますね。
0446デフォルトの名無しさんNGNG
標準コンテナにハッシュマップが載るのは
いつごろになりそうなんですか?
0447デフォルトの名無しさんNGNG
>>440
気になったから調べてきたぜ。

結論から先に言うと、clear()でcapacity()が変わってしまうのは
規格の 23.2.4.2 -5- に反する。
ここで言っている再確保に関する保証がリセットされる機会は規格上に記述されていない。

そうなるとswap技法はどうなるのかと言うと、
swapによってcapacity()も入れ替わるという記述が抜けているということで、
現在の標準の欠陥として委員会に承認されている。
ttp://anubis.dkuug.dk/jtc1/sc22/wg21/docs/lwg-defects.html#341

23.2.4.2 -5- に関しては、こんなのもあった。
ttp://anubis.dkuug.dk/jtc1/sc22/wg21/docs/lwg-defects.html#329

↓同じSTL実装と思われるXBOXでの話から巻き起こる議論
ttp://www.mainframeforum.com/t50764.html
0448447NGNG
> clear()でcapacity()が変わってしまうのは
ごめん、↑は↓に置き換えて読んで。
> clear()でcapacity()が小さくなってしまうのは
0449デフォルトの名無しさんNGNG
>>445
え、マジで?
c:\Program Files\Microsoft Visual Studio .NET 2003\Vc7\include\vector
は
void clear()
{// erase all
_Tidy();
}
になってるんだけど。

vector<int> a;
a.reserve(100);
cout << a.capacity() << endl;
a.clear();
cout << a.capacity() << endl;
も
100
0
になるんだけど。
直されてるバージョンがどこかにあるのかな。
0450デフォルトの名無しさんNGNG
>>449
よくみたら引用した行は vector<bool> でした。
通常版のvectorは確かに_Tidy()呼んでましたね。申し訳ない
0451449NGNG
>>450
了解っす。てことはまだ未修整ってことか……
自分で修正するか(w
0452デフォルトの名無しさんNGNG
>>442
だれもツッコミないから俺から一言。
そのような一時オブジェはswapには渡せません。
0453デフォルトの名無しさんNGNG
>>452
左右逆でしたね。正しくは
std::vector<int>().swap(v);

しかし間違っているというだけで正しいものを指摘しないのはなんだか。
0454デフォルトの名無しさんNGNG
     いけずぅ〜♥
0455デフォルトの名無しさんNGNG
ちょっと聞きたいんだけどさデフォルトテンプレート引数で関数っていけないよね?
プログラミング言語第3版【日本語版】で13章4.1で使ってんだけど、これ間違いだよね。
規格のhttp://www.kuzbass.ru/docs/isocpp/template.html
14.1.9には関数はあかんって書いてるけど。
たんに本での俺の解釈が間違いかな?それとも訳?
0456デフォルトの名無しさんNGNG
>>455
もちろんだめ。
0457デフォルトの名無しさんNGNG
>>456
やっぱダメだよね。
特別なコンパイラでもあるのかと、思っちゃいましたよ。
0458デフォルトの名無しさんNGNG
13章4.1のどこでデフォルトテンプレート引数に関数使ってんの?
0459455NGNG
>>458
ごめんごめん。質問わるかった。
デフォルトテンプレートに関数ではなく。
int test(){}
template<int (*pf)() = test> これではなく。
struct fun{};

関数のテンプレートにデフォルトを持たすことができないよね?といってるんですよ。
template<typename T,class C = Cmp<T> > ←これ。
int compare(const String<T>& s1,const String<T>& s2){}
こんなのない?
0460デフォルトの名無しさんNGNG
>>459
関数テンプレートはデフォルト引数を設定できないよん。

デフォルト引数を設定できるのはクラステンプレート。

関数テンプレートはその代わり使用される時のコンテキスト(引数)で
判断が可能な場合は引数の省略が可能。
(逆にクラステンプレートにこの機能はない。)
0461455NGNG
>>460
わざわざ詳しい説明に感謝。
俺は本のせいで数時間(数日?)、惑われてしまった。
もしかしたら。と、期待を胸に抱いて。
0462デフォルトの名無しさんNGNG
萌え萌えに語ることないか。
0463デフォルトの名無しさんNGNG
最近operator->*に萌え萌え
Dispatchオブジェクトのスマートポインタに
(pDisp->*L"Hoge")();
とか
0464デフォルトの名無しさんNGNG
俺は boost::spirit に萌え。
しかし忙しくてあまりいじる暇がない……
0465デフォルトの名無しさんNGNG
>>463
こんなんどうやるの?
0466デフォルトの名無しさんNGNG
>>464
禿同
0467デフォルトの名無しさんNGNG
>>465
function<void()> operator->*( const wchar_t* name ) { ... }
とかじゃないの?

つーか確かに >>463 の使い方は萌え萌えだ。
0468デフォルトの名無しさんNGNG
つーか、この使い方を書いてくれた>>463に萌えだ。
0469デフォルトの名無しさんNGNG
>>463
もえ〜〜〜〜〜。LV UP!
もえもえもえもえもえもえもえもえもえっ。
もえーーーーーーーー。ごっちゃんですぅ。
0470デフォルトの名無しさんNGNG
スマソ。漏れが低レベルなんだろうが>>463の何が萌えなのかサパーリ分からん。
誰か説明してたもれ…
0471デフォルトの名無しさんNGNG
夏ってエロい季節だよね
http://homepage3.nifty.com/coco-nut/
0472デフォルトの名無しさんNGNG
>>463
それぞれに違う引数を渡したい場合はどうするんだろう?
0473463NGNG
こんなに反応があるとは思わなんだぞ

http://do.sakura.ne.jp/~junkroom/cgi-bin/megabbs/readres.cgi?bo=lounge&vi=999294620&res=75

俺の今の実装。

CComVariant name = (pDisp->*"get_Name")();
(pDisp->*"put_Name")( name );

実は引数を渡したことがないからバグってるかも。

->*の優先順位が低いのが悲しいな・・・
0474デフォルトの名無しさんNGNG
STLの利点が分からない…
誰か説明してちょ♪
0475デフォルトの名無しさんNGNG
>>474
標準
0476デフォルトの名無しさんNGNG
>>474
はじめての恋。そして、別れ。
のような甘く、ちょっぴり切ない気持ち。
0477デフォルトの名無しさんNGNG
>>474
標準なので移植性が高く、使い方を間違わなければ効率もいい。
ものによってはCの標準ライブラリよりも効率がいいよ。
あと、汎用的なわりには結構使いやすいんではないかな。
0478デフォルトの名無しさんNGNG
>>474
C++使いなら誰でも書ける程度の代物が多いけれど、

* 標準なのでどこでも使えるし、

* (まともな実装を選べば)枯れてるからバグも少ないし、

* <vector>とか<map>とかalgorithm>とか、簡単ではあるけれどよく使うものなので
  塵も積もれば山となるってことで最終的には結構手間を省けるし、

* C++使いなら誰でも(きっと)知ってるはずなので、
  関数やクラスの名前だけ見ても、ぱっと見何をしてるのか推測しやすく、
  ソースコードの可読性が上がる。 

boostもそれに準じる。Lokiはまだちょっと知名度低そうだけど。
0479デフォルトの名無しさんNGNG
HEWにはSTLついてないのだが・・・
0480デフォルトの名無しさんNGNG
>>479
まあ標準に準拠できていない処理系は別問題(もはやC++として議論できない)
ってことで
0481デフォルトの名無しさんNGNG
HEWの準拠度はVC6よりはましだと思ったが。
ライブラリが無いのがつらい。
0482デフォルトの名無しさんNGNG
>>481
そんならSTLPortとか持ってくればいいんじゃない?
(VCで比較するなら2世代前のVC6ではなくVC7.1で比較して欲しい(笑))
0483デフォルトの名無しさんNGNG
そうだね。でも普通に考えてVC7.1には勝てないことはわかるしね。
STLportからは一部持ってきてつかってるよ。というか、参考にして適当なのでっちあげた。
SHでの開発にKPITのGCCが使えないか探り中。
0484デフォルトの名無しさんNGNG
VC6+STLport+boostでかなり助かった。

今お試しでVC7.1いんすこしたとこ。
0485デフォルトの名無しさんNGNG
以下のようなコードを
GCC3.2で使おうとすると、
template < typename T >
struct A
{ typedef T value_type; };
template < typename T >
struct B : public A< T >
{ void f( value_type t ){} };

以下のようなWarningがでました。
warning: `typename B<T>::value_type' is implicitly a typename
どうもB<T>の公開基底クラスであるA<T>でのtypedefが見えていないようです。
これはC++の仕様?それともGCCのバグ?
なにかうまい方法はないっすかね?
0486デフォルトの名無しさんNGNG
たんにどっちのvalue_typeって迷っているだけ
0487デフォルトの名無しさんNGNG
追加
A<T>::value_type or B<T>::value_type ?
0488デフォルトの名無しさんNGNG
{ void f( typename value_type t ){} };

nisurebaiinnjyanaikana?
0489485NGNG
>>486=487
すみません。よくわかりません。
B<T>であらたにtypedefは追加していないのですが、、、

>>488
それでよさそうな気もしますが、
こんどはその行で parse error がでます。
わけわからん、、
0490デフォルトの名無しさんNGNG
たんに選択してやればいいだけ
template<typename T>
struct L : public A<T>
{
    typedef typename A<T>::value_type value_type;
    void f(value_type t){}
};

0491デフォルトの名無しさんNGNG
もう一つ
template<typename T>
struct L : public A<T>
{
    void f(typename L::value_type t){}
};
0492デフォルトの名無しさんNGNG
>>485
Aが特殊化されていたら A<T>::value_type が存在しない/型名でない可能性
があるのです。
0493485NGNG
>>490 >>491
ありがとうございます。
しかしですね、私としては>>490のようなことをせずにすむように
struct Aを定義しているつもりなんですよ。
typedefを必要とするBのようなクラスがたくさんあるときに、
Aから継承するだけで、typedefを書かなくても済むように。
(つまりAをstd::iteratorのように使いたい。)
また、>>491では>>485と同じWarningがでます。
Warningの内容からすれば、>>488の対処がマッチするような気がするのですが、
>>491ではなぜか parse error が出てしまうのです。
0494485NGNG
>>492
それは>>488のやりかたなら許されるはず、ということでしょうか?
0495485NGNG
ちなみにこのコードでも同じことが起こります。
#include <iterator>
#include <iostream>
using namespace std;

template< typename T >
class B : public iterator< random_access_iterator_tag, T >
{
public:
void f( value_type a ){}
};
また、
void f( value_type a ){} を
void f( typename value_type a ){}
に変えるとparse errorが出る、というのも>>485のコードと同じです。
0496485NGNG
>>493の訂正
誤 >>491ではなぜか parse error が出てしまうのです。
正 >>488ではなぜか parse error が出てしまうのです。
0497492NGNG
>>493
この場合にはtypename の次には少なくとも一つネームスペースとしてのクラス名
が必要なのです、と文法できまっています。よって
typename A<T>::value_type t または
typename B::value_type
とかけばよいです(>>491は通るよね?)。

自分も同じ事でハァって思って結局警告を無視するかいちいち継承先で
typedef typename ....
って書くしかないという結論になりました。後者だとstd::iteratorの存在意義
があまりない罠。
0498デフォルトの名無しさんNGNG
実はVC++でテストしたら警告が出ないんだよね。
0499485NGNG
>>492
> この場合にはtypename の次には少なくとも一つネームスペースとしてのクラス名
> が必要なのです、と文法できまっています。よって
> typename A<T>::value_type t または
> typename B::value_type
> とかけばよいです(>>491は通るよね?)。
なるほど、勉強になりますた。>>491は通ります。
void f( typename B::value_type a ){}
でいくことにします。

> 後者だとstd::iteratorの存在意義があまりない罠。
まったくですね。なんか納得がいかない。むかつく。
0500485NGNG
>>499の訂正
誤 >>492
正 >>497(=492)
0501492NGNG
ムカツク!禿ムカツク!禿バカジャネーノ!?と言いながらキーボードに
こぶしを振り下ろすとよいです。安物のキーボードのほうが殴ったときに
たわんだ感じがしてより自己効力感を得られるし、万が一壊したときの
損害も少なくてすむので、ベターです。
0502485NGNG
同じことを言ってる人をみつけました。
http://www2.justnet.ne.jp/~tyche/bcbbugs/reports/compiler010.html
なんかコンパイラのバージョンがあがって直ったとか。
しかし、このスレでの結論としては、
GCC3.2もBCC4.0も標準として正しく
BCC5.02JやVC++( >>498 )がおかしい、
ということですか?
0503デフォルトの名無しさんNGNG
>>502
いや>>492の意見を取り入れるとBCCの方はわかりませんが
VC++の方は部分特殊化がないからでは。
0504485NGNG
>>501
ノートパソコンなので、無理です。
>>492
> >>485
> Aが特殊化されていたら A<T>::value_type が存在しない/型名でない可能性
> があるのです。
コンパイラにはそういうときだけ
(A<T>が特殊化されてvalue_typeが存在しない typename T に対して
B<T>が実体化されたときだけ)
エラーを出してほしいと思うのですが、それは標準ではない、
ということなのでしょうか。
0505492NGNG
>>502
footypeでもfoo<T>::footypeでも特殊化を考慮するとこれが型名であるとは
(Tが未決定の時点では)決定できないのでtypenameつける以外は違反
になってしまう?まぁ実装では>>504の望むようになっているけど。
標準じゃないから認めんとか言い出したら、禿ムカツクってことで泣き寝入りを。

>>503
VC6でも↓は通らないから、このケースでのvcとgccの違いは警告を出すか
どうかだけなんではないかな。bccは入れてないからわからない。

template<typename T>
struct A
{ typedef T value_type; };

template<>
struct A<char> /* 特殊化(value_type未定義)*/
{};

template<typename T>
struct L: public A<T>
{ void f(A<T>::value_type t){} };

int main() {
L<int> li;
L<char> lc;
li.f(0);
lc.f('0');
}
0506503NGNG
>>505
>このケースでのvcとgccの違いは警告を出すかどうかだけなんではないかな
確かにそうかもね。その点では案外VC++が優秀なのかもね。
g++ -wじゃ全部の警告消えちゃうしね。
それから、この特殊化の例が通ると怖いね。
0507デフォルトの名無しさんNGNG
"VC++"は6と7と7.1で激しく標準準拠レベルが違うので
バージョン明記してくれ〜
0508デフォルトの名無しさんNGNG
>>504
USBキーボードかえ
0509デフォルトの名無しさんNGNG
暴力的だな(笑)
0510デフォルトの名無しさんNGNG
おれのキーボードは昔ながらの四角いやつなんだけど
キータッチが別れてるやつって使いやすいの?
買おうかどうか迷ってるんだよ。
0511デフォルトの名無しさんNGNG
STLつかうと一気に実行ファイルサイズが10倍に?!
0512名無しさん@EmacsNGNG
なるね。たまに。
0513デフォルトの名無しさんNGNG
最近はサイズなんて気にしてないな
0514デフォルトの名無しさんNGNG
>>511
環境によるだろ。
俺はBorland-C++5.6.2に -D_RTLDLL オプションを指定して、極力
ランタイムを使用するようにして使っているが、例えばstd::vectorを
使っても使わない時と比べ10Kほどしか増えない。
0515デフォルトの名無しさんNGNG
すごいよこの人(以下自粛)


スマソ。
0516デフォルトの名無しさんNGNG
>511
向こうのスレのループを持ち込むな
もまえら、釣られてはいけません
0517デフォルトの名無しさんNGNG
僕の名前はエンポリオです。
0518デフォルトの名無しさんNGNG
糞スレ化の危機により緊急age
質問カモ〜ン
0519デフォルトの名無しさんNGNG
>518
ageルナ。
0520デフォルトの名無しさんNGNG
>>492
Aが特殊化されていたら A<T>::value_type が存在しないというのは
具体的にはどういうときに起こるのでしょうか?
0521デフォルトの名無しさんNGNG
>>505
0522520NGNG
特殊化が分かってなかったみたいだ。出直してきます。
0523デフォルトの名無しさんNGNG
どかーん
0524デフォルトの名無しさんNGNG
STLのvectorって、小さくresizeしてもメモリ開放してくれない、って本当ですか?

そうなら、小さくなった場合vector再作成しなきゃならないですか?
ってそんな処理書くの手間なような。
0525デフォルトの名無しさんNGNG
この場合の、Aってなんていう名前なんでしょうか?
名前がわからないので、ググることもできないんで、、、
ご存知の方、教えてください。

class A;

class B {
int c;
A *m_a;
};
0526デフォルトの名無しさんNGNG
前方宣言
0527デフォルトの名無しさんNGNG
>>525
質問の意味がちょっと・・・。
0528527NGNG
526が当たってたら、俺カッコよすぎるな・・・
0529デフォルトの名無しさんNGNG
>>525
名前も何もAて言うクラスじゃん。
しかも、それは宣言のみだからどこかに定義がなけりゃ使えん。
0530デフォルトの名無しさんNGNG
前送り宣言て訳してる本もあったな。
ぐ〜ぐるではヒットしなかったが。
0531デフォルトの名無しさんNGNG
>>527
クラスAの宣言文をなんというかが知りたいんです。
以前、「抽象クラス」っていう、って文を見たことがあるんですが、
ぜんぜん自信がありません(し、ググってもそれらしいのは見つからない)
でも、Javaの抽象クラスとは意味が違って紛らわしいなぁと思った
記憶はあるんですが。
0532デフォルトの名無しさんNGNG
>>530
英語では、なんていうんでしょうか?
0533デフォルトの名無しさんNGNG
forward declaration
0534デフォルトの名無しさんNGNG
>>533
ありがとうございます。
前方宣言でいいようです。ぐぐったらヒットしまくりました。
ありがとうございました。
0535デフォルトの名無しさんNGNG
でも正規表現とかだとそっちは後方だよね。
後方宣言で通じる奴はいないだろうけど。
0536デフォルトの名無しさんNGNG
>>528
藻前カコイイ!
0537527NGNG
>>536
ありがとう(´・ω・`)
0538デフォルトの名無しさんNGNG
>>535
正規表現だと"後方参照"だから、宣言があるのは前方、
参照があるのは後方、でいいのではないかなあ。
0539デフォルトの名無しさんNGNG
>>538
先読み表明、後読み表明はどうする
0540デフォルトの名無しさんNGNG
>>539
現在位置より先を読むんだから普通に"先読み"表明で何か問題あるか?
後読み表明って聞いたこと無いからわからんが。
0541デフォルトの名無しさんNGNG
>>540
後読み表明ってひそかにマイナーだったんだな
「後読み」や「後読みアサーション」でググってくれるとヒットする。
0542デフォルトの名無しさんNGNG
スレ違いな話題はここまで。
0543デフォルトの名無しさんNGNG
>>495
「::」で修飾されないシンボルの検索では,
テンプレート引数に依存する親クラスは考慮されない。
だから、
 template <class T>
 struct Iter : public iterator<input_iterator_tag, T> {
  void foo(value_type) {}
 };
はダメだが、
 struct Iter2 : public iterator<std::input_iterator_tag, int> {
  void foo(value_type) {}
 };
は問題ない。
以前ハマって仕様書調べたことがある。

g++ 3.3 だと御丁寧にも
 implicit typename is deprecated,
 please see the documentation for details
と言われる。

>>524
禿しくガイシュツ杉。
swap技法で検索するがよろし。
0544デフォルトの名無しさんNGNG
>>543
> 「::」で修飾されないシンボルの検索では,
> テンプレート引数に依存する親クラスは考慮されない。
...中略...
> 以前ハマって仕様書調べたことがある。
それはつまり
>>502ということですか?
0545デフォルトの名無しさんNGNG
deprecatedってことは昔はokだったのね
0546山崎 渉NGNG

 __∧_∧_
 |(  ^^ )| <寝るぽ(^^)
 |\⌒⌒⌒\
 \ |⌒⌒⌒~|         山崎渉
   ~ ̄ ̄ ̄ ̄
0547低LVで申し訳無いNGNG
二つの集合について要素が一対一の場合に
どちらからも相手を特定したいのですが

map<A, B> m_mapA2B;
map<B, A> m_mapB2A;

の二つを持たせてfindするしかないですか?
0548山崎 渉NGNG

 __∧_∧_
 |(  ^^ )| <寝るぽ(^^)
 |\⌒⌒⌒\
 \ |⌒⌒⌒~|         山崎渉
   ~ ̄ ̄ ̄ ̄
0549デフォルトの名無しさんNGNG
>>547
標準の範囲ではそんな感じの手しか無いと思う。

そーゆー用途のコンテナを作ってる人が世の中には
それなりにいるので、それを利用するのが手かと。
http://www.google.co.jp/search?hl=ja&ie=UTF-8&oe=UTF-8&q=bidirectional+map
0550547NGNG
>>549 ありがとうでつ
0551飲斡磯稲飲斡NGNG
飲斡磯稲飲斡
0552ほしゅNGNG
ほしゅ
0553デフォルトの名無しさんNGNG
gccのtemplateを、gcc下位versionにソース互換性
を持たせる様に巧く書けません。
下のコードですけど、
gcc version3.2.2では通りますが、
gcc version2.9.6では C<T>::C()のiteratorについて、
C<T>がmap templateを持ってないと怒られます。
typenameを消すとgcc version2.9.6で通りますが、
今度はversion3.2.2で通りません。
何がおかしいんでしょうか?
--------------------------------
template<class T>
class C {
public:
typedef map<T,T> TCont;
C();
};

template<class T> C<T>::C() {
typename C<T>::TCont::iterator iter;
}
---------------------------------
0554デフォルトの名無しさんNGNG
>>553
たんによけいです。gcc version 2.95.3-10で確認。
template<class T> C<T>::C() {
  typename TCont::iterator iter;
}
0555デフォルトの名無しさんNGNG
>>553
GCC-2.9XはC++のテンプレートに関して期待したらダメだと思うけど。
テンプレート使う以上はGCC3以上必須。
0556553NGNG
>>554
ホンとですね...逝ってきます。

>>555
> GCC-2.9XはC++のテンプレートに関して期待したらダメだと思うけど。
うちの環境RedHat7.3がベースなので、
ほとんどがgcc-2.9.xです
(つд`)∴°
0557デフォルトの名無しさんNGNG
templateはそんなに悪くはないと思うが。それよりiostreamが・・・
0558デフォルトの名無しさんNGNG
boostとかlokiとかを愛する人達にはあの程度では物足りないのでつ。<template
stl程度止まりの人達には必要充分。
0559デフォルトの名無しさんNGNG
2.9.xって部分テンプレート特殊化できますか?
StlOnlyでも特殊化は使うと思うけど。
0560デフォルトの名無しさんNGNG
>>559
質問したらageようよ
0561_NGNG
http://homepage.mac.com/hiroyuki44/hankaku01.html
0562デフォルトの名無しさんNGNG
>>559
なんの2.9.x? gccかな?
0563_NGNG
http://homepage.mac.com/hiroyuki44/
0564_NGNG
http://homepage.mac.com/hiroyuki44/
0565_NGNG
http://homepage.mac.com/hiroyuki44/jaz09.html
0566_NGNG
http://homepage.mac.com/hiroyuki44/
0567_NGNG
http://homepage.mac.com/hiroyuki44/jaz09.html
0568_NGNG
http://homepage.mac.com/hiroyuki44/
0569_NGNG
http://homepage.mac.com/hiroyuki44/jaz09.html
0570_NGNG
http://homepage.mac.com/hiroyuki44/
0571_NGNG
http://homepage.mac.com/hiroyuki44/jaz02.html
0572_NGNG
http://homepage.mac.com/hiroyuki44/
0573デフォルトの名無しさんNGNG
なんなんだ
0574_NGNG
http://homepage.mac.com/hiroyuki44/jaz02.html
0575_NGNG
http://homepage.mac.com/hiroyuki44/
0576_NGNG
http://homepage.mac.com/hiroyuki44/jaz02.html
0577_NGNG
http://homepage.mac.com/hiroyuki44/
0578デフォルトの名無しさんNGNG
[w]stringstreamが遅いんだが、もっと速くならんのかな。
0579デフォルトの名無しさんNGNG
>>578
コード晒さないとわかんねぇよ。
0580578(1)NGNG
#include<boost/lexical_cast.hpp>
#include<boost/timer.hpp>
#include<boost/smart_ptr.hpp>
#include<sstream>
#include<vector>
#include<string>
#include<iostream>
#define MAX_LOOP (100000)
#define B_PRE { boost::timer tmr;
#define B_START(i) for(int i=0;i<MAX_LOOP;i++){
#define B_END } std::cout << tmr.elapsed() << std::endl; }
#define B_FINALLY_BEGIN }
#define B_TIMER std::cout << tmr.elapsed() << std::endl;
#define B_FINALLY_END }
wchar_t* stringconcat_i(const wchar_t* s1,int ii2){
const int i1 = wcslen(s1);
const int i2 = 6*sizeof(int);
const int i = i1+i2+1;
if( i1 > i || i2 > i || i1< 0 || i2 < 0 || i < 0){
throw "stringconcat error";
}
wchar_t* w = new wchar_t[i];
if(!w){throw "error";}
wcsncpy(w,s1,i1);
#ifdef _MSC_VER
_itow(ii2,w+i1,10);
#else
swprintf(w+i1,L"%d",ii2);
#endif
return w;
}
0581デフォルトの名無しさんNGNG
int main(){//環境はVC2003 -O2(最適化) です
//(1)lexical_cast + wstring::operator+ + vector 0.343 0.359 0.343
B_PRE
std::vector<std::wstring> ar; ar.reserve(MAX_LOOP+10);
B_START(i)
ar.push_back(L"boost" + boost::lexical_cast<std::wstring>(i) );
B_END
//(2)試しに狡をする wstringstream + vector 0.25 0.234 0.234
B_PRE
std::vector<std::wstring> ar; ar.reserve(MAX_LOOP+10);
std::wstringstream s; s << L"boost";
B_START(i)
s.rdbuf()->pubseekpos(5);
s << i;
ar.push_back(s.str());
B_END
//(3) stringconcat + shared_ptr + vector 0.109 0.11 0.11
B_PRE
std::vector<boost::shared_ptr<wchar_t> > ar; ar.reserve(MAX_LOOP+10);
B_START(i)
ar.push_back(boost::shared_ptr<wchar_t>( stringconcat_i(L"boost",i) ));
B_END
//(4) stringconcat + vector 0.078 0.063 0.063
B_PRE
std::vector<wchar_t*> ar; ar.reserve(MAX_LOOP+10);
B_START(i)
ar.push_back( stringconcat_i(L"boost",i) );
B_FINALLY_BEGIN
B_TIMER
for(std::vector<wchar_t*>::iterator itr = ar.begin();itr!=ar.end();itr++){ delete (*itr); }
B_FINALLY_END
}
0582デフォルトの名無しさんNGNG
vectorの中身がいろいろちがうじゃねぇか。
結果を統一しないと、道具が遅い根拠にはならないだろ。

あと、
不要なマクロ使いすぎ。
deleteとdelete[]を混同してる。
newで0が返ってくるのは非標準。
0583修正NGNG
>deleteとdelete[]を混同してる。
そうだったね。
for(std::vector<wchar_t*>::iterator itr = ar.begin();itr!=ar.end();itr++){ delete [] (*itr); }
に修正してください。

>vectorの中身がいろいろちがうじゃねぇか。
std::wcout << ar[i].c_str();でみたけどOKだったけどちがた?

>newで0が返ってくるのは非標準。
どのように処理するのがいいのでしょうか?
0584578NGNG
チッ
0585デフォルトの名無しさんNGNG
try {
Cls c = new Cls;
catch (std::bad_alloc& ex) {
// 確保できんかった
}

または、

Cls s = new(std::nothrow) Cls;
if (s == 0) {
// 確保できんかった
}

コンパイラ毎の対応は知らん。
0586デフォルトの名無しさんNGNG
>>585
- catch (std::bad_alloc& ex) {
+ } catch (std::bad_alloc& ex) {
0587修正2NGNG
同様にshared_ptrでなく、shared_arrayが正しいですね。
std::vector<boost::shared_array<wchar_t> > ar; ar.reserve(MAX_LOOP+10);
ar.push_back(boost::shared_array<wchar_t>( stringconcat_i(L"boost",i) ));

これも少し訂正してみました。>>585
wchar_t* stringconcat_i(const wchar_t* s1,int ii2){
const int i1 = wcslen(s1);const int i2 = 6*sizeof(int);
const int i = i1+i2+1;
if( i1 > i || i2 > i || i1< 0 || i2 < 0 || i < 0){throw "stringconcat error";}
wchar_t *w= 0;
#ifndef BOOST_NO_EXCEPTIONS
try{w = new wchar_t[i];}
catch(...){
//delete [] w; //?
throw;
}
#else
w = new wchar_t[i];
if(w == 0){
//delete [] w;//?
throw std::bad_alloc();
}
#endif
wcsncpy(w,s1,i1);
#ifdef _MSC_VER
_itow(ii2,w+i1,10);
#else
int iResult = swprintf(w+i1,L"%d",ii2);
if(iResult == -1){throw"stringconcat error";}
#endif
return w;
}
0588デフォルトの名無しさんNGNG
結果を統一しろっつうのは、std::vector<std::wstring> で統一しろってことだよ。
まずは文字列の保持の仕方を固定にしろ。

あと、
BOOST_NO_EXCEPTIONSはユーザーが使うものじゃない。
速度のテストに条件コンパイル使ってたら結果がどれによるものかはっきりしない。

>>585
nothrow使ってもクラスのコンストラクタからの例外は飛んでくるぞ。
0589588NGNG
> BOOST_NO_EXCEPTIONSはユーザーが使うものじゃない。
ごめん。これはうそだった。ちゃんとドキュメントに載ってるな。

でも使い方が間違ってる。
このマクロが定義されているときは、コンパイラは例外処理をサポートしない。
0590578(その1)NGNG
ごたごたしたので最後に整理しておきます。
>>588さん、ご指摘ありがとうございます。
//includeは580のを使ってください
#define MAX_LOOP (100000)
#define B_LOOP (3)
#define B_TYPE1 //片方の方が精度が良い
#define B_TYPE2  //片方の方が精度が良い
#define B_INI boost::timer tmr;double td1=0;double td2=0;
#define B_PRE td1=0;td2=0; for(int j=0;j<B_LOOP;j++){ { tmr.restart();
#define B_START(i) for(int i=0;i<MAX_LOOP;i++){
#ifdef B_TYPE1
#define B_TIMER1 td1 += tmr.elapsed();
#else
#define B_TIMER1
#endif
#ifdef B_TYPE2
#define B_TIMER2 td2 += tmr.elapsed();
#else
#define B_TIMER2
#endif
#define B_FINALLY_BEGIN }
#define B_FINALLY_END } B_TIMER2 } std::wcout << td1/B_LOOP << " : " << td2/B_LOOP <<std::endl;
#define B_TIMER B_TIMER1
#define B_END B_FINALLY_BEGIN B_TIMER B_FINALLY_END
0591578(その2)NGNG
wchar_t* stringconcat_i(const wchar_t* s1,int ii2){
const int i1 = wcslen(s1);
const int i2 = 3*sizeof(int)+2;//3>(8*LOG10(2))
const int i = i1+i2+1;
if( i1 > i || i2 > i || i1< 0 || i2 < 0 || i < 0){ throw "stringconcat error"; }
wchar_t *w = new wchar_t[i];//std::bad_alloc() or SPEC
if(w == 0){throw"stringconcat error";}//(非標準)
wcsncpy(w,s1,i1);//no error
#ifdef _MSC_VER //VC
_itow(ii2,w+i1,10);//no error
#else //Other Compiler
int iResult = swprintf(w+i1,L"%d",ii2);
if(iResult == -1){throw"stringconcat error"; }
#endif
return w;
}
int main(){//環境はVC2003 -O2(最適化) です
B_INI
std::cout << "ループ終了時: スコープ脱出時" << std::endl;
//(1)lexical_cast + wstring::operator+ + vector
std::cout << "lexical_cast<wstring> , wstring::operator+ , vector<wstring>" << std::endl;
B_PRE
std::vector<std::wstring> ar; ar.reserve(MAX_LOOP+10);
B_START(i)
std::wstring s=L"boost"; s+=boost::lexical_cast<std::wstring>(i);
ar.push_back(s);
B_END
0592デフォルトの名無しさんNGNG
えぃ
0593デフォルトの名無しさんNGNG
VC++6.0を使っているのですが、

#include <iostream>
#include <map>

using namespace std;

int main()
{
map<int,int> mt1, mt2;
int a=10;
a;

return 0;
}

というプログラムを組むと、

warning C4786: 'std::reverse_bidirectional_iterator<std::_Tree<int,std::pair<int const ,int>,std::map<int,int,std::less<int>,std::allocator<int> >::_Kfn,std::less<int>,st
d::allocator<int> >::iterator,std::pair<int const ,int>,std::pair<int const ,int> &,std::pair<int const ,int> *,int>' : 識別子が '255' 文字に切り捨てられました (debug 情報内)。

などの警告が6つでます。
また、最初のintをstringに変えると(#include <string>済み)、77個の警告が出ます。
どうすればこの警告は消えるのでしょうか?
0594578(その3)NGNG
//(2) wstringstream + pubseekpos + vector
std::cout << "wstringstream , vector<wstring>" << std::endl;
B_PRE
std::vector<std::wstring> ar; ar.reserve(MAX_LOOP+10);
std::wstringstream s; s << L"boost";
B_START(i)
s.rdbuf()->pubseekpos(5); s << i;ar.push_back(s.str());
B_END
//(5) stringconcat + wstring + vector
std::cout << "stringconcat , vector<wstring>" << std::endl;
B_PRE
std::vector< std::wstring > ar; ar.reserve(MAX_LOOP+10);
B_START(i)
wchar_t *wA = stringconcat_i(L"boost",i);ar.push_back(std::wstring(wA));delete [] wA;
B_END
//(3) stringconcat + shared_ptr + vector
std::cout << "stringconcat , vector<shared_array<wchar_t> >" << std::endl;
B_PRE
std::vector<boost::shared_array<wchar_t> > ar; ar.reserve(MAX_LOOP+10);
B_START(i)
ar.push_back(boost::shared_array<wchar_t>( stringconcat_i(L"boost",i) ));
B_END
//(4) stringconcat + vector
std::cout << "stringconcat , vector<wchar_t*>" << std::endl;
B_PRE
std::vector<wchar_t*> ar; ar.reserve(MAX_LOOP+10);
B_START(i)
ar.push_back( stringconcat_i(L"boost",i) );
B_FINALLY_BEGIN
B_TIMER
for(std::vector<wchar_t*>::iterator itr = ar.begin();itr!=ar.end();itr++){ delete [] (*itr); }
B_FINALLY_END }
0595デフォルトの名無しさんNGNG
>>593 http://www.google.co.jp/search?lr=lang_ja&q=C4786
0596592NGNG
きゃはは
0597デフォルトの名無しさんNGNG
>>578
何を整理したつもりなんだ?混沌としたままじゃないか?
それじゃテストにならん。
引き取るか出直すかしてきてくれ。
0598デフォルトの名無しさんNGNG
>>595
そういう検索の仕方もあるのですね
ありがとうございました
ttp://www.nitoyon.com/vc/reference/error.htm
を[C4786 表示]で検索して探り当てました

0599デフォルトの名無しさんNGNG
>>597
一言一言、う○ーな。
テストなんかしてねーよ。
578-579をよく読め。
0600デフォルトの名無しさんNGNG
#include <windows.h>
#include <map>

class Draw {
private:
static map< HBITMAP, int > hBit;
static map< HDC, int > memDC;
public:
InitDraw();
};

error C2143: 構文エラー : ';' が '<' の前に必要です。
error C2059: 構文エラー : '<'
error C2238: ';' の前に不正なトークンがあります。

おそらくHBITMAPなどのせいかと思いますが、どのようにすればよいのでしょうか?
0601デフォルトの名無しさんNGNG
using namespace std;

付け足したらうまくいきました・・・
0602デフォルトの名無しさんNGNG
あれだあれがねぇ。
STLを使う前のあの呪文がねぇ。
0603デフォルトの名無しさんNGNG
std::map
0604デフォルトの名無しさんNGNG
これって常識?

template<typename TYPE, size_t N>
 inline size_t elemof(TYPE (&)[N]) { return N; }
0605デフォルトの名無しさんNGNG
>>604
ttp://www.tietew.jp/cppll/archive/9004

この辺も参照しとけ。
0606デフォルトの名無しさんNGNG
>>604
一般常識。
>>605
おはなしがふるい。
0607デフォルトの名無しさんNGNG
>>604
こっちも見とけ。
http://pc2.2ch.net/test/read.cgi/tech/1058213523/44
0608604NGNG
うーん。やっぱ常識だったか。
追加情報もありがトン。
0609デフォルトの名無しさんNGNG
マクロなのに名前空間内に入ってるように見せかけてみるテスト。

namespace Count
{
template<typename T, size_t N>
inline const char (&elemof_(T (&)[N]))[N];
const int elemof_unity_ = 1;
}

#define elemof(array) elemof_unity_ * (sizeof Count::elemof_((array)))
0610_NGNG
http://homepage.mac.com/hiroyuki44/
0611デフォルトの名無しさんNGNG
しまった。elemof_unity_ の型は size_t だ。
0612_NGNG
http://homepage.mac.com/hiroyuki44/hankaku02.html
0613デフォルトの名無しさんNGNG
>>609
それじゃ elemof_unity_ の意味がないだろ。

const size_t elemof_unity_ = sizeof(char);

#define elemof(array) ((sizeof Count::elemof_((array))) / elemof_unity_)

こうじゃないのか?
あと、template 引数の size_t はこの場合、int のほうがよかないか?
0614デフォルトの名無しさんNGNG
>>609
(・∀・)イイ
0615デフォルトの名無しさんNGNG
>>613
それじゃ、Count::elemof( a ) と書けないだろ。
0616デフォルトの名無しさんNGNG
>>615
elemof_unity_ の意味を勘違いしてたよ、スマソ。
0617609NGNG
別の名前空間で elemof を定義できないから
これじゃ意味が無かったなー。
と今さら言ってみる。
0618デフォルトの名無しさんNGNG
STLにメモリストリーム系ありますか?

printfを書き換えるのに使えるようなものが欲しい。
0619デフォルトの名無しさんNGNG
printfを書き換えるってメモリ上の関数を書き換えたいのか?
0620デフォルトの名無しさんNGNG
iostream も boost::format も STL じゃないね。
0621デフォルトの名無しさんNGNG
>>619
 >>618はsprintf()と間違えたんとちゃうか?
0622デフォルトの名無しさんNGNG
てかSTLって何よ。
C++の標準ライブラリなんてほとんどテンプレートじゃないかと
思うんだが。
0623デフォルトの名無しさんNGNG
iostreamってテンプレートだったんだ。へー。
0624デフォルトの名無しさんNGNG
>>623
iostream は、basic_iostream テンプレートクラス の typedef だろ?
0625デフォルトの名無しさんNGNG
>>623
0626 ◆qQ4COMPILE NGNG
typedef basic_iostream<char, char_traits<char> > iostream;
0627623NGNG
stringってテンプレートだったんだ。へー。
0628デフォルトの名無しさんNGNG
typedef basic_string<char, char_traits<char> > string;
0629デフォルトの名無しさんNGNG
ちょっと違った。
typedef basic_string<char, char_traits<char>, allocator<char> > string;
0630デフォルトの名無しさんNGNG
たまには釣られてみるか

>>627
typedef basic_string<char, char_traits<char>, allocator<char> > string;
typedef basic_string<wchar_t, char_traits<wchar_t>, allocator<char> > wstring;
0631デフォルトの名無しさんNGNG
pair<T,U>のコンテナを pair の second に従ってソートさせたいのですが、
関数アダプタとかをうまく組み合わせて共通アルゴリズムの sort でソートできませんかね?
0632 ◆qQ4COMPILE NGNG
compose 系と select2nd でいける。
0633デフォルトの名無しさんNGNG
>>632
compose も select2nd もVC6にはないや・・・
0634デフォルトの名無しさんNGNG
stlportとかboost入れたら?
0635 ◆qQ4COMPILE NGNG
stlportを入れておくべきかと、
環境が固定されてるとかで入れられないなら、作ってもよし。こんな感じで。

template< typename FN, typename OP1, typename OP2 >
struct binary_compose:public std::binary_function<OP1::argument_type, OP2::argument_type, FN::result_type>
{
FN& fn;
OP1& op1;
OP2& op2;

binary_compose(const FN& f, const OP1& p1, const OP2& p2):fn(f), op1(p1), op2(p2) {}

result_type operator( first_argument_type p1, second_argument_type p2){
return fn( op1(p1), op2(p2) );
}
}

template< typename FN, typename OP1, typename OP2 >
binary_compose< FN, OP1, OP2 >
compose2(const FN& f, const OP1& p1, const OP2& p2)
{
return binary_compose<FN, OP1, OP2 >( f, p1, p2 );
}
template<class PAIR>
struct select2nd : std::unary_function<PAIR,PAIR::second_type> {
PAIR::second_type operator()(const PAIR& x) const
{
return x.second;
}
};

0636デフォルトの名無しさんNGNG
以下のコードがVC7では通っていたのに準拠度が上がったらしいVC7.1では
warningとerrorが出て通らなくなってしまったんですが
何がマズイんでしょうか?

template<typename T> class Manager
{
protected:
typedef std::list<T*> Array;
typedef Array::iterator ArrayIterator; //ここでwarningとerror
Array Items_;
public:
virtual ~Manager() { Clear(); }
void Add(T* item) { Items_.push_back(item); }
void Add(const Array& array){ Items_.merge(array); }
int size() const { return Items_.size(); }
void Clear()
{
for(ArrayIterator it=Items_.begin(); it!=Items_.end(); ++it)
delete *it;
Items_.clear();
}

};


エラーとワーニングはこんな感じです
warning C4346: 'std::list<_Ty*>::iterator' : 依存名は型ではありません。
型を指定するには、'typename' を含むプレフィックスを使用してください。
コンパイルされたクラスのテンプレートのインスタンス化 'Manager<T>' の参照を確認してください

error C2146: 構文エラー : ';' が、識別子 'ArrayIterator' の前に必要です。
error C2501: 'Manager<T>::ArrayIterator' : 識別名を宣言するのに、型が指定されていません。
0637デフォルトの名無しさんNGNG
>>636
>>492のあたり

関係ないけどVCの「コンパイルされた」っていうの冗長じゃね?
0638デフォルトの名無しさんNGNG
>631
Uの比較をする関数をつくって、sortに渡してやればいいです。
0639デフォルトの名無しさんNGNG
>>636
>typedef Array::iterator ArrayIterator;
ここは

typedef typename Array::iterator ArrayIterator;
こう

Array::iteratorだけではそれが型名かどうか判別できないから。
0640デフォルトの名無しさんNGNG
string sbuf;
cout << sbuf;

みたいに書けないんでつか?
0641デフォルトの名無しさんNGNG
なぜそう思うのですか?
0642デフォルトの名無しさんNGNG
>>640
はい
0643デフォルトの名無しさんNGNG
>638
違った。
sortに渡すのは、pairのsecondを比較する関数。
Uの比較演算子の定義もするという、二段構えだと、オブジェクト指向っぽいね。
0644デフォルトの名無しさんNGNG
>>640
書きまくってますが
0645デフォルトの名無しさんNGNG
>>640
おそらく
#include <string>
を忘れている。
0646デフォルトの名無しさんNGNG
>640
vc6だとできなかっった鴨試練。
代わりに
cout << sbuf.c_str();
とでもして。
0647デフォルトの名無しさんNGNG
>>646
できないのは VC5 までじゃなかったっけ?
うろ覚えだが。
0648デフォルトの名無しさんNGNG
実は#include <iostream.h>
0649デフォルトの名無しさんNGNG
実は
basic_ostream<char>&
operator<<(basic_ostream<char>&, const string&);
の定義がない罠
0650デフォルトの名無しさんNGNG
649は、きっとあまりかしこくないひとなんだろうなぁ、とおもいました。
0651649NGNG
えへへ。誉められちった。あまりだって。
0652デフォルトの名無しさんNGNG
実は
std::
を付け忘れてるとか
0653デフォルトの名無しさんNGNG
実は関数外
0654デフォルトの名無しさんNGNG
うしんぐ なめsぱせ std
0655デフォルトの名無しさんNGNG
struct A { string str; int i;}

typedef std::vector<A> B;
typedef std::vector<B> C;

class D {
std::vector<C> vec;
int flag
void vsort(int index);
};

の時、vsort内でstd::sortを使ってvec内のB[n].strをキーにしてvecをソートしたいの
ですが、どうすればいいですか?flag==indexの時は逆順ソートがしたいです。
叙述関数ってのが良くわかんないです。
0656デフォルトの名無しさんNGNG
>vec内のB[n].str

nはどっから出てきた?
0657デフォルトの名無しさんNGNG
すみません、B[index].strでした
0658山崎 渉NGNG
(^^)
0659デフォルトの名無しさんNGNG
どのB[index].strを使って比較するの?
0660 NGNG
setに格納されている要素のアドレスを取得できないんですか?
vectorだと&vec[0]とかで、mapだと&m[7]見たいな感じでアドレスが取得できるみたいだけど
setの場合はどうしたらいいの?

set<int>::iterator it = s.find(7);
int* p = ⁢
だとイテレータのアドレスになってしまうよね。
変なことやってると思うかもしれないけど既存のCのプログラムとの関係でアドレスが欲しいです。
setじゃ無理かな?教えてください。
0661デフォルトの名無しさんNGNG
>>660
&*it
0662デフォルトの名無しさんNGNG
>>660
> vectorだと&vec[0]とかで、mapだと&m[7]見たいな感じでアドレスが取得できる
vector以外でそれやるの危険では・・・。
0663デフォルトの名無しさんNGNG
template <typename T1,typename T2=NullType,typename T3=NullType,typename T4=NullType>
struct GenTypelist;

template <typename T1>
struct GenTypelist<T1,NullType,NullType,NullType>{
    typedef TYPELIST_1(T1) Result;
};
template <typename T1,typename T2>
struct GenTypelist<T1,T2,NullType,NullType>{
    typedef TYPELIST_2(T1,T2) Result;
};
template <typename T1,typename T2,typename T3>
struct GenTypelist<T1,T2,T3,NullType>{
    typedef TYPELIST_3(T1,T2,T3) Result;
};
typedef GenTypelist<char,short,long>::Result Intengers;

ふと思いついたんだけど、既出?
BOOST_PPのあたり使って作っておくと面白そう
0664663NGNG
template <typename T1,typename T2=NullType,typename T3=NullType,typename T4=NullType>
struct GenTypelist{
    typedef Typelist<T1,GenTypelist<T2,T3,T4,NullType>::Result> Result;
};
template <>
struct GenTypelist<NullType,NullType,NullType,NullType>{
    typedef NullType Result;
};
書き込んでから思いついた・・・
0665デフォルトの名無しさんNGNG
>>662
*((&m[0]) + i) とかはvector以外では無理だが、
別に単にアドレスとっても問題なかろう。
0666 NGNG
>>661
どうもありがとう。
初め見たとき参照のアドレス?みたいなのになってエラーになるかと思ったけどならないのね。
ただ返す型はconst int *になってたみたい。setは内容変えないようになってるんだね。
まあ自分のプログラムも変えないからconstへのポインタでOKなんだけど。

>>662
ほんのちょっとの間、Cの関数に渡すのです。
その間、要素を削除しないことは保証できるから大丈夫なんじゃない?
実際はintなんかじゃなくてもっと大きい構造体なんかが入ってるからポインタ渡しになってます。
0667デフォルトの名無しさんNGNG
std::setの場合、要素が変更されると整列が狂うから。
0668デフォルトの名無しさんNGNG
std::string::_Rep::_M_grab(std::allocator<char> const&, std::allocator<char> const&)

ってgdbに言われました。しかし、意味がわかりません・・・

ore % g++ --version

g++ (GCC) 3.2 20020927 (prerelease)
Copyright (C) 2002 Free Software Foundation, Inc.

冒頭のメッセージは一体何を伝えたいのでしょうか・・・。
0669デフォルトの名無しさんNGNG
stlportの
vectorとlistのソートの実験したら、listの方が3倍くらい早かった。
0670デフォルトの名無しさんNGNG
>>669
要素の型によってんなもん変わるだろ
0671デフォルトの名無しさんNGNG
std::fstream の読み書きがうまく行かなくて困っています
stlport、vc6 です

ファイルを読みこんで、その中身を元に末端にデータを追加するんですが、
読み込みしかできないのです

std::fstream file;
file.open ( "test.txt", std::ios::binary | std::ios::in | std::ios::out );
.............// read など
.............// データ解析
.............// write など
file.close();

読み書きが出来る様にする方法を教えてください
おねがいします
0672デフォルトの名無しさんNGNG
app
0673669NGNG
>>670
boost::shared_ptr で実験してみました。
intのメンバだけもったクラスをポインタにしてみたんだが、
1000個くらいのポインタをコンテナにぶち込んだあと
intでソート、その後ポインタでソートを10000回くらい繰り返してみた。
まぁ、1000個ポインタぶち込むとこからループさせたらあまりかわらなくなったけどね。


>>671
www.scl.kyoto-u.ac.jp/scl/appli/appli_manual/SUNWspro/WS6U2/ja/manuals/stdlib/user_guide/loc_io/index.htm
homepage1.nifty.com/emil/stream.html
homepage1.nifty.com/tnomakuchi/studying/programming/iostream.htm
www.jah.ne.jp/~naoyuki/Writings/ExtIos.html
ahiru.portland.co.uk/tips/stlsmp.shtml
www5c.biglobe.ne.jp/~ecb/cpp/cpp00.html
www.kab-studio.biz/Programing/Codian/iostream/06.html
0674671NGNG
ifstream と ofstream の2つで代用しました
お騒がせしました
失礼致します
0675デフォルトの名無しさんNGNG
>>673
std::iter_swap<std::list<T>::iterator, std::list<T>::iterator>
がうまく特殊化されてるんじゃないの?
0676デフォルトの名無しさんNGNG
ifstream で2回オープンすると、ちゃんとファイルが読み込めないようなのですが
なぜでしょうか?
0677デフォルトの名無しさんNGNG
template関数やクラスに、型を適用したあとのソースを出力してくれるような
プログラムありませんかね?
0678デフォルトの名無しさんNGNG
>>677
×template関数
○関数template
0679デフォルトの名無しさんNGNG
×template関数やクラス
×関数やクラスtemplate
0680デフォルトの名無しさんNGNG
>>679
両方×かよw
0681デフォルトの名無しさんNGNG
std::stringで検索しても良いHP出ないのナンデダロ-
お気に入りに入れてるお勧めなHPありますか?
0682デフォルトの名無しさんNGNG
>>681
std::string のなにを知りたいんだ?
0683デフォルトの名無しさんNGNG
>>681
良いHPじゃなくて悪かったな。
0684デフォルトの名無しさんNGNG
>>682
681の知りたいことを予想してみる。
ずばりcodecvt。
ていうかむしろ俺が知りたい。
日本語でよろしく。
ググレってか?
0685山崎 渉NGNG
    (⌒V⌒)
   │ ^ ^ │<これからも僕を応援して下さいね(^^)。
  ⊂|    |つ
   (_)(_)                      山崎パン
0686デフォルトの名無しさんNGNG
               _,......,,,_
               ,、:'":::::::::::::::::``:...、
           /::::::::::::::::::::::::::::::::::::::\
          i::::::::::::::::::::::::::::::::::::::::::::::::::ヽ
            !::::::::::::::::::::::;‐、:::::::::_::::::_::::';
         |::::::::::::::::::::::|  :: ̄      ``!
         r''ヾ'::::::::::/  ::          |
         l r‐、\::/  _,,、ii_;;_、    _,,,l、       
         ヽヾ〈    ::= -r:;;j_;、`/ :;'ィ;7        
          !:!_,、    :: ` ー  : |: `´/
         ,./ヽ |  、_  ::  ,: 'r' :i |:  /
       ,../ `ヽ;_  i | '"、_:::__`:'‐'. /  なんかもう必死でしょ?
        / ``'ー 、_\  ! `::` ̄''`チ`シ  
    /ー 、_    `\:、_ :: ` ̄/   最近の山崎渉
   /     ``ヽ、   ヽ`'7‐--'゛     


0687デフォルトの名無しさんNGNG
要素数を3に限定したvector<int>ってどうやってつくんの?
0688デフォルトの名無しさんNGNG
なんでint[3]じゃだめなんだろう
0689デフォルトの名無しさんNGNG
イテレータが使いたいとか
0690デフォルトの名無しさんNGNG
>>687
const vector<int> v(3);
0691デフォルトの名無しさんNGNG
意味なし
0692デフォルトの名無しさんNGNG
>>688
なんでも

>>689
同意

>>690
v.push_back(1);
でコンパイルエローが出ますぅ

>>691
同意
0693デフォルトの名無しさんNGNG
boost::array<int,3>はどうだ
0694デフォルトの名無しさんNGNG
>>692
こいつ質問者の態度じゃないな。
0695デフォルトの名無しさんNGNG
>>693
さっそくboostを入れました。
typedef boost::array<int, 3> bai3;
で、できました。
std::vectorで同様のことができなそうなので、あきらめます。
ありがとうございました。


>>694
((((((≧∇≦)))))) ブハハハハ
0696デフォルトの名無しさんNGNG
>>695
ちょっとワロタがやはりおまいは氏ね。
0697デフォルトの名無しさんNGNG
>>696
放置しる
0698デフォルトの名無しさんNGNG
export の実装されてるコンパイラって、やっぱ未だにないの?
0699直リンNGNG
http://homepage.mac.com/maki170001/
0700デフォルトの名無しさんNGNG
かなり前からcomeau C++がサポートしてるよ。
0701デフォルトの名無しさんNGNG
>>663 >>664
何が言いたいのだろう?。これってLokiのTypelistじゃん
http://sourceforge.net/cvs/?group_id=29557
0702デフォルトの名無しさんNGNG
>>701
なにいまごろ釣られてんだよw
0703デフォルトの名無しさんNGNG
>>701
TYPELIST_2() とか TYPELIST_3() とかいう要素数が名前に入った
マクロ使わずに GenTypeList<>::Result で書けて便利、てことじゃねーの?

mpl 使えって感じだが。
0704デフォルトの名無しさんNGNG
XMLでシリアライズしてくれるライブラリってある?
0705デフォルトの名無しさんNGNG
http://pc2.2ch.net/test/read.cgi/tech/1017641205/l50
こっちのスレじゃなくて?
0706デフォルトの名無しさんNGNG
>>700
おー。1つはあったんですね。
それ以外にはもうないんでしょうか?
0707664NGNG
>>703
まあそういうこと
要素数が増減する時に便利かな、と思う。
0708デフォルトの名無しさんNGNG
?んなのLokiに入ってるだろ?
前Lokiのソース見た時あったぞ
0709デフォルトの名無しさんNGNG
質問です。g++ (GCC) 3.2 20020927 (prerelease) で

template <typename T>
class CTypeAttribute
{
 private: template <typename U> class CNonConst { public: typedef U ResultType; };
 private: template <typename U> class CNonConst<const U> { public: typedef U ResultType; };
 public: typedef CNonConst<T>::ResultType NonConstType;
};

としたら、public: typedef CNonConst<T>::ResultType NonConstType; の行で
ResultType は implicitly a typename だという警告が出てしまいます。
暗示的な型ってどういう意味でしょう?警告の抑制以外で、この警告を出さないようにするには?
よろしくお願いします
0710>>2ちゃんねらーの皆さんNGNG
( ´Д`)/< 先生!!こんなのを見つけました。
http://www.hokekyoji.com/
http://www.yakuyoke.or.jp/
http://members.tripod.co.jp/hossyoji/index/
http://www.maap.com/tanjoh-ji/
http://www.honmonji.or.jp/
http://www.maap.com/tanjoh-ji/
http://www.kuonji.jp/
http://www.butsuzou.com/jiten/sanmen.html
http://www.butsuzou.com/list1/sanmen2.html
http://www.butsuzou.com/list1/sanmen3.html
http://www.butsuzou.com/keitai/sanmen-kz.html
0711709NGNG
このスレの前の方みたら似た例が出てました。スミマセン。

public: typedef typename CNonConst<T>::ResultType NonConstType;

ですね。
07127NGNG
▼ ▼ ▼ ▼ ▼ ▼ ▼ ▼ ▼ ▼ ▼ ▼ ▼ ▼ ▼ ▼
 ☆★ 無修正DVD★☆なら 新宿歌舞伎町直送 ☆★

人気爆発新作ベスト9入荷
  堤さやか引退特集 憂木瞳 プロジェクトX No8 ベイビーフェイスをやっちまえ
 白石ひより・愛葉るび SNAPSHOT 地下映像陵辱援交 すぎはら美里痴女教師
 店頭販売の売れ筋のみ厳選してみました 安心の後払い
     http://book-i.net/moromoro/
   白石ひとみ 小森詩 山田まり 長瀬愛
@@ 及川奈央 レジェンド @@ 堤さやか 東京バーチャル 依然大好評
    
  サンプル画像充実  見る価値あり  最高画質
▼ ▼ ▼ ▼ ▼ ▼ ▼ ▼ ▼ ▼ ▼ ▼ 
0713デフォルトの名無しさんNGNG
□□□□■□□□□□■□□□□□□□□□□□□□□□□□□□□□
□□□■■□□□□□■□□□□□□□■■■■■■■■■■■■□□
□□■■□□□□□■■■■■■□□□□□□□□□□□□□■■□□
□■■□□■□□□■□□□□■□□□□□□□□□□□□■■□□□
□□■□■■□□■■■□□■■□□□□□□□□□□□■■□□□□
□□□■■□□■■□■■■■□□□□□□□□□□□■■□□□□□
□□■■□□□□□□□■■□□□□□□□□□□□■■□□□□□□
□□■□□□■□□□■■■■□□□□□□□□□□■□□□□□□□
□■■■■■■□□■■□□■■□□□□□□□□□■□□□□□□□
□□□□■□□□■■□□□□■■□□□□□□□□■□□□□□□□
□□■□■□■□□□□■■□□□□□□□□□□□■□□□□□□□
□□■□■□■□□□□□■■□□□□□□□□□□■□□□□□□□
□■■□■□■□□□□□□□□□□□□□□□□□■□□□□□□□
□■□□■□□□□■■■□□□□□□□□□□□□■□□□□□□□
□□□□■□□□□□□■■■□□□□□□□□□□■□□□□□□□
□□□□■□□□□□□□□■■□□□□□□■■■■□□□□□□□
0714 ◆bYHudLsQLw NGNG
Effective STLを読んでいるのですが、
関数オブジェクト・ファンクタ・ファンクタクラスが良く分かりません。
豊富に例が載っているサイト・書籍を紹介していただけませんか?
0715デフォルトの名無しさんNGNG
>>714
C++Primerの改訂3版の617ページ当たりからならどうか。
あるいは
http://www.kab-studio.biz/Programing/Codian/STL/02.html
当たりを見るとか。
0716デフォルトの名無しさんNGNG
関数オブジェクトとファンクタの違いがわからん
C++第3版では関数オブジェクト、
Effective〜ではファンクタと呼んでるが
同じものかな?
0717デフォルトの名無しさんNGNG
>>716
同じものじゃん。
0718デフォルトの名無しさんNGNG
>>716
C++第3版のP593に、

関数呼び出し演算子を持つクラスのオブジェクトは、
関数的オブジェクト: function-like object, functor あるいは単純に
関数オブジェクト: function object と呼ばれる。

って書いてある。つまりまったく同じ物を指してる。
0719デフォルトの名無しさんNGNG
おお分かった。つまり
関数オブジェクトはその名の通り関数の機能を持つオブジェクトで
内部状態を持ち得ない。ファンクターは関数的なオブジェクト、
すなわち形式的に関数オブジェクトと同じ形をしているもので
内部状態を持ち得る、或いは持っている物を指す。といった具合か。

ん?つまり違う物を指すんじゃないか
>つまりまったく同じ物を指してる。
この結論はどこから?
0720デフォルトの名無しさんNGNG
>>719
内部状態云々はどこから・・・
0721デフォルトの名無しさんNGNG
スゲー馬鹿だな
0722デフォルトの名無しさんNGNG
>>719
(゚Д゚)ハァ?(゚Д゚)ハァ?(゚Д゚)ハァ?(゚Д゚)ハァ?(゚Д゚)ハァ?(゚Д゚)ハァ?
0723719NGNG
なんだ文句あるのか。受けて立つぞ
0724デフォルトの名無しさんNGNG
話が低次元過ぎてあなたと喧嘩なんかするつもりになれません。
基礎からC++をやり直される事をおすすめします。
0725719NGNG
しっぽ巻いて逃げたか
0726デフォルトの名無しさんNGNG
負け惜しみなんか言ってる暇があったらもっとC++を勉強しろ。
0727719NGNG
俺は達人だからな勉強する必要などない。お前らはもっと勉強しろ。
関数と内部状態の関係が分からなかった奴は特にな
0728デフォルトの名無しさんNGNG
何を持って達人と自称してるか知らないが、性格が悪そうだから
どっちみち先が見えてるな。
0729719NGNG
>何を持って
漢字が違うよバーカ
0730デフォルトの名無しさんNGNG
重箱の隅をつつく所なんかいかにも嫌らしいねえ。
0731デフォルトの名無しさんNGNG
そのくせ日本語が不自由
0732デフォルトの名無しさんNGNG
ま、こんな奴には絶対友達いないな。
0733デフォルトの名無しさんNGNG
さらしあげ
0734デフォルトの名無しさんNGNG
釣られるなよ...。
0735デフォルトの名無しさんNGNG
>>734
単純だなお前
0736デフォルトの名無しさんNGNG
取り込み中、アホな質問で申し訳ないのですが…

メンバとしてもっているstringやlistは
そのオブジェクトをdeleteするときに、list::clear()や
string::remove()しなければいけないのでしょうか?
0737デフォルトの名無しさんNGNG
>>736
list や string のデストラクタでちゃんとやってくれる。
0738736NGNG
>>737
レスありがとうございます!
が、すいません、ということはやっぱり
明示的にlistなどのデストラクタを呼ばなきゃなのでしょうか?

勝手にやってくれるのかな…でもスコープ
外れるわけでも、delete使うわけでもないし…うーん
0739デフォルトの名無しさんNGNG
>>738
Java厨?それともC#厨?

C++ だと、new で動的に確保したのは delete しないと駄目だけど、
静的確保した変数はデストラクタ自動的に呼ばれるよ。
0740714 ◆bYHudLsQLw NGNG
レスが遅れてすいません。
お答えいただいた方どうもありがとうございました。
0741デフォルトの名無しさんNGNG
>>739
なるほど、どうもです
■ このスレッドは過去ログ倉庫に格納されています