■過去ログ置き場に戻る■ 1- 前250 次250 最新50


[memo] "9999999999_00.html#R20" という感じで、URLの最後に "#RレスNo" を追加すると幸せになれます。

C++相談室 part51
751 名前:デフォルトの名無しさん :2006/08/11(金) 12:22:07
#include "stdafx.h"
#include <algorithm>

template <typename T>
void NotOp(T& c) { c = ~c; }

int _tmain(int argc, _TCHAR* argv[])
{
unsigned int buf[256];
std::for_each(buf, buf+256, NotOp<unsigned int>);
return 0;
}

Linker error LNK2019: 未解決の外部シンボル "void __cdecl NotOp(unsigned int &)" (?NotOp@@YAXAAI@Z) が関数 _main で参照されました。
Linker fatal error LNK1120: 外部参照 1 が未解決です。

やはりエラーが出ます。

752 名前:デフォルトの名無しさん :2006/08/11(金) 12:41:12
Academic Editionを買えるならAmazonで2005にしたほうがいいよ、安いし…
俺も2002愛用してたけど色々と諦めて2005にした。
インテリセンスが鈍い事以外に不満はなくなったよ

753 名前:742 :2006/08/11(金) 12:47:32
やはりコンパイラのバグでしょうか。
とりあえず>>745氏の方法で回避したいと思います。
2005は余裕が有れば購入してみます。
回答してくださった皆様ありがとうございました。

754 名前:デフォルトの名無しさん :2006/08/11(金) 13:19:03
1. プリコンパイル済みヘッダを使っているようだがstdafx.hには何が書いてあるのか。
2. TCHAR.hはどこでインクルードしているのか?というかこれMFCプロジェクト?
3. 1行目を削除してvsvars32.batからclだけでコンパイルしてみろ。

755 名前:デフォルトの名無しさん :2006/08/11(金) 13:40:11
>>754
馬鹿かお前

756 名前:デフォルトの名無しさん :2006/08/11(金) 13:58:29
クラスで、コピーコンストラクタと代入演算子を明示的に定義せず、
コンパイラによって暗黙に生成されるものを使うほうが良い場合って
ありますか?常に明示的に定義したほうがよいですか?

757 名前:デフォルトの名無しさん :2006/08/11(金) 14:07:55
デフォルトの動作で問題ない場合は定義しなくていい。

758 名前:デフォルトの名無しさん :2006/08/11(金) 14:12:04
>>757
「定義しなくていい」のか、「定義しないほうがいい」のか、どちらでしょうか?

759 名前:デフォルトの名無しさん :2006/08/11(金) 14:14:10
物理的にはどっちでもいい。
スタンスだったら、人それぞれ。

760 名前:デフォルトの名無しさん :2006/08/11(金) 14:15:14
明示的に定義しないほうが、コンパイラが最適なものを生成してくれる
ということはないのですか?

761 名前:デフォルトの名無しさん :2006/08/11(金) 14:21:43
知らんけどコンパイラによるんじゃないの?
俺は後で必要になるかもしれないから全部作ってるけど。
コンストラクタはメンバ初期化にも使えるから便利だし。
(初期化は代入よりも効率いいらしいよ)

762 名前:L :2006/08/11(金) 14:58:17
読み込んだファイル(標準入力)内の単語の出現回数を数えて、
出現回数の略順にソートして表示するプログラムの場合で、
処理時間が最も短くできるのは何ですか?

763 名前:デフォルトの名無しさん :2006/08/11(金) 14:59:16
std:::map

764 名前:デフォルトの名無しさん :2006/08/11(金) 21:12:13
質問

ASP.NETでセッション作って、
ISAPIフィルタでセッションIDとか取得できる?

ISAPIフィルタで認証ちっくなことしたい。


765 名前:デフォルトの名無しさん :2006/08/11(金) 21:26:14
スレ違いだと思います
俺が答えられないのは内緒だぞ

766 名前:デフォルトの名無しさん :2006/08/12(土) 00:18:45
ListViewItemのタグに数字のテキストを入れています。
string型の変数にそのタグのテキストを代入することはできたのですが、
それをintの変数に代入できません。(下の式)
初歩的な質問で申し訳ないですが、ヒントで結構ですので
教えていただけませんでしょうか?

private void btnApply_Click(object sender, EventArgs e)
{
foreach (ListViewItem itm in lvwSkillTable.CheckedItems)
{
int tagNum;
if (itm.Checked) tagNum = Convert.ToInt16(itm.Tag.ToString());
if (tagNum = 77) MessageBox.Show("できた"); //intに変換できたか確認
}
}


767 名前:デフォルトの名無しさん :2006/08/12(土) 00:20:01
↑誤爆しました。無視してください。

768 名前:デフォルトの名無しさん :2006/08/12(土) 00:21:33
>>766
それは C++ じゃないので、まずは自分の使用している言語を確かめて、
適切な別のスレを探してください。

769 名前:デフォルトの名無しさん :2006/08/12(土) 01:56:11
脊髄反射失敗恥ずかしい

770 名前:デフォルトの名無しさん :2006/08/12(土) 09:15:11
それ脚気やんビタミンB1補給しろ

771 名前:デフォルトの名無しさん :2006/08/12(土) 13:54:06
>>702
標準じゃないからじゃない?

772 名前:デフォルトの名無しさん :2006/08/12(土) 14:12:44
boost::filesystemは、TR2に入るんで、
C++0xでは標準になる可能性大です。

773 名前:デフォルトの名無しさん :2006/08/12(土) 21:15:44
boostが標準になったときは名前空間はどうなるの?
「boost::→std::」になるのはどうもやだな

774 名前:デフォルトの名無しさん :2006/08/12(土) 22:51:48
じゃあ
boostd::
で。

775 名前:デフォルトの名無しさん :2006/08/12(土) 23:01:51
C++でHibernateみたいなことできますか?

776 名前:デフォルトの名無しさん :2006/08/12(土) 23:17:59
>>775
”C++ ORM”で調べるくらいのことはしましょうぜ

777 名前:デフォルトの名無しさん :2006/08/13(日) 17:24:57
>>506の逆はできますか?
クラスのインスタンスを、ヒープ上には作成できるけど、
スタック上には作成できないようにしたいです。
コンストラクタをprivateにすればいいのかなと思いましたがnewもできなくなるみたいですね。

今はnewInstanceというクラスメソッドを作ってそこから生成していますが、
出来れば、ClassName::newInstance()という記述が嫌なので、
new ClassNameと書ければいいかと思っているのですが。

778 名前:デフォルトの名無しさん :2006/08/13(日) 17:32:58
>>777
小汚いテクニックを使えばできんこともないだろうけど、
いまのやり方のままのほうがええよ。

779 名前:アナルロックオン :2006/08/13(日) 17:33:57
>>777
コンストラクタを隠蔽してファクトリメソッドを使うところまでは良し。
で、後は new 演算子をオーバーロードすればいいんじゃね?

780 名前:デフォルトの名無しさん :2006/08/13(日) 18:00:05
autoconfを使えるようにしようと下のサイト
ttp://www.ogis-ri.co.jp/otc/hiroba/technical/CppUnit/chapter3.html
のサンプルを試しています。

automakeがinstall-shをconfig以下に作るのはいいのですけどconfigure
の方のac_aux_dirが空のままで./configureを実行すると

configure: error: cannot find install-sh or install.sh in . ./.. ./../..

となってMakefileが作られません。
aclocal --acdir=configも試したのですが

aclocal: configure.ac: 6: macro `AM_INIT_AUTOMAKE' not found in library

となってしまいます。今使っているのはautoconf 2.5xなのでサンプル
通りにはいかないのでしょうか?
configureでac_aux_dir=configと手動で設定してやれば./configureは
成功するのですが自動生成する方法はないでしょうか?

781 名前:デフォルトの名無しさん :2006/08/13(日) 19:18:34
>>780
すれ違いです

http://pc8.2ch.net/test/read.cgi/tech/1148393695/


782 名前:デフォルトの名無しさん :2006/08/13(日) 21:12:16
>>777
Effective C++の第八章(第三版で)「newとdeleteのカスタマイズ」は読んだ?


783 名前:デフォルトの名無しさん :2006/08/13(日) 21:30:51
>>781
あちらは過疎ぎみだったのでこちらに書き込みさせて頂いたしだいです。
マルチポストになってしまった。

784 名前:デフォルトの名無しさん :2006/08/13(日) 22:34:19
あーらら
じゃぁどっちでもスルーだね

785 名前:777 :2006/08/14(月) 01:10:00
>>778
名前が長いのが嫌っていうだけなので、小汚いテクニックとなるならば今のままにしておきます。

>>779
オーバロード!?すれば出来そうなのですか?ちょっと調べてみます。

>>782
えっ!?その手のネタが書いてありました!?読み直してみます。
あっ。ウチにあるの第2版でした。

786 名前:デフォルトの名無しさん :2006/08/14(月) 01:31:16
2版でもnewのオーバーロード書いてるだろ

787 名前:デフォルトの名無しさん :2006/08/14(月) 06:34:28
質問、こんなことできたっけ?
void proc(int iLen)
{

788 名前:デフォルトの名無しさん :2006/08/14(月) 06:36:21
、、ミスった、、質問、こんなことできたっけ?
void proc(int iLen)
{
char buf[iLen]; ← これ
・・・・
}
gccや、C99で可とか教えてほしいです

789 名前:デフォルトの名無しさん :2006/08/14(月) 06:41:19
>>788
c99で可。
今のgccはc99対応なので勿論可。
実装はalloca()相当を使うからスタックサイズに注意。

790 名前:デフォルトの名無しさん :2006/08/14(月) 06:56:23
>>789
即レスサンクス
c99なのか、寝る前に分かって良かった、ありがとう

791 名前:デフォルトの名無しさん :2006/08/14(月) 21:29:13
なんで、ifstreamの>>オペレータでunsigned shortの実装がないんじゃーーーー。
WORDが読めないジャン。。。
readはchar*かwchar_t*のどっちかしかないし。キャストすんのきもいよー。

なんか解決策ありませんか?

792 名前:デフォルトの名無しさん :2006/08/14(月) 21:30:53
union{
int i;
WORD w;
};

793 名前:デフォルトの名無しさん :2006/08/14(月) 21:37:51
>>792
はや!レスサンキュー!!
そういう方法になるのかー。うーん。
DWORD の場合はどうしますか?(32bit符号なし整数の場合。intも32bit)



794 名前:デフォルトの名無しさん :2006/08/14(月) 21:47:27
union {
unsigned long ul;
DWORD dw;
};


795 名前:デフォルトの名無しさん :2006/08/14(月) 21:54:17
>>791
それはどこの処理系?

それはともかく自分でグローバルな関数を作ればよいだけでは?やや面倒かもしれないけど。
template <...>
std::basic_istream<...> operator >>(std::basic_istream<...>, unsigned short&);


796 名前:デフォルトの名無しさん :2006/08/14(月) 21:57:07
std::operator>>をオーバーロードすりゃ良いじゃん
まぁ、微妙に標準やぶることになるけど気にしない。

797 名前:デフォルトの名無しさん :2006/08/14(月) 22:10:17
>>794-796
レスサンキュー。
VC2005EEなんだけど、どうやらunsignedの>>オペレータはどれも無いみたい。あとint64関連も無いみたい。

オペレータオーバーロードはいいけど、ちゃんとsignedで読んでunsignedに代入で反映されるかちょっと不安です。。。
補数とかそういうのあんまり詳しくないんです(汗

*余談*
ビットマップの汎用クラス作ってるんだけど、
構造体のアラインメント関係でガーっと読んでっていうのができない(処理系に依存する)から要素を一個ずつ読んでるのです。
まーこの際そんなこといってる場合じゃないかもしれないけど・・・。

798 名前:デフォルトの名無しさん :2006/08/14(月) 22:42:53
ちらっとallocaの話題出たけど、例外を投げる関数でそれ使っても安全?
allocaとva_argsと例外とsetjmpとWIN構造化例外って排他的関係にならないの?

799 名前:デフォルトの名無しさん :2006/08/14(月) 22:47:42
>>797
待て待て。VC++ 2005ならある。MSDNにも書いてあるし、実際にヘッダを覘いても書いてある。
http://msdn2.microsoft.com/en-us/library/whtx1k1x.aspx

800 名前:デフォルトの名無しさん :2006/08/14(月) 22:55:56
>>798
例外を受け取るときには使えないようだが、ほかは問題なさそう。
http://msdn2.microsoft.com/ja-jp/library/wb1s57t5.aspx

排他的関係というのは無いと思う。
allocaとva_argsはスタックの大きさが可変になるだけで特に不都合は考えられない。
VC++なんかだとC++例外処理にはWindowsの構造化例外処理(SEH)を使っている。
Windowsの構造化例外処理(SEH)はsetjmpなんかにも対応している。

たとえばVC++ではコンパイラオプションでSEHを使うよう指定したら、
setjmpでもローカルオブジェクトのデストラクタが呼び出されるようになる。

よそのスレへ行くべきだな、すまん。

801 名前:デフォルトの名無しさん :2006/08/14(月) 22:59:04
>>797
> VC2005EEなんだけど、どうやらunsignedの>>オペレータはどれも無いみたい。

氏ねや、MS。

>>798
alloca()は標準じゃないので、コンパイラのマニュアル読んでください。
一般的なalloca()の実装では、例外で外に出て、問題ないはずです。

802 名前:デフォルトの名無しさん :2006/08/14(月) 23:03:50
>>798
va_args は実際に問題が起きることはないだろうが、
va_end が呼ばれないままになる場合は問題が起きても文句は言えない。

803 名前:デフォルトの名無しさん :2006/08/14(月) 23:06:00
>>799
レスサンキュー。

・・・あれ?ほんとだ。あるなー。
・・・あれ?コンパイル普通に通った。
さっきの格闘はどこへ??
あっれーーーーー!? XP

ごめん。勘違いだった。
ほんとにごめんなさい。

804 名前:デフォルトの名無しさん :2006/08/14(月) 23:11:06
>>803
氏ねや、MS。

805 名前:デフォルトの名無しさん :2006/08/15(火) 17:53:46
質問です。

void func(const hoge& i=0) { // 参照を引数にして
if (i!=0) i.huga(); // 引数が渡された場合に実行
}

↑こういうことしたいのですが、引数がポインタなら問題ないのですが、
参照の場合operator!=()を定義しないと駄目ですよね。
そこまでするのは大袈裟なので、参照を使いつつ、
簡単に書くお約束の方法があれば知りたいのですが…。
何かいい方法はありますでしょうか。

806 名前:デフォルトの名無しさん :2006/08/15(火) 18:14:42
>>805
オーバーロードすれば?


807 名前:デフォルトの名無しさん :2006/08/15(火) 18:17:54
>>806
どうも。実は
func();
func(const hoge&);
という関数が無茶苦茶たくさんあって、
オーバーロードするとコードサイズが倍になってしまうんです。


808 名前:デフォルトの名無しさん :2006/08/15(火) 18:20:13
>>807
プリプロセッサでサボる


809 名前:デフォルトの名無しさん :2006/08/15(火) 18:34:17
二つのfunc()が同じ事をするなら、引数が0なら渡されていないと考えていいのなら

func(){ func(0) ; }
func(const hoge & i )
{
if (i != 0) i.huga() ;
}

810 名前:デフォルトの名無しさん :2006/08/15(火) 18:36:39
戻り値の型忘れたけど、重要じゃないか。

811 名前:デフォルトの名無しさん :2006/08/15(火) 18:36:34
>>808
それは最後の手段に取っておくとして…

>>809
それは…>>805と同じでは。

812 名前:809 :2006/08/15(火) 18:38:23
あ、ほんとだ。スマソ

813 名前:デフォルトの名無しさん :2006/08/15(火) 18:39:35
func(){実装}
func(const hoge & i )
{
if (i != 0) i.huga() ;
func ();
}
じゃない?


814 名前:813 :2006/08/15(火) 18:40:55
ゴメン
ifはいらね
func(const hoge & i )
{
i.huga() ;
func ();
}


815 名前:デフォルトの名無しさん :2006/08/15(火) 18:54:47
>>813
どうも。結局func()とfunc(const hoge&)の両方必要なのは変わらず、
という感じでしょうか(実装部の流用はできますが)。
諦めて全部書こうかな…。

関数宣言が引数やテンプレートの特殊化の組み合わせですごい数に…。
テンプレート引数a種類×関数b種類×…×コンストラクタ引数z種類=('A`)


816 名前:デフォルトの名無しさん :2006/08/15(火) 18:58:42
規則性があるならコードを吐くプログラムを書いてみるとか


817 名前:デフォルトの名無しさん :2006/08/15(火) 19:02:25
>>815
コンストラクタが関わってくる理由がわからない。

818 名前:デフォルトの名無しさん :2006/08/15(火) 19:11:27
>>817
何言ってるんですか?頭大丈夫ですか?
とても心配です。お便り待ってます。

819 名前:デフォルトの名無しさん :2006/08/15(火) 19:11:28
>>817
あぁ、>>815は少し変な書き方でした。すみません。
上でfuncとしていたのは全部コンストラクタです。
仮想コンストラクタにしているので

struct hoge1 {
template <typename T> hoge* create(引数リストA);
template <typename T> hoge* create(引数リストB);
template <typename T> hoge* create(引数リストC);
};
struct hoge2 {...};
struct hoge3 {...};
...

みたいになるということです。
デフォルトの引数で多少なりとも量を減らせるかなと思った次第。


820 名前:デフォルトの名無しさん :2006/08/15(火) 19:27:47
>>805
俺だったらこーする。
void func(const hoge &i = *(const hoge*)NULL) {
if (&i) i.huga();
}
参照の実装は結局ポインタだからな。

821 名前:805 :2006/08/15(火) 19:30:33
>>820
ファイナルアンサーの予感!!
どうもありがとう。

822 名前:デフォルトの名無しさん :2006/08/15(火) 19:48:29
それって規格的に駄目じゃなかったっけ?

823 名前:デフォルトの名無しさん :2006/08/15(火) 19:48:56
最悪な解法だけど、納得したということで。じゃ次。

824 名前:805 :2006/08/15(火) 19:53:50
エー('A`)


825 名前:デフォルトの名無しさん :2006/08/15(火) 20:02:10
>>820-821
アホは氏ね

826 名前:デフォルトの名無しさん :2006/08/15(火) 20:06:39
ていうか引数が参照じゃないと駄目な理由が解らん。ポインタでいいじゃん。

827 名前:デフォルトの名無しさん :2006/08/15(火) 20:15:12
>>822,>>823,>>825
なにそんなに必死になってんの?

828 名前:デフォルトの名無しさん :2006/08/15(火) 20:44:57
何が必死なんだ?見当違いの煽りをするな。

829 名前:デフォルトの名無しさん :2006/08/15(火) 20:56:56
つい最近必死だなとかって煽られて、悔しい思いでもしたんじゃないの?

830 名前:805 :2006/08/15(火) 20:57:58
結局ポインタで実装しました。
んー、参照に未練…。

>>826
参照だと
struct mypred { bool operator()() ... ; } };
func(mypred());
って出来るのがうれしい…。

831 名前:デフォルトの名無しさん :2006/08/15(火) 21:06:52
>>827
じゃあ必死だなオマエw

832 名前:デフォルトの名無しさん :2006/08/16(水) 05:25:06
>>830
流れを読まないでレス。
それってポインタならfunc(& mypred());って話?
#中身見てないから意味があるのか知らんけど。

833 名前:デフォルトの名無しさん :2006/08/16(水) 07:52:17
ifstreamで以下のチェックをパスするのに、>>演算子で値が取得できない場合ってどんな状況ですか?

if(ifs.is_open() == false) return false;

if(ifs.fail()) return false;
if(ifs.good() == false) return false;
if(ifs.bad() == true) return false;
if(ifs.eof()) return false;
std::ios::iostate state=ifs.rdstate();
if(!(state == std::ios::goodbit)) return false; 

834 名前:デフォルトの名無しさん :2006/08/16(水) 08:14:02
素朴な疑問、それらのチェックは動的なのか?
直前の読み込みなどの結果を反映する静的なものということはないか?

835 名前:デフォルトの名無しさん :2006/08/16(水) 08:31:08
>>834
レスthx
えーっと、>>演算子の後にチェックをかけたら、エラーを返しました。
チェックのやり方がまずかったみたいです。おかげで何とかなりそうです。
ありがとうです。

836 名前:デフォルトの名無しさん :2006/08/16(水) 08:42:22
つーかさ、stdioのfeof()等もそうだけど
この手のって、実際に読んでみてから
「読んでみたらエラーだった」「読んでみたらEOFだった」しか
わからないだろ。
で、その結果に応じてフラグを設定するんだから。

いや、ライブラリに限らず、OSのファイルアクセスだってそういう仕組みだし。

837 名前:デフォルトの名無しさん :2006/08/16(水) 09:00:27
いわれてみればそうですね。うーん。

838 名前:デフォルトの名無しさん :2006/08/16(水) 09:08:59
読んだけどヤだったから読まなかったことにします!
なんてのもあるよな。


839 名前:デフォルトの名無しさん :2006/08/16(水) 09:14:10
いやな理由がちょっと思いつきません。
まさか、実装してないとかそういうことじゃないだろうし。うーん。

840 名前:デフォルトの名無しさん :2006/08/16(水) 11:05:38
アルファベットなのにintで読もうとした、とか。

841 名前:デフォルトの名無しさん :2006/08/16(水) 11:17:47
アルファベット?
漢字なら良かったか?

842 名前:デフォルトの名無しさん :2006/08/16(水) 11:21:35
>>832
それだと「一次変数のアドレスを渡そうとしてる」って警告が出ます。


843 名前:デフォルトの名無しさん :2006/08/16(水) 12:15:42
>>842
参照だと警告が出ないの?

844 名前:デフォルトの名無しさん :2006/08/16(水) 12:21:32
>>843
標準でもconst参照は右辺値で初期化できるから、警告になるわけがない。

845 名前:843 :2006/08/16(水) 12:39:04
あ、なるほど、ただの参照じゃなくてconst参照だったか。ちゃんと遡ってみるべきだったな。

846 名前:デフォルトの名無しさん :2006/08/16(水) 16:33:16
>>840
あ!それです!!たぶん。
やっとわかった。(TT;

大分投げやりになってたとこです。
レスが遅くなって申し訳ない。
ありがとうございました。

847 名前:デフォルトの名無しさん :2006/08/16(水) 17:42:04
いた違いだったらすいません
CentOSを使ってC++のプログラミングの勉強をしています
今、mainを書いたファイルとは別にclassを書いた二つのソースを作って、分割コンパイルしてみようと思ったのですが、やり方がさっぱりわかりません
分割コンパイルのやり方はいろんなサイトに乗っているのですが、こういったclassを丸ごと別のソースにするやり方がどこにも書いてないので、困っています

やり方をご存知の方は教えていただけませんでしょうか?

あと、ひょっとしてこういうプログラムの書き方って普通しないものなんでしょうか?

848 名前:デフォルトの名無しさん :2006/08/16(水) 17:46:43
>>847
やりたいことは、まぁわかった。
あとは、自分でやったことと、その結果(エラーメッセージとか)を
書いてもらわないと話にならん。

849 名前:デフォルトの名無しさん :2006/08/16(水) 17:47:26
foo.h: class Foo {}
foo.cpp: Fooの実装
bar.h: clas Bar{}
bar.cpp: Barの実装
main.cpp: #include "foo.h" #include "bar.h"

$ g++ -c foo.cpp
$ g++ -c bar.cpp
$ g++ -c main.cpp
$ g++ -o hoge foo.o bar.o main.o

あるいは

$ g++ -o hoge foo.cpp bar.cpp main.cpp

普通はMakefile書くね。


850 名前:デフォルトの名無しさん :2006/08/16(水) 17:55:48
Makefile:
all: hoge

hoge: main.o foo.o bar.o
[TAB]g++ -o $@ $?

main.o: main.cpp foo.h bar.h

foo.o: foo.cpp foo.h

bar.o: bar.cpp bar.h

[TAB]のところはTABキーでインデント。

851 名前:デフォルトの名無しさん :2006/08/16(水) 18:12:29
>849
あのものすごいバカな質問してしまうかもしれませんが教えてください
foo.cpp の実装ってなんなんでしょうか?
foo.hに
class foo{
   int x;
   foo(){
      x = 1;
   }
}
とか書くとして、foo.cppには何を書けばいいんでしょうか?

852 名前:デフォルトの名無しさん :2006/08/16(水) 18:21:52
>>851
それで終わりなら foo.cpp 要らない。

853 名前:デフォルトの名無しさん :2006/08/16(水) 18:24:41
>>851
分割コンパイルの目的からすれば foo.h で foo(); と宣言だけで済ませて、
foo.cpp で foo::foo() { ... } と(実装を加えて)定義する。

854 名前:デフォルトの名無しさん :2006/08/16(水) 18:26:37
>>851
以下のようにメンバ関数の定義を別ファイルでやる場合に*.cppが必要になる。
こうするとなぜ良いのかというと、class Fooの内容(実装詳細とかいう)が変わっても、
foo.hをincludeしているソースをコンパイルしなくても済むため。

foo.h:
class Foo {
public:
Foo() {}
virtual ~Foo() {}
int open(void);
int close(void);
};

foo.cpp:
int Foo::open(void)
{
}
int Foo::close(void)
{
}

855 名前:デフォルトの名無しさん :2006/08/16(水) 18:51:32
コンパイルとリンクの違いは分かってる?

856 名前:デフォルトの名無しさん :2006/08/16(水) 18:53:40
>852-854
言われたとおりやってみたら、.oファイルは作成できましたが、リンクが上手くできませんでした
エラーがあまりに大量にでているので、全部は書けませんが

GUI.o(.text+0x202): In function `GUI::~GUI()':
: undefined reference to `XCloseDisplay'

のようなものが大量に出ています
コンパイルの仕方に問題があるのでしょうか?

mpiとX Windowを使うので
mpicxx -o -lX11 -L/usr/X11R6/lib main.o GUI.o
としてコンパイルしてみたのですが・・・

857 名前:デフォルトの名無しさん :2006/08/16(水) 18:57:11
>>856
ライブラリの指定を最後にしてみろ。

こっから先は別スレでやってくれ。 gcc スレでいいんじゃないかな?

858 名前:デフォルトの名無しさん :2006/08/17(木) 03:57:49
>>839
「いや」という表現がよくなかったかも。
目的に合わないから、とかかな。構文解析とか、scanfみたいなやつで使うと思うんだけども。
http://www.microsoft.com/japan/developer/library/vccore/_crt_ungetc.2c_.ungetwc.htm
C++から離れてしまって申し訳ない。


859 名前:デフォルトの名無しさん :2006/08/17(木) 17:17:26
下記のコードのようなことがやりたい (標準出力またはファイルのいずれかを実行時に
選択して、あれこれ書き込みたい) のですが、コンパイルエラーが出ます。ストリーム
は複製できない、というのが理由だと思うのですが、かといって s2() から auto 変数
への参照を返すこともできないし… (Java なら GC されるまでストリームが消えない
ので平気なのですが)。どうするのがよいのでしょう?

#include <cstdlib>
#include <ctime>
#include <fstream>
#include <iostream>
using namespace std;

ostream s1() { return cout; }
ostream s2() { return ofstream("foo.log"); }

int main()
{
 srand(time(NULL));
 ostream out(rand() % 2 == 0 ? s1() : s2());

 out << "foo" << endl;
 out << "bar" << endl;
 // and more...

 return 0;
}

860 名前:859 :2006/08/17(木) 17:17:59
エラーの内容:

foo.cc: In copy constructor `std::basic_ios<char, std::char_traits<char> >::basic_ios(const std::basic_ios<char, std::char_traits<char> >&)':
/usr/lib/gcc/i686-pc-cygwin/3.4.4/include/c++/bits/ios_base.h:781: error: `std::ios_base::ios_base(const std::ios_base&)' is private
foo.cc:7: error: within this context
foo.cc: In copy constructor `std::basic_filebuf<char, std::char_traits<char> >::basic_filebuf(const std::basic_filebuf<char, std::char_traits<char> >&)':
/usr/lib/gcc/i686-pc-cygwin/3.4.4/include/c++/streambuf:769: error: `std::basic_streambuf<_CharT, _Traits>::basic_streambuf(const std::basic_streambuf<_CharT, _Traits>&) [with _CharT = char, _Traits = std::char_traits<char>]' is private
foo.cc:8: error: within this context

861 名前:デフォルトの名無しさん :2006/08/17(木) 17:26:24
newすればいいとおもうよ
std::ostream* out =
   argc > 1 ?
     new std::ofstream( argv[1] ):
     new std::ostream( std::cout.rdbuf() );

*out << "foo" << std::endl;
// and more

delete out;

862 名前:859 :2006/08/17(木) 17:30:03
>>861
うはー…なるほど、そんな手が。
お早い回答、本当にありがとうございました。

863 名前:デフォルトの名無しさん :2006/08/19(土) 02:11:52
VIPPERに好かれて困っています
http://ex16.2ch.net/test/read.cgi/news4vip/1155903854/

>>1(巨乳・ナンパ多し)   会社の先輩
年齢:23歳         年齢:33歳 ♂
彼氏いない暦:半年    彼女いない暦:恐らく年齢
身長:158a        身長:160cmくらい
体重:51`         体重:80`くらい

先輩は>>1がVIPPERとは知らない
Sサイズのシャツから肉がはみ出てる
変にオサレぶってかっこつけてキモイ。
でもオバサマには人気ある
上司とすげー仲良い(信頼されてる)

メールの内容
「今日は楽しかったおo(^ω^)o  注)一緒に帰っただけ
 また月曜に会おうNe星
 ちゃんとお風呂入るんだおwwwww」
「俺はインターネッツに詳しい」と豪語(ry

会社が終わるとロッカー前で毎日待ち伏せ
→同じ路線なので着いてこられる
→「本屋に寄るから」と断ると一緒に来る
→「今度一緒に映画行こうか(^ω^)」
→断ると以下ループ

864 名前:デフォルトの名無しさん :2006/08/19(土) 13:14:49
#include <iostream>
#include <fstream>
using namespace std;

int main () {
int length;
char * buffer;

ifstream is;
is.open ("test.txt", ios::binary );

// get length of file:
is.seekg (0, ios::end);
length = is.tellg();
is.seekg (0, ios::beg);

// allocate memory:
buffer = new char [length];

// read data as a block:
is.read (buffer,length);

is.close();

cout.write (buffer,length);

return 0;
}
このコードで5Gくらいのファイルを読むと処理に時間がかかるんですが
どういった方法で読み込んで処理すればよいでしょうか?

865 名前:デフォルトの名無しさん :2006/08/19(土) 13:23:21
>>864
速度はきわめて環境に依存するので各環境スレへどうぞ。
#その場合、OS、コンパイラ、CPU、ディスクなどの情報も忘れずに。

目安としては、そのファイルをできる限りシンプルな方法でコピーしてみて
その所要時間より速くはできないと思っておけばいい。


866 名前:デフォルトの名無しさん :2006/08/19(土) 13:27:24
ありがとうございます。一行ずつとかで処理かそんな感じなんですね・・・

867 名前:デフォルトの名無しさん :2006/08/19(土) 13:30:46
id<T>::resultがT::resultと同じ型になるテンプレートクラスを作りたいんですが,

template<class x>
struct id{
typedef x::result result;
};

とすると宣言するだけで

warning C4346: 'x::result' : 依存名は型ではありません。
error C2146: 構文エラー : ';' が、識別子 'result' の前に必要です。
error C2501: 'id<x>::result' : 識別名を宣言するのに、型が指定されていません。

とエラーになってしまいます.(VC)
どうすればよいでしょうか.

868 名前:デフォルトの名無しさん :2006/08/19(土) 13:35:09
>>867
やりたいことを全部書け

869 名前:デフォルトの名無しさん :2006/08/19(土) 14:09:17
>>867
コンパイラはx::resultが型かどうかわからない。
テンプレートの初歩からやり直すべき。

template < typename T >
struct id
{
typedef typename T::result result ;
} ;

870 名前:デフォルトの名無しさん :2006/08/19(土) 15:51:24
>>869
ありがとうございます.解決しました.
初歩からやり直してきます…




871 名前:デフォルトの名無しさん :2006/08/19(土) 16:25:03
basic_stringのc_str()とdata()の違いはなんでしょうか?
どちらも同じ物が返ってるようなのですが。

872 名前:デフォルトの名無しさん :2006/08/19(土) 16:34:06
c_strは\0で終わってるけど、
dataは\0で終わってるとは限らない。

873 名前:デフォルトの名無しさん :2006/08/19(土) 16:36:43
>>872
ありがとうございました

874 名前:デフォルトの名無しさん :2006/08/19(土) 16:39:35
おまえらよぉ
毎日シコシコとコンピュータばっかいじってないで、お外に出て遊べよ
おれはこの真夏の光の中を走ってきたぜ

875 名前:デフォルトの名無しさん :2006/08/19(土) 16:55:55
仕事が忙しいっつーの

876 名前:デフォルトの名無しさん :2006/08/19(土) 17:12:03
このコードはコンパイルできないんですが何がいけないんでしょうか?
void print()の行をぬくとコンパイルできます。

#include <iostream>
using namespace std;

class Entry {
public:
Entry(string& name) { theName = name; }
void print() { cout << theName << endl; }
private:
string theName;
};

int main()
{
return 0;
}


877 名前:デフォルトの名無しさん :2006/08/19(土) 17:12:48
ちなみにエラーの内容は
error C2679: 二項演算子 '<<' : 型 'std::string' の右オペランドを扱う演算子が見つかりません (または変換できません)。
です。意味がわかりません・・・

878 名前:デフォルトの名無しさん :2006/08/19(土) 17:13:45
多分
#include <string>

879 名前:デフォルトの名無しさん :2006/08/19(土) 17:16:28
>>878
あ、コンパイルはできました。ありがとうございます。

・・・でもincludeしてなかったのに
private
string theName;
でコンパイルエラーでなかったんですが。

880 名前:デフォルトの名無しさん :2006/08/19(土) 17:23:22
多分stringの定義とoperator<<の宣言は別ヘッダになってて
<iostream>ではstringの定義部分だけインクルードされてたのだろう。

881 名前:デフォルトの名無しさん :2006/08/19(土) 17:33:02
アドバイスありがとうございます。
何か複雑みたいなのでstring使うときはincludeすることにします。

882 名前:デフォルトの名無しさん :2006/08/19(土) 17:34:50
>>867
実用ならboost::mpl::identity使えよ。
やっていることは全く同じだから。

883 名前:デフォルトの名無しさん :2006/08/19(土) 17:43:09
>>880
宣言があっただけだろ。

>>881
まぁ、std::stringを使うなら<string>をインクルードしておけってこった。

884 名前:デフォルトの名無しさん :2006/08/19(土) 17:46:19
>>882
やってることが全く同じだったら、boostを使う必要は無いのでは?

885 名前:デフォルトの名無しさん :2006/08/19(土) 19:05:51
>>883
宣言だけだと theName = name やEntryのメンバtheNameでエラーになると思うよ。

886 名前:デフォルトの名無しさん :2006/08/19(土) 19:32:05
>>864 5G だと int length がオーバーフローしてないだろうか?

887 名前:デフォルトの名無しさん :2006/08/20(日) 10:10:40
Cの関数なら日本語で見つかるんですが
c++の関数やiostream、STLを詳しく書いてあるサイトはありますか?
ないなら英語でいいので教えてください。

888 名前:デフォルトの名無しさん :2006/08/20(日) 10:20:14
>>887
詳しくは無いかもしれんが。
http://www.cppreference.com/
http://www.cppll.jp/cppreference/
次スレではテンプレに入れよう。

詳しいやつは、規格書を見るのが手っ取り早いな。
英語でもいいなら >>5 のリンク先からどうぞ。

889 名前:デフォルトの名無しさん :2006/08/20(日) 16:32:05
http://www.wakhok.ac.jp/~sumi/stl/

890 名前:デフォルトの名無しさん :2006/08/21(月) 13:00:10
MSDN:
ms-help://MS.MSDNQTR.2004JAN.1041/vcstdlib/html/vcoriStandardCLibraryReference.htm


891 名前:デフォルトの名無しさん :2006/08/21(月) 13:03:08
MSDN もってないなら、こっち。
http://msdn.microsoft.com/library/default.asp?url=/library/en-us/vclang98/HTML/IOS_basic_ios.asp


892 名前:891 :2006/08/21(月) 13:04:08
ごめん、アドレスミス。
http://msdn.microsoft.com/library/default.asp?url=/library/en-us/vclang98/HTML/vclanghm.asp?frame=true


893 名前:デフォルトの名無しさん :2006/08/21(月) 20:29:18
古い(ドラフトを基にしているらしい)けど日本語。
ttp://www.microsoft.com/japan/developer/library/vclang/stdlbhm.htm

894 名前:デフォルトの名無しさん :2006/08/21(月) 20:55:31
内部で確保したバッファを任意の型で取り出すクラス
class buf{
char* buf_;//ここにバッファが確保されているとする
template <typename T>
T operator [](size_t idx);
};
を定義して、[]演算子でアクセスしようと思ったんですが、どう書けばいいのかわかりません
template <typename T>
T get(size_t idx); など関数を定義すれば
buf b;
int val;
val = b.get<int>(0x0012);//バッファ内の0x0012をintとして取り出す
可能なんですが・・・
val = b[0x0012]<int>;//こんなかんじ???


895 名前:デフォルトの名無しさん :2006/08/21(月) 21:01:28
val = b.operator[]<int>(0x0012) ;

本当にこんなことがやりたいかどうかは知らん。

896 名前:デフォルトの名無しさん :2006/08/21(月) 21:20:03
>>894
ttp://www.tietew.jp/cppll/archive/1071
ちょっと違うだろうが参考にはなるだろ。

897 名前:デフォルトの名無しさん :2006/08/21(月) 21:29:38
>>895
私もその呼び出し形式は考えたんですが、
そこまでやるならget()等通常のメンバ関数呼び出しにしようかなと・・

>>896
ありがとうございます
読んでみます

898 名前:デフォルトの名無しさん :2006/08/21(月) 22:26:00
配列を動的に確保したとします
int *a;
a=(int *)malloc(5*sizeof(int));
こうするとa[0]からa[4]まで使えますが、
後から配列の要素数を減らして不要な配列を解法したいときはどうすればいいんでしょうか?
free((a+2));
とかやるとa[0]とa[1]だけ使えてa[2]から先は開放されるんでしょうか?


899 名前:デフォルトの名無しさん :2006/08/21(月) 22:35:41
>>898
realloc
C++ならstd::vector使った方が楽。

900 名前:デフォルトの名無しさん :2006/08/21(月) 22:39:54
>>899
ありがとうございます。

901 名前:デフォルトの名無しさん :2006/08/21(月) 22:54:03
この場合は
swap使え
が正しい答えじゃね?

902 名前:デフォルトの名無しさん :2006/08/21(月) 22:56:05
>>901 どこの誤爆だ?

903 名前:901 :2006/08/21(月) 22:58:54
>>902
あーいや

>後から配列の要素数を減らして不要な配列を解法したい
こう書いてあったからさ

あ、resizeすればいいのか

904 名前:デフォルトの名無しさん :2006/08/21(月) 23:01:28
困った。こういう場合にBの宣言とtypedefで衝突して、
AがBを後方参照できないんだけど、回避策あるかなあ?

class B;

class A{
public:
void f(B& b){}
};

template<class T>
class BBase{
public:
};
typedef BBase<int> B;

int main(){
Bb;
}



905 名前:デフォルトの名無しさん :2006/08/21(月) 23:01:42
大抵のvectorの実装では、要素の数を減らしても、
内部で確保されているメモリは減らないけどね。

906 名前:デフォルトの名無しさん :2006/08/21(月) 23:10:50
>>904 class B

907 名前:デフォルトの名無しさん :2006/08/21(月) 23:51:47
>>905
たぶん、そういうレスのために>>901を用意していたのだろう。

↓「でも、OSにメモリが・・・」

908 名前:デフォルトの名無しさん :2006/08/22(火) 00:31:28
>904
前方宣言は正しく

909 名前:デフォルトの名無しさん :2006/08/22(火) 02:43:46
>> 908
?

910 名前:デフォルトの名無しさん :2006/08/22(火) 03:00:32
>>904
Aの前でBをtypedefするか
A::fをメンバ関数テンプレートにするか
くらいかなぁ?


911 名前:デフォルトの名無しさん :2006/08/22(火) 03:40:11
template<class T> class BBase;
typedef BBase<int> B;

class A{
public:
void f(B& b){}
};

template<class T>
class BBase{
public:
};

912 名前:デフォルトの名無しさん :2006/08/22(火) 03:44:39
んーー、普通に先行宣言するなら
template<class T> class BBase;
typedef BBase<int> B;
class A { ... };
だけど、そういうこと言ってるんじゃなくて、
class Bというのが別にあって、
それがtypedefした名前とぶつかってるって話だよね。

例えば、struct statなんてのは、関数のstat()と名前がかぶっているんだけど
直前に"struct"を付ける事で回避できる(同じスコープで同時に使用できる)から
class Bに限っては、直前に"class"をつければ使えるかもしれないね。
試してないけど。

913 名前:デフォルトの名無しさん :2006/08/22(火) 04:15:06
>>912
すんません、絡まってたんでわかりずらかったんですが、
911,912さんので解決です。どうもです。

914 名前:デフォルトの名無しさん :2006/08/22(火) 07:28:35
typedef class... B;

class B;
で前方宣言したつもりだったのか。
そりゃうまくいかない。

915 名前:デフォルトの名無しさん :2006/08/22(火) 17:45:03
memcpy(_iconGroupData + offset, &grpEntry, sizeof(GRPICONDIRENTRY));
このソースの+とはどういう意味なのでしょうか?

916 名前:デフォルトの名無しさん :2006/08/22(火) 17:46:11
>>915
おそらく&_iconGroupData[offset]と同じこと。

917 名前:デフォルトの名無しさん :2006/08/22(火) 18:13:35
>>887
SGIのサイト見ろや。

918 名前:デフォルトの名無しさん :2006/08/22(火) 18:16:46
>>898
通常、サイズ変更は大きなコストを支払うことになるから、
あらかじめ適切なサイズを確保することにしたり、
一時領域を使い廻したりすることを考えた方がよいことがある。

919 名前:デフォルトの名無しさん :2006/08/23(水) 00:13:26
>>917
こうですか!? わかりません!
http://www.sgi.org/

920 名前:デフォルトの名無しさん :2006/08/23(水) 01:33:03
C++ ってメソッドをクラス定義の外に書く事って出来ないの?

メソッドを全く持たない class foo があったとして、
foo を弄らずに foo::bar() を後から定義して
myfoo.bar() みたいな感じで呼び出すみたいな。

921 名前:デフォルトの名無しさん :2006/08/23(水) 01:34:40
継承すれば?

922 名前:デフォルトの名無しさん :2006/08/23(水) 01:36:57
>>920
クラス定義内で宣言した奴を外で定義できる。
クラス定義外でメンバの宣言を追加すことは出来ない。

923 名前:デフォルトの名無しさん :2006/08/23(水) 01:40:06
宣言と定義は違う

924 名前:デフォルトの名無しさん :2006/08/23(水) 01:47:16
>>922
クラス定義内で宣言していないメソッドを追加する事が出来ないかなと考えていました。
特に必要なわけではないのですが、文法上問題無さそうなのに何でだろうと思いまして。

925 名前:デフォルトの名無しさん :2006/08/23(水) 01:50:12
>>924
勝手にメンバ関数追加できたら private も糞もねーな。

926 名前:デフォルトの名無しさん :2006/08/23(水) 02:38:23
文法上の問題がなかったとしても概念上は問題ありまくりだ。

927 名前:デフォルトの名無しさん :2006/08/23(水) 03:16:58
>>920
ヤマシタ! ヤマシタ! オマエズルイモン!

928 名前:デフォルトの名無しさん :2006/08/23(水) 04:39:56
>>925
private は考えてませんでした。
後から定義したメソッドからはアクセス不可にするのでも良いような気がしますが、
言語仕様としては複雑になってしまいますね。

アウターワールドは開始直後のワカメみたいなのに殺されて以来プレイしていません。

929 名前:デフォルトの名無しさん :2006/08/23(水) 05:12:10
ヤマシタだけでわかるなんて相当好きなんじゃん

930 名前:デフォルトの名無しさん :2006/08/23(水) 08:35:34
>>924
そもそもC++をなんでもありと思うのが間違い。
C++(に限らないことのはずだが)どんな機能もそれにはきちんとした必要性があったから導入された。

あ、でももしoperator .の多重定義ができるようになったとしたら、
外見上924の考えているのと同じことになりそうだけど。

931 名前:デフォルトの名無しさん :2006/08/23(水) 09:49:58
なりません
とりえあず>>920はgeneric function風の
bar(myfoo)の多重定義で我慢して。

932 名前:デフォルトの名無しさん :2006/08/23(水) 10:17:20
>>920
template< typename Function, class T > class dynamic_method {
 Function fun; T * obj;
public:
 typedef typename function_traits
  < typename remove_pointer<Function>::type >::result_type result_type;
 
 dynamic_method( Function fun, T * obj ) : fun( fun ), obj( obj ) {}

 result_type operator()() const {
  return fun( *obj );
 }
 template< typename A1 > result_type operator()( A1 & a1 ) const {
  return fun( *obj, a1 );
 }
};
template< typename T > struct use_dynamic_method {
 template< typename Function >
 dynamic_method< Function, T > operator->*( Function func ) {
  return dynamic_method< Function, T >( func, static_cast<T*>(this) );
 }
};

class foo : public use_dynamic_method<foo> {};
void bar( foo & obj, char const * message ) { cout << message << endl; }

int main() {
 foo myfoo;
 (myfoo->*bar)("dynamic call");
}

変態とか言うな

933 名前:デフォルトの名無しさん :2006/08/23(水) 11:13:01
変態にもほどがある。

934 名前:デフォルトの名無しさん :2006/08/23(水) 11:32:53
dynamicと言ってる割にはstaticなのね。

935 名前:デフォルトの名無しさん :2006/08/23(水) 11:58:14
>>934
あ…

さ、最初は連想配列に、function オブジェクト突っ込んでほんとに動的に追加できるように
しようと思ってたけど、可変引数に対応させようと色気だしてごちゃごちゃやっているうちに
静的になってしまったんだよ。ホントだよ。
呼び出し方は、↓のように文字列か、数字をキーにしようと思ってた。

(myfoo->*"bar") = function< void ( foo & ) >( bar ); // 関数追加
(myfoo->*"bar")();
(myfoo->*"dar")(); // throw そんな関数は存在しない例外

見たいな。
ちなみに、仮想関数的な振る舞いは最初から考慮しておりません。


936 名前:デフォルトの名無しさん :2006/08/23(水) 12:00:03
元ネタ見たい人はboostスレに行ってねw

937 名前:デフォルトの名無しさん :2006/08/23(水) 12:15:46
こんなのはどうよ。932でoperator ->*をメンバにする意図がわからなかった。その後935が書かれた。
template<typename T, typename Functor>
boost::function<void ()>
operator ->*(T obj, Functor f)
{
return boost::bind(f, obj);
}

class Hoge {};
void hello(Hoge) {std::cout << "Hello" << std::endl;}

int main()
{
    Hoge hoge;
    (hoge->*hello)();
}

938 名前:デフォルトの名無しさん :2006/08/23(水) 15:09:23
>>937
それだと、複数引数に対応できないから、無理に operator->* 使うより
普通に hello( hoge ); で呼んだほうがええね。


939 名前:デフォルトの名無しさん :2006/08/23(水) 21:17:49
>>932
よくわからないけど凄い。
ちなみに

 template< typename Function >
 dynamic_method< Function, T > operator->*( Function func ) {

のtemplate引数Functionは明示的にinstantiateされていないけど、
コンパイラが自動的に推測してくれるのでしょうか?

(myfoo->*bar)("dynamic call");

で利用されているからFunction = void (foo&, char const *)とか

940 名前:デフォルトの名無しさん :2006/08/23(水) 23:25:02
だれか>>932について1行1行解説して
たのむ

941 名前:デフォルトの名無しさん :2006/08/24(木) 00:45:35
>>940
>>932じゃないけど解説してみる。

use_dynamic_methodをCRTPでpublic継承すると、operator ->* () が使えるようになる。
operator ->* ()は、関数オブジェクトを引数にとり、dynamic_method型のオブジェクトを返す。
ここでいう関数オブジェクトとは、use_dynamicmethodを継承するクラスへの参照と、任意の型を引数に取るもののこと。
ここでは、任意の型はひとつしか引数の取れないが、
dynamic_methodをちょっといじれば、現実的に問題のないくらい多数の引数を取るようにもできる。

dynamic_methodは、関数オブジェクトのラッパ。

使用例を分かりやすく書くと

myfoo.operator->*(bar) ("dynamic call") ;

operator->*を呼び出すことで、dynamic_method型のオブジェクトが返される。
で、そのoperator()()が呼び出されることで、実際の本当に呼び出したい関数オブジェクト、barが呼び出される。


でもまあ、bar(myfoo) ; でいいじゃんというのはまた別の話

942 名前:941 :2006/08/24(木) 01:02:03
ごめん、関数オブジェクトじゃなくて、関数ポインタだった。

943 名前:デフォルトの名無しさん :2006/08/24(木) 16:51:28
動的じゃないと言われてカッとなってやった。今は深く反省している。

template< typename T > struct dynacall {
 T & o;
 any & c;
 dynacall( T * object, any & content ) : o( *object ), c( content ) {}
 template< typename R > R operator()( type<R> ) {
  return (any_cast< function< R ( T & ) > >(c))(o);
 }
 template< typename R, typename A1 > R operator()( type<R>, A1 a1 ) {
  return (any_cast< function< R ( T &, A1 ) > >(c))(o,a1);
 }
 template< typename R > R value_of() const { return any_cast< R >(c); }
};
template< typename T > struct prototype {
 typedef map< string, any > map_type;
 map_type m;
 dynacall<T> operator->*( typename map_type::size_type index ) {
  typename map_type::iterator it = m.begin();
  advance( it, index );
  return dynacall<T>( static_cast<T*>(this), it->second );
 }
 dynacall<T> operator->*( typename map_type::key_type const & key ) {
  return dynacall<T>( static_cast<T*>(this), m[key] );
 }
 template< typename F > void register_fun( typename map_type::key_type const & key, F f ) {
  m[key] = function< remove_pointer<F>::type >(f);
 }
 template< typename V > void register_val( typename map_type::key_type const & key, V v ) {
  m[key] = v;
 }
};

944 名前:943 :2006/08/24(木) 16:55:13
>>943 の使い方

class foo : public prototype<foo> {};

int bar( foo & x, int a ) { return a; }

int main() {
foo myfoo;
myfoo.register_fun( "bar", bar );
myfoo.register_val( "hage", 12 );
cout << (myfoo->*"bar")( type<int>(), 10 ) << endl; // 10 と表示
cout << (myfoo->*0)( type<int>(), 20 ) << endl; // 20 と表示
cout << (myfoo->*1).value_of<int>() << endl; // 12 と表示
}

どうみても変態です。
必要なヘッダは、<boost/any.hpp> や、<boost/function.hpp> など。
良い子でなくてもマネしちゃだめ。

945 名前:デフォルトの名無しさん :2006/08/24(木) 17:27:13
anyは正直反則だと思う。
でも、C++0xの標準ライブラリに入ることが予定されているんだよな……。

946 名前:デフォルトの名無しさん :2006/08/24(木) 17:40:04
病気になるよ


947 名前:デフォルトの名無しさん :2006/08/24(木) 18:54:40
だれか>939にお答えを…!

948 名前:デフォルトの名無しさん :2006/08/24(木) 19:24:14
>>947
関数f の引数として、関数ポインタを渡す場合、f( bar ) と記述してもいいことになってます。
なので、(myfoo->*bar) は、(myfoo->*&bar) と同じ意味になります。
よって、Function の型は、「 void (*)( foo &, char const * ) 」 つまり関数ポインタ型。
このままだと、function_traits に渡せないので、remove_pointer して、「 void ( foo &, char const * ) 」にしているわけです。

949 名前:943 :2006/08/24(木) 19:42:30
>>943 何も考えずに、prototype ってクラス名にしたけど、
冷静になると、ぜんぜん prototype ってカンジじゃねーな。
map_type m; を、static map_type m; にすれば、少しは prototype っぽくなるかも。



950 名前:デフォルトの名無しさん :2006/08/24(木) 23:49:42
>>948
どうもありがとうございます。普通のtemplate classの場合と違って、

myfoo->*<void (*)(foo&, char const *)>bar

と書かなくて良いのは、何か特例なんでしょうか?

951 名前:デフォルトの名無しさん :2006/08/25(金) 00:02:19
>>950
関数テンプレートのテンプレート引数は引数の型から推論される。
std::max(4, 2);などと書けるのと同じ。

952 名前:デフォルトの名無しさん :2006/08/25(金) 00:04:04
オtットット夏だぜ

953 名前:デフォルトの名無しさん :2006/08/25(金) 00:08:30
C++初心者ですが、
class Camera;
などのような使用クラスの宣言とはどんなものなのでしょうか?
ヘッダファイルに書いてあったのですが。

入門書などではClass Camera{---}; Camera camera1;などのように宣言
してありチンプンカンプンです。

954 名前:デフォルトの名無しさん :2006/08/25(金) 00:11:08
>>953
Cameraがクラスであることを宣言するが、どんなクラスであるかの定義は行わない。

955 名前:953 :2006/08/25(金) 00:12:37
>>954
ありがとうございます。

956 名前:デフォルトの名無しさん :2006/08/25(金) 00:53:23
>>951
なるほど、有難うございました.。

957 名前:デフォルトの名無しさん :2006/08/25(金) 20:17:19
intとかunsigned intとかの最大値をtemplateで取得することって
できましたっけ?
template<class T>
T GetMaxSize(T t){}
的な感じで。

958 名前:デフォルトの名無しさん :2006/08/25(金) 20:21:39
#include<limits>
template<typename T>
T GetMaxSize(const T&){
    return std::numeric_limits<T>::max();
}

959 名前:デフォルトの名無しさん :2006/08/25(金) 20:35:14
うぅ、知りませんでした。ありがとうございます。
return (T)(-1);
的な感じでできるかなと思ってましたが、unsignedとsignedの見分けが・・
とか思ってました。numeric_limitsは特殊化で全型分用意してるみたいですね。
最近自分のコードの型あふれに対する対処がすごく甘いなあと。
なんというか包括的な対処法っていうのはなんかないんですかねえ。(例外飛ばすとか)
みなさんどうしてますか?

960 名前:デフォルトの名無しさん :2006/08/25(金) 22:24:37
C++を使うな。終り。

961 名前:デフォルトの名無しさん :2006/08/25(金) 23:25:17
>>みなさんどうしてますか?

お前だけだよ

962 名前:デフォルトの名無しさん :2006/08/25(金) 23:52:53
>>959 boost::numeric_cast

963 名前:デフォルトの名無しさん :2006/08/26(土) 00:00:06
これはひどい

964 名前:デフォルトの名無しさん :2006/08/26(土) 00:15:05
ばかばっか

965 名前:デフォルトの名無しさん :2006/08/26(土) 00:21:48
http://www.boost.org/libs/numeric/conversion/doc/numeric_cast.html
> unsigned long l=std::numeric_limits<unsigned long>::max();
> // This works, because unsigned integral types cannot cause overflow.
> unsigned char c=numeric_cast<unsigned char>(l);

エエェェ(´Д`)ェェエ

966 名前:デフォルトの名無しさん :2006/08/26(土) 00:51:57
>>959
ありがとうございます。たぶん解決しそうです。
>>965
今のところunsignedでも動いてます

967 名前:デフォルトの名無しさん :2006/08/26(土) 00:54:07
まちがえ
>>962
ありがとうございます。たぶん解決しそうです。
>>965
今のところunsignedでも動いてます

968 名前:デフォルトの名無しさん :2006/08/26(土) 01:00:51
unsignedに対してシフト演算(やそれに類するかけ算)をしたときに、
いちいち例外投げられたら面倒でやりきれないからじゃないの?
と勝手に想像してみる。


969 名前:デフォルトの名無しさん :2006/08/26(土) 01:11:46
ゼロ除算で例外が飛ぶことを考えればオーバーフローも例外扱いされるべきだとは思う。(シフト演算の場合は除く)

970 名前:デフォルトの名無しさん :2006/08/26(土) 01:14:26
しかし、そうするとあらゆる演算に
numeric_cast<int>(i * 3)
とかしなくちゃいけなくなるな

971 名前:デフォルトの名無しさん :2006/08/26(土) 01:16:21
>>970
int * 3 の評価の時点でオーバーフローする場合、
オーバーフローの結果である int 型の値に対して
numeric_cast<int> しても意味無い。

972 名前:デフォルトの名無しさん :2006/08/26(土) 01:24:33
ほんと、boost馬鹿って迷惑だよな

973 名前:デフォルトの名無しさん :2006/08/26(土) 01:29:50
そうか?

974 名前:デフォルトの名無しさん :2006/08/26(土) 01:30:18
ん?その評価をするためにcastが必要なんだろ?
int i2 = numeric_cast<int>(i * 3);
iの3倍をi2に入れるときにbad_numeric_castを出させるには
こうするしかないでしょ。

975 名前:デフォルトの名無しさん :2006/08/26(土) 01:36:57
>>974
i の型は何だ? int 以下のサイズの整数型なら、その numeric_cast は利かないだろう。

976 名前:デフォルトの名無しさん :2006/08/26(土) 01:38:13
>>974
boostばかり使っていると、こういう馬鹿になりますよ。

977 名前:デフォルトの名無しさん :2006/08/26(土) 01:45:24
>>974
演算のオーバーフローについてチェックしてくれてるわけじゃないから

978 名前:デフォルトの名無しさん :2006/08/26(土) 01:47:06
袋叩きw

979 名前:デフォルトの名無しさん :2006/08/26(土) 01:50:04
>>974
それは次のコードと等しい。
int temp = i * 3;
int i2 = numeric_cast<int>(temp);

お前が望んでいる動作は、仮にsizeof (int) < sizeof (long)だとすれば、一例だが次のような感じになる。
int i2 = numeric_cast<int>(implicit_cast<long>(i) * 3);

それとも、もしやiはint型ではないと言うつもりか?

980 名前:デフォルトの名無しさん :2006/08/26(土) 01:52:29
それ位で許してやれよw

981 名前:デフォルトの名無しさん :2006/08/26(土) 01:53:10
あれ?じゃこういう演算のオーバーフローってどうすんの?
int i;
i = ???;
int i2 = i * 3;
毎回if(i < INT_MAX/3)みたいに事前にあふれチェック?

982 名前:デフォルトの名無しさん :2006/08/26(土) 01:55:35
何言ってんだ、こいつ。

983 名前:デフォルトの名無しさん :2006/08/26(土) 02:02:19
>>982
なんか難しいこと言ったか?例えばC#はchecked blockとかで演算の
オーバーフローをチェックできるだろ?

984 名前:デフォルトの名無しさん :2006/08/26(土) 02:04:20
何言ってんだ、こいつ。

985 名前:デフォルトの名無しさん :2006/08/26(土) 02:05:34
次スレ準備中。リンク貼れるようにレス番節約お願い。

986 名前:デフォルトの名無しさん :2006/08/26(土) 02:06:42
>>984
ずいぶん頭悪いんだね。。

987 名前:デフォルトの名無しさん :2006/08/26(土) 02:07:53
>>986
アホ。関連レスを最初から読め。

988 名前:デフォルトの名無しさん :2006/08/26(土) 02:14:46
読んだ結果だろ。boost::numeric_castは型から型のキャストに
ついてチェックしてくれるだけで、演算についてはしてくれないだろ?
じゃあ、演算についてはどうするんだ?C#はcheckedとかあるよな?
で、C++ってどうすりゃいいんだったっけ?と言っただけだがまだ難しいか?

989 名前:デフォルトの名無しさん :2006/08/26(土) 02:15:36
>>981
なぜ「あれ?じゃ・・・」なのか意味不明だが、ケースバイケースだな。

990 名前:デフォルトの名無しさん :2006/08/26(土) 02:16:42
>>988
まさか本当に「難しいから回答が得られない」と思ってるわけではないだろうな。

991 名前:デフォルトの名無しさん :2006/08/26(土) 02:17:40
お前ら、くだらんたわごとは止めて、新レスのリンクが貼られるまで発言すんな。

992 名前:v(^・^)v :2006/08/26(土) 02:18:15
次スレ
C++相談室 part52
http://pc8.2ch.net/test/read.cgi/tech/1156525695/

993 名前:v(^・^)v :2006/08/26(土) 02:20:45
>>991
> 新レスのリンク
v(^・^)v プギャーー

994 名前:デフォルトの名無しさん :2006/08/26(土) 02:20:57
シフト演算のつもりで割り算してて、かつ、右辺が0だっていうんなら、
むしろ例外を投げてくれた方がありがたいよ。

995 名前:デフォルトの名無しさん :2006/08/26(土) 02:20:57
>>990
で?

996 名前:デフォルトの名無しさん :2006/08/26(土) 02:23:10
>>995
何が「で?」だよw
答え知りたいなら、それなりの質問態度でなw

997 名前:デフォルトの名無しさん :2006/08/26(土) 02:24:54
>>970=>>974=>>981なんだろうなぁ。。。

998 名前:デフォルトの名無しさん :2006/08/26(土) 02:26:09
boost馬鹿って、ほんとに迷惑ですね。

999 名前:デフォルトの名無しさん :2006/08/26(土) 02:27:14
>>998 恥ずかしいセリフ禁止

1000 名前:デフォルトの名無しさん :2006/08/26(土) 02:27:44
>>993
素で間違えた。ハズカシー


■過去ログ置き場に戻る■ 1- 前250 次250 最新50
DAT2HTML 0.33f Converted.