1 :
デフォルトの名無しさん :
2007/02/02(金) 00:29:12
これはひどい。
3 :
デフォルトの名無しさん :2007/02/02(金) 00:37:40
4 :
デフォルトの名無しさん :2007/02/02(金) 00:38:27
6 :
デフォルトの名無しさん :2007/02/02(金) 00:39:20
7 :
デフォルトの名無しさん :2007/02/02(金) 00:39:52
一体何事かと思った
スレタイ壊れとる。
10 :
1 :2007/02/02(金) 00:40:28
すみませんでした・・・ 削除依頼してきます テンプレ張ってくれてる人ありがとうございます
11 :
1 :2007/02/02(金) 00:46:23
今削除依頼だしてきました。すみません。。
削除依頼出す前に本スレ立ててからにしろよ〜
<>使うの止めようぜ
このまま存続でよくね?
スレタイの誤字程度で削除なんて C++的とは言えんな ゴミを黄金水に変えてこそC++だろ
黄金水ってょぅι゙ょの聖水だよな
C1010: プリコンパイル済みヘッダーの検索中に予期しない HAGE を検出しました。 とかいうエラーが出るんだけどこれってどうすればいいの?
#include <stdaderance.h> 後死ね。 言葉が悪いな。それで教えているつもりか。 まぁ付け毛ぐらいにはなったな。 うむごくろう。 Boostつかうと一気に実行ファイルサイズが100倍に?! 環境によるだろ。 俺はVC++に /Yc オプションを指定して、極力 プリコンパイルヘッダを使用するようにして使っているが、例えばboost::lambdaを 使っても使わない時と比べ10秒ほどしか増えない。
注:私の有意義な発言に対し、自分の理解不足を棚に上げ煽り、1行レス で返す方が多いようですが、そのような方はスレの皆様を混乱させるだけでなく スレの雰囲気を崩しかねないのでお黙り下さい。 また質問者は回答者に知識を披露する場を与える貴重な存在なので、 質問者を見下した回答、あまりにも儀礼を欠いた回答も厳重に禁止いたします。 忙しい中、少ない時間の合間を縫って質問しに来てるわけですので、 その辺ご承知下さい。なお、当方が質問に対して有意義な答えであると 判断した方には評価いたしますので各自よく調べ、よく考え正確な回答をするように。
21 :
デフォルトの名無しさん :2007/02/02(金) 09:07:45
20 名前:あぼ〜ん[あぼ〜ん] 投稿日:あぼ〜ん 速攻であぼーんになってるw
注 : 私 の 有 意 義 な 発 言 に 対 し 、 自 分 の 理 解 不 足 を 棚 に 上 げ 煽 り 、 1 行 レ ス で 返 す 方 が 多 い よ う で す が 、 そ の よ う な 方 は ス レ の 皆 様 を 混 乱 さ せ る だ け で な く ス レ の 雰 囲 気 を 崩 し か ね な い の で お 黙 り 下 さ い 。 ま た 質 問 者 は 回 答 者 に 知 識 を 披 露 す る 場 を 与 え る 貴 重 な 存 在 な の で 、 質 問 者 を 見 下 し た 回 答 、 あ ま り に も 儀 礼 を 欠 い た 回 答 も 厳 重 に 禁 止 い た し ま す 。 忙 し い 中 、 少 な い 時 間 の 合 間 を 縫 っ て 質 問 し に 来 て る わ け で す の で 、 そ の 辺 ご 承 知 下 さ い 。 な お 、 当 方 が 質 問 に 対 し て 有 意 義 な 答 え で あ る と 判 断 し た 方 に は 評 価 い た し ま す の で 各 自 よ く 調 べ 、 よ く 考 え 正 確 な 回 答 を す る よ う に 。
23 名前:あぼ〜ん[あぼ〜ん] 投稿日:あぼ〜ん
注^:^私^の^有^意^義^な^発^言^に^対^し^、^自^分^の^理^解^不^足^を^棚^に^上^げ^煽^り^、^1^行^レ^ス で^返^す^方^が^多^い^よ^う^で^す^が^、^そ^の^よ^う^な^方^は^ス^レ^の^皆^様^を^混^乱^さ^せ^る^だ^け^で^な^く ス^レ^の^雰^囲^気^を^崩^し^か^ね^な^い^の^で^お^黙^り^下^さ^い^。 ま^た^質^問^者^は^回^答^者^に^知^識^を^披^露^す^る^場^を^与^え^る^貴^重^な^存^在^な^の^で^、 質^問^者^を^見^下^し^た^回^答^、^あ^ま^り^に^も^儀^礼^を^欠^い^た^回^答^も^厳^重^に^禁^止^い^た^し^ま^す^。 忙^し^い^中^、^少^な^い^時^間^の^合^間^を^縫^っ^て^質^問^し^に^来^て^る^わ^け^で^す^の^で^、 そ^の^辺^ご^承^知^下^さ^い^。^な^お^、^当^方^が^質^問^に^対^し^て^有^意^義^な^答^え^で^あ^る^と 判^断^し^た^方^に^は^評^価^い^た^し^ま^す^の^で^各^自^よ^く^調^べ^、^よ^く^考^え^正^確^な^回^答^を^す^る^よ^う^に^。
注_:_私_の_有_意_義_な_発_言_に_対_し_、_自_分_の_理_解_不_足_を_棚_に_上_げ_煽_り_、_1_行_レ_ス で_返_す_方_が_多_い_よ_う_で_す_が_、_そ_の_よ_う_な_方_は_ス_レ_の_皆_様_を_混_乱_さ_せ_る_だ_け_で_な_く ス_レ_の_雰_囲_気_を_崩_し_か_ね_な_い_の_で_お_黙_り_下_さ_い_。 ま_た_質_問_者_は_回_答_者_に_知_識_を_披_露_す_る_場_を_与_え_る_貴_重_な_存_在_な_の_で_、 質_問_者_を_見_下_し_た_回_答_、_あ_ま_り_に_も_儀_礼_を_欠_い_た_回_答_も_厳_重_に_禁_止_い_た_し_ま_す_。 忙_し_い_中_、_少_な_い_時_間_の_合_間_を_縫_っ_て_質_問_し_に_来_て_る_わ_け_で_す_の_で_、 そ_の_辺_ご_承_知_下_さ_い_。_な_お_、_当_方_が_質_問_に_対_し_て_有_意_義_な_答_え_で_あ_る_と 判_断_し_た_方_に_は_評_価_い_た_し_ま_す_の_で_各_自_よ_く_調_べ_、_よ_く_考_え_正_確_な_回_答_を_す_る_よ_う_に_。
注:::私:の:有:意:義:な:発:言:に:対:し:、:自:分:の:理:解:不:足:を:棚:に:上:げ:煽:り:、:1:行:レ:ス で:返:す:方:が:多:い:よ:う:で:す:が:、:そ:の:よ:う:な:方:は:ス:レ:の:皆:様:を:混:乱:さ:せ:る:だ:け:で:な:く ス:レ:の:雰:囲:気:を:崩:し:か:ね:な:い:の:で:お:黙:り:下:さ:い:。 ま:た:質:問:者:は:回:答:者:に:知:識:を:披:露:す:る:場:を:与:え:る:貴:重:な:存:在:な:の:で:、 質:問:者:を:見:下:し:た:回:答:、:あ:ま:り:に:も:儀:礼:を:欠:い:た:回:答:も:厳:重:に:禁:止:い:た:し:ま:す:。 忙:し:い:中:、:少:な:い:時:間:の:合:間:を:縫:っ:て:質:問:し:に:来:て:る:わ:け:で:す:の:で:、 そ:の:辺:ご:承:知:下:さ:い:。:な:お:、:当:方:が:質:問:に:対:し:て:有:意:義:な:答:え:で:あ:る:と 判:断:し:た:方:に:は:評:価:い:た:し:ま:す:の:で:各:自:よ:く:調:べ:、:よ:く:考:え:正:確:な:回:答:を:す:る:よ:う:に:。
25 名前:あぼ〜ん[あぼ〜ん] 投稿日:あぼ〜ん 26 名前:あぼ〜ん[あぼ〜ん] 投稿日:あぼ〜ん 27 名前:あぼ〜ん[あぼ〜ん] 投稿日:あぼ〜ん
正規表現すらしらないのか
性器表現?
「禁止表現」 別表3 <性表現> 1.性器及び局部(恥毛を含む)表現
namespace seiki_hyougen { namespace tag { struct tinko; struct manko; } }
>>32 typedefで別名たくさん付けそうだ
今ちょうど官能小説用語辞典かって来たところだ
review eequest Boost.Seiki_hyougen collection of seiki_hyougen tag; namespace seiki_hyougen { namespace tag { struct tinko; struct manko; typedef tinko penis; typedef manko awabi; .... } }
何それ面白いと思ってんの?
>>36 じゃあ代わりになにか面白いネタ振ってよ。
「暗いと不平を言うよりも、進んで明かりをつけましょう」
>>36 の強い反対によりrejectされました
Reviewer comment:
Definitely useless
無理にネタふらなくてもいいと思うんだ ネタスレじゃないんだし
typedef manko awabi; あわびかよww
ポリモルタソにおれのポリシープラグイン!!
template<class inserter> class Porimol : public inserter { public: bool sex(){ insert(); } } class MyPenis { protected: insert(); }
これはひどい
テンプレにあったこれって都市伝説ですか? Boostつかうと一気に実行ファイルサイズが100倍に?!
むしろコンパイル時間の方がうっとおしい
std::wcout << (wchar_t)i; if(std::wcout.fail()){std::wcout.clear(std::ios::goodbit);} こんなのを書いたんだが 画面に表示せずにどっかに出力を捨てて fail()をチェックする方法ってある?
>>50 表示したくないだけならBOM( ZERO WIDTH NON-BREAKING SPACE )でも突っ込めば?
さんくす、BOMってこんな使い道あったんだな ただ、今回はiが表示可能文字かどうかチェックするのが目的なんで もうちょっと調べてみるわ
…表示可能文字かどうかはそれでは判定できないよ。
>>52 >ただ、今回はiが表示可能文字かどうかチェックするのが目的なんで
そーゆーことなら iswgraph() っていう標準関数があるぞ。
iswprintとかiswgraphとか
ところで isgraph系の関数と isprint系の関数ってなにが違うんだ? 画面表示(isgraph)と印刷(isprint)の違い?
windowsなんで、こんな方法をみっけた
std::wofstream ofs(L"nul");
>>53 なんとなくは、わかってるつもり
Unicodeなら制御文字とかだよな
CJK統合漢字のうちCK部分はstd::locale("japanese")だと表示されないわ
>>54 お、調べてみる。さんくす
テストしてみた。 nul出力してfailbitがたたないもの 0-0x0080 0x3000を含む 以下の範囲を含む 0xe000-0xe757 0xf8f0-0xf8f3 iswgraphが真 0x0021-0x007e 0x3000を含まない 以下の範囲を含まない 0xe000-0xe757 0xf8f0-0xf8f3 iswprihtが真 0x0009 0x0020-0x007e 0x3000を含む 以下の範囲を含まない 0xe000-0xe757 0xf8f0-0xf8f3 3種類の、その他の結果は全て同じ なお 0x0009は水平タブ 0x3000は空白 0xe000〜0xf8ffは私用領域
>>56 空白類文字を含むか、含まないかの違いらしい
60 :
57 :2007/02/04(日) 00:21:44
やべ、めっちゃバグってた 57のことは忘れてください
/|:::::::::::::::::::::ヽ.:.:.:.:、:.:.:.:、:.:.:.、.:.、.:.:.:.:.:.::`゛> /{::|:\:::::::\.:.:.:\.:.:.ヽ::.::.ヽ:.:.ヽ::::::::::.:.`゛ー- ..,__ : 何 : /:|::',:ト、::::::ヽ、:.\:.:.:.\:.:.ヽ:.:.:\.:.:.:.:.:::.:.:.:.:::.::::_;:-'´ : が : //:/:::|::',|::'、:::::::::\:.:\.:.:.ヽ:.:.:\:.:..\::::::::::::\、::::\ : 何 : /!::|::l::::/|:::l:ヽ:\::ヽ:.:\:.:\.:::ヽ:.:.:ヽ:.:.:.:\::::::::::::\ ̄ : だ : |/l::|::|::|:ト、:::::::::、、:ヽ、:.:.:.:::::::::::::::ヽ::::.:ヽ:.:.:.:.\:.:.:.ヽ:::\. : か : |::|::/l::|::|r‐ヽ:::::ヽ(ヽー,―\::::::、::::::::::ヽ::.:.::::::.:::::::ヾ. ̄ : : }//l::|:::|{(:::)ヾ、:::ヽ \!(:::) ヽ,:::ヽ:::::::::::::::::::::::::::::::::::ヾ、 : わ :. |/l::|::|:::|ヽ==''" \:ヽ、ヽ=='" |:::::::::::::::::::::::::::::::::::ヽ、::::\ か / ',|::|:::| / `゛ |!::::::::::::::::::::::::::::ト、::ト、_` ゛` ら l::!::::ト、 '、 _ ||::::::::::::::::::::::::ト:ヽヾ| | ̄ ̄ ̄`ヽ、 な r'"´||',::::', |:::::/l:::::|\:::ト、ヾ | | / / \ い / ll ',::', 、 ーこニ=- /!::/ ヽ:::| ヾ、 ノ ノ / ,イ ヽ、 ,' | '、:, \ -- ,. '´ |;' l ヾ、. // / | l: l | |! ヽ; ヽ /.: i! / ゛// |l / | | |
>>49 同意。スクリプト言語の最大のメリットはコンパイルしなくて済む点だと思ってる。
書いてすぐに実行できるのが最高。
そんなオレからすればコンパイルに何分もかかるようなプログラムは現実的じゃない。
あんなのに耐えられるのは、makeと打ってコーヒー飲みにいってたようなおっさんだけ。
C++で作ったのをPythonで繋げる
コーヒーは嫌いかい?
>>62 「コンパイルが遅くなったら人間側がマルチタスクになればおk」
って昔の教科書に書いてあったのを思い出した
俺もコンパイルしてる間は、メール書いたり別のことしてるけどね。 だからといって、コンパイルに長時間かかっても良いってことじゃないけど。
俺の先輩が、ビルドに1時間かかるんだよとか嬉しそうに言うんだけど、 なんなんだろうね
初心者から初級者へステップアップした証だなそれは
以前は2時間かかっていたんだろ。
いや、俺のプログラムはビルドに1時間もかかるほどすごいんだぞ! と言う事だと思う
きっとテンプレートを駆使して浮動小数点数の計算をしているんだよ。
g++なひとはdistcc使うと幸せになれるよ
メタプログラミングをプロジェクトで使うのってどうよ
浮動小数点計算とコンパイル時間に何の関係が?
>>73 使うこと自体はよいが、適当な粒度でコンパイル依存を切るのが定石
>67 pimplとかって使わないのかね。
>>76 その間に喫煙所に行ったり仮眠とったり、パチンコに行ったりするのような光景が
昔ではよく見られた。いまはどうなんだろ?
シュミレーションに2週間かかるようなプログラムじゃなかったら c++じゃなくてmatlab使う
ref++がwindows vistaで動かなかったのは対応されたのかな
バカだろうとなんだろうとあちこちで使われている現実がある。
>>81 まあLispが好きなEmacs使いの言うことだから。
emacsでC++書いてるので複雑
>C++はすごい遊び場であり、そのすべてを知るとすごく賢くなった気分になる。
>だからあなたはそのすべてを使おうとすることになる。
>しかしそれはうまくやるのが本当に難しいのだ。
この辺に同意する。
2年間C++を学んで、
>>6 の本もすべて読んで、
ようやくSTLやBoostのすばらしさを理解したけれど、
メタプログラミングを実際に使いたいかというと、激しく疑問。
>だからあなたはそのすべてを使おうとすることになる。 ここが間違いの元
不自由なほうが安全なのはみんなわかってるはずなのに 使えるものは使いたい、揮える力はふるいたいという衝動が
>2年間C++を学んで、
>>6 の本もすべて読んで、
>ようやくSTLやBoostのすばらしさを理解したけれど、
この辺でお郷が知れている。
>メタプログラミングを実際に使いたいかというと、激しく疑問。
そりゃぁ、二年間の歳月とそれだけの本を読むという手間隙を掛けて辿り着いたところがあれじゃぁねぇ。
メタプログラミングを実践で応用できるは、そのような手間隙なしに到達できる人間に限られているのかもしれない。
全てを使うのではなく、必要なものだけを使えばよい。
でもその必要なものだけという力加減がまた難しいもんだ。
92 :
86 :2007/02/05(月) 21:02:43
>>89 いや、最初の一年は、テンプレートがまったく理解できなかった。
STLがなんだかすごいとは思ったが、どうして動いているのか分からなかったので、
うまく使えなかった。
Boostは、そもそも理解できなかった。
テンプレートについて書いている本も見つからなかったし。
>>6 に上げられている本、特にC++ Templatesを読んで、ようやく理解できた。
私のような凡人には、手取り足取り教えてくれる教科書が必要です。
>メタプログラミングを実践で応用できるは、そのような手間隙なしに到達できる人間に限られているのかもしれない。
それはたとえば、禿とか髭ですか。
テンプレート使うか使うまいが、 C++かCか分からんプログラム書こうが、 良いじゃないか。動いていれば!!! 動いてるって素晴らしい!!!
>>81 なんかひどい言われようだけど、やっぱ俺はC++が一番好きだな
あのごつごつした粗野な感じ、ちょっと間違うとすぐアプリケーションエラー
しかしうまく扱えたときの快感
車にたとえればポルポルかフェラーリだな。
>>93 それはスパゲティなソースを認めるということかね
>>95 ミートソースは認めるけど、
和風おろしソースは認めない
つ、つまらん
>>81 Javaより抜粋
> C++と比較すれば、Javaは言語として同程度だ。いや、今のなし。ずっといい。
> 文字列があるもの。文字列のサポートがお粗末な言語なんていったいどうやって使えるんだ?
俺、ずっとC++のstringは文字列だと思ってたよ。(´Д⊂
言語がバカだから人間が頭使えて楽しいんだろ。 賢い言語なんてバカな人間向けの補助輪だと思わないかね
それは極論 パズルが好きならアセンブラやれ、ってことになる。(まあそうなんだけど) しかし正直文字列の扱いはC++酷い
アセンブラは低レベルすぎてむしろ頭使えない CくらいがちょうどいいなーJavaになるとぬるま湯って感じ
いかに命令数削減するかとか レジスタ少なく使うかとか エンコード系の処理の最適化を考えるのは結構楽しいぞ
プログラムを書くのが楽しいのか アプリの機能やら考えてつけるのが楽しいのか 食うために書いてるのか
>>102 >いかに命令数削減するかとか
あーそれは楽しいね
cpの代わりにor使ったりとか
>>99 そうだ、所詮は言語なんて、すべてマシン語へのシンタックスシュガーなんだ。
>>105 うぉーいきなり真理を突いてきましたよ!!!
目から鱗
機械語最高
Boost使いまくってる人は最新のPCでOCしまくって使ってるの?
なんで自分の使ってる電算機言語にけちつけられた位で人生の全てを否定されたかの様な反応するのか理解できません。
井蛙は井の水枯れれば干乾びる
普通に反論が来ただけで釣れたとか必死だなとか言う奴のほうが理解できね
スレタイの影響なのかマ板みたいな会話が続いてるな
関数の引数に関数を渡して関数の中で引数で渡した関数を呼び出したいんですが出来ますか? 出来るか出来ないかだけで結構です。
できる。
できる。
>>114 型としての「関数」は無理だろうな。
関数ポインタとか、関数オブジェクトなら渡せるが。
そんなことわかってるよ。 やっぱ関数ポインタとか面倒なんで引数にクラスを渡すことにします。 お前らご苦労さん。
なにこれ
俺の精子だよ
そこでstd::tr1::function。 結局関数オブジェクトであることに変わりはないし、 引数に渡すだけならテンプレート使えよと言うところだが。
std::ptr_fun
関数オブジェクトと関数ポインタの違いは何ですか?
>>110 誰も全て否定されたなんて思ってないのだが。。。
お前はよくそういうこと感じたりするの?
わざわざ蒸し返すなよ
すみませんでしたショボーン
>>123 関数オブジェクトはクラス。関数ポインタは関数へのポインタ。
関数ポインタ⊂関数オブジェクト
関数オブジェクトはメンバ変数を持てるからいろいろできる 当然クラスだから継承もできるけど… どういう場面で関数オブジェクト継承するのかはワカンネ
STL以外で関数オブジェクト使ったことありますか?
俺はねえ
boostでは良く使う
滅多に使わないが内部関数定義するときに使った。 あとはテンプレートの関数作って一部のテンプレート引数を typedefで固定化したいときとか。
うん。
136 :
デフォルトの名無しさん :2007/02/09(金) 10:40:39
boost/mpl/if.hにおいて 101 template< 102 bool C_ 103 , typename T1 104 , typename T2 105 > 106 struct if_c 107 { 108 typedef typename aux::if_impl< C_ > 109 ::template result_<T1,T2>::type type; 110 }; という箇所があるんですが、 この ::template というのはどういう意味なんでしょうか?
result_というのがif_implのインナークラス"テンプレート"なんだということがいいたいのかな? だとしたら、 typedef typename aux::if_impl< C_ >::result_<T1,T2>::type type; これではなんでいけないのか
c++スレって1つにまとめてもいいのかな
>>137 手元に資料が無いから推測でモノ書くけど、
「result_<T1」が式として認識されないようにするためじゃね?
141 :
140 :2007/02/09(金) 19:39:31
ああ、間違えた。テンプレート パラメータに依存する・・だ。 スレ汚しごめん
ジェネリックプログラミングとか関数プログラミングとか なんかむずいけど、面白っ!
意味無さ過ぎてワラタ
struct Cls { template <typename FuncType> Cls() { void* p = new FuncType; } }; int main() { Cls c<int>(); return 0; } こういう風にしたいんですがコンパイルできません templateクラスにはしたくないんですが コンストラクタでtemplate使うのは↓みたいに引数から推論させるしかないんでしょうか? template <typename FuncType> Cls(FuncType) { void* p = new FuncType; } Cls c(10);
高橋秀樹「そのコード、ジェネリックになりませんか?」
×��Cls�c<int>(); ○��Cls<int>�c;
>>139 なるほど。T1がテンプレートパラメータだからダメだってことなんですね。
// boost/mpl/if.hpp
template< bool C > struct if_impl
{ template< typename T1, typename T2 > struct result_ { typedef T1 type; }; };
template<> struct if_impl<false>
{ template< typename T1, typename T2 > struct result_ { typedef T2 type; }; };
template< bool C_, typename T1, typename T2 > struct if_c {
typedef if_impl<true>::result_<int, char>::type type1; //これはOK
//typedef typename if_impl< C_ >::result_<T1,T2>::type type; //クラステンプレート内ではERROR!!
typedef typename if_impl< C_ >::template result_<T1,T2>::type type;
};
>>145 そういうこと。
Boostなんかだと場合によっては何か引数で型を指定する方法を使っていた気がする。
>>149 やっぱりそうですか。なんかC++にありがちな、きな臭い方法があればなーと思ったんですが
組み込みならともかく巨大なクラスとかだと現実的じゃない方法だ、、
152 :
150 :2007/02/10(土) 11:43:48
インスタンス作るとコンストラクタが走ってしまうのでなかなか。 ↓みたいにポインタにすればコストは少なそうだけど毎回キャストとか使い物にならねorz struct TCls { TCls() { std::cout << typeid(*this).name() << std::endl; } }; struct ClsRef { template <typename T> ClsRef(const T&) { T* p = new T; } }; struct ClsPtr { template <typename T> ClsPtr(const T*) { T* p = new T; } }; int main() { //ClsRef cc((TCls())); ClsPtr c(static_cast<TCls*>(0)); }
タイプ数的にはあんまり変わらないけど。 -- template<typename>struct hoge{}; struct hige{virtual void huge(){}}; template<typename T> void hage(hoge<T>) { std::cout << typeid(T).name() << std::endl; } int main(int,char**) { hage(hoge<hige>()); return 0; }
>>153 やるとしたら、こっちのほうがミスはなくて良さそうですね
ただ、どっちにしろ(自分の感覚では)あまりキレイな形にはならなそうで残念です
どうもありがとうございました
struct Cls { void* p; template<typename T> struct traits{}; template<typename T> Cls(traits<T>){ p = new T; std::cout << typeid(T).name() << ":" << p << std::endl; } }; template<typename T> struct TCls : public Cls{ TCls():Cls(Cls::traits<T>()){} }; void func(Cls c) { std::cout << c.p << std::endl; } struct A { int n; }; void main(int argc, char* argv[]) { TCls<A> tc; func(tc); Cls c = tc; func(c); std::cout << "sizeof(tc)=" << sizeof(tc) << std::endl; std::cout << "sizeof(c)=" << sizeof(c) << std::endl; }
void* a= new int(10); cout << *a << endl; 2行めが正しく無い様で、ポインタの指すアドレスが表示されてしまいます。 void方のポインタ a が指す値を参照したり、変更するにはどうすればよいのでしょうか??
>>156 適当にreinterpret_castすればよろし。
>156の例なら、std::cout << * reinterpret_cast<int *>(a);とすれば(不定値が)出力されるかと。
>>156 実体がintだったりcharだったりするのを自動判別して表示するのを期待している?
なら、voidポインタでは無理。素直にaの型をint*にしる。
>>157 void*から既知のポインタ型に戻すのは
スタチック=キャストで正当扱いされるような気がするが、忘れた。
159 :
156 :2007/02/11(日) 13:08:57
>>157 >>158 (int*)a とか試してもアドレスが表示されてしまったのでなかなか解決出来なかったのです。
なるほど。reinterpret_castをいちいち使わないとダメだったんですか。
がんばってみます。ありがとうございました。
確かにそれだとアドレスが表示されるだろうな。 値を出したければ *(int*)a だろう。 つかこれはC言語の内容だ。
161 :
156 :2007/02/11(日) 15:01:37
>>160 ぉぉ、なるほど。
慣れないものですいません。ありがとうございました。
boost::any使うと便利だよ
*(int*)aと(int*)aを間違えるならまだ早いだろうさ。
class hoge{ : void operator[](size_t); : }; class foo{ : hoge *sss; : }; (*(((foo*)&x)->sss))[val] 少なくともこれくらいパッと見で理解できないとね。
(*static_cast<hoge *>(reinterpret_cast<foo *>(&x)->sss))[val] ; (*(reinterpret_cast<foo *>(&x)->sss))[val] ; うーむ、あまりわかりやすくはならんな。
166 :
デフォルトの名無しさん :2007/02/12(月) 09:12:15
若いの オラが村では派遣労働の問題を口にしちゃなんねーだ お前さんはまだわけぇから言いたいこともあるべぇ だべな、派遣問題を口にするとバカにされたと思ってムキになって怒る者がおるでよぉ てめぇでの責任で派遣やってる癖に派遣問題に触れると逆ギレするバカなんだけどよぉ 問題の指摘は駄目だっぺぇ 派遣のことは口にしちゃなんねぇ この村みたいな民度ゼロの会社で現実忘れるためにはよ 北朝鮮とか宗教団体と一緒でよ、駄目のものを駄目と言ってはなんねえだべさ タブーを口にしちゃいけねぇだ
168 :
デフォルトの名無しさん :2007/02/12(月) 13:06:36
ねぇねぇ、久しぶりに来たんだけどさ、「まあヒントくらいにはなったな。うむご苦労。」とか、 「ダイナミックリンクしておいてサイズが増えない」とか書き込まれていたのはこのスレだっけ?
大体でいいけど何時頃の話?
>>168 2つ前のスレで「うむご苦労」が抜けて
一つ前のスレではSTLで実行ファイルサイズが増えるってところがHAGEに変わってた
172 :
デフォルトの名無しさん :2007/02/12(月) 13:47:38
何だよHAGEってワロス
#define HAGE struct
>>164 hogeの[]を呼んでることは分かった。
>>164 ,165
漏れには何がしたいのかがわからん
式が何やってるか解釈できるかどうかの話だろう その式の結果自体に意味は無い
hoge & hoge_ref = *reinterpret_cast<foo *>(&x)->sss ; hoge_ref[val] ; これなら分かりやすいはず。
179 :
デフォルトの名無しさん :2007/02/12(月) 21:38:37
派遣には人格的に首をかしげたくなる香具師が多い 特に駄目なのがいわゆる「裏切派遣」ね。 元々は正社員だったのに取引先にフリーのほうが稼げるとか騙されて、派遣やってるバカw 結局は自分で判断して自分の責任で派遣やってる癖に派遣問題の話が出るとウッキー!って逆ギレw 自分の会社を裏切り、結局派遣先からも騙されてる。 そもそも信頼されてるなら直接契約するか正社員にするはずだが、 馬鹿だから派遣にされて喜んでるんだよなw
>>179 自称”フリーランス”はほとんどそれだね
>>179 昔、当時勤めてた会社をやめた時に、大企業の取引先のお偉いさんから
ウチで働かないか?って誘われたことがあるけど、いまから思い返して
みれば誘いに乗ってればそーゆー結果になってたかもなぁ。その会社の
仕事ができる人間に対する扱いが恐ろしく酷いことは一緒に仕事してて
よく知ってたんで即お断りしたけど。
あれ、C++スレだよなここ
184 :
デフォルトの名無しさん :2007/02/14(水) 00:05:18
>>181 >ウチで働かないか?って誘われたことがあるけど、
それが正社員なら信頼されてるが、派遣会社経由の偽装請負だったら人間として低く見られてる
「こいつはバカだから目先に金に飛びつくだろう」ってね
所詮派遣だからいらなくなったら切ればいいという考え
何年かたって裏切り派遣野郎が騙されたことに気づいても縁切りゃいいやとでも思ってるんだろ
そんなひでぇ奴は刺されて良いと思うな(w
トキかっこよすぎ
俺は社員で働くのは体質的に無理だ 派遣がイイ。
>>183 ところであのはてなのC++リングのアイコンはどーにかならんのか?
なんだよ、あの道化を逆さにしたようなアイコンは。
>>186 間違いなく、コンパイル速度は遅くなる。
実行速度は使い方次第なので一概には言えない。
#そもそもコンパイルタイムに演算を済ませてしまうようなテンプレート関数なら、実行速度は最大なわけだが。
192 :
デフォルトの名無しさん :2007/02/14(水) 09:04:11
なにムキになってageてるんだろう
うっせ、テンションたけーんだよクズ
また変なの沸いちゃったなぁ
>>183 のサイトみてるんだけど
本名でやってる人いないね
自分もやるとしたら偽名でやるのがいいのかな?
>>196 個人的に知ってる子がいた。
もう結構な歳なのにまだ耳とか言ってるのか...
>>197 なんだっけ? 確か、殺した相手の耳を削いで集めるネトゲがあんだよね?
きんもー
耳塚?
猫耳じゃないのか・・・
猫を殺さば猫に喰わるる
猫駆除
通☆風☆性
>>199 Diablo?
外人が「mimi chodai!」 とか言いながらPKしまくってたなw
>>208 そいつの講演むかし聞いたことある
一番印象に残った発言は
「無駄な苦労をしただけの人は評価しません」
世の中上手く騙したほうが勝ちだからな やりすぎて抹殺されることも多々あるが
mainのなかで newで割当てられるメモリーには上限があるのでしょうか? コンパイルオプションなどで上限を増やすことはできないのでしょうか?
環境依存スレへ
/3GBスイッチで 合わせて最大3GBまで確保できる
214 :
211 :2007/02/17(土) 14:41:20
>>213 すいませんLinuxのばやいはどうしたら言いのでしょうか?
>>214 というか、どんなけメモリ確保したいんだよ。
パソコンに搭載されているメモリに近い量だとスラッシングが起きるでしょ。
一回のnewで大きなサイズの場合、そのサイズ以上の連続したアドレスがあいていないと無理。
Linuxのことは知らんけどそんなもんでしょ。
2つ以上のdll作ったとき、 やっぱベースアドレスかえてますか?
確保できるメモリ量の最大値はどうやればわかりますか?
>>219 WindowsならAdvanced Windowsあたりに書いてた気がする
まぁ、環境依存スレへどうぞ
>>219 for(DWORD i=1;i++;i<=0xFFFFFFFF)
{
try
{
int a=new int(0);
}
catch(...)
{
cout << i;
}
}
おお!
Cランタイムライブラリを スタティックリンク、ダイナミックリンクした場合 何かちがくなることはありますか?
>>224 そりゃスタティックとダイナミックが違うに決まってる。
CRTをスタティックリンクしてるdllとダイナミックリンクしてるdll を呼び出す場合の違いについて教えてくださいませ
>>226 もう明らかにスレ違い。 MSDN 嫁。
コンストラクタの例外は、デストラクタが呼ばれないことからメモリリークの原因のひとつと言われます。 でも例えば以下のような場合などで、MyClassに適切なデストラクタを定義しておけば (=後始末はメンバオブジェクト自身にやらせる)問題なしという認識でOKでしょうか? class A{ public: MyClass m; // こいつのデストラクタは必ず呼ばれるので後始末も必ず実行される A(); // こいつが例外を投げる。 ~A(); // こいつは呼ばれない。 };
>>228 そう。メモリリークの原因とか言ってるやつは例外処理について
まともに調べもせずに言語のせいにして喚いてるだけ。
コンストラクタで何してるかによるんじゃ???
232 :
228 :2007/02/17(土) 21:51:04
>>229 お返事ありがとうございます。納得致しました。
>>230 ええ、もちろんそうなのですが
A::A(){
m.Init();
ThrowExceptionFunc();
}
などと余計なことをしなければ、後始末の役目をMyClassだけに押し付けることができて、
Aのデストラクタが呼ばれないなんて心配する必要ないじゃんと思った次第なのです。
言い回しは怪しいが、だいたいそんな感じ。 例外が投げられた時点で構築が完了した(コンストラクタが完了した) オブジェクトは、対応するデストラクタが呼ばれる。
234 :
デフォルトの名無しさん :2007/02/17(土) 23:21:31
MyClassはfriendにしたほうがいいんじゃね?
>>234 んなわけない。つーか、これだけの情報でよくそんなこと言えるな。
んんーー? だってMyClassからAの開放するんでしょ? Aのprivateメンバに触れたほうが良いじゃん
>>236 だれもそんなこと言ってない。電波でも受信したか?
うん。
後始末処理が Aコンストラクタのcatch内にかかれるか、 MyClassにかかれるかだけの違いに見えるが
>>239 A のコンストラクタに後始末を書く場合、当然 A のデストラクタにも書くわけで、
コードが重複することになる。
あらまぁ
RAII
雑誌でコンストラクタから例外を投げるなと書いてた人がいたね。 初期化関数を作って初期化で投げろと。w
それは一番無難だけど、 少し冗長だなーーー
>>244 初期化呼び忘れや二重初期化の危険性を持ち込むことのどこか無難か。
そこでテンプレートパターンですよ
>>246 テンプレートメソッドパターンのことかな?
それって普通にコンストラクタで初期化するのに比べて何がうれしいの?
コンストラクタで例外投げるのって、不変条件を 必ず満たすために使うのがほとんどなんでないの? 初期化関数作るやり方で代用出来るの?
白根ーーよ!!!!
std::fstreamでもファイルノットファウンドで例外が飛んでくるし
>>248 プログラマががんばれば代用できるというレベル。バグの温床かと。
>>250 紙面でも読んだ覚えがあるが、これはひどい。
コンストラクタ・例外・初期化関数についての例題を書いてみた。 ある資源を3つのクラスで管理する。 クラスA、B、Cは、コンストラクタが例外を投げ得る構成を用いる。 クラスD、E、Fは、コンストラクタは例外を投げず、初期化関数を用いる。 どのクラスのデストラクタも例外を投げないものとする。 class A { int* p; public: A(); ~A(); }; class B { A a; public: B(); ~B(); }; class C { A a; B b; public: C(); ~C(); }; A::A() : p(new int(0)) {} B::B() : a() {} class D { int* p; public: D(); ~D(); void init(); }; class E { D d; public: E(); ~E(); void init(); }; class F { D d; E e; public: F(); ~F(); void init(); }; D::D() : p(0) {} void D::init() { p = new int(0); } E::E() : d() {} void E::init() { d.init(); } このとき、資源漏れのないC::C()とF::init()を定義し、両者を比較せよ。 なお、D、E、Fには必要に応じてメンバ関数を追加してもよい。
コンストラクタじゃなくて、初期化子で初期化しているときに例外を投げた場合て どうなるんだっけ?
既に初期化が済んだオブジェクトについてはそのデストラクタが呼ばれる。 まだコンストラクタが完了していないオブジェクトについてはデストラクタも呼ばれない。
>256 確か、初期化子だと逐次初期化を完了させていくんだったよね? 例外によるリークは発生しないということでいいのかな?
コンストラクタから例外だしてもいいと思うけどなぁ ただ、その例外出すって設計がいいとは思わないけど。 RAIIを必ず使ってれば、メモリーリークは防げるし。
class Hoge { public: Hoge() p(new int), q(new int) {} ~Hoge() {delete p; delete q;} private: int* p, q; }; こういうときqの初期化のnewがbad_allocを投げたらpのメモリはリークする。 pとqが何らかのスマートポインタなら、そのデストラクタが働くのでpのリークは心配いらなくなる。
qがintのポインタになってない、という突っ込みはやめておこう。
突っ込んでるやんかと思ったけど、そんな突っ込みもやめておこう。
まったくここはハッテン場なスレですね
う〜、トイレトイレ
用はauto_ptrだのRAIIつかえって話でしょ? 似たような話が例外処理スレに上がってる
なるほど、こうすりゃ良いのね。 class Hoge { public: Hoge() p(new int), q(new int) {} ~Hoge() {} private: boost::shared_ptr<int> p, q; };
それだけならscoped_ptrで十分だと思う。 必要ならshared_ptrにすべきだが。
268 :
デフォルトの名無しさん :2007/02/20(火) 02:47:41
クラスのデストラクタをvirtualにするのとしないのとでは派生したときにどのように動作が違いますか?
>>268 virtual 付けると動的な型に基づいてデストラクタが呼ばれる。
他のメンバ関数と同じ。
>>268 確かこんなこと
class B : pubic A { 略 };
A * pa = new B;
delete pa;
A::~AがvirtualならB::~Bが呼ばれる。
そうでなければA::~Aが呼ばれB::~B呼ばれない。
>>270 そこでboost::shared_ptrですよ
あれ、目から汗が・・・。
273 :
デフォルトの名無しさん :2007/02/20(火) 15:23:15
双子素数を求めるプログラムを作ってみたんですけどどこか改善点などあれば教えてください。 #include<iostream> using namespace std; const int MAX_NUMBER = 2000; //保存できる素数の数 int sosu[MAX_NUMBER]; //この配列に素数を保存 int main(){ int num=0; //見つけた素数の総数 初期値は0 int i,j,route; int judge; //素数のとき1,素数でないとき0とする int k=0,h=0; sosu[num] = 0; //素数の初期化 for(i=2;i<=10000;i++) //1をとばして2から素数判定を始める { /*エラトステネスのふるい*/ for(route=1;route*route<=i;route++); //iの平方根より大きい自然数で、最も小さいものを求める for(j=0,judge=1;sosu[j]!=0 && sosu[j]<route;j++)//iの平方根より小さい素数で割り切れるものが無いとき、iは素数 { if(i % sosu[j] == 0){ //何らかの素数で割り切れたとき、その数は素数でないので終了 judge = 0; //素数でないので0にする break; } } if(judge){ sosu[num] = i; //新しく見つけた素数の保存 num++; //見つけた素数の数を1増やす sosu[num] = 0; //保存されている素数配列の終わりが分かるように、配列の最後を0にしておく } } while(sosu[k+1]){ //求めた素数のうち双子素数を表示 if(sosu[k+1] - sosu[k] == 2){ //連続する二つの素数の差が2なら双子素数なので表示 cout << "(" << sosu[k] << "," << sosu[k+1] << ")" << " "; h++; //一つの組を表示するたびにカウンタhを1増やす } if(h == 6){ //1行に6つの組が表示されたら改行 cout << endl; h = 0; //カウンタ初期化 } k++; } cout << endl; return 0;}
>>273 全ての素数を見つけてから双子を探すのではなく、双子素数を最初から探せば?
双子素数候補は(2,3,5以外は)必ず6n±1の形をしているのだし。
こんにちは。 windows.hをインクルードしたC++ソースファイルをLinuxでコンパイルしたいんですけど, 何か方法ありませんか? HDCとHBITMAPが曲者でした。この二つがLinuxで使えるようにできる方法があれば、どうぞ教えてくださいませ。
>>275 個別環境スレへどうぞ。
#まぁ無理だけど。
g++のクロスコンパイラでexeを作ったあと wineで実行するとかw
278 :
デフォルトの名無しさん :2007/02/20(火) 17:09:48
VC 2005で気の迷いからstlを使ってみようと思ったのですが, しょっぱなからつまずいてしまいました. map<Key,T>::end ()がiteratorを返すend ()かconst_iteratorを返すend () constか 判断できないと言うのです.コンパイラが. 普通こうした時にはキャストで(map<Key,T>::iterator)とか入れてやると 通りそうなものですが,やっぱり判らんと言い続けます. const_iteratorにしても同じです. 何が不味いんでしょうか?
とりあえずソース。
280 :
278 :2007/02/20(火) 18:22:56
具体的には宣言が class IStereo { public: typedef std::map<int, IStereo *> Map; static Map ourMap; static Map & getMap (void) { return ourMap; } 使っている所が { IStereo::Map::iterator & theIterator = IStereo::getMap ().find (wUserID); if (theIterator == IStereo::Map::end ()) で,このendがキャストしたりしても判らんと.
endは静的メンバでないので、IStereo::getMap().end();
気のせいか、、boost::shared_ptr はC++プログラマを甘やかしてないか? お前ら初心を忘れるなよ!!!!!
心配すんな。ちゃんと循環参照してるぜ
>>282 馬鹿でしょ
より完成度の高いもの作るんだったらshared_ptrなり使うわ。
例外処理の話でRAIIの重要性わかんないの?、、
何怒ってんだ?? 生理?
お前ら初心を忘れるなよ!!!!!
げ、ハッカーと画家じゃん やだなぁ
289 :
デフォルトの名無しさん :2007/02/22(木) 08:14:32
ブール型配列 f の要素すべてを true/false に設定したいのですが bool f[100]; memset(f,true,sizeof(f)); // 要素すべてをtrueにする memset(f,false,sizeof(f)); // 要素すべてをfalseにする このように書いても問題ないでしょうか? よろしくおねがいします
>>290 289です
290さん、ありがとうございます
こらこら。
memsetってなんで埋めの値がintなの? 1バイトずつ埋めずに、4バイト一気にやるわけ? 全配列をtrueにするには0xffffを渡さないと駄目なの?
0xffffffffだった
>>293 過去との互換性を維持するため、引き数にintより小さい型は使えなかったから。
そもそもtrueは1だし、boolがint幅あるかどうかは処理系依存じゃないのか?
うるさいうるさいうるさい!!!
>>289 ダメ。 std::fill() 使え。
>>293-294 memset() の埋めに渡した int は unsigned char にキャストされて使われる。
0xffff でも 0xffffffff でもあまり変わらない。
bool b[100]; for (int i = 0; i < sizeof b / sizeof b[0]; i++) b[i] = true;
何で駄目なんですか sizeof bはきっちり100を返すので問題ないと思うのですが
std::fill()の方がコード読みやすいじゃない。
bool型のサイズは1byteと決まっているわけではなかったような。 1byteでないならば、trueをセットするならstd::fill()でないと 駄目でしょ。
なるほど。。
305 :
デフォルトの名無しさん :2007/02/22(木) 15:41:12
ifstream の get() と read() ってどう違うの?
getが文字・文字列読み込みということで、 ポインタを引数に取る奴は、そのポインタが指す配列の最後に'\0'を置いていく。 readはバイナリ読み込みということでそれがない。
>>306 そうかー、ありがとう。
VC のヘルプをよんでもよくわからんかった。
本物のプログラマはバイナリモードしか使わない
「本物のプログラマは〜」 でググれ
>>310 いっぱい出てくるけど、どのページを言ってるの?
「コロ助はゲイなのかい?」 「バイナリ。」
誰がうまくないこと言えと
>>314 ゴルァ、吹いたじゃねぇか。
なんでこんなのでツボに嵌るんだか orz
>本物のプログラマは、やるべきことをユーザーよりよく知っている。 同意
フィクションとかでもそうだなぁ。 受け手が偉そうに「こうしろ」といっていたことを作り手がその通りにすると、 そこで初めて、それが大したものでないことや、他に弊害が出るものであることがわかる。 その時受け手が何をするかというと、それを要求していたという事実を無かったことにして、 また新たな素材を選び直して「俺の言う通りにしておけば良かったのに」の言い直しを始めるw
フィンランド語でおk
普通に日本語として読めるし意味も通じるだろとマジレス
なんとなくだが、
>>320 は
「アーアー聞こえな〜い(AA略)」 の新しいバージョンかとオモタ
classのメンバ変数として、char *p;(可変長のため動的確保)などを持っているclass Xを考えていて、 p[pos]からp[pos+size]を取り出す、X X::get(int pos,int size)のようなものを作りたいのですが、 X X::get(int pos,int size) { X ret(); <ret.pを動的に確保してコピー> return ret; } として、X a,b; a=b.get(pos,size); のような使い方は出来ないのでしょうか? (上の式のようにするとreturnの前にデストラクタが呼び出されて値が壊れるようなのですが・・・)
Xにコピーコンストラクタはあるか?
コピーコンストラクタとoperator =は両方作って見たのですが、 a=b.get(pos,size);の時点でbのメンバ変数が壊れているようです・・・。
コピーコンストラクタをよくよく見ていたら、それ自体が間違っていました;; 修正したらきちんと動くようになりました、、どうもありがとうございます^^
そういえば禿ってフィンランド出身だったっけ?
えーと、リナックスの人と間違えました
お前ら地球から出てけよ
そうだ、火星いこう。
Dならいいけど、計数火星C++はヘタレだからやだ。
ハンガリアンというオチか
アーユーハングリー?
イエス!!!!カップヌーーードル!
OK、買ってくる
ノオオオオボオオオオオダアアアアアアアアアアア!!!!!!!!!
カップヌードルクリーミーチキンうめぇwww
注:私の有意義な発言に対し、自分のカップヌードルを棚に上げ煽り、1行カップヌードル で返す方が多いようですが、そのような方はスレの皆様をカップヌードルさせるだけでなく カップヌードルの雰囲気を崩しかねないのでお黙り下さい。 また質問者は回答者にカップヌードルを披露する場を与える貴重な存在なので、 カップヌードルを見下した回答、あまりにもカップヌードルを欠いた回答も厳重にカップヌードルいたします。 忙しい中、少ない時間の合間を縫ってカップヌードルしに来てるわけですので、 その辺ご承知下さい。なお、当方がカップヌードルに対して有意義なカップヌードルであると 判断した方にはカップヌードル価いたしますので各自よく調べ、よく考え正確なカップヌードルをするように。
カ ッ プ ヌ | ド ル
enum e味 { ノーマル, カレー, シーフード, クリーミーチキン, ミソ }; // 後忘れた enum e感想 [ 神、いわゆるゴッド, ウマー, おk, 普通にダメー, 糞マズイ }; typedef カップ麺 { 名前 味 感想 }カップヌードル;
名前 妹 感想 } ヌード; こうみえた。もうだめ
e味とかe感想とか、e電みたいだなwww
348 :
デフォルトの名無しさん :2007/02/28(水) 20:11:29
ソースの末尾(EOF)は改行で終わらなければならない という謎仕様はどういう経緯で策定されたんでしょうか 歴史的理由? //OK int hoge; [EOF] //NG int hoge;[EOF]
>>348 プリプロセッサの文法要素がすべて改行を終端としているので、
厳密には改行がないとパースに失敗することになるからだと思われ。
規格の A.14 に文法の定義がある。
>>348 diffとかpatchとか行指向なツールで、
最終行に改行が「無い」事を表現するゴミ情報が必要になって、
さらにゴミ情報の後方互換性とか出てきてウザいから。
viは改行を入れてくれるしemacsも警告出たような。 でも、ツール云々はスレ違い。
計算式が異なる3つのクラス(hoge_1〜3)をtemplate等を使い、1つのクラス宣言に する方法はありませんか? class hoge_1 { BYTE hoge_data ; WORD calc_data ; public: void hoge_calc(BYTE add){ calc_data = (((WORD)hoge_data + add) / 10) ; } } ; class hoge_2 { WORD hoge_data ; WORD calc_data ; public: void hoge_calc(WORD add){ calc_data = (((DWORD)hoge_data + add) * 10) ; } } ; class hoge_3 { WORD hoge_data ; WORD calc_data ; public: void hoge_calc(WORD add){ calc_data = (((DWORD)hoge_data + add) * 120 / 100) ; } } ;
353 :
352 :2007/03/01(木) 09:41:38
また、hoge_mergeのdata_1〜3をインデックス番号で呼び出す方法も教えて欲しいです。 例: class hoge_merge { public: hoge_1 data_1 ; hoge_2 data_2 ; hoge_3 data_3 ; } ; hoge_merge merge_data ; switch( no ){ case 0: merge_data.data_1.hoge_calc(add_val) ; break ; case 1: merge_data.data_2.hoge_calc(add_val) ; break ; case 2: merge_data.data_3.hoge_calc(add_val) ; break ; } では無くて、イメージとしては merge_data[no].hoge_calc(add_val) ; のような呼び出しイメージです。 良い方法をご存知の方がおりましたら、よろしくお願いします。
>>352 Boost.Anyで使われているような、Type Eresureのテクニックを使えばできるけど。
boost/any.hppを読んでみれば分かる。物凄く単純だから。
ごめん、みっつとも入れたいのか。 tupleでも使えば。
356 :
352 :2007/03/01(木) 10:18:06
>>355 アドバイスありがとう御座います。
タプルを調べてみます。
358 :
352 :2007/03/01(木) 14:10:50
>>357 ご指摘ありがとう御座います。
operator[]で考えて見たのですが、私の理解不足で戻り値を何にすれば
よいか解りませんでした。
xxxx operator[](int no){
switch(no){
case 0: data_1 ; break ;
case 1: data_2 ; break ;
case 2: data_3 ; break ;
}
};
data_1〜3のクラスは、hoge_1〜3と別のクラスになっていて
operator宣言で戻り値(xxxxの部分)を何にすればよいか、わかりません。
ご教授頂けるとありがたいです。
>>357 が何を意図していたのか分からないけれど、
その一連のhogeクラスとやらが変更できるならば、
class hoge_base
{
public :
virtual ~hoge_base() {}
virtual hoge_calc(WORD) = 0 ;
} ;
class hoge_1 : public hoge_base ;
class hoge_2 : public hoge_base ;
class hoge_3 : public hoge_base ;
hoge_base & operator[](int n)
{ return /*適当なオブジェクトを返す*/ ; }
360 :
352 :2007/03/01(木) 15:19:59
>>359 ありがとう御座いました。
operator[]が思った通りに動くようになりました。
クラス宣言をうまく1つにまとめる事が出来なかったとしても
operator[]で半分は満足出来ます。
あとは、タプルを攻略してみます。
久しぶりにJavaを書いたらデストラクタが無かった これどうすんだっけ?
>>361 (#^ω^)ピキピキ ここはC++のスレだお。
すみません 最近レスが少なかったからつい・・・
寧ろ逆じゃね?
スレ違い。
Schemeでは末尾再帰をループにする最適化を行うことが必須となっていたはず。 そこらへんのC/C++コンパイラでも最適化を指定すれば末尾再帰くらいはループにする。 最近のコンパイラならSchemeやその他Lisp処理系、C/C++どれでも 最適化として末尾でない再帰だってループに展開する。
値を返す前にデストラクタを実行する必要がある関数だと 見かけ上末尾再帰でも、再帰呼び出しが末尾処理にならなそう。 RAIIとは食べあわせが悪いのかも。
370 :
デフォルトの名無しさん :2007/03/12(月) 03:44:51
すごくどうでもいい質問なんだけど、
>>4 のC++Primerが3rdEd.になってるけど4thよりこっちのがいいの?
372 :
デフォルトの名無しさん :2007/03/14(水) 12:52:43
News 2007-03-14: The 2007-03-pre-Oxford mailing is available (4900 kb tar.gz, .zip 4900 kb) individual papers
News 2007-03-14: C++ Standard Core Language Issues List (Revision 46) is available, also committee version
http://www.open-std.org/jtc1/sc22/wg21/
373 :
デフォルトの名無しさん :2007/03/14(水) 22:28:41
インターフェースと実装を分離する定石を使いながら ↓のようにイテレータを扱いたいのですが、良い方法はないでしょうか? // インターフェース class X {}; class Y { virtual X* operator[](size_t index) = 0; virtual iterator begin(void) = 0; // ←XimplやYimplの実装を隠しながら virtual iterator end(void) = 0; // このiterator型をどうにか定義できないか? static Y* create(void); // iteratorのdereference演算の返り値はX*型。 }; // 実装 class Ximpl : public X {}; class Yimpl : public Y { Ximpl* operator[](size_t index) { return array_[index]; } iterator begin(void) { return array_.begin(); } iterator end(void) { return array_.end(); } vector<Ximpl*> array_; }; Yimpl* Y::create(void) { return new Yimpl; } ここまで
そのYなら、ついでに virtual size_t size()const=0も追加して、 iteratorはY*とsize_t indexを持つようにすれば?
そこでany_iterator というより俺だったら、とりあえず何も考えずにイテレータもXやYのように インタフェースを公開するクラスとそれを継承して実装するクラスに分ける。
376 :
373 :2007/03/14(水) 23:31:19
>>374-375 どうもです。↓こんな感じ?(なんだか大袈裟な気が…)
// インターフェース
class iterator {
public:
iterator(void);
iterator(const iterator& ite);
~iterator();
X* operator*(void) const;
iterator& operator++(void);
private:
class iterator_impl;
iterator_impl* impl_;
};
377 :
373 :2007/03/14(水) 23:32:13
(つづき) // 実装 iterator::iterator(void) : impl_(new iterator_impl) {} iterator::iterator(const iterator& ite) : impl_(new iterator_impl(ite.impl_)) {} iterator::~iterator() { delete impl_; } X* iterator::operator*(void) const { return impl_->operator*(); } iterator& iterator::operator++(void) { impl_->operator++(); return this; } class iterator::iterator_impl { public: iterator_impl(void) {} iterator_impl(const iterator_impl* impl) : ite_(impl->ite_) {} iterator_impl(vector<Ximpl*>::const_iterator ite) : ite_(ite) {} Ximpl* operator*(void) const { return *ite_; } void operator++(void) { ++ite_; } private: vector<Ximpl*>::const_iterator ite_; }; ここまで
>>376 イテレータを表すクラスなら是非ともstd::iteratorを親に持っておけ。
親に持つって、ようするに継承しろよということ。
380 :
373 :2007/03/15(木) 00:20:13
>>378 あい。あるいはboost::iterator_adaptorを使えば
少しは楽できるでしょうか?
それから、こういう方針をとっておいて言うのもなんですが、
イテレータを作るたびにnewして、インクリメントやdereferenceも
pimplポインタ経由というコストの掛かるやりかたというのは
イテレータ的にありなんでしょうか…。
>>380 基本的に iterator に対して cheap to copy を仮定していることが多いですし,また
(今,仮に373のようなことがやりたいことだと仮定して) 373のような increment などが
非常に軽い演算だと型の情報を消去するコストは看過できないと思います.
効率とのバランスを考慮するなら374さんの案だと思いますし,自分も373ならそうします.
class Y{
class iterator
: public boost::iterator_adaptor< iterator, size_t, X* >
{
private:
friend class boost::iterator_core_access;
public:
iterator() : iterator_adaptor_(), p_(){}
iterator(Y* p, size_t i) : iterator_adaptor_(i), p_( p ){}
private:
reference dereference() const{ return (*p_)[base_reference()]; }
Y* p_;
};
};
iterator のような機能と実装の隠蔽を両立したいときに
非負整数による indexing を使うのは比較的よくあるパタンかと.
382 :
デフォルトの名無しさん :2007/03/15(木) 01:36:34
メンバ関数へのポインタの取り方について質問させてください。 下のようなクラスMultipleがあったときにメンバ関数 int Mul(int n) へのポインタをとるにはどうすればよいでしょうか? 引数の型が異なる同名の関数はどうやって指定すればよいのか? というのが質問の意図です。 ポインタの使い道としてはstd::mem_fun_refの引数に与えることを考えています。 よろしくお願いします。 class Multiple { public: Multiple(size_t size) : size_(size){} int Mul(int n) {return size_ * n;} std::string Mul(const std::string& str) { std::string ret(str); for (size_t i = 1; i < size_; ++i) ret = ret + str; return ret; } private: size_t size_; };
static int Mul(int n) {return size_ * n;}
384 :
373 :2007/03/15(木) 01:53:24
>>381 どうもありがとうございます。
実装を隠すというのはどうしてもコストが掛かるんですね…。
374, 381の方法だとインデクシングという手法が外に見えると。
この辺が落としどころかなぁ。
# ちなみに381でiterator_adaptorを使っているのは
# 単に個々の演算の定義の省力化のためでしょうか??
>>382 基本的に代入したり実引数として渡す場合は、その型に合うものと推定されるが、
キャスト演算でもそれを強制的に行わせることができる。
static_cast<int (Multiple::*)(int)>(&Multple::Mul)
>>382 メンバ関数ポインタはそれぞれ別の型になるから、
&Multiple::Mul を渡せば、コンパイラが適切に判断してくれるよ。
渡された先では int (Multiple::*)(int) を受け取れるようにすること。
387 :
381 :2007/03/15(木) 11:47:35
>>384 >374, 381の方法だとインデクシングという手法が外に見えると。
一応 indexing のインタフェース (operator[]) を実装詳細として
外に見せずに, iterator だけ提供するのもありえると思いますよ.
indexing による手法を選択するかどうかは,
実装側のコンテナが random access できないといけない
(もしくは整数から要素への適当な mapping が要求される) という制限や,
コンテナへの要素の追加・コンテナからの要素の削除に対して
iterator が無効化される条件などを考慮して最終的に決定しなければならないかと.
># 単に個々の演算の定義の省力化のためでしょうか??
あと,各種 typedef ですね.実際きちんと iterator に要求される演算を用意しようとすると,
たとえば random access iterator の場合
==, !=, ++ (前置・後置), -- (前置・後置), +=, +, -=, - と,そこそこな労力が必要になるので
この省力化の恩恵は小さくないと思います.
388 :
373 :2007/03/15(木) 18:00:50
>>387 丁寧にありがとうございます。
インデクシングが見えると書いたのは例えば
>>381 の2行目
public boost::iterator_adaptor< iterator, size_t, X* >で
size_tをイテレータの中身(?)として渡しているのを見た人が
「インデクシングをしているのかな」と察するという意味ですが、
# 例えば class Ximpl; Ximpl* impl_; という記述を見た人が
# Pimplイディオムの実装に気付くように。
それすら隠せるということでしょうか?
…なんだか訳の分からないことを言っている気がしてきた。
> この省力化の恩恵は小さくないと思います.
たしかにその通りですね。
389 :
382 :2007/03/16(金) 02:11:32
>>385 なるほどキャストすればよいのですね。
おかげで解決しました。
>>386 コンパイラが判断できない場合もあるようです。
みなさまありがとうございました。
開発環境 VC2003 C++ 通信で取得したバッファを構造体にほうり込んで使おうと思ってるのですが。 構造体に詰めんだ後の値を見るとどうも数値がおかしい struct test { char com[24]; int len; unsigned char flg; char md5[32+1]; int sum; char test[10][2]; }; こんな感じの構造体に受け取った通信バッファを詰め込むと どうしてもsumから数値がおかしいものが詰め込まれてしまうので メモリ上で確認してみるとmd5の部分で自分で意図しない+2バイトが 勝手にとられているせいで、後ろがずれてしまってました。 確か+2バイトとか余計な事をしない設定があったと思うのですが 思い出せず、教えて頂けないでしょうか?
391 :
デフォルトの名無しさん :2007/03/16(金) 18:03:06
あげるべきだった、連書きすいません。 上の質問お願いします。
環境依存だよそでやれ。#pragma pack(0)
extern で class の宣言は出来ないのでしょうか? そうしないと多重でインスタンス化してしまったりするのですが、、
>>392 最後のが何気なく気になって調べてみたら・・
ありがとう助かった。
ぉぉ。これがツンデレか!!123
397 :
393 :2007/03/16(金) 23:29:07
>>396 もう一度見直したら、確かにできそうです。
まぁ、#include とか #ifdef とかを駆使して頑張ってみます。
398 :
デフォルトの名無しさん :2007/03/18(日) 09:07:22
いままで俺様フィーリングで使い分けてたけど、 structにするかclassにするかで明確な分け方の基準ってある?
俺様基準でいいんじゃない?
PODや関数オブジェクトはstructってのが慣習の様な
いきなりその辺にclass使うといきなりpublic:が出てくるからな
402 :
デフォルトの名無しさん :2007/03/19(月) 22:25:29
下記のソースがコンパイルすると error C2248: 'A<T>::__ctor' : private メンバ (クラス 'A<T>' で宣言されている)にアクセスできません。 と言われてしまいます vc7.1です template<class T> class A { friend class T; A() { std::cout << "A()" << std::endl; } }; class B { A<B> a; public: B() {} }; int main(int argc, char *argv[]) { B b; return 0; }
403 :
402 :2007/03/19(月) 23:15:36
ただのfrined Tにしたらコンパイル通りました でもg++ではまったく受付けないぽいorz
bcc32では通ったお
規格でもfriend T;は駄目だし、 ほかにもテンプレート引数に対してフレンドを指定する方法はないはず。
てっきりAのコンストラクタがprivateだからエラーになってるだけかとオモタよ?
g++で通った人いる? 俺もどうやっても通らなかったんだけど。。
規格によれば、11.4-2で、classをfriendにするには、elaborated-type-specifier (展開していくと、class-or-namespace-name)が必要で、こいつには、テンプレート 引数とかtypedefとかは含まれないんだな
まあ、そこはどう考えても規格がおかしいだろとは思う。 さっさとこれを合法にして欲しい。 VC8では、うれしいことに、通ってしまうようだが。 template <typename T> class nonderivable { friend T ; nonderivable() {} nonderivable(nonderivable const &) {} } ;
friend T; なんてどんな場面で使うんだ? 設計が間違っているようにしか思えないんだが…。
それ言うなら、friend自体使わんな。
友達じゃないか
困ったときだけ友達よばわりか
まぁ、覗かれる側が覗く相手を指定する友達宣言だし、いいじゃないか。 てか、覗きたい相手を勝手に宣言して覗きまくれるキーワードがあったらカオスだな。 さしずめsoulmate(心の友)ってとこか。
class a{ peeping b; // bを覗き見します }
tashiroでも可
とりあえず勝手に子供を名乗るのはどうだろう? 保護されている情報くらいまではアクセスできる。
BYTE* p = reinterpret_cast<BYTE*>(new SomeType); delete p; こんなようなコードって合法?このdeleteの振舞いは定義されている? つまり、ある型の自由記憶にあるオブジェクトを、 まったく関連のない型にキャストしてから、deleteするのはあり?なし?
タイーホ
>>422 なんか出てくる前に、早く鼻の穴を塞ぎなさい!
キャストしてdeleteすれば?
そこでboost::shared_ptr<void>ですよ class A { public: A() { std::cout << "A()" << std::endl; } ~A() { std::cout << "~A()" << std::endl; } }; int main(]) { boost::shared_ptr<void> p; p.reset(new A); return 0; }
>>422 void * p = reinterpret_cast<void *>( new sometype ) ;
delete reinterpret_cast<sometype * >(p) ;
これなら鼻の穴をふさがなくてもいいはず。
コラー
>>427 static_cast で頼む。っていうかほんとはキャスト無しで頼む。
friendがダメという話はよく聞くがではどうしろと? public?
例外を認めない規則に一般性はない
実際に動的ポリモーフィズム的なこと使う場面って多いのでしょうか?
割と。
かなり。
使わないとやってられない
いや俺は使わんね
静的ポリモーフィズムで済むとこは極力そっちに
じゃあ俺は性的ポリモーフィズムで。
template <class Derived> struct base { void interface() { // ... static_cast<Derived*>(this)->implementation(); // ... } }; struct derived : base<derived> { void implementation(); }; wikipediaでみつけたコードなのですが、base型からderived型にキャストしているのは ダウンキャストであまり良くないと思うのですが、 こういうのは一般的に使われているものなのでしょうか?
>>439 static_cast の時点でクラス間の継承関係をコンパイラが知っていれば
static_cast でもダウンキャストは可能。ただし実際に適用するインスタンスの
継承関係はプログラマが保証することになる。
dynamic_cast なら同じダウンキャストでも実行時のチェックが入る。
どちらにしてもダウンキャストがあまり良くないのは確か。
>>439 ATLで多用されてるテクニックだな。
vtblを節約して、呼び出すメソッドをコンパイル時に解決できるのが、
通常のポリモーフィズムと比較しての利点。
CRTP(奇妙に再帰するテンプレートパターン)の常套手段。 static_castならコンパイル時に解決されるのでこれに限ればデメリットは無い。
>>439 昔見たときは感動したが
今ではむしろvirtualが過激な拡張に見えてしまう罠
444 :
デフォルトの名無しさん :2007/03/21(水) 21:06:29
すいません アドバイス頂けないでしょうか type_infoクラス type_info::before関数 を使って継承関係を調べたいのですが、 継承中にテンプレートクラスをはさむと上手く判別してくれないときがあります。 (きちんと判別してくれるクラスもあります) 何かよい手がありましたら、お願いします。 こんな感じです↓↓↓↓↓↓ ※ はしょって書いてます、すいません class A; class B : public A; class C<t> : public B; // ※テンプレートクラス class D : public C<hoge>; class E : public C<huga>; このとき , DクラスとEクラスの継承を調べます typeid(D).before( typeid(A) ) → 1 typeid(D).before( typeid(B) ) → 0 //なんで? typeid(D).before( typeid(C<hoge>) ) → 0 //なんで? typeid(E).before( typeid(A) ) → 1 typeid(E).before( typeid(B) ) → 1 //なんで? Dと違う! typeid(E).before( typeid(C<huga>) ) → 1 //なんで? Dと違う! ・・・困ってます
>>444 問題の再現する最小コードを用意してくれんか?
それから、再現環境も教えてくれ。
>>439 boost::iterator_facadeとかBoostでも使われてるな
>>444 beforeは継承関係と関係ないらしいぞ
type_info::before()で継承関係なんか調べられたっけ?
>>444 is_base_of
名前空間boostもしくはstd::tr1
450 :
445 :2007/03/21(水) 21:51:39
orz
451 :
デフォルトの名無しさん :2007/03/21(水) 21:53:56
444です。
>>445 すいません。今、サンプルコード作成中です。
いかんせん、作っているクラスがでかいので上手く切り取りできないかも。
ちなみに VC++6.0 サービスパックは5.0だっけな?
>>447 ,448
ヤフーで「typeid before C++」検索かけると引っかかります。
※個人ページなので アドレス直書きは避けます。
そこだと「派生関係を調べる」と書いてありました。
452 :
デフォルトの名無しさん :2007/03/21(水) 21:59:31
>>449 アドバイスありがとうございます
is_base_of、検索してみます。
18.5.1 より bool before(const type_info& rhs) const; Effects: Compares the current object with rhs. Returns: true if *this precedes rhs in the implementation’s collation order. 継承関係と before() による順序は関係ない。
before()は、規格では「type_infoオブジェクトを実装依存の順序で比較する」としか言ってないはず。 無論、継承関係を考慮に入れた順序付けでの実装もありうるだろうけど。 動的な継承関係の判定なら、dynamic_castを使うべき。
でも444を見る限り静的に判定できれば十分そうに見える。
439です。 template <class T> class Hoge{ typename T::Type value; }; class Fuga :Hoge<Fuga>{ public: typedef int type; } と書くと main.cpp: In instantiation of ‘Hoge<Fuga>’: main.cpp:9: instantiated from here main.cpp:6: error: invalid use of undefined type ‘class Fuga’ main.cpp:9: error: forward declaration of ‘class Fuga’ とエラーになってしまいました gcc 4.1.2を使ってます。 instantiateって Fuga fuga; のようなものを指すものだと思っているのですが違うようですね・・・ ようは、Fugaより先にHogeをインスタンス化するから、T::Typeがなんなのか解らない。ってエラーでしょうか?
>>456 class Fuga :Hoge<Fuga> の時点では Fuga は不完全なんだけど、
Fuga::type は Fuga が完全になっていないとエラーになる。
コレに対して >439 がエラーにならないのは、メンバ関数の定義は
必要になるまでインスタンス化されないから。
class A; A a;の場合「aはAのインスタンスである」ということがあるが この場合の「インスタンス化」はtemplate <typename T> class A;に対するtypedef A<int> A_int;
なるほど。解りました。 ありがとうございます。
460 :
445 :2007/03/22(木) 23:28:00
>>444 struct TRUE_tag { static int value = 1; };
struct FALSE_tag { static int value = 0; };
template<class T> inline TRUE_tag is_derived_of(const T *)
{
return TRUE_tag();
}
template<class T> inline FALSE_tag is_derived_of(const void *)
{
return FALSE_tag();
}
なんかくやしいんでこんなん書いてみた。
なにか便利なもノン阿野?
コンストラクタ/デストラクタで仮想関数呼ぶと 派生クラスでオーバーライドした関数が呼ばれないんですね・・・
派生クラスの仕事は派生クラス側で片付けろということだわな。 少々面倒かもしれないけど 派生クラスの ctor/dtor に書けば済むことですわ。
基底クラスのコンストラクタではまだ派生クラスのオブジェクトは作られていない。 基底クラスのデストラクタではもう派生クラスのオブジェクトはなくなった。 C++ではこういう発想をしている。
type_info::before( )の話を見ていたら C++にリフレクションが無いのが悔やまれ
一般にC++って言ったら MSのC++/CLIも入ってくるものでしょうか? 上司に、C++ってまだリソースリークするのか?って 聞かれたんで、それはしますよと答えたのだが。。
>>466 お前も上司も何か勘違いしてないか?
C++ がリソースリークするわけじゃないし、
C++/CLI がリソースリークしないわけじゃないだろう。
>>466 どういう一般かによる。CとC++の区別もろくにつかない人からすれば
C++/CLIはまぁC++に含んでもいいんじゃないかと思うが、プログラマ
あるいはそれに準ずるような立場の人からすれば別物。
>>466 C++/CLIを入れると迷惑だとおもう。
C++知っている人みんながCLI知っているわけじゃない。
VC使わない人もいるし。
リソースリークとC++が未だっていうことは関係ないでしょ。
来月になるとリソースリークしなくなるわけじゃないし。
RAIIを徹底すればリソースなんてリークしません、とでも言っておけよ。 これは、GCする環境ではリークがないのと同じくらい真実だから。
C++でちゃんと作れば、オブジェクト廃棄のタイミングを制御できない言語よりも リソース管理を精密に行えると思うが・・・
GC言語でも開放されると思ってたらクロージャで参照してたせいで 開放されてなかった、ということはあったな。
C言語では言語の機能的に確実なリソースの解放が時に非現実的な事となるけど、 C++ではそういう悲惨な事態は十分回避可能。 ある意味ではこれこそC言語との一番大きな差異だな。
ですとらくたさまばんざーい
>>466 C++/CLIの実装は今のところ.NETフレームワーク上の環境になると
思うから、これは.NETの開発というくくりにした方が良い気がする。
>>470 、
>>471 ちゃんと作れる人が相対的に少ないから問題なんだろうね。
実力差があらわれすぎてしまうし。
そもそもCLIがまともに動く環境上なら多少のリソースリークなんて(ry
リソースリーク=メモリリークじゃないだろ
ファイルハンドルとかプロセス内で完結するリソースだったら、 プロセスの終了と同時に解放されることがやっぱり期待できると思う。
mallocしたらmainを抜けるまでにfreeすべきですよね。
freeしろって言われてできませんだったら、 ほかでリークしてるんじゃ?というのは勘ぐりすぎ?
↑意味不明な文章の例。
勘ぐり過ぎっていうか混乱しすぎ
freeしろと言われた奴が、出来ませんと答えやがった。 ひょっとしてリークしてるんでは?というのは勘ぐりすぎ? 脳みそリークなおまいらの代わりに俺が補完してやった。 間違ってたら吊ってやるよ。
↑意味不明な文章の例。
脳みそリークってどういう状況?
グロイな
こんな感じではないかと。 ∧ /´。 `ーァ ヽ{ 々 ゚l ノ (( ノ( )ヽ )) < >
488 :
480 :2007/03/28(水) 00:14:20
わりい、酔っぱらって書いてた。
のうみそをすいとられた!
スターシップトルーパーにいたね そういうの
複数形のズがつきます
>>493 なんか他の言語と混同してんだろ。
と、思いつつもいろいろ試してみたら最近のコンパイラならかなりの割合でイケる。
vc も 8 ならおk。知らんかったよ、その構文。
関数もこの構文でイケるんだな。てか、これって ISO/IEC 142882:2003 にあったっけ?
>>493 うちのvc7.1では通ったし、規格にもある。
C++クックブックにも載ってたよ
普通だよその構文
500 :
493 :2007/03/31(土) 02:18:33
orz 自分が確認用に使っていたコードは class A { public: template<class T> explicit A(T t) try : i_(t) { } catch(...) { } private: int i_; }; みたいなかんじでなのですが、普通のコンストラクタでは確かにコンパイルできることを確認しました おさわがせしました
>>493 は知らなかった。
そんなコードに今まで一度もお目にかかったことがない。
どういう経緯で入ったんだろう。
既に関数として{}を打っているのに、関数全体にかかるtry {}をタイプするのは面倒だという人が多かったんだろうか。
>>501 それでは初期化リストが漏れてしまうのだよ。
>>493 のページにはコンストラクタ・デストラクタでの関数tryブロックでは
自動的に再スローされることが書かれていないな。
> 自動的に再スローされる マジかよ。 それを止めることもできない? ということは緊急避難用ってことかな
関数tryブロックについては More Exceptional C++ Item 17, 18 に詳しく書いてある 要するに、関数tryブロックのcatchハンドラに入ったということは コンストラクタ (ないしデストラクタ) はすでに失敗しており、 正常終了しようがないわけだ ハンドラ内では次のルールが適用される (More Exceptional C++ Item 18 より) - return; は書けない - throw; と書くと元の例外が再スローされる - 元の例外とは違う例外を投げると、それが上位にスローされる - 制御がブロックの最後に到達すると、最後に throw; が書いてあるものとみなされる
誰か標準委員会に進言してこいっ!!
何を?
あれを
>>500 それはそれで、本来はコンパイルできなきゃいかんコードなんじゃないか?
アッー!
Tがintへの暗黙の変換を持たない型で試していたとかそういうことでは?
>>511 A a(777); でもコンパイルエラー@vc7.1
エラーメッセージ貼れよ
class A { public: template<class T> explicit A(T t) try : i_(t) { } catch(...) { } private: int i_; }; int main() { A a(777); return 0; } main.cpp(4): error C2059: 構文エラー : 'try' main.cpp(6): error C2334: '{' の前に予期しないトークンがありました。関数の本体は無視されます main.cpp(4): error C2988: 認識できないテンプレートの宣言または定義です。
同じようなコードでもVC++ 8だとエラー無くコンパイルできる。
俺が作ったコンパイラならよゆうで通るんだがな
?????????????????
>>514 VC7.1はテンプレートでは動かない
(そもそも生成コードにバグがあるので使えないらしい)
520 :
デフォルトの名無しさん :2007/04/01(日) 14:13:47
C++ で final (sealed) クラスを作るいい hack はないかな?
thanks.
523 :
デフォルトの名無しさん :2007/04/01(日) 16:13:01
初歩的なところで止まってしまった 教えてくれ class 定義で struct foo{ int i; int j; } private: foo* f(); としてるんだが、肝心の関数内で foo rf(255); c::f = &rf; とするとエラーになる。 何か根本的に勘違いをしているらしい。 やりたいことは、class に foo 構造体(要素 255 個)を持たせたい。 エロい人教えて><
typedef struct __foo{ int i,j; private: __foo*f(); }foo; foo*f(){ //... foo rf[255]; //... } 駄目だ、俺の良心が質問に答えようとしても523の書いてあることの意味が分からない。
むしろ自分の方が間違ってるんじゃないか? ってくらい齟齬を感じるけど とりあえず入門書ひゃっぺん読み返したほうが・・・
予約識別子死ね
>>524-525 いやすまん、ほんとにすまん
俺の表現がそもそもおかしかった
class a に、structure foo をクラス内変数として保持したかった。
要するに、構造体配列を、a が破棄されるまで a の内部で foo を保持したかっただけなんだ。
(なんというか、仮想テーブルみたいな)
クラス内で int の変数を保持するなら private: int i; でいいんだが、
構造体で、それの配列要素数が 255 としたときの宣言の仕方が分からなかった。
もういっかいお願い、エロい人><
struct foo{ int i, int j }; class a{ foo foo_array[255]; //..... };
何やってんだ俺・・・徹夜明けでボケてる・・・orz × struct foo{ int i, int j }; ○ struct foo{ int i; int j; };
531 :
523 :2007/04/01(日) 16:36:36
いやそんなことねーだろと思ってもう一回
>>528 みたいに書き直したら
コンパイル通りました(゚Д゚)
どうも a[255] が a(255) になってたっぽいですorz
これだからVB厨は・・・
すれ汚しスマソorz
532 :
523 :2007/04/01(日) 16:37:49
533 :
デフォルトの名無しさん :2007/04/02(月) 00:56:41
ATLでCOM作ってたんだが、メソッドを1つプロパティを1つ追加したまではよかった(と思う) ある時突然、インターフェイスアイコン(IFoo とかの)をダブルクリックすると、 このクラスの定義が見つかりません。 と言われて開けなくなった。 定義( ATL_NO_VTABLE の派生クラス定義もIDLも )はもちろんあるし、コンパイルも正しく通る。 うまく動いてはいるんだが、IFooにプロパティを追加しようとしても、クラス定義がないと見なされているからか ウィザードから追加ができない。うんともすんとも言わない。 クラスビューがソースとリンクしなくなるのはどんな時ですか??
環境依存はスレ違い。
gccスレで聞いてましたが言語の問題なのでこちらに移転します MacOSXでg++の4系列を使い始めたのですが, 以下のコードでコピーコンストラクタがないと怒られます. #include <iostream> using namespace std; class A { A (const A &p); A &operator = (const A &p); public: A () {} friend ostream &operator << (ostream &p_os, const A &p_a) {return p_os;} }; int main () { cout << A () << endl; return 0; } エラーメッセージは test.cpp:4: error: 'A::A(const A&)' is private test.cpp:12: error: within this context です.g++-3.3では怒られないのですが, これって規格的にはg++-3.3の方が正しいですよね? powerpc-apple-darwin8-g++-4.0.1 (GCC) 4.0.1 g++-3.3 (GCC) 3.3 20030304
いやGCCの問題だろ 向こうでいい
規格として許されるソースコードなのかどうかという点では、ここでもいいだろう。
>>535 8.5.3/5によって実装はコピーすることを認められている
よってそれは移植性のないコードということになる
将来的には通るようになる。たぶん
>>538 そんな消えそうな仕様に今更ぶつかるとはorz
operator const A & () const;
をAのpublicに足して対応することにしました.
540 :
デフォルトの名無しさん :2007/04/09(月) 20:20:27
type erasure とはどんな技法(?)の事を指すんでしょうか boost::anyに使われてるぽいですが・・・
ようするにvoid*
boost.Anyを呼んでみるのが一番早いと思う。 恐ろしく短いから。 C++ Template Metaprogrammingに詳しい解説がある。 日本語だと……個人のブログぐらいしか情報がないんじゃないかな。
543 :
540 :2007/04/09(月) 23:32:46
shared_ptrでもdeletor周りに使ってた希ガス
boost::anyはかなり簡潔に書かれているから 解説が無くてもソースを読んで理解できると思う。
皆さんどのくらいのサイズからヒープ使ってます? wchar_t a[1024]; ぐらいはスタックにしてますが
面倒だから配列は使わない
>>546 状況による。スタックが潤沢にある環境ならスタックを贅沢につかうし、そうでないなら節約して使う。
vector使う
速度が必要か、最適化が効きそうな場合以外はvector、せめてboost:array
個人的にはBoost.Range/RangeExが出てからBoost.Arrayは要らない子
>>548 それを自動で切り替えるアロケータを作れ(俺はいやだ)
>>552 環境依存なモノなら作れるかも知れんが、これって環境依存じゃ意味ないだろ。
スタックとかヒープとかってC++の規格で言及されてないよな
>>554 そうなのか? スタックとヒープとフリーストアについては規格で
言及されているものだとばかり思っていたのだが。禿本とかにでてくるだけ?
>>554 std::stack
std::priority_queue
はご存知か?
今話題なのはそっちじゃないと思うが
>>556 そいつはあくまで「論理的にスタックの動作をするコンテナ」。
CPU内部におけるスタックで実装されているわけじゃない
きっと釣りだよ。そう思ってあげようよ。
>>553 Boostとか考えるに普及しているいくつかの処理系と環境に対応させれば移植性ありを謳えるさw
もっとも、そのアロケータがスタックに割り当てた後で、大き目の配列を宣言してる
関数呼んでたりすると本末転倒でお手上げだから、案外どうしようもないかもしれん。
>>560 > CPU内部におけるスタック
> CPU内部におけるスタック
> CPU内部におけるスタック
> CPU内部におけるスタック
> CPU内部におけるスタック
SPのことじゃないの?
引数がメンバ変数かそれ以外かでメンバ関数をオーバーロードすることって可能?
日本語でおk
オーバーロードにこだわらなくても、 別の関数にすればいいじゃん。
サブクラスでオーバーロードした非仮想メソッドを 上位クラスの別のメソッドから呼び出したい、 とかなんか病んだ状況を連想したw
それはCRTPでいけるだろ
ベタに書くといちいちキャスティング。 スマートに書くならBridgeパターンで機能と実装を分離、かな。 Effective C++ 第三版のcuriously recurring template patternは 知らない。
んーCRTPでどうやってやるのか思い浮かばない。 サンプルきぼん。 ちなみに俺!=564
何を解決しようとしているのか問題定義が不明。
struct A { T m; } a; T b; のとき function(a.m); function(b); この二つの関数で別々の実体を呼び出したいってことか? だいぶエスパーだな。
>>572 やはりまともに解釈するとそういうことになるよな。
無理やり考えてみると、参照で受け取って、ポインタを比較して、自前でシコシコディスパッチ。
>>564 は一体何がしたいんだ。
やっぱりオーバーロード使うべきところじゃないと思うのだが・・・
575 :
568 :2007/04/17(火) 19:29:08
576 :
570 :2007/04/17(火) 22:11:07
577 :
酔っ払い :2007/04/18(水) 00:24:57
スレ違いと分かって質問しますが void func() { static const hoge x(10.2); x.foo(); } これのxってスレッドセーフじゃなくなるんですかね? マルチスレッドでfuncの初回呼びが同時に起こると、xの初期化前を参照してしまう スレッドが発生してしまう可能性って、やっぱりある訳ですか? これが static const int x(10); とかでもやっぱり保証されないものでしょうか? 定数をしてxを抑えたいだけなのですがやっぱりlockなりなんなり 特殊な事しなきゃやっぱり駄目でしょか?
int(というか、POD)ならOK.場合によっては最適化で消えるし。
TLS使えばおk
580 :
デフォルトの名無しさん :2007/04/18(水) 00:57:39
つ関数ポインタ void (*func)()
581 :
酔っ払い :2007/04/18(水) 01:00:13
>>578 それはC++の仕様として保証されているものなのでしょうか?
>>579 それはやっぱりマルチスレッド用に準備が必要って事ですよね。
定数としてだけ参照したいんで変なコストは掛けたくない訳です。
>>580 関数ポインタ使うと??
だったらグローバルの静的オブジェクトにしろよ
>>581 そもそもC++の規格にはマルチスレッドに関する記述がでてこない。
よってマルチスレッド関連はすべて実装依存。
584 :
デフォルトの名無しさん :2007/04/18(水) 01:07:30
今夜はおかしな書き込みばっかだな
お前ら規格書のどこに書いてあるかそれだけを示せ
586 :
酔っ払い :2007/04/18(水) 01:32:30
>>582 グローバルにしても翻訳単位が違うと同じような問題が起きる訳ですよね?
>>583 そんな気はしてました。スレッドセーフは保証されないと言うことですね。
ただ単にスレッドセーフかそうじゃないか聞きたかっただけです。
587 :
583 :2007/04/18(水) 01:33:10
初期化のスレッドセーフが気になるなら、 シングルスレッド状態の時に初期化しちまえw
ワラタ
>>590 書いてないなから全部読めタコって言えばいいだけじゃん。
そっちのほうが回りくどいし痛いのに「〜って言えばいいだけ」っていうのがまぬけ。 引くに引けないからってそこまで暴走しなくていいじゃないか585よw
はぁ? それがあくまのしょうめいですかそうですか
なんでそんなに必死なの
ヒント:異常者の自作自演
「酔っ払い」より見苦しい二人は相当ダメだなw
class Base {}; class Derived1 : public Base {}; class Derived2 : public Base {}; int main() { Base* pObj = new Derived1; Derived2* pDri = static_cast<Derived2*>(pObj); delete pObj; return 0; } こういうダウンキャスト処理はもしかして未定義ですか?
いいえ
no, this is not MITEIGI.
dynamic_cast失敗しないかコレ
603 :
600 :2007/04/18(水) 23:20:36
よく見たらダウンキャストじゃねーしwワロタ
>>599 はプログラムを今すぐやめること
>>599 未定義も糞もDerived1の実体を
Derived2のポインタで操作したらあかんだろ
あーありがとう クラスのメンバを完全に省略してしまったので 質問の意図が伝えられてなかったかもしれないですけど、なんとなくわかりました まずクラスの型安全がほしいのにstatic_cast使うって発想がだめで 何のためのdynamic_castかって話なんですね のうみそおわとるなー
おまいのやってる事は単なるポインタの再解釈であって ただのreinterpret_cast
こういうのクロスキャストっていうっだっけ。 エロス。
言わないと思うけど
こんな意味のないキャストに名前なんかつけるのか? 名前はなにげにカッコイイから気に入ったけどw
クロスキャストは多重継承しているオブジェクトを 親Aのポインタから親Bのポイントに切り換える事じゃなかったっけ?
>>605 dynamic_cast出来るわけがないし、
reinterpretすれば別だが、幸せな結果は訪れないぞ。。。。
reinterpret_cast って意味有るの? (hage*)a でいいやん
それいったら、全部 Cキャストでいいわけだが。
そういうお馬鹿を排除するために必要。
1. キャスト意図がよく分かるし、意図と違うキャストだとコンパイルエラーになってくれる。 2. キャスト位置が検索ですぐ列挙できる。 比較的安全なキャスト(static_cast)と 危険度の高いキャスト(reinterpret_cast, const_cast, dynamic_cast)を 分離したわけだ。 何でもかんでも同じ文法にしてしまうと危険だから。 ただ、この長過ぎる名前はどうにかして欲しいもんだが・・・。 scast, rcast, ccast, dcast でいいじゃん。
そうやってキャストする気をなくすために長い名前にしたんだよ
「目立つように」ってのは禿本にも書いてあったな。
dynamicとstatic比べてdynamicのほうが危険ってケースあったっけ?
dynamic_castは安全だが高コスト。
話の流れと関係ないが C++スタイルのキャストは見慣れてくると 任意の型を受け取って指定した型を返すテンプレートクラスのように見えてくる これは何か意図しているんだろうか
>>617 #define dcast dynamic_cast
でおk
>>622 正に見た目言語組込のキャストと同じになる関数を作れるようにするため。
ex) boost::lexical_cast
ライブラリの設計がキャストほぼ必須なのに そのライブラリ側で用意してある独自のキャスト関数の名前が糞長いって なんかの嫌がらせですか
dynamic_cast が必要な状況自体が あまり出てきて欲しくないよな。 ダウンキャストかクロスキャストが必要な状況なわけで。
boost::polymorphic_downcastはよく使うぞ
628 :
デフォルトの名無しさん :2007/04/21(土) 22:45:48
インラインクラスのメンバ関数ってinline 宣言したのと同じ事になるんでしょうか?
インラインクラスってなあに?
ローカルクラスの事かと
それならクラス定義内に関数定義を置くことになるから、暗黙の inline が利くことになるね。
つーか何でinlineの実装はhファイルなのよVC
だってinlineだから
普通にinlineキーワードを頭に置けば良いんじゃないの?
マジで?
>>632 どんなコードになってるか分かんなかったら
処理を埋め込めないじゃないの。
Java や C# があるこのごろでは、コンパイル単位の概念なんて C/C++ 特有とも言えるだろう。
WPO使え
フツー .inl だよな
640 :
デフォルトの名無しさん :2007/04/22(日) 21:19:45
ソケットを使って、ヤホーから株価をダウンロードするソフトを作っています。 銘柄コード毎にループでsend, recvすると sendでConnection reset by peer、 writeでBroken pipe っちゅうエラーがでてデータを取得できません。 どうすりゃ良いんでしょうか。
writeでBroken pipe ではなくて、 recvででBroken pipe でした。失礼しました。
ソケットは環境依存だなぁ。Winsockとかsocketとかあるし。
そうっすか。。。 macなので一応unixですね。 わからーん(爆。
>>640 スレ違いだし、激しく迷惑だからやめてね。
>>644 は人間関係苦手。柔軟性なし。
自分の判らない事には関わりたくない。
多分童貞。
スレ違いなのは確かだろう 何絡んでんの?
ム板ってスレ違いにうるさいよな。 受け入れてたら何が何だか判らんスレだらけになってしまうから、仕方ないんだろうけど。 640はネットワークプログラミングの本とtcpとかの仕組みの本読め。 でも、猫でも判るとか銘打ってるのは辞めとけ。
職業柄カオスな状態になるのが耐えられないんだろ
スレ違いに気づかない and 気づいても居座って回答を求める奴が大杉 後者はホント勘弁してくれ
>>648 なるほど。
こういうところでスレ違いなのに暴れている奴は
原因も自ら作り出しているという事か。
相談室、って言うスレタイが微妙だな。
初心者尋問室
>>653 うわぁ、エピたんがしつっこく絡んでるw
エピって仕事のストレスを初心者にぶつけるのが好きだよな
2ちゃんのほうがまだマシだと思ったのは俺だけじゃないハズw
えぴ引き合いに出そうが出すまいが てめぇが最悪なのには変わりねぇって バーカ
えぴ乙
初心者尋問室ワロタw
kusakabeよりまし。
kusakabeか・・・。 嫌なものを思い出させてくれる。
最近あちこちのスレでファビョってる中年というのは○usa○abeか?
kusakabe引き合いに出そうが出すまいが てめぇがクソなのには変わりねえよバーカ
また粘着基地外か
kusakabe乙
万年火病を起こしている中年k○s○k○b○
いやこりゃ質問者が悪いよ。 2chならネタ扱いで回答すらしてくれんのだから まだマシじゃね?
と、エピが申しております
>>669 あれはどう見てもネタ師だろう。
問題設定も質問内容もあまりに稚拙過ぎる。
スルー力が足りないのではないか、と。
常識を下方向に本気で逸脱している人間って、割といるからな。 そう簡単にネタとか言い切れないものがある。
勉強したいから本紹介しろ、でもずうずうしいのに、 こいつときたら「テキスト」紹介しろ、だぜぇ? レスはぽんぽん付ける癖に、 問題解決する気は全然ないしwww どう見ても2ちゃんでいつも暴れてる単発質問厨だろ
いやしかし、初心者があのサイトにたどり着けるんかな。 ネタの可能性も捨てきれない。 俺は初めて知った。 C#やらないからかな。 ランキングが有名人ばかりで笑った。
匿名で他人のコミュニティ引っ掻き回すのが趣味の狂人だろうな
17:33分から49分までの16分間に擁護レスが5件か。
まあそう僻むな。 深夜2時〜5時台の連続レスや 過疎スレの不自然な質疑応答と比べりゃ よっぽど健全だろw
てかどの辺が擁護なのかまるでわからないんで 説明してくれ
結論:エピ工作乙
エピも立派な基地外である事が証明されますた
匿名で有名人叩くのが趣味とはとんでもねぇ狂人だな
有名人にはキチガイが多いんだよ
カオスな状況には拒絶反応出るのが職業柄なら、 ダラダラ下らん事話すのは気にならないのも職業柄だな。
みんな気が済んだらそろそろ相談室に戻ろうぜ。
ていうか、本題のネタがないんだよ。 個人的には好きなんだが、明らかにこのスレのタイトルは失敗だったね。 前スレと比較して、どうみてもこのスレタイのせいで質問が減ってるだろ。
凝ろうとしたのがあだになったんだな 1を責める気は無いけど
ぶっちゃけ2chで質問するメリットなんてほとんどない
基地外がレスしてきたら少なくともスルーしよう
stringstreamでlexical_castみたいなの作ったのだが、 みんなが遅い遅い言うもんだからatofとかに変えたら 返って遅くなった。 STL伊達じゃない
さぁみんなネタ作って速く埋めようぜ! 次スレタイトルは dynamic_cast<part57>(C++相談室) だ
真夜中だってのに元気だね
つい癖で for(int i=0;i<max;i++) と書いてしまいますが、 i++ は ++i としたほうがやはり速いのでしょうか?
>>693 速度は実測が基本。
int なら差はでないだろうとは言える。
何で差がないの?
#define int unko だから
前々スレあたりでやった気がするな 速い遅いではなく、そうする意味で考えろという結論に達していたようなうやむやになったような
まあそんなこと気にしても、一生の間動かしても ここに書き込んだ時間より差が出ることはないな
差があるかどうかを聞くより、どんな時に差が出るのかを聞いたほうが話が早いな。
よっぽどなコンパイラじゃない限り、整数型変数を単独でインクリメントする目的なら同じコードを出力する。
i++とか見ると、素人くさいなと思う。
玄人はどう書くのか、聞いてもいいか?
チェック柄のやつらに一言言いたい シャツをズボンに入れるな。出せ。 それだけでかなり変わる。
シャツをズボンから出して良いのはお子様だけだ
>>703 悪くはないだろうけど、今度は日本語の素人、あるいは論理の素人くさいな。
> 論理の素人くさいな 素人くさいな
背景知識が欠如している人間が知ったかかますのを指して 「論理の欠如」って言うのって、それなんて火病?
>>704 韓国人と日本人を見分けるポイントの一つらしいからな。
(もうひとつは髪型)
スレタイも空気も読めないのが異常者の特徴
オナホとバイブがセックス
++i
++iにする理由って不変な表明とかいうのと関係あるの?
一度イテレータを自作してみれば分かるよ。
アッ―!! 増加前のコピーを作ってそれを返すことによるオーバーヘッドが問題になるのか
そういうこと。 まあ、イテレータじゃないと問題にならないけど。
私服とビジネスカジュアルを混同してはいけませんよ糞餓鬼ども
ドレスコードが厳しいとファッションセンスがもろに出るので 常にスーツですが何か
++iとi++の差が気になるような状況でforループってのがそもそも
“時期尚早に最不適化をしない”っつうし、意味もなく悪いスタイルを採用するのは止めたほうがいいね 訳も判らずスタイルを真似するだけっつうのも問題だけど、天邪鬼よりよっぽどマシ。
つ最不適化 つ天邪鬼
どっちの話題も実害がなきゃいいよ。 「俺にとって目障りなのは実害」って話はどっか隔離スレでやってくれ
ループカウンタのインクリメントに++iを使うのは悪いスタイルなの?
いや別に
>>724 無意味に i++ を使うのが悪いスタイル。
++iが自然な書き方って前提なんだな
ぬるぽの話題ここまで
結局ここって「初心者の質問を火種にして中級者どうしで荒れるスレ」だよな
>>727 俺は自分のソースにはそういう縛りをあえて持ち込んでるな。
無作為に書き方を選ぶより、i++に必ず「そうじゃなくちゃいけない理由」を持たせたほうが、
まぁ僅かではあるけど、読んだ時に理解が早いし。
窮屈な思いを強いられる縛りなら適用も慎重になるけど、この縛りは別にそんなこともないしね。
まぁ細かい話だし、各人好きにすりゃいいことだと思うけど。基本的には。
i=0ではiが左側、だから次の文でもiを左側にしてi<N、 そうなりゃ次の文でもiを先頭に置きたくなるのは変なことじゃないし無意味とは言わない。 それを抑えて全部++iにしたきゃそうすりゃいいし 本能に任せて適当に書くときはi++ってしてもいい。
>>728 同意
このネタはそんなひきずるべきネタではなく、
単にIteratorの実装上は違いが出るね、
でおしまいだろう。なんでつまらない話をズルズル引きずるんだ
自分の習慣を改めるべきだと認めたくない人が居るから。
一応マジレスすると、C言語レベルでは ++iは、本体実行前にインクリメント i++は、本体実行後、次のループに移る前にインクリメント という差があるだけ。 改めるとか改めないとか言い出すべき問題ではない。 もしかして、do{}while() は全廃して while(){} に統合すべきだ とか下らないコダワリを主張したい人?
習慣なんて、学習の糧を得た身からひり出た糞でしかないのにな。
変なのがへばりついてるな
スレタイも読めない馬鹿がいらっしゃるようだしな
でもお前らvoid main()とか書かれたらどうせ噛み付くんだろ
馬鹿にするだけで噛み付きはしないだろうな。
どうせとか言い出した時点で負けだろ。 息をお引き取りください。
これはひどい
C++的にはvoid main()は許容範囲内
組み込みならよくある話
>>742 デマを流すな。
3.6.1p2 より
"It shall have a return type of type int, but otherwise its type is implementation-defined."
C++ FAQ のコレが好き。
"main() must return int. Not void, not bool, not float. int. Just int, nothing but int, only int."
745 :
デフォルトの名無しさん :2007/04/28(土) 19:43:01
次のプログラム例 std::string str1; while (getline(std::cin, str1)) { // .... 何か実行文 .... } できれば、次の例のように、getline関数の戻り値と同じ型 の変数を間に通して処理したいと思ったけれど。 std::string str1; 型 r = std::getline(std::cin, str1); while (r) { // .... 何か実行文 .... r = std::getline(std::cin, str1); } rの型は、std::basic_istreamかと思ってそれで宣言すると 「クラスのテンプレート名で仮引数リストの指定がありま せん。」と言われてコンパイルエラーになるし。 困ったもんだ。基本的なところのように思えて、すごく難しいな。 同じ型の変数を宣言しようとなんか考えたら、C++の完璧な知識が 必要なのか。
処理系定義なら未定義よりはマシだな。
>>745 bool でいいんじゃね?っていうか、その置き換えの意味が分からん。
>>745 std::basic_istream<char>もしくはそのtypedefであるstd::istream
つうか普通にドキュメントにプロトタイプ書いてあるだろ 意味がわからん
>>745 は「標準ライブラリの関数の戻り値を調べる方法は無い」とか、
あるいはそこまでいかずとも、「調べずに使うのが普通で、調べるのはちょいと特殊な行為」
くらいには思ってそうな気がする。
>>745 マジレスするとC++使うのは100年早い。
今のお前に解決法教えてもそれを実行できるとは思えない
>>745 何考えてるんだ
初歩的な問題集でも一通りやってみなよ
すぐわかるから
>>734 >一応マジレスすると、C言語レベルでは
C++言語レベルでは、一時コピーを作るかそうでないかの意味だろか。
既存のセマンティクスを無視して後置インクリメント演算子で*thisを返すクラスがあってもいいじゃない
>>755 そんなアホ仕様なら何も返さない方がまだマシだ。
MSDNやF11で標準図書館のファイルに入ってgetline調べてみてstd::basic_istreamかと思ったけど、 正解には至らんかった。 キーワードtemplateもあったし、その学習も必要かの。
std::istreamクラスに=演算子って定義されてたっけ?
ないね。 でもstd::getlineは参照を返すからそれで受ければいいと思う。
そうか、クラスを返すのだから、初期化するためのコンストラクタを調べるのが解決の鍵か。
代入しろなんて書いてないみたいだけど
>>734 一応マジレスすると、
本体実行ではなく、ループ継続の判定実行
な
>>762 r = std::getline(...
>>745 そもそも何でgetline()の戻り値を変数に一時蓄えたいと思ったのか
よくわからんが、↓のようにすれば一応出来る。
ただし、リファレンスなので、初期化は可能だが再代入ができないので注意。
再代入がしたければ、かわりにポインタを用いて
std::istream *isp = &std::getline(std::cin, s);
とでもするんだな。
#include <iostream>
#include <string>
int main()
{
std::string s;
for (;;) {
std::istream& isr = std::getline(std::cin, s);
if (!isr) break;
std::cout << s << std::endl;
}
return 0;
}
C++のIO図書館でファイルを開く方法をヒントとして思い付かなかったのは不覚だ。
うひょー
>bool でいいんじゃね?っていうか、その置き換えの意味が分からん。 >そもそも何でgetline()の戻り値を変数に一時蓄えたいと思ったのか 他の言語でデバッグの利便性や、後から拡張するときのために、そういう 書き方を習慣にしてる。
そして、あくまでgetlineは一つの例として出しただけ。 それだけ特別というわけではない。
>>769 ほんとで必要なのがわかる場面でなけりゃ、やめてほしい。
functional周りではどうしてるんだろう…
STLでstrtokみたいなことが出来る関数ってありますか?
>>STLで
boost使うのが嫌けりゃ自作しろ
>>755 つstd::insert_iterator
Loki 0.1.6のSmartPtr.hppの1308行目に return OP::template Merge( rhs ); とあるのですが、このtemplateって一体何者ですか?
Mergeがテンプレートであることを明示 typenameみたいなもん
じゃあなくても問題ないってことですか?
この手の宣言は入れないとエラーするから入れてあるんだと思うけど。
はじめて知った・・・ typenameは知ってたけど templateはどんな時につけなきゃいけないんだろ コンパイラがMergeをテンプレートであると一意に解釈できない場合があるって事かな
はじめて知った・・・
存在はしってたけど、自分で使うハメになったとない。 複雑sなtemplateあんまり書かないからだろうけど。
struct Foo { template <int T> static void a(int x){} static int const b = 0 ; } ; struct Bar { static int const f = 0 ; } ; //コンパイラ「テンプレート関数呼び出しのようだな、よしよし」 Foo::template a<1>(0) ; //コンパイラ「ええと、bと1を<演算子で比較するのと、>演算子で0と比較するのか。無意味に括弧使っているけどオッケー」 Bar::b< 1 >(0) ;
instance.template func<hoge>(arg) 以前、こう書かないとコンパイルできない状況に遭遇したことがある。 多分、gccのバグか何かで。(うろ覚え)
787 :
785 :2007/05/01(火) 18:25:15
なんかレス思考中の無駄なコードが混じった。
>>786 規格通りでは?
>>785 つまり
struct Foo {
template <int> void f(int) {}
};
ってあったときに
Foo::f<0>(0)が
>>785 の下のように解釈されちゃうってことか
で
Foo::template f<0>(0)とするとそう解釈されなくなると
VC8だとどっちでも通ったけどgccとかだとダメなのかな?
かといってtemplateをつけて書くようにすると逆に昔の
コンパイラで通らなくなるような気がする
789 :
786 :2007/05/01(火) 18:35:23
ぬ、規格通りなのか。すまん。w
>>788 g++ でも通った。
というかこれ、OP が typename テンプレート引数の場合のみで使われる文法だと思う。
>>790 直接テンプレート引数じゃなくても、テンプレート引数に依存してたら要るよ。
>>791 ああ、それもそうやね。
>>792 こういうことだと思う。
#include <iostream>
using namespace std;
class A {
public:
template <typename T> class B {
public:
static T foo() {
return '0';
}
};
};
template <typename T> class C {
public:
static void bar() {
cout << T::template B<int>::foo() << endl;
cout << T::template B<char>::foo() << endl;
}
};
int main() {
C<A>::bar();
}
これは確かに使いどころが発生しづらいな。
>>793 これはつまりtemplateをつけないとBがtemplateかどうかわからないから
templateってつけないとB<int>とかB<char>って書けないっていうこと?
でもそれだと
>>778 のはtemplateいらないな・・・
>>795 Loki のコードは見てないが、
OP がテンプレート引数で
Merge が関数テンプレートで
rhs の型がテンプレート引数に依存してるんじゃないの?
>>793 のはB<>って書いてるからtemplateが必要
って気がするけど、
>>778 templateであることを
明示する必要ないと思うんだけど
何か根本的な勘違いをしている・・・?
例えば・・・ #include <iostream> using namespace std; class A { public: template <typename T> static int Merge(T n) { return n; } }; template <typename OP, typename T> class C { public: static int hoge(T rhs) { return OP::template Merge(rhs); } static const T n = '0'; static void bar() { cout << static_cast<T>(hoge(n)) << endl; } }; int main() { C<A, char>::bar(); C<A, int>::bar(); } template なしでも通るみたいだけど。 template と書いてあったら Merge が関数テンプレートでない場合には 通らないという違いが発生して良さそうだと思ったんだけど、 g++ だと通っちゃうな・・・。規格だとどうなってるんだろ。
「相談室」って頼りない名前だな。 「C++言語なら俺に聞け」のタイトル名にはならんのかね。
たぶんならないだろう。
こんな感じか? C++なら、俺に聞け! 1 名前: ビル・ジョブス おれは禿。今までC++でプログラムを一生懸命作ってきた。 スクリプト言語は知らないがC++なら誰にも負けない...
「C with classes part**」 でいいじゃん
C with classes 1 名前:禿 投稿日:1979/03/??(?) ??:??:?? 暇なんでCみたいだけどネットワークトラフィック解析にふさわしいツールつーのを 作ってみるわ。もちろんUNIXネイティブな。少しまちなー。 2 名前:禿 投稿日:1979/??/??(?) ??:??:?? 暇つぶしにぬぼーと新しいツールを設計中。 現状では、Simulaと似たパラダイムだけどあれと同じだと重そうなんで コンパイラはCと同じだけど、C with Classesはソースを 単にマクロで置き換えてCコンパイラに丸投げする方法を予定。 19 名前:禿 投稿日:1979/10/??(?) ??:??:?? あげちったい(T_T)
細かいことだが、正しくは C with Classes だろ。
806 :
デフォルトの名無しさん :2007/05/03(木) 11:57:46
コンテナについて質問です。 下記のようなクラス構成があったとして、 ひとつのコンテナにProductAとProductBを一緒に詰め込む ことはできますか? 混在しているProductA/ProductBを 基底クラスの参照で取り出して、順次処理を行いたいのですが…。 class ProductBase{ virtual void Get() = 0; } class ProductA : public ProductBase{ void Get(){ // ProductA固有の処理; }; } class ProductB : public ProductBase{ void Get(){ // ProductB固有の処理; }; }
>>806 ProductBase* のコンテナを作るのが基本。
boost::shared_ptr<ProductBase> のコンテナにすると楽ができる。
今なら boost::ptr_container が便利かもしれない。
>>806 生のポインタだとこんな感じ
807のが良いと思うけど
#include <vector>
#include <algorithm>
#include <functional>
using namespace std;
class ProductBase{
public:
virtual ~ProductBase () {}
virtual void Get() = 0;
};
class ProductA : public ProductBase{
void Get(){ /* ProductA固有の処理; */ }
};
class ProductB : public ProductBase{
void Get(){ /* ProductB固有の処理 */ }
};
struct Delete{
template <typename T> void operator () (T *p) {delete p;}
};
typedef vector <ProductBase *> Container;
int main ()
{
Container container;
container.push_back (new ProductA ());
container.push_back (new ProductB ());
for_each (container.begin (), container.end (), mem_fun (&ProductBase::Get));
for_each (container.begin (), container.end (), Delete ());
return 0;
}
809 :
806 :2007/05/03(木) 12:57:29
810 :
デフォルトの名無しさん :2007/05/03(木) 20:45:06
テンプレートの仕様ってとてもコンピュータ言語の仕様とは思えないんですが、 何考えてあんな阿呆みたいな事(学生の思いつきレベル?)やってるんでしょうか。
>>810 何が不満で、自分だったらどういう仕様にするのかを語ってくれ。
>>810 嫌ならC++使うのやめれ。STLも使うな。
文法的に汚いのは分かるが、 テンプレートの重要性が分からない奴は池沼
814 :
デフォルトの名無しさん :2007/05/03(木) 20:57:00
>>811 あれを見て、いかに阿呆かもわからず使えてしまうような人間には
説明しても無駄なので、却下します。自分の頭で考えて下さい。
>>812 好き嫌いだけで動ける人の発想は柔軟でいいですね。
自宅警備員が趣味でやっているぶんにはそれでいいのかもしれませんね。
| | | | | | | | | | || | | | | | レ | | | | | J || | | | | | J | | | し || | | | レ | | レ| || J | J し | | || J | し J| J レ /V\ /◎;;;,;,,,,ヽ _ ム::::(l|l゚Д゚)| …うわぁ ヽツ.(ノ::::::::::.:::::.:..|) ヾソ:::::::::::::::::.:ノ ` ー U'"U'
結局具体的な指摘は無しかよツマンネ
810はテンプレートに親を殺されたんだよ
みんなそれぐらい文章から読み取れよ
うんうん、
>>810 は全て正しい
語ることもなにもないな
Javaの存在意義が分かる書き込みだな
いいえ、家事手伝いです。
いいえ、手伝いません。
822 :
デフォルトの名無しさん :2007/05/03(木) 23:01:38
注:私の有意義な発言に対し、自分の理解不足を棚に上げ煽り、1行レス で返す方が多いようですが、そのような方はスレの皆様を混乱させるだけでなく スレの雰囲気を崩しかねないのでお黙り下さい。 また質問者は回答者に知識を披露する場を与える貴重な存在なので、 質問者を見下した回答、あまりにも儀礼を欠いた回答も厳重に禁止いたします。 忙しい中、少ない時間の合間を縫って質問しに来てるわけですので、 その辺ご承知下さい。なお、当方が質問に対して有意義な答えであると 判断した方には評価いたしますので各自よく調べ、よく考え正確な回答をするように。
>>810 ある程度のことは「C++の設計と進化」という本に書いてある。
原作が出版されたのは、ISO規格が出るか出ないかという頃で結構古いけど。
俺が思うに、当時メタプログラミングに関して大した前例が無く、
その可能性に対してC++のテンプレートはあまりにも拙過ぎるということが
誰も判らなかったのだと思う。
あと、例によってCとの互換性が大きく立ちふさがったというのも一因に違いない。
824 :
デフォルトの名無しさん :2007/05/03(木) 23:14:14
>>817 質問に対する反応として、それは全面的に間違っていますね。
ある事実を提示しているのではなく、その件に関して「どういう事実があるのか」を
問うているわけですから。
もうちょっと頭を使って噛み付いてください。
826 :
デフォルトの名無しさん :2007/05/03(木) 23:16:34
>>819 いえ、自宅警備員ではないので好き勝手にはできない、という意見が書いてあるわけです。
これは学年でいえば、小学4年生くらいなら正しく読み取れなくてはいけないところですね。
template のヘルプを見たら 将来の為に予約されていますと書いてあった時代が懐かしい。
828 :
デフォルトの名無しさん :2007/05/03(木) 23:19:31
>>823 そうですね、「想像しきれなかったもの」がすごくたくさんあったのだろう、というのは
とても腑に落ちる話です。
うざいので続きはVIPでやってくれ
830 :
デフォルトの名無しさん :2007/05/03(木) 23:20:17
D の template はどうだろう?
832 :
デフォルトの名無しさん :2007/05/03(木) 23:22:33
>>829 この話題に支持が集まった結果として話題が続いているわけですから、
あなたの感じる個人的な「うざさ」など無力なのです。
833 :
デフォルトの名無しさん :2007/05/03(木) 23:27:00
>>827 exportを懐かしむ時代はこないだろうな。
おれは普通に経緯とか、メリットを聞きたかっただけなんだけど。
834 :
デフォルトの名無しさん :2007/05/03(木) 23:28:57
auto_ptr<T> m_hoge;ってのがあったときに こいつをぶっこして作り直す関数内でdelete m_hoge.release()ってしてから m_hoge = auto_ptr<T>(new T(...))ってするのってリークしたりしてヤバいですか?
メモリ破棄を自動化してるのに、何で自前で破棄するんだ。 というか、何故 reset を使わない?
C++のテンプレートに萌え。 確実に。
837 :
デフォルトの名無しさん :2007/05/04(金) 09:22:38
reset()だと m_hogeの実体もぶっこしてくれるんでそか? ちなみにこれはある意味例外処理みたいなもんなんで、 他の部分では素直にauto_ptrタソの恩恵受けてます
reset使って解決しました resetで所有権を放棄した後に新たなオブジェクトをnewしてもちゃんと開放してくれるんですね… やっぱスマポはすげーや
>>838 順番逆。 new が成功した後に元のポインタが破棄される。例外安全って奴だ。
840 :
デフォルトの名無しさん :2007/05/04(金) 20:06:56
>>840 あ、画像じゃなくなってる。けどコピーや保存はできないね。
いくらか軽いのと、テキスト検索が効くのが今まで違うところか。
いや、前から保存できる。
843 :
841 :2007/05/05(土) 00:35:25
あ、新しいやつも保存できた。前の画像のやつと入れ替えとこ。
1ファイル目と2ファイル目の区切りが変なところだ もともときりのいいような改ページなんてなかったけどさ それだったら前みたいに1つのファイルで良かったのに
どうせわざとだろ。テキストになってもクソ重いし。どうやったらこうなるんだ?
>>846 現行の規格である 2003 にはまだ含まれていない。
>>3 の一番下のリンクから手に入るドラフトにはすでに記載があるので
おそらく次回の改定で含まれることになる。
・・・んだけど、 __STDC_FORMAT_MACROS についての記載が無いな。
どうなるんだろう。
>>847 なるほど。long long とかも入るみたいですね。
こりゃ楽しみです。
849 :
デフォルトの名無しさん :2007/05/18(金) 22:58:51
最新の C++ ドラフト見たら enum の最後の要素にコンマつけていいことになってますが、 GCC 4.0.1 だとエラーになります。 今の C++ の規格票ではまだつけていいことにはなってないのでしょうか?
852 :
デフォルトの名無しさん :2007/05/23(水) 23:45:39
cppUnitって実際どうなのでしょうか?
けっきょくは主観でしょう。
boost::testの方が好き >852
UnitTest++とか色々あるよね
明晰なCの血を引き且つ強力な柔軟性、多才性に富んだ、高速なネイティブを吐くC++を生み出したBjarne Stroustrupは神。
なにこいつキモい
人工無能っぽい pythonスレでもでてた
結婚すれば働かなくても夫が金稼いでくれるし 家事なんて一日2時間位でちょちょいとやればOK 仕事と違って往復の時間も無駄にならないのも大きい 子供も産めて家族と団欒出来るから孤独にならないし 結婚しないとか言ってる奴は負け組みwww もっともっとメディアは恋愛至上主義の洗脳活動を頑張って欲しいな^^v
誑し込めば働かなくても女が貢いでくれるし 家事だってかいがいしくやってくれる 仕事と違って往復の時間も無駄にならないので遊び放題 子供生ませると面倒だけど二股できるから孤独にならないし 結婚するとか言ってる奴はあほすぎwww もっともっとメディアはギャンブル至上主義のパチンコ宣伝をがんばって欲しいな。
スレ違い
struct xx { int len; char name[0]; }; いわゆる、可変長構造体のことなんだけど、 C89では最後のメンバーに0は不可、C99はサイズ0でも許されるようになった。 これはわかる。 では、C++では、サイズ0のメンバーはどうなの? 手元の処理系で GCC(3.4)(-Wall) デフォルトだとC,C++とも警告なしでOK BCC(5.6.4)(-W) Cだとコンパイルエラー、C++だと警告なしでOK VC(2003の)(/W4) どちらも、「非標準だよ」という警告が出る 規格的にはどうなってるのか、知ってる人教えてくれ。
>>893 C++だとダメだったはず。
次の規格でどうなるかは知らん。
お、ありがとう。 やっぱ駄目なのか。 ついこの間まで、C++ではOKになったと思い込んでた。
このスレのレベルが急速に低下してるな……
sizeof を使わずに name の offsetof を使えば name を除いたサイズが取得できる。
class X { public: X( int i )i_(i){}; int i_; }; Func0( X x ) { printf( "%d\n", x.i_ ); } Func1( X &x ) { printf( "%d\n", x.i_ ); } int main() { Func0( X( 10 ) ); Func1( X( 10 ) ); return 0; } Func0はOK Func1はコンパイルエラー 何でですか?
>>868 コンパイラの言うことに耳を傾ければわかるよ。
const X& x ならおk。 というか、戻り値の型は
>>870 甘やかすなよ。本気で本人の為にならんぞ、それは。
何で const X& x ならおkかまでは言ってないぜ。
>>872 それでエラーが出なくなったら、せっかくのエラーメッセージを読む機会が潰れるだろ。
こういう奴は、警告なんか平気で無視するからな。
ぶっちゃけ、他人がどうなろうが不幸になろうが知ったことじゃない
お前だけ妙に切り口が青いな。
#include <cstdio> class X { public: X( int i ) : i_(i){}; int i_; }; void Func0( X x ) { printf( "%d\n", x.i_ ); } void Func1( X &x ) { printf( "%d\n", x.i_ ); } int main() { Func0( X( 10 ) ); Func1( X( 10 ) ); return 0; } コンストラクタの所にメンバ初期化リストの形にして戻り値指定したら constにしなくても通っちゃったよ?なんで??
何も変わってないように見えるが
879 :
877 :2007/06/18(月) 13:15:13
error C3646: 'i_' : 不明なオーバーライド指定子です error C2061: 構文エラー : 識別子 'i' error C2091: 関数は関数を返せません。 とゴルァされたからメンバ初期化リストの形になるように : を追加(それ以前に前の形じゃ何やってるかイミフ、マジで解説欲しい) X( int i )i_(i){}; → X( int i ) : i_(i){}; error C4430: 型指定子がありません - int と仮定しました。メモ: C++ は int を既定値としてサポートしていません warning C4508: 'Func0' : 関数に戻り値の型が指定されていません。戻り値を void 型と見なします。 とゴルァされたから Func0( X x ) → void Func0( X x )に変更 Func1も同様
そもそも前の形じゃコンパイル通ってないんだから 解説しようがない。
881 :
デフォルトの名無しさん :2007/06/18(月) 13:38:42
Aカップなのに見栄張ってBカップのブラ買っちゃったけど後で困っちゃってる子ってどう思う?
俺が揉んで大きくしてあげたい
>>879 まぁなんていうかCなりJavaでしばらく修行積んどけばおk。
明らかにプログラミングそのものに慣れてなさすぎる
いやCと違って暗黙的に戻り値がvoidにならないこととかは分かってるよ
ただX( int i )i_(i){};の形のコンストラクタとか(どうせ:の付けわすれだろうが)、
あと
>>870 の意味がよくわからねぇconstにしなくても上記のもの直したらエラーでないし、
constにしても上記の点をそのままの状態ならエラーのまま
もしかして嘘言ってるのかな?と気になっただけ
まぁ経験不足ってのは否定しないけどね
886 :
868 :2007/06/18(月) 20:09:56
なんかいきなりスレが加速してますが。 戻り値がないとか:が抜けてるとかはごめんなさい 適当に書いたんで。 聞きたかったのは Func( X x(10) ); という形で、なんで Funcの引数が値渡しならコンパイルが通って、 リファレンスだと通らないのかってことが聞きたかったんです。
887 :
868 :2007/06/18(月) 20:14:21
書き忘れです g++4.1.2使ってて、 invalid initialization of non-const referenceってエラーです constリファレンスじゃないとダメなのはなぜ?
一時オブジェクトは非constな参照引数に渡せないって規格で決まってるから
日頃過疎ってて、初心者が書き込むと一斉に群がる・・・ なんか悪い意味でcppllと同じ流れになってんな。
この手のスレは自称中級者位が回答するから
>>887 エラーメッセージのとおり、非const参照型のオブジェクトは、
左辺値でしか初期化できないことになっている。
void f(double& x)
{
x = 1.;
}
ここでf(1)と呼出ができても何も有難味がない。
右辺値を渡せるとしたら当然次のコードもコンパイルできることになる。
int i;
f(i);
これは、iで初期化したdouble型の一時オブジェクトを作りそれをfへ渡すと解釈される。
そのため、iに1が代入されることは、決してない。
これはバグの温床になるということで、参照型オブジェクトを右辺値で初期化することは禁じられている。
逆にconst参照ではこういう心配が不要で、
また、関数を呼ぶときに、値渡しとconst参照との違いを意識させないためということもあって、
const参照は、右辺値でも初期化できることになっている。
>右辺値を渡せるとしたら当然次のコードもコンパイルできることになる。 ここがよくわからない 右辺値の参照と、暗黙な型変換時のコピーが何故結びつくのか? 右辺値のポインタ渡しが危険って事は分かるけどそれと関係するの?
>>892 暗黙の型変換は、変換後の型の一時オブジェクトを作るということ。一時オブジェクトは右辺値。
だから、f(1)もf(i)も、実引数に右辺値を渡しているという点では同じ。
f(double&)にint変数を食わせた時に、昇格した一時doubleオブジェクトが 渡るなんて動作をするとしたら、C++の落とし穴を増やすだけ、って話でそ。 素直にコンパイルエラーになって欲しいだろ、と。
895 :
883 :2007/06/18(月) 22:35:31
>>884 いや868が写し間違えしまくったまま
コンパイルエラーに混乱してんのかと思った。
>877とかf(double&)にint食わせるとかはBorland C++ 5.0では警告が出るだけでコンパイル通ったはず。
手元のVC2k3はちゃんとエラーになる
896 :
868 :2007/06/19(火) 02:22:29
>>891 ありがとうございます。
良く考えられてますね。
写生しそうなくらい感動しました
すいません、どなたかご存知でしたら教えてください。 template<?????? Method> struct A {...}; の、このMethodにメンバ関数を突っ込みたいのですが、 どういう型として定義すればいいんでしょうか? template<typename T,void (T::*Method)()> struct A {...}; A<SomeClass,&SomeClass::SomeFunc> a; というのは出来たのですが、これだと冗長なので A<&SomeClass::SomeFunc> a; としたいのですが…。
boost::functionとboost::bindを使っても boost::function< return_valuse(args) > f = boost::find(&T::Method, Instance); だしなぁ メンバ関数を扱うAにさらに引数と戻り値サポートさせるとなるとboost::functionを独自で実装する事になるし あんまりやりたくない問題だ…
ちなみに今のところ、冗長な問題についてはマクロで我慢しています。 MakeA(SomeClass,SomeFunc) a; こんなところが妥協策でしょうか…
>897 多分、本当にやりたいこと、を説明した方がいいアドバイスがもらえるような気がする。 とりあえず 1. 型自体はやっぱり冗長。 2. メンバ関数へのポインタは定数値ではなくコンストラクタで渡される。 3. メンバ関数の型に合わせて定義が増加。 で、良ければ↓みたいなのがある。 struct B { void func(void) {} }; template<typename T> struct A { } // dummy template<typename T> struct A<void (T::*)(void)> { A(void (T::*method)(void)) { /* method の保存とか */ } }; template<typename T> A<T> MakeA(T t) { return A<T>(t); } int main(void) { MakeA(&B::func); return 0; }
901 :
デフォルトの名無しさん :2007/06/29(金) 16:29:28
脳内準boostのmove_ptrで struct safe_bool_helper { int x; }; typedef int safe_bool_helper::* safe_bool; という書き方をみたのですが「int safe_bool_helper::*」がワケワカメです boost::shared_ptrでもtypedef T * this_type::*unspecified_bool_type;とありこちらも理解できません 「::」の後に「*」があるところが謎です int main() { using namespace std; cout << typeid(safe_bool).name() << endl; return 0; } を実行してみても「int safe_bool_helper::*」と出力されました
>>901 >「::」の後に「*」があるところが謎です
メンバ変数へのポインタ。
メンバ変数へのポインタ型だね。あんまりいい例が思い浮かばないけど #include <iostream> struct A { int x; int y; }; typedef int A::*ptr_to_int_member; int main() { A a; ptr_to_int_member ptim = &A::x; (a.*ptim) = 1; ptim = &A::y; (a.*ptim) = 2; std::cerr << "x=" << a.x << ", y=" << a.y << std::endl; } とかするとわかるかな?
メンバ関数ポインタと仕組みは同じやね。 メンバ関数ポインタ以上に使わないけど。
905 :
901 :2007/06/29(金) 17:28:52
>>902-904 ありがとうございます
メンバへのoffset用の変数型と理解しました
(a.*ptim) = 1;という文法もはじめて見たのですが
a.*ptimがaのベースアドレス+offsetをして、そのアドレスに1が入るみたいな感じですね
まあ、そんな感じだな。
>>901 で、なんでそこにメンバへのポインタを使うかというと、
move_ptrやshared_ptrでもif (p)のように条件式で使うため。
しかし、operator boolを提供すると、bool b = p;のように余計なことまでできてしまうので、
メンバへのポインタ型をtypedefし、それへの変換演算子を提供することで、それを防いでいる。
クラスのメソッドを関数ポインタみたいに指定して 配列に収めインデックス参照して実行するってことは可能ですか? class Test{ public: int type; public: void func00() { printf( "func00\n" ); } void func01() { printf( "func01\n" ); } void Run() { T p[] = {func00,func01}; p(); } }; RunのTの部分に何を書けばいいのかわかりません。 やはり、staticなメソッドにして、引数にクラス渡して内部利用するしかないんでしょうか?
まあなんとタイムリーなこと。 メンバへのポインタ使え。 void Run() { typedef void (Test::*pmemfn)(); pmemfn p[] = {&Test::func00, &Test::func01}; (this->*p[0])(); (this->*p[1])(); } };
>>909 おおー。いけました。
ありがとうございます。
こういうのもシンクロニシティの一種なんだろうなぁ。 おいらも908の質問みたいなのかかえて見に来たんだよ。
まぁありがちな疑問だしね
>>907 bool b = p; はできないとマズイだろ。
!!p というタイプ数を犠牲にした代替手段がある一方で bool への暗黙の変換はたとえば関数の引数を誤るような バグなど発見しにくい問題を引き起こしうる このトレードオフを考慮した結果 bool への暗黙の変換は 構文上禁止するほうが妥当という判断なんでしょう
整数型として動き出すのを抑えるため、と言えばよかった
面白い hack だな。
918 :
デフォルトの名無しさん :2007/07/06(金) 15:25:57
以下のコードですがg++のバージョンによって通ったり通らなかったりします. $ cat test.cpp #include <vector> using namespace std; template <template <typename> class T> struct Hoge {}; int main () { typedef Hoge <vector> Hage; return 0; } Debian etchの4.1.2 20061115 (prerelease) (Debian 4.1.1-21)ですと問題ないのですが 自前ビルドの4.2.0でコンパイルすると test.cpp: In function 'int main()': test.cpp:7: error: type/value mismatch at argument 1 in template parameter list for 'template<template<class> class T> struct Hoge' test.cpp:7: error: expected a template of type 'template<class> class T', got 'template<class _Tp, class _Alloc> class std::vector' test.cpp:7: error: invalid type in declaration before ';' token と怒られます. 恐らくはデフォルトテンプレート引数の扱い方の違いが,両者に違いをもたらしていると思うのですが 規格的にはどちらが正しいんでしょうかね? あと他のコンパイラだとどんな感じなんでしょうか?
>>918 4.2での変更が原因かも
http://gcc.gnu.org/gcc-4.2/changes.html >The (undocumented) extension which permitted templates with default arguments
>to be bound to template template parameters with fewer parameters has been removed.
920 :
918 :2007/07/06(金) 16:39:59
>>919 これみたいですね.
`extension'ってことは,gccの開発陣の見解では
918のコードは規格的にエラーとなるべきだということなんでしょうね
横からすまんけど、 <typename> ってどういう意味?
>>921 プロトタイプ宣言の時にパラメータが省略されてるのと違うん?
純粋仮想関数のぶんって仮想関数テーブル作られますか?
多重継承が出来る以上、継承先で必ず定義されるとは限らないから、作られる。
???
__declspec(novtable) っていうのもあるよ
>>928 それはコンストラクタでvtableを初期化子ないだけで、領域は用意される。
仮想関数のテーブルというかスロットは純粋仮想だろうがそうでなかろうが用意される。 中身は純粋仮想の場合入れようがないし入れようとさせるのは無理(抽象クラスのインスタンスは作れない)
まあ、pure virtual callと叫んで死ぬための ルーチンが入っていたりするけどね。
そういえばそんなメッセージ出して落ちたエロゲーがあった
俺は昔Photoshop 5.5でそのエラーを見た。むしろよくそんな面倒なエラーだせたもんだと感心してしまった。
A Boneじゃしょっちゅうだぜ
よくあるのは、デストラクタ・コンストラクタでpure-virtual-methodに うっかりさわってしまった場合。
コンストラクタ内で仮想関数を呼ぶのがあんまりよろしくないと思うけど
アップキャスト・ダウンキャストをばりばりに駆使した壮絶プログラミングだったんじゃないのか
>>932 バーチャコール言わせたいだけちゃうんかと
940 :
デフォルトの名無しさん :2007/07/17(火) 19:17:29
こんなことをしたいんだけど ●a.h #include "b.h" class a{ b* testB; }; ●b.h #include "a.h" class a{ a* testA; }; 普通にやるとコンパイル通らないんだが、いい方法ない?
循環依存はまずいだろ・・・常識的に考えて あとそれじゃ二重定義になるからそこの所を修正した前提で とりあえず宣言だけしとけば良いんじゃないか // a.h class b; class a { b* testB; }; // b.h class a; class b { a* testA; };
classは両方ともaでいいの?
943 :
デフォルトの名無しさん :2007/07/17(火) 20:42:21
すみません ●a.h #include "b.h" class a{ b* testB; }; ●b.h #include "a.h" class b{ a* testA; }; の誤り。
944 :
デフォルトの名無しさん :2007/07/17(火) 20:45:19
補足ですが、それぞれのincludeは2重読み込みしないように、ifdef設定してあります。 AはBを読み込もうとしますが、BもAを読み込もうとします。 ただ、どちらもclass宣言の途中に、もう一方のクラス設定が必要になります。
946 :
デフォルトの名無しさん :2007/07/17(火) 23:05:13
947 :
デフォルトの名無しさん :2007/07/17(火) 23:08:47
#pragma once 使っちゃだめ?
#ifndef __XXX__ #define __XXX_ /* ほげほげぬるぽ */ #endif の方が移植性があっていいかもネ IDEのマクロ使えば#pragma onceと書くのと大差ない手間まで落とせるし でも環境非依存のジェネリックなテンプレートライブラリとか作るんでなければどっちゃでもいいと思う
移植性考慮するなら処理系予約の識別子を使うなよ。 俺の場合、やるときにはこれくらいやる。 #ifndef XXX #define XXX #ifdef _MSC_VER >= 1020 #pragma once #endif #endif やらないときには、#importなどほかにもVC++限定の機能をどうせ使いまくっているので、 #pragma onceだけ使う。
アッ 前置の__って予約だったんだ 今度から zzyyxx_NAME_GUID_xxyyzz みたいにしようっと^^ あと俺からも質問 ↑の例のzzyyxx_はインテリセンスで最後に表示されるという変な理由からで この性質を使ってクラスや関数のdetaiをzzz_name()みたいにしてるけどやっぱ駄目なのかな? もし駄目なら代替案としてはどのようなもんがあるでしょか?
名前空間
953 :
デフォルトの名無しさん :2007/07/18(水) 21:36:01
演算子オーバーロード難しくてわかんないですっ!
俺は後置 _ をつけておく。 #ifndef XXX_H_ #define XXX_H_ #endif // #ifndef XXX_H_
>>953 例えば a + b は a.operator+(b) や operator+(a, b) という関数呼び出しに変換される。
どちらかが定義されていれば、その定義通りに実行される。
ただそれだけのことだ。
956 :
デフォルトの名無しさん :2007/07/21(土) 08:29:19
前者がメンバ関数で後者がフレンド関数ですねっ! うおおおお、なんだかわかってきたぞー! でもわかったのと使いこなせるのは別の話だけど。 とりあえず演算子のオーバーロードの章は終わって これから継承ですっ!
必ずフレンドにしなきゃいけないわけでもないが、まあどうでもいい話か。
CRTPを使った継承と、 普通のコンポジションとの使い分けを教えてください。
>>958 CRTP なんて奇怪なコード、本当に必要だと説明できる場面でしか使うな。
CRTP は mix-in の代わりとして使う。
961 :
デフォルトの名無しさん :2007/07/23(月) 09:33:40
仮想関数難しすぎますっ
アップキャストしても本来の型の関数が呼ばれるってだけの話。
963 :
デフォルトの名無しさん :2007/07/23(月) 11:14:10
基本クラスのポインタで派生クラスを指すことができるのは 覚えるしかないんでしょうけど、 基本クラスのポインタで派生クラスのメンバにアクセスできないのに 仮想関数では派生クラスで再定義されたものが使われるっていうのが 納得できません。 これはもうそういうものだと覚えるしかないんでしょうか。
「納得できない」って言葉は仕様や実装を理解した上で、その欠点をはっきり示す事ができ、よりよいモノを自分で提案できる場合にこそ使われるべきだと思うよ。 仕様や実装は理解できてるのかな?
>>963 納得できないとか、覚えるしかないとか何を言いたいのかよくわからんが、
どのポインタとして扱われても本来の関数が起動される仕組みとして仮想関数が用意されているだけの話。
嫌なら仮想関数を使わなければいいだけじゃん。
基底クラスが仮想関数を起動するってのは、あくまで自分のメンバである仮想関数を起動した結果、継承クラスの仮想関数が起動されるのであって、 直接継承したクラスの関数を起動するわけではない。
>>963 そこが仮想関数の「便利」なところなんだぜ。
複数のクラス D, E, F, ... の共通部分を基底クラス B として提供しておけば、
その基底クラス B への参照やポインタを使って処理 X を 1 個だけ記述しておけば、
それから派生している全てのクラス D, E, F, ... に対してその処理 X を適用できる。
派生クラスごとに処理が変わる部分は、全て仮想関数で提供しておけばいい。
X が派生クラスのメンバに直接アクセスできないのはむしろ利点で、
X が派生クラスに依存しない形で書けているからこそ、
B の派生クラスであれば何であっても X で処理することができるのだ。
実際のところ動的多態性が要求される場面ってそんなに多いか?
ありまくり
970 :
デフォルトの名無しさん :2007/07/23(月) 21:33:41
JISの規格を読みました。 派生クラスで再定義された仮想関数は 基底クラスの仮想関数を上書きするんですね。 本の説明の解釈の仕方・理解の仕方もちょっとまずかったみたいで 頭の中がぐちゃぐちゃになってたみたいです。 まだすっきりしないかんじはあるけど なんとなくわかってきました。 ありがとうございました。
971 :
デフォルトの名無しさん :2007/07/23(月) 22:28:56
C++からJAVAのオブジェクト(API)を利用する事ができますか?
VM的なモノをつくればいけます
>>971 gcj限定でよければJNIよりCNIの方がエレガント
975 :
デフォルトの名無しさん :2007/07/23(月) 23:22:57
C++からJAVA?
僕をあなたのクラスのfriendにしてください><
977 :
デフォルトの名無しさん :2007/07/24(火) 23:20:01
クラステンプレート難しすぎますっ!
template class Tenpureito<T> { T v_; const T get() const { return v_; } void set(const T& v) { v_ = v; } void print() { cout << v_; } };
>>978 このレベルがサクッと空で書けるようになるには普段からtamplateを
多用していないと無理?
書かれたコードを見れば終えるんだけど、いざコーディングするとなると
経験不足から時間がかかってしまうんだが・・・
>>979 最初は適当な型で普通にクラスを書いて、
それからテンプレートに置き換える。
というようにやってみては?
>>980 ああ、確かに。適当な型で動作したのならテンプレートにしても
とりあえずその型で使っている限りは同じ動作になるはずなんだもんな。
>>979 プログラムをサクッ空で書く必要なんて無いだろ。コンパイルエラーが
出てから直せばいいんだよ。そうしてるうちに慣れる。
さんざんこの過程を経てるはずなのに慣れないってんなら、テンプレート
関係無しにプログラムに向いてないだけだと思われ。
>>979 デフォルトのアクセス制御とか、const とか、C++ そのものに慣れて
いないみたいだから、もっと手を動かして体で覚えたほうがいいと思う。
テンプレートってのは、要するにどんな型でも使えるよってだけの話だ。
test
>>テンプレートってのは、要するにどんな型でも使えるよってだけの話だ。 そんなこと言うと変なのが湧くぞ
あれだよ あひるタイピングって奴さ
それがアヒルならアヒルだ この言葉知るまでは「テンプレートによるインターフェース」とか言ってたな
ダックタイピングって言葉、C++の方で普及してるの? python使ってるときは、ダックタイピング、 C++の時は静的インターフェイスとか、テンプレートによるインターフェイスとか言ってる。
templateってコンテナ作る以外に何が便利なの?
イテレータとアルゴリズム作るのに便利。
Boost を見ればその便利さが分かる。そして気持ち悪さも。
テンプレート引数に型以外の物も使えるというのが重要で、 これによって、コンパイル時プログラミングというジャンルが発展した。 Boostはその成果。 とはいえ、実際のプログラミングの場面では、そこまでのものが必要に なることはあまり無くて、実用上は、 >テンプレートってのは、要するにどんな型でも使えるよってだけ という認識でも別にいいかなとも思う。
たらいを回してみるのもまた一興
暑い
エルニーニョ→ショタ ラニーニャ→ロリ
ぬるぽ
ぬるぽ
ぬるぽ
1001 :
1001 :
Over 1000 Thread このスレッドは1000を超えました。 もう書けないので、新しいスレッドを立ててくださいです。。。