トップページ⇒tech
1001コメント388KB

【C++】template 統合スレ -- STL/Boost/Loki, etc.

■ このスレッドは過去ログ倉庫に格納されています
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

関連スレ、その他リンクは >>2-5 あたりに。
0375デフォルトの名無しさんNGNG
>>374
簡単にまとめると次のようになりますかね。

叙述関数:
  bool値を返す関数または関数オブジェクト。但し、呼び出し毎に内部状態
  が変化する関数または関数オブジェクトは、標準アルゴリズムに適用する
  と予想に反した動きをする可能性があるので、できるだけ使用しない方が良い。
0376デフォルトの名無しさんNGNG
>>375
まとめるのは勝手だが、
「可能性があるので」が理由じゃぁまとまってるとは言い難い。
0377デフォルトの名無しさんNGNG
>>376
やっぱり「可能性」の具体例をあげないとダメか・・・・
本を読んでくれ、なら簡単なんだが、自分でまとめるとなると、何か例を
考えないといけないか。
0378デフォルトの名無しさんNGNG
関数を提供する側から言えば、
副作用がない、と仮定してアルゴリズムが書かれていると、
述語(ここで言えば叙述関数)を呼び出す回数が予想できないわけだ。

副作用がないなら同じ引数で何度呼んでも値は同じはずだから、アルゴリズムは返り値をメモり、以降その値を使いまわすかもしれない。
(しかし副作用がある関数は呼ばれるごとに値が変わることができるから、メモった値と呼んで帰った値は一致しない可能性がある。)
このような性質はアルゴリズム内に隠蔽されていて関数提供側ではまったく予想できない。

一方、逆に標準アルゴリズムを提供する側から言えば、
述語は条件判定に使う関数だから、
例えば副作用がコンテナ内の要素に影響を及ぼす類のものだとすると結果は破壊的になりうるし、そうでなくても同じ対象を比較する際に呼び出すごとに違った値を返すとすると
それらを仮定してアルゴリズムを書くのは大変困難だ。

ひどい例を考えてみる。あるコンテナをソートするとする。
そのときにソートの比較に使う述語(if文の中で比較・判別に使われる)が
大小判定ついでにコンテナの値を書き換えるとすると、
どんなアルゴリズムでも大前提(ソート中に値が変化しない)が崩れるから
ソートはまずまともに機能しないだろう。
(終わらなくなったり、正しくない結果を返したり・・・。)

述語というのは論理学用語だが、
基本的にif文(あるいはfor文など)の条件式内で条件判定に使われる
特殊な種類の関数をさす用語。
普通、if文の中で代入や入出力などするコードはあまりお行儀が良いとは言えない
分かりにくい保守・変更しにくいコードだという事は納得してもらえると思う。それと同じ。
(エラー処理のように条件が成立したら処理を中止するような場合はともかく。)

一方、述語(叙述関数)は関数オブジェクトの中でも特殊なものなので、
一般の関数オブジェクトの在り様まで規制するものではないから、一般の関数オブジェクトは副作用があっても良い。っつーか、むしろないと困るものもあるくらいだろう。
0379デフォルトの名無しさんNGNG
map のコンストラクタで、比較オブジェクトを引数にとるものがあるが、
それの存在意義がわからない。

プログラミング言語C++ 第3版 17.4.1.5
void f(map<string,int>& m)
{
  map<string,int> m2; // デフォルトで < を使う
  map<string,int> m3(m.key_comp()); // mの比較基準を使う
}

とあるが、m.key_comp() は less<string> だから、
デフォルトの < を使うのと同じこと。
比較オブジェクトをコンストラタに渡すのが有意義な場合ってある?
0380デフォルトの名無しさんNGNG
>>379
キーが整数として、比較基準を、ある基準値との差の比較とすると、
比較オブジェクトの中に基準値を入れて使うことが想定できる。

struct compare_distance
{
  const int origin;
  compare_distance(int org):origin(org){}
  bool operator() (int rhs, int lhs) const
  {
    return std::abs(rhs - origin) < std::abs(lhs - origin);
  }
};
0381デフォルトの名無しさんNGNG
>>380 なるほどね。そういう例はわかります。その比較オブジェクトを渡す
mapの型は map<int, T, compare_distance> ですよね。
map<int, T> つまり map<int, T, less<int> > に、渡せるわけではないと。
0382デフォルトの名無しさんNGNG
0383デフォルトの名無しさんNGNG
これこそ型志向言語の神髄中の神髄、C++が最晩年に到達した
何にも真似のできない世界です。このライブラリに込められた
テンプレートの技法は、後世のどの言語もついに超えることが
ありませんでした。ですから現在でもこのライブラリはテンプ
レートの最高の技術を示した作品であり続けています。
C++の晩年には、テンプレートを駆使した手法は時代遅れとなっ
ており、手厳しい非難の対象にもなっていました。しかしC++は
テンプレートを捨てることなく、むしろテンプレートの限界を
極めるような作品を数多く生むようになります。その最高の成
果が、この「Loki」で、たった1つの主題の技法の可能性を徹
底的に汲み尽くした(残念ながらC++の死によって未完となって
いますが)作品となっています。加えて、ソースにコンパイラ
の指定がなく、そのためにVC++版、g++版、Comeau版など、いろ
いろでコンパイラに実装が試されています
0384デフォルトの名無しさんNGNG
>383 バッハの『フーガの技法』の解説のパクリかい?
0385デフォルトの名無しさんNGNG
>384 よく知ってるね
おれの中では両者の間に連想がある。なんというか厳格さと
柔軟さの混在というか...
でももしC++が廃れるようなことがあれば、テンプレートを
魔術的に駆使したものはフーガの技法みたいな扱いを受けそう。
0386デフォルトの名無しさんNGNG
過去の難解言語で為された魔術が
今どういう扱いを受けているか考えてみるといい
0387デフォルトの名無しさんNGNG
最近知ったのですが、boost面白そうですねぇ。
俺の場合、STLとかからちゃんと勉強しないといけないけど(笑)

ところで、boostのfunctionalとかfunctionって、メンバ関数に対しても使えるの??
0388デフォルトの名無しさんNGNG
STLはスレッドセーフですか?そうでないとしたらスレッドセーフなコンテナはありますか?
0389デフォルトの名無しさんNGNG
↑よく知らないけど純粋にテンプレートだけじゃないんですか???
0390デフォルトの名無しさんNGNG
>>388
「このコンテナはスレッドセーフである」と規格に書かれてたりは、しないと思う(たぶん)。実装に依存すると考えるべきではないかなぁ?
0391デフォルトの名無しさんNGNG
Effective STL の Item 12 が "Have realistic expectations about the thread
safety of STL containers." となっているのでこれを読んでみては?
0392デフォルトの名無しさんNGNG
>>387
メンバ関数は第一引数にインスタンスのポインタを
渡してやればいいから、こんな感じ。
#include <iostream>
#include "boost/function.hpp"
#include "boost/bind.hpp"
struct Test {
int t_;
Test(int t) : t_(t) {}
int Add(char t) {return t_ + t;}
};
int main() {
Test test(5);
boost::function1<int, char> func;
func = boost::bind(&Test::Add, &test, _1);
boost::function2<int, Test *, char> func2;
func2 = &Test::Add;
std::cout << (func)(6) << std::endl;
std::cout << (func2)(&test, 6) << std::endl;
}
0393デフォルトの名無しさんNGNG
Boost!

ワル カコイイ(・∀・)!
0394デフォルトの名無しさんNGNG
boost::formatの戻り値をchar*として受け取ってメッセージボックスに
表示したいのですがいい方法は無いですか?
()でくくってc_str()とかやってみましたが、
error C2039: 'c_str' : 'boost::basic_format<Ch,Tr>' のメンバではありません。
[
Ch=char,
Tr=std::char_traits<char>
]
と怒られてしまいます。

MessageBox(NULL, (boost::format("Error !!!\n"
"\tlocation %d:%d\n"
"\tcode %02x:%02x:%02x:%02x\n"
"\tmessage %s\n") %
parse_error->get_line() %
parse_error->get_row() %
parse_error->get_genre() %
parse_error->get_category() %
parse_error->get_sequence() %
parse_error->get_sequence_case() %
parse_error->get_message()).c_str(),
"error", 0);
0395デフォルトの名無しさんNGNG
(...).str().c_str() しかないんでない?
0396393NGNG
SGIには感動した!
精子出た!
ropeキター
0397デフォルトの名無しさんNGNG
Modern C++ Designの19ページの一番下に紹介されてる
「極めて洒落たテクニック」のソースきぼーん
"Sutter"とか"copy constructor"とかで検索したけど
みつからんかった...
0398デフォルトの名無しさんNGNG
>>397
Exceptional C++ の項目13。
0399デフォルトの名無しさんNGNG
>>397
Loki::SmartPtr::operator=()を見たらいいやんって書いてあるやん。
0400デフォルトの名無しさんNGNG
boost使うとコンパイル劇遅で、ノートな私はVCが死んだかと
思ってしまいます。
コンパイルを早くする方法ってないのかな?
templateだからやっぱ無理?
0401デフォルトの名無しさんNGNG
>>400
プリコンパイル
0402デフォルトの名無しさんNGNG
>>401
「プリコンパイルヘッダの使用」とかいうやつ?
0403デフォルトの名無しさんNGNG
gcc-3.6ぐらいにはpchブランチの成果が取り込まれるといいな
0404デフォルトの名無しさんNGNG
>>402
ttp://www1.kcn.ne.jp/~robe/cpphtml/html03/cpp03003.html

この辺が参考になると思う。
0405デフォルトの名無しさんNGNG
GenScaterHierarchyについてわからない点。

template <class T1, class T2, template <class> class Unit>
class GenScaterHierarchy<TypeList<T1, T2>, Unit>
: public GenScatterHierarchy<T1, Unit>
: public GenScatterHierarchy<T2, Unit>
{
・・・・・
};

最初の(左側の)基底クラスはGenScatterHierarchy<T1, Unit>としなくても、

template <class T1, class T2, template <class> class Unit>
class GenScaterHierarchy<TypeList<T1, T2>, Unit>
: public Unit<T1>
: public GenScatterHierarchy<T2, Unit>
{
・・・・・
};

のようにUnit<T1>でいいのでは?
0406デフォルトの名無しさんNGNG
保守
0407デフォルトの名無しさんNGNG
>>405
それだと継承ツリーの途中で Unit<T1> を複数回継承することになって、
コンパイルエラー食らわん?
0408デフォルトの名無しさんNGNG
>>407
そ、そうかな... ;
0409デフォルトの名無しさんNGNG
何かネタない?
0410デフォルトの名無しさんNGNG
http://groups.yahoo.com/group/boost/files/utf/
暇ならこれチェックして
0411デフォルトの名無しさんNGNG
std::map<int, std::string>に値を挿入するには、

insert(std::map<int, std::string>::value_type(1, "abc"))
と
insert(std::pair<int, std::string>(1, "abc"))
のどちらがより適切でしょうか?
0412デフォルトの名無しさんNGNG
>>411
同じ。mapのvalue_typeは、pairをtypedefしたもの。
0413デフォルトの名無しさんNGNG
>>412
それはわかってるんじゃないか?
0414デフォルトの名無しさんNGNG
>>413
Borland-C++5.6.2でコンパイルしてみた所、同じようなコードを吐いているようです。
コンパイラが違うとバイナリも違ってくるかもしれませんが。
ただ、タイプ量が少ないstd::pairの方が多用される傾向にあると思います。

もっともmap<int, std::string>をtypedefして使えばどちらもあまり変わらないですね。
0415デフォルトの名無しさんNGNG
>>411
insert(std::make_pair(1, "abc"))
0416デフォルトの名無しさんNGNG
std::wifstream win("in.txt");
std::wofstream wout("out.txt");
wout << win.rdbuf();
wout.close();
win.close();

マルチバイトを使おうとおもってテストでこれやってみたのですが、
0x81で始まる、日本語がうまく表示されないんですけど
ベターな解決策おしえてください。

win2000 vc6 stlport使用 です。
0417デフォルトの名無しさんNGNG
>>415
411です。
遅くなりましたがありがとうございます。make_pairという述語があるのですね。
0418デフォルトの名無しさんNGNG
>>416
stlに関係ないじゃん。(V)C++スレにゆくべきかと。
ちなみにマルチバイトとwchar_tは別物。
0419デフォルトの名無しさんNGNG
1)string str="hoge";vector<string> vec;
2)vec.push_back(str);
3)str="fuga";

ここで2)でvectorに追加されているのはstrそのものでしょうか
あるいはそのコピーでしょうか?
また3)では2)でvectorに登録された内容は上書きされてしまうのでしょうか
0420デフォルトの名無しさんNGNG
>>419
当然コピーです。3)で代入しても、vectorの中身には何の影響も及ぼしません。
0421419NGNG
>420
ありがとうございます。いろいろ試してみます
0422416NGNG
>>418
そっかー、そりはショック。
首つって、VCスレいってきます。
ありがとございました。
0423IP記録実験NGNG
IP記録実験
http://qb.2ch.net/test/read.cgi/accuse/1042013605/

1 名前:ひろゆき ◆3SHRUNYAXA @どうやら管理人 ★ 投稿日:03/01/08 17:13 ID:???
そんなわけで、qbサーバでIPの記録実験をはじめましたー。

27 名前:心得をよく読みましょう 投稿日:03/01/08 17:20 ID:yL/kYdMc
SETTING.TXT管轄でないということは全鯖導入を視野に、か?

38 名前:ひろゆき ◆3SHRUNYAXA 投稿日:03/01/08 17:22 ID:rLfxQ17l
>>27
鋭いです。

73 名前:ひろゆき ◆3SHRUNYAXA 投稿日:03/01/08 17:27 ID:rLfxQ17l
>ところで、IPが抜かれて何か今までと変わることってあるのでしょうか?
・今までより、サーバが重くなる。
・裁判所や警察からの照会があった場合にはIPを提出することがある。
0424デフォルトの名無しさんNGNG
保守
0425デフォルトの名無しさんNGNG
>>1=無職
wwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwww
0426デフォルトの名無しさんNGNG
>>296
確かに民放じゃやらないですな。
BSではたまにやるけど。
0427デフォルトの名無しさんNGNG
>>405
またポリタンコですか
あいつどうしようもないですね。
0428デフォルトの名無しさんNGNG
あ、どーしてもいいたかったんだけど、

  絶 対 に 有 料 化 し な い で ね 。
0429IP記録実験NGNG
IP記録実験
http://qb.2ch.net/test/read.cgi/accuse/1042013605/

1 名前:ひろゆき ◆3SHRUNYAXA @どうやら管理人 ★ 投稿日:03/01/08 17:13 ID:???
そんなわけで、qbサーバでIPの記録実験をはじめましたー。

27 名前:心得をよく読みましょう 投稿日:03/01/08 17:20 ID:yL/kYdMc
SETTING.TXT管轄でないということは全鯖導入を視野に、か?

38 名前:ひろゆき ◆3SHRUNYAXA 投稿日:03/01/08 17:22 ID:rLfxQ17l
>>27
鋭いです。

73 名前:ひろゆき ◆3SHRUNYAXA 投稿日:03/01/08 17:27 ID:rLfxQ17l
>ところで、IPが抜かれて何か今までと変わることってあるのでしょうか?
・今までより、サーバが重くなる。
・裁判所や警察からの照会があった場合にはIPを提出することがある。
0430デフォルトの名無しさんNGNG
>>638
そのキャップだけはいろんな意味で許せん。僕によこせ
0431デフォルトの名無しさんNGNG
>>56
Jane使えば一目瞭然
0432デフォルトの名無しさんNGNG
匿名匿名掲示板自体にクレームがついたんだから2chじゃ出来ないでしょ。。。




連続書き込み規制変えたな

きつい。。。
0433デフォルトの名無しさんNGNG
暴力団に殺人依頼した。管理人を入廷時に射殺する
0434デフォルトの名無しさんNGNG
age
0435デフォルトの名無しさんNGNG
======2==C==H======================================================

         2ちゃんねるのお勧めな話題と
     ネットでの面白い出来事を配送したいと思ってます。。。

===============================読者数: 138720人 発行日:2003/1/9

年末年始ボケがそろそろ収まり始めた今日このごろのひろゆきです。

そんなわけで、年末に予告したIP記録ですが実験を開始しています。

「2ちゃんねる20030107」
こんな感じで各掲示板の最下部に日付が入ってるんですが、
20030107以降になってるところはログ記録実験中ですー。

んじゃ!

────────────────────────Age2ch─
■この書き込みは、Age2chを使って配信されています。
────────────────────────────
Keep your thread alive !
http://pc3.2ch.net/test/read.cgi/software/1041952901/l50
────────────────────────────
0436デフォルトの名無しさんNGNG
>>773-774
迂闊にもワラタ
0437デフォルトの名無しさんNGNG
>>589
ちょっと違うが今までがそんな感じだったんよ。
「(善意であろうが悪意であろうが)確認できない以上利用者が真偽を判断すべきであり、
要請があっただけで全て削除するべきではない。」
というのがひろゆきの主張。
嘘を嘘と〜の名言もこれに繋がる。

これに対して動物病院訴訟における地裁・高裁の判断は、
「外部から確認できない以上当事者が中傷だと主張し削除の要請をした場合は、管理人は削除すべき。」

今後はこれに倣い当事者側が中傷だと主張さえすればIP公開する必要が出るかもしれない。
(もちろん警察なり裁判所の正式な提出要請があってからになるだろうけど)
なお、書き込んだ者はその書き込みに対し責任を負うべし、ってのは賛成だが。
いずれにしろ善意の告発は難しくなると思われ。
0438デフォルトの名無しさんNGNG
>>104
と思うんだけど、某○○さんは違うという。。。
0439デフォルトの名無しさんNGNG
>>104
と思うんだけど、某○○さんは違うという。。。
0440デフォルトの名無しさんNGNG
>内容証明が届いて、すぐに削除したら、賠償はしなくていい気が。

それはそのとおりでしょうねぇ。

・内容証明が届いて、名誉毀損の書き込みがあることを知りえた
・その日から起算してン日間書き込みを消さなかった
・その間のン日間は名誉が毀損されたことによって被害が発生した
ということを「裁判所が認めれば」負けちゃうんじゃないかなぁ、、

>んだったら、IP取ってない板で、自分で自分を中傷して、
>すぐに裁判すれば賠償金が取れるってことになっちゃう、、

そのとおりじゃないすかねぇ、、
掲示板の持ち主がけんすうさんだという前提でいうと、
その中傷発言が自作自演かどうか、けんすうさんにも判断できないん
だったら、けんすうさんが責任を負わないといけないという判決ですよね。
しかし個人の中傷発言だったら最初から消せばいいのでは。。
0441デフォルトの名無しさんNGNG
ガイドライン読めないのに獣医になれる世の中・・・
0442デフォルトの名無しさんNGNG
2ちゃんねるに近いあるインターネット関連会社の社長は、
2ちゃんねるの幹部から得た話として証言する。
「2ちゃんねるは、運営者や幹部などが
それぞれ別々に会社を作りカネの流れを見え難くしているが、
実際の資金源は複数の大手通信会社系からの調査費名目のカネ。
月額で計約700万円と言い、年間にすれば1億円近く。
額はともあれ、これは通信会社系的には、
ぼう大なトラフィックを調査すると言う表向きの理由が一応は立つ。
自社系に都合の悪い書き込みがされた時に優先的に削除してもらうことも期待している」と前置きし
「通信会社系の削除の期待も含めて、2ちゃんねるは総会屋と同じになっている」と言うのだ。
0443デフォルトの名無しさんNGNG
IPでも記録されてみるか。
0444デフォルトの名無しさんNGNG
>>540
鑑定スレでお願いしようとして誤爆し・ま・す・た・!   
0445デフォルトの名無しさんNGNG
C++にevalが仕様として盛り込まれるのは何年ぐらいでしょうか?
0446デフォルトの名無しさんNGNG
ぼらんちあさんにお年玉です。
( ´∀`)ノ~●●●●
0447デフォルトの名無しさんNGNG
>>445
cbrtが標準math functionsに組み込まれてから10年は必要です。
0448デフォルトの名無しさんNGNG
名前(アルファベット)五人分入力
         ↓
     辞書式に並び替える
         ↓
  "meido.doc"ファイルに書き込む
というプログラムを教えてください。
まじ困ってます。
0449デフォルトの名無しさんNGNG
>>441
2ちゃんねらでもPGなれるんだもん・・・。
糞だね。
0450デフォルトの名無しさんNGNG


今後、予想されるレス

「IPって何ですか?」

「串って何ですか?」 「串揚げ」

0451デフォルトの名無しさんNGNG
第3者が見て情報価値の低い書きこみ>「質の低い」
0452デフォルトの名無しさんNGNG
匿名性に絡む問題なので反対 28% 1193 票
サイトのためになるから賛成 54% 2315 票
利用しないから関係ない 8% 378 票
2ちゃんねるってなに? 4% 172 票
アクセスログってなに? 4% 173 票



0453デフォルトの名無しさんNGNG
そーいや boost::shared_ptr が policy 使うよーになるとか
ならんとかって話はどーなった?
0454デフォルトの名無しさんNGNG
君がそれやればなんとかなるかも(^_^;)
0455デフォルトの名無しさんNGNG
ますます、ファンタスティックでスリリングでドラマティックなスレッドですわね、
0456デフォルトの名無しさんNGNG
713 名前:ひろゆき ◆3SHRUNYAXA 投稿日:03/01/09 15:33 ID:Jx8vAdAb
というわけで、掲示板の最下部のバージョン表示が20030107a以降のやつは、
ログとり実験やってますです。
今のところ、qb,live2,tmpですね

722 名前:心得をよく読みましょう 投稿日:03/01/09 15:43 ID:b1s0ydcx
qb : 2ch批判要望 削除議論 削除要請 削除整理
live2 : ニュース速報
tmp : ニュース極東 ちくり裏事情 政治思想 Download
    厨房! 人権問題 バカニュース 薬・違法
    ゴーマニズム ロビー 最悪 少年犯罪
    違反の潰し方 ペット苦手 なんでもあり 学歴

IP記録実験PART2
http://qb.2ch.net/test/read.cgi/accuse/1042020193/
0457デフォルトの名無しさんNGNG
======2==C==H======================================================

         2ちゃんねるのお勧めな話題と
     ネットでの面白い出来事を配送したいと思ってます。。。

===============================読者数: 139038人 発行日:2003/1/10

なにやら、連日メルマガだしてるひろゆきです。

そんなわけで、ログ記録実験ですが、いちいちサーバ指定するのが面倒なので、
全部のサーバに入れてみました。

重くなって落ちたりしてもご愛嬌ってことで。。。

んじゃ!

────────────────────────Age2ch─
■この書き込みは、Age2chを使って配信されています。
────────────────────────────
Keep your thread alive !
http://pc3.2ch.net/test/read.cgi/software/1041952901/l50
────────────────────────────
0458デフォルトの名無しさんNGNG
つうか、2chとアップローダーは関係無いだろに。
0459デフォルトの名無しさんNGNG
雑談系やニュース系の板はIDもIPも関係ないわな
0460デフォルトの名無しさんNGNG
(^^)
0461デフォルトの名無しさんNGNG
ひろゆきはあほ
氏ね
0462デフォルトの名無しさんNGNG
【予告】小学生の登校を狙って・・・
http://live2.2ch.net/test/read.cgi/news/1042035002/

674 名前:ひろゆき ◆3SHRUNYAXA 投稿日:03/01/08 23:36 ID:1BXnvYvY
通報する人は、IPはあるので管理者に連絡してくれれば、
「捜査関係事項照会書で照会しますよー」って言ってたて伝えてくださいー。

902 名前:ひろゆき ◆3SHRUNYAXA 投稿日:03/01/08 23:41 ID:1BXnvYvY
>警視庁の情報提供っていうフォームで通報していいですか?

フォームでもよいかと。
通報者の電話番号とかもきちんとかいといたほうが
取り上げられる可能性高いです。
ホントは110のほうがいいんですが、、
0463デフォルトの名無しさんNGNG
IP記録スレは有るよ

IP記録実験2
http://news2.2ch.net/test/read.cgi/newsplus/1042030554/
0464ENGNG

ある object が 型T のインスタンスだったときに true を返す
Javascript の instanceof みたいなモノを作ってみたんだけど、
イマイチ使用する場面を思い浮かばない。

なんかイイ使い方があったら教えて下さい
0465デフォルトの名無しさんNGNG
>>464
蛇足ですがinstanceof演算子はJScriptですよん。
0466デフォルトの名無しさんNGNG
>>464
それって
 #define instanceof(T, obj) (typeid(obj) == typeid(T))
とか
 template<class T> struct instanceof {
  static bool f( T ) { return true; }
  template<class U> static bool f( U ) { return false; }
 };
とかで十分な気がするんだけど、どんなもんを作ったん?
いまいちよくわからん。

>>465
JavaScript 1.3 以上にはあるよ。ECMAの標準にも入ってるし。
0467464NGNG
>>466
あ、そういえば、それでイイじゃん。つーか、そっちの方がいいかも。
俺が作ったのは、こんなモノ

class __object
{
 template< typename Type > struct holder
 {
  static holder* unique()
  {
   static holder obj;
   return obj;
  }
 };
public:
 template< typename InstanceType > __object( InstanceType& ) throw()
  : p_( holder<InstanceType>::unique() )
 {}
 template< typename CompareType > bool instanceof() const throw()
 { return p_ == holder<CompareType>::unique(); }
private:
 void* p_;
};

で、こう使う。
if( __object( obj ).instanceof<T>() ){ ... }
0468464NGNG
>>467 にミス。

class __object
{
 template< typename Type > struct holder
 {
  static holder* unique()
  {
   static holder obj;
   // ×return obj;
   return &obj;
  }
  ...

boost::any みたいなものに組み込めば面白いかなとも思ったけど、
type() があるからいらんわなー。
なんか1日無駄に過ごした気分。フゥ
0469デフォルトの名無しさんNGNG
何を今更・・・
0470デフォルトの名無しさんNGNG
ヤツがアニヲタという事がわかるな。
0471デフォルトの名無しさんNGNG
どうしても解決できないので教えて下さい。

struct person{
int id;
std::string name;
};

struct personless
{
bool operator()( const person & l, const person & r ) const {
return (l.id < r.id);
}
bool operator()( const person & l, const int & r_id ) const {
return (l.id < r_id);
}
bool operator()( const int & l_id, const person & r ) const {
return (l_id < r.id);
}
};
typedef std::set<person, personless> PersonSet;

このとき
PersonSet ps;
PersonSet::iterator it = ps.find( 5 );

というように、findすると下のようなエラーがでます。
error C2663: 'find' : 2 オーバーロードに 'this' ポインタのための必要な定義がされていません。

これはどうしたら解決できるんでしょうか?
0472デフォルトの名無しさんNGNG
>>471
こんな風にしてもダメ?

struct person {
int id;
std::string name;
person(int i, char* str) : id(i), name(str) {}
};

// 途中略

int main()
{
PersonSet ps;
ps.insert(person(1, "def"));
ps.insert(person(5, "abc"));
PersonSet::iterator it = ps.find(person(5, "abc"));
std::cout << it->id << ' ' << it->name << std::endl;
}
0473471NGNG
>472
ええと、IDで検索するのが目的なのでこれではちょっと。
int一つ分冗長になるけれど
std::map<int ,person>
とするしかないのかな。
0474デフォルトの名無しさんNGNG
>>473
VC++(だよね?)付属のSTLをやめて STLport を入れれば解決するらしい。
http://www.google.co.jp/search?q=cache:ucnz7QO5270C:www.dodgson.org/lab/hat/map_like_set.html&hl=ja&ie=UTF-8

でなければ、setの中身オブジェクトの作成コストが低ければ
PersonSet ps;
...
person key = { 5, string("") };
PersonSet::iterator it = ps.find( key );
みたいにダミーのオブジェクトで検索…くらいしかないのではないかなぁ。
■ このスレッドは過去ログ倉庫に格納されています