[表示 : 全て 最新50 1-99 101- 201- 301- 401- 501- 601- 701- 801- 901- 2chのread.cgiへ]
Update time : 05/09 20:36 / Filesize : 218 KB / Number-of Response : 953
[このスレッドの書き込みを削除する]
[+板 最近立ったスレ&熱いスレ一覧 : +板 最近立ったスレ/記者別一覧] [類似スレッド一覧]


↑キャッシュ検索、類似スレ動作を修正しました、ご迷惑をお掛けしました

C++相談室 part78



1 名前:v(^・^)v mailto:sage [2010/02/13(土) 23:18:03 ]
C++に関する質問やら話題やらはこちらへどうぞ。
ただし質問の前にはFAQに一通り目を通してください。
IDE (VC++など)などの使い方の質問はその開発環境のスレに
お願いします。

前スレ
C++相談室 part77
pc12.2ch.net/test/read.cgi/tech/1263556932/

2 名前:デフォルトの名無しさん mailto:sage [2010/02/13(土) 23:20:55 ]
■基本■
[C++ FAQ]
 www.parashift.com/c++-faq-lite/
 www.bohyoh.com/CandCPP/FAQ/ (日本語)
  Cとその仕様を比較しながらの解説なので分かりやすい。
  ***** 質問の前に必ずこの二つに目を通してください *****
[C/C++ リファレンス]
 www.cppreference.com/ (英語)
 www.cppreference.com/wiki/jp/ (↑の日本語訳だけどまだ未完)
[禿 Stroustrup]
 www.research.att.com/~bs/
[C++ International Standard]
 www.iso.org/iso/iso_catalogue/catalogue_tc/catalogue_detail.htm?csnumber=38110
[JTC1/SC22/WG21 - C++]
 www.open-std.org/jtc1/sc22/wg21/
  ここから規格の最新(2003より新しい)ドラフトがダウンロードできる。
[JIS X3014]
 www.jisc.go.jp/app/pager?id=15868
  ISO規格の日本語訳。JIS X 3014:2003はISO/IEC 14882:2003 (E)に対応。

3 名前:デフォルトの名無しさん mailto:sage [2010/02/13(土) 23:24:24 ]
■Libraries■
[Boost]
 Boost www.boost.org/
 (日本語) www.kmonos.net/alang/boost/
 (日本語) shinh.skr.jp/boost/
[標準ライブラリ]
 SGI-STL www.sgi.com/tech/stl/
 STLport stlport.sourceforge.net/
 GNU libstdc++ gcc.gnu.org/libstdc++/
 Apache C++ Standard Library (STDCXX) stdcxx.apache.org/
 STLFilt www.bdsoft.com/tools/stlfilt.html
 (日本語) episteme.wankuma.com/stlprog/ (※1999年発行注意)
[Loki]
 sourceforge.net/projects/loki-lib/
 LokiPort-MSVC6sp5 fara.cs.uni-potsdam.de/~kaufmann/?page=lokiport

4 名前:デフォルトの名無しさん mailto:sage [2010/02/13(土) 23:28:14 ]
■Books■
amazon.com C,C++関連書籍
 www.amazon.com/exec/obidos/tg/browse/-/3956/ref=br_bx_c_1_3/

The C++ Programming Language
 www.amazon.com/exec/obidos/ASIN/0201700735/
 www.amazon.co.jp/exec/obidos/ASIN/475611895X/ (翻訳)
C++ Primer (3rd Edition)
 www.amazon.com/exec/obidos/ASIN/0201824701/
 www.amazon.co.jp/exec/obidos/ASIN/4756140068/ (翻訳)
The C++ Standard Library
 www.amazon.com/exec/obidos/ASIN/0201379260/
 www.amazon.co.jp/exec/obidos/ASIN/4756137156/ (翻訳)
Effective C++
 www.amazon.com/exec/obidos/ASIN/0201924889/
 www.amazon.co.jp/exec/obidos/ASIN/4756118089/ (翻訳)
More Effective C++
 www.amazon.com/exec/obidos/ASIN/020163371X/
 www.amazon.co.jp/exec/obidos/ASIN/4756118534/ (翻訳)
Exceptional C++
 www.amazon.com/exec/obidos/ASIN/0201615622/
 www.amazon.co.jp/exec/obidos/ASIN/4894712709/ (翻訳)
More Exceptional C++
 www.amazon.com/exec/obidos/ASIN/020170434X/
Exceptional C++ Style
 www.amazon.com/exec/obidos/ASIN/0201760428/

5 名前:デフォルトの名無しさん mailto:sage [2010/02/13(土) 23:29:23 ]
■Books(Templateまわり)■
Effective STL
 www.amazon.com/exec/obidos/ASIN/0201749629/
 www.amazon.co.jp/exec/obidos/ASIN/4894714108/ (翻訳)
Modern C++ Design
 www.amazon.com/exec/obidos/ASIN/0201704315/
 www.amazon.co.jp/exec/obidos/ASIN/4894714353/ (翻訳)
C++ Templates
 www.amazon.com/exec/obidos/ASIN/0201734842/
C++ Template Metaprogramming
 www.amazon.com/exec/obidos/ASIN/0321227255/

6 名前:デフォルトの名無しさん mailto:sage [2010/02/13(土) 23:30:53 ]
長いソースを貼るときはここへ。
 codepad.org/

7 名前:v(^・^)v mailto:sage [2010/02/13(土) 23:36:05 ]
基本のリンクは少し更新しといた。あと Libraries のリンクを復活させといた。

後は好きにして。

8 名前:デフォルトの名無しさん [2010/02/13(土) 23:48:06 ]
近縁スレでも貼る?

 【初心者歓迎】C/C++室 Ver.71【環境依存OK】
 ttp://pc12.2ch.net/test/read.cgi/tech/1264774545/
 初心者はこちらへ

 C言語なら俺に聞け(入門編)Part 60
 ttp://pc12.2ch.net/test/read.cgi/tech/1264920499/
 C言語はこちらへ

ぐらいか?


9 名前:デフォルトの名無しさん mailto:sage [2010/02/14(日) 02:08:30 ]
前スレの話だけど、関数テンプレートならinline付けずに
ヘッダに定義書いても全然問題ないことをどっちか片方が知らないように感じた。
俺の誤解だといいんだけど。

10 名前:デフォルトの名無しさん mailto:sage [2010/02/14(日) 08:16:00 ]
>>9 さすがにそれは無いでしょ。それだと判断基準以前の話になってるはず。



11 名前:デフォルトの名無しさん mailto:ageage [2010/02/14(日) 09:26:00 ]
前スレの方が上とはけしからん

age

12 名前:デフォルトの名無しさん mailto:sage [2010/02/14(日) 09:59:23 ]
STLつかうと一気に実行ファイルサイズが10倍に?!

環境によるだろ。
俺はBorland-C++5.6.2に -D_RTLDLL オプションを指定して、極力
ランタイムを使用するようにして使っているが、例えばstd::vectorを
使っても使わない時と比べ10Kほどしか増えない

すげえ。ダイナミックリンクしといてファイルサイズが増えないとかいってるよ。この人。

C1010: プリコンパイル済みヘッダーの検索中に予期しない EOF を検出しました。
とかいうエラーが出るんだけどこれってどうすればいいの?

#include <stdafx.h>
後死ね。

言葉が悪いな。それで教えているつもりか。
まぁヒントぐらいにはなったな。
うむごくろう。

13 名前:デフォルトの名無しさん mailto:sage [2010/02/14(日) 10:06:33 ]
ところで現在のC++0xは
いつ頃 正式なC++になるんですか?

14 名前:デフォルトの名無しさん mailto:sage [2010/02/14(日) 10:12:35 ]
2011年10月23日2時13分25秒頃

15 名前:デフォルトの名無しさん mailto:sage [2010/02/14(日) 10:19:30 ]
VS2010はSP1で完全対応してくれるんかいな

16 名前:デフォルトの名無しさん mailto:sage [2010/02/14(日) 17:31:43 ]
>>12
地鎮乙

17 名前:デフォルトの名無しさん mailto:sage [2010/02/14(日) 19:14:00 ]
if else文で文字列のパターンを32個
チェックするのが、どうにも気持ち悪いのですが
何か別の方法はないでしょうか?


18 名前:デフォルトの名無しさん mailto:sage [2010/02/14(日) 19:15:46 ]
関数ポインタとの連想配列作るとか

19 名前:デフォルトの名無しさん mailto:sage [2010/02/14(日) 19:16:36 ]
パターンを配列に入れてループ

20 名前: ◆GWRSHcLrd6 [2010/02/14(日) 19:18:15 ]
どうも。
スマートポインタにメモリプールを実装してみました。
(なんか保守的GCみないな感じになりましたが・・・)

まだうpしてませんが(随分汚いので)、ベンチだけ取ってみました。



21 名前:デフォルトの名無しさん mailto:sage [2010/02/14(日) 19:21:35 ]
で、ベンチは?

22 名前: ◆GWRSHcLrd6 mailto:sage [2010/02/14(日) 19:26:26 ]
ループは10000, サンプリングは5で行いました。

boost::shared_ptrのベンチマーク(非スレッドセーフ)
単純な生成ループ: 15, 空ポインタに代入: 12
オブジェクトのリセット: 25, オブジェクトのコピー: 24
オブジェクトの解放: 9

framework::smart_ptrのベンチマーク(with メモリプール)
単純な生成ループ: 3, 空ポインタに代入: 12
オブジェクトのリセット: 12, オブジェクトのコピー: 12
オブジェクトの解放: 6

トータルスコア:
boost::shared_ptr: 85
framework::smart_ptr: 45

boost::shared_ptrに対する性能
単純な生成ループ: 500.0%
空ポインタに代入: 100.0%
オブジェクトのリセット: 208.3%
オブジェクトのコピー: 200.0%
オブジェクトの解放: 150.0%

全体: 188.9%

いやあ、劇的ですわ

ソースが汚いので、奇麗に書きなおせばあと10%はアップすると思います。

23 名前:デフォルトの名無しさん mailto:sage [2010/02/14(日) 19:30:10 ]
既存の実用アプリでレポ

24 名前:デフォルトの名無しさん mailto:sage [2010/02/14(日) 19:30:31 ]
まずはスマポのソースうp

25 名前:デフォルトの名無しさん mailto:sage [2010/02/14(日) 20:03:40 ]
C++ではメソッドチェーンを、あんまり使わないんだね

26 名前:デフォルトの名無しさん mailto:sage [2010/02/14(日) 21:01:28 ]
>>25
多用されてるでしょ。主にoperator系、特にストリーム操作とか。
印象は違うかもしれないけどオブジェクトのメソッドがオブジェクト自身を返して連鎖していくって意味では
まさにメソッドチェーン。

27 名前: ◆GWRSHcLrd6 mailto:sage [2010/02/14(日) 21:03:39 ]
メモリプールの仕組みがこんなんなんですけど、効率のいい方法はどんなのが
あるんですか?

cdtest.genin.jp/projects/smart_ptr/pool_system.png

>>25
効率が悪いからでは?

28 名前:デフォルトの名無しさん mailto:sage [2010/02/14(日) 21:10:01 ]
>>27
このスマポってライセンス何なの?
まだ考えてない?

29 名前: ◆GWRSHcLrd6 mailto:sage [2010/02/14(日) 21:15:53 ]
ま、まだ考えてないです・・・
ライセンスは何がいいんでしょう・・・?


30 名前:デフォルトの名無しさん mailto:sage [2010/02/14(日) 21:20:00 ]
ただの習作でしょ。
実用プログラムに組み込みたいと思ってる奴なんて要るの?



31 名前:デフォルトの名無しさん mailto:sage [2010/02/14(日) 21:21:41 ]
Googleのメモリ管理でいい。tcmallocとかいうやつ

32 名前:デフォルトの名無しさん mailto:sage [2010/02/14(日) 21:21:48 ]
アロケートしたメモリのバイト数分だけジェリービーンズで支払う

33 名前:デフォルトの名無しさん mailto:sage [2010/02/14(日) 21:29:51 ]
まだソース見ないから分からないけど
NYSLライクなら昔作ったスレッドセーフ用のスマポと比較して
性能が良かったら使おうと思った
ライブラリに合わせて改変することになるだろうからLGPLとかだと無理なんだけど
この先も色々評価して高速化するなら需要はあるんじゃね?

34 名前:デフォルトの名無しさん mailto:sage [2010/02/14(日) 21:32:57 ]
>>27
こんなの遅くて使いものにならんでしょ。
以下の問いに対して、少なくともdlmallocよりも高効率なのかよw?

こんな糞データ構造で、メモリの空き領域をどうやって効率的にさがせる
のか答えてみろよw?これじゃ単なる線形リストだろw

このスレに2度と来るないいな?わかったか?




35 名前:デフォルトの名無しさん mailto:sage [2010/02/14(日) 21:35:20 ]
>>34
>>27 の質問を良く見てみろ

36 名前: ◆GWRSHcLrd6 mailto:sage [2010/02/14(日) 21:35:44 ]
>>30 >>33
まあ、これから頑張って独自性がでるようになってきたら、
ライセンスをつけたいと思います。
それまでは改変自由で(まだ大したものじゃないですしね)。

>>31
tcmalloc、ググりました。
こういうアロケートの仕方もあるんですね。
でもあれってアロケートはシステムコールとかで
バリバリにコーディングされているのかな?

ちょっとコード見てきます。

37 名前: ◆GWRSHcLrd6 mailto:sage [2010/02/14(日) 21:37:33 ]
>>34
申し訳ないです・・・

38 名前:デフォルトの名無しさん mailto:sage [2010/02/14(日) 21:37:45 ]
>>34
突然どうした
ちょっと落ち着け

39 名前:デフォルトの名無しさん mailto:sage [2010/02/14(日) 21:38:24 ]
速度はたいした問題でない。既にある物より圧倒的に遅いなら別だが。
安定していて使いやすいこと。
しかしGoogleのメモリ管理もあまり流行ってないし、普及させられるほどの価値ある物は出来ないと思う。
メモリプールしても全体の速度向上はほとんど望めない。
普及させられるとしたら、boost互換のインターフェースでboostよりメリットがあること。

40 名前:デフォルトの名無しさん mailto:sage [2010/02/14(日) 21:42:38 ]
>>36
メモリ操作のみなら、Googleのメモリ管理は超速だが
実際にアプリに組み込むと何の変化も出ない。
現実アプリはメモリの生成・解放ばかりしていない。
プールはおまけにするか、Google任せにしてスマートポインタ開発のほうが
需要出ると思う。



41 名前:デフォルトの名無しさん mailto:sage [2010/02/14(日) 21:54:29 ]
Googleはこんなこともしてたのか知らんかった。
ちょっと見てみたけどtcmallocって改良版dlmallocみたいなのか。

42 名前:デフォルトの名無しさん mailto:sage [2010/02/14(日) 22:48:55 ]
>>27
線形以外の探索ってどんなのがいいのかねぇ

43 名前:デフォルトの名無しさん mailto:sage [2010/02/14(日) 22:59:37 ]
>>27
このプールから削除する場合はどうなるんだ?使い捨て?

44 名前:デフォルトの名無しさん mailto:sage [2010/02/14(日) 23:04:19 ]
>>42
最速の固定長の小メモリブロックアロケータは simple segregated storage だとわかりきっている。
探索しないでいい。

45 名前:デフォルトの名無しさん mailto:sage [2010/02/14(日) 23:36:17 ]
ヒープメモリーにヒープ構造を!w

46 名前:デフォルトの名無しさん mailto:sage [2010/02/14(日) 23:50:34 ]
boost::shared_ptrにもメモリプールを使うオプションがあったような

47 名前: ◆GWRSHcLrd6 mailto:sage [2010/02/14(日) 23:54:13 ]
>>43
inner_ptrの方でゼロ初期化され、新たなアロケートで再利用されます。

というかカウント0のものはゴミとみなして新しくAllocした時にそれを使います。

で、ブロックが空、なおかつ、ブロックを多く確保しすぎている場合は
そのブロックはdeleteされて前後のブロックをリストで繋ぎます。

>>45
そうなんですよw

48 名前:デフォルトの名無しさん mailto:sage [2010/02/14(日) 23:59:54 ]
じぶんに考え。

N 十分大
char* p[0]・・・p[N] メモリブロック
メモリの使用状態を1ビットで表す 00011100010101000000
連続領域が必要なら0の連続を選択。
はじめはp[i]はNULLにしておく。


49 名前: ◆GWRSHcLrd6 mailto:sage [2010/02/15(月) 00:00:16 ]
2つアロケート ↓
0001 ABCD 1234 5678, 0001 4321 DEDE 5678
~~~~~~~~~~~~~~~~~~~ ~~~~~~~~~~~~~~~~~~~
解放 ↓
0000 0000 0000 0000, 0001 4321 DEDE 5678
~~~~~~~~~~~~~~~~~~~
アロケート(再利用) ↓
0001 0123 2567 ABAB, 0001 4321 DEDE 5678
~~~~~~~~~~~~~~~~~~~
アロケート(ブロック追加) ↓ ブロック2をnew
0001 0123 2567 ABAB, 0001 4321 DEDE 5678
0001 0CCC 1224 5555, 0000 0000 0000 0000
~~~~~~~~~~~~~~~~~~~ ~~~~~~~~~~~~~~~~~~~
解放 ↓
0001 0123 2567 ABAB, 0001 4321 DEDE 5678
0000 0000 0000 0000, 0000 0000 0000 0000
~~~~~~~~~~~~~~~~~~~ ~~~~~~~~~~~~~~~~~~~
不必要と判断、ブロック2をdelete
0001 0123 2567 ABAB, 0001 4321 DEDE 5678

50 名前:デフォルトの名無しさん mailto:sage [2010/02/15(月) 00:00:37 ]
>>47
いったい何を目指しているの?

メモリブロック確保の速度なんて operator new の実装に任せておけばいいこと。
そんなところをがんばるよりも、他にすることは無いの?



51 名前: ◆GWRSHcLrd6 mailto:sage [2010/02/15(月) 00:01:08 ]
って感じです。

52 名前:デフォルトの名無しさん mailto:sage [2010/02/15(月) 00:02:15 ]
カオス

53 名前: ◆GWRSHcLrd6 mailto:sage [2010/02/15(月) 00:02:56 ]
>>50
すいません。高速化しようと思って少しそれてしまいました・・・

54 名前:デフォルトの名無しさん mailto:sage [2010/02/15(月) 00:03:49 ]
マルチスレッドでメモリ探索にロック掛けると速度落ちると思うから
キューに入れて順番に処理すると良い思うが、キューへのアクセスにロックが必要
ロック無しにする方法ないか。

55 名前:デフォルトの名無しさん mailto:sage [2010/02/15(月) 00:05:52 ]
wait-free lock-freeのwikiみると、アトミック命令使えばロック無しのマルチスレッドできるらしいが。


56 名前:デフォルトの名無しさん mailto:sage [2010/02/15(月) 00:07:06 ]
operator new よりGoogleメモリ管理の方が高性能。

57 名前:デフォルトの名無しさん mailto:sage [2010/02/15(月) 00:08:51 ]
>>54 www.google.co.jp/search?q=lock+free+queue

58 名前:デフォルトの名無しさん mailto:sage [2010/02/15(月) 00:09:43 ]
>>56
なら operator new を Google メモリ管理で置き換えればいいじゃない。

59 名前:デフォルトの名無しさん mailto:sage [2010/02/15(月) 00:23:34 ]
>>57
実装方法わからん。cas命令らしいけど

60 名前:デフォルトの名無しさん mailto:sage [2010/02/15(月) 00:46:42 ]
マルチコア時代のLock-free入門
www.slideboom.com/presentations/133166
これによると std::shared_ptr (C++0x) はとてつもなく遅くて使えんとあるな。
だから Hazard ポインタを使えともある。



61 名前:デフォルトの名無しさん mailto:sage [2010/02/15(月) 01:01:25 ]
>>60
スマートポインタでLock-freeにするには? という話なのに、
Lock-freeを実現するために使用するスマートポインタの話をするのは順番が逆でしょう。

でも >>60 のような用途に使える軽快なスマポは確かに欲しいけど。

62 名前:デフォルトの名無しさん mailto:sage [2010/02/15(月) 01:14:46 ]
CAS命令は結構コストかかるのよ。
可能なら、RCU的な手法にする方が良い。

www.atmarkit.co.jp/flinux/rensai/watch2010/watch01b.html
みたいな記事もある。

63 名前:デフォルトの名無しさん mailto:sage [2010/02/15(月) 23:47:17 ]
RCUってなあに?

64 名前:デフォルトの名無しさん mailto:sage [2010/02/15(月) 23:48:21 ]
正直
マルチコア時代
を相手にするならスマポのコストが問題となることは
大抵ないと思うんだが。


65 名前:デフォルトの名無しさん mailto:sage [2010/02/15(月) 23:49:25 ]
>>63
記事の中よめよ
リンク先にまるなげだけどちゃんとあるだろう
ja.wikipedia.org/wiki/%E3%83%AA%E3%83%BC%E3%83%89%E3%83%BB%E3%82%B3%E3%83%94%E3%83%BC%E3%83%BB%E3%82%A2%E3%83%83%E3%83%97%E3%83%87%E3%83%BC%E3%83%88

66 名前:デフォルトの名無しさん mailto:sage [2010/02/15(月) 23:55:18 ]
で、依存無しのCASとかRCUとかはどう実装するんだ?

67 名前:デフォルトの名無しさん mailto:sage [2010/02/16(火) 00:06:35 ]
無理無理

68 名前:デフォルトの名無しさん mailto:sage [2010/02/16(火) 00:59:05 ]
>>64
マルチコア関係なくね?

69 名前:デフォルトの名無しさん mailto:sage [2010/02/16(火) 01:48:54 ]
>>64
おい!

70 名前:デフォルトの名無しさん mailto:sage [2010/02/16(火) 08:04:43 ]
通信系の処理プログラムを書いてるんですが
処理担当スレッドを作る場合、必要になったらbeginthread(もしくはbeginthreadex)で
スレッドを起動して作業が終わったらおしまいとするのとスレッドプールをするのでは
どちらがいいのでしょうか?



71 名前:デフォルトの名無しさん mailto:sage [2010/02/16(火) 13:05:40 ]
>>70
頻繁に起動終了を繰り返すようなものならスレッドプールが良いと思うよ。
スレッドの生成破棄もコストはあるからね。

72 名前:デフォルトの名無しさん mailto:sage [2010/02/16(火) 15:32:45 ]
getter/setterについて悩んでいます。

●getterについて
・setterに対してgetterも用意されていたら、隠蔽になっていないのではないか?
・利用者がsetした時の情報を保持すればgetterはいらないのではないか?
●setterについて
・コンストラクタの引数で受け取る物は、setterも用意したくなるが同じ機能を2箇所に書いている感が?

書いたクラスが各メンバ変数に対してgetter/setterが存在する物になっていると、
無駄に手間をかけただけの構造体なんじゃないかと不安になります。
必要十分なgetter/setterを持つクラスを設計するには、どういう事を考えればいいのでしょうか?

73 名前:デフォルトの名無しさん mailto:sage [2010/02/16(火) 15:45:03 ]
>>72
>・setterに対してgetterも用意されていたら、隠蔽になっていないのではないか?

なんでそうなる
他にもいろんなprivate変数持ってる場合がほとんどだろ

74 名前:デフォルトの名無しさん mailto:sage [2010/02/16(火) 15:54:44 ]
>>73
「コンストラクタも含めて外部からget/setされないメンバ変数」を持たないクラスも多いです。
10個近くの設定値が必要なクラスとか、コードのうちgetter/setterが占める割合が多くなって、「なんだかなー」と思います。

75 名前:デフォルトの名無しさん mailto:sage [2010/02/16(火) 15:59:39 ]
そう思うなら思い切ってpublic変数にすればいいだろ
でもgetter/setterを敢えて持つ理由は、プログラマに「今private変数を
いじってますよ」という事を常に意識させる効果がある

76 名前:デフォルトの名無しさん mailto:sage [2010/02/16(火) 16:10:53 ]
>>72
class widget {
public:
inline void set_x(int _x) { x = _x; }
inline int get_x(void) { return x; }
private:
int x;
};

↓内部仕様を変更したくなった

class widget {
public:
inline void set_x(int _x) { p->set_x(_x); }
inline int get_x(void) { return p->get_x(); }
private:
impl *p;
};

しっかり隠蔽になってるね
基本的に公開する必要があるなら全部アクセサでいい
未来永劫仕様を変えない保証があるなら丸出しでもいい

コンストラクタの分だけセッターを作る必要はない
単純セッターなら普通は
void set(const Obj &obj) { m_obj = obj; }
hoge.set(Obj(a1, a2));
こうする

77 名前:デフォルトの名無しさん mailto:sage [2010/02/16(火) 16:39:05 ]
>>75
一貫性がないのは嫌なので、public変数にするとなると全てのクラスをpublic変数にする事になって、これも嫌な感じがします。

>>76
確かに隠蔽性がなくなるわけではありませんでした。
インターフェイスがすっきりしないのが嫌なところですね。

設定値が多い時は、構造体に纏めてget/setするという事ですね。

78 名前:デフォルトの名無しさん mailto:sage [2010/02/16(火) 17:08:13 ]
そのたくさんある変数はすべてset/getする必要があるの?
内部実装のためにあるデータだってあるでしょ

外部から見たときにset/getする必要があるやつだけ
publicなsetter/getterを定義すればいいよ

79 名前:デフォルトの名無しさん mailto:sage [2010/02/16(火) 17:30:04 ]
vectorにクラスを入れるということは普通しないのでしょうか?

80 名前:デフォルトの名無しさん mailto:sage [2010/02/16(火) 17:30:44 ]
よくやる



81 名前:デフォルトの名無しさん mailto:sage [2010/02/16(火) 17:37:08 ]
むしろやらないでどうする

82 名前:デフォルトの名無しさん mailto:sage [2010/02/16(火) 17:40:03 ]
>>79
とても若干良くある
クラスのコピーコストが気になるレベルならポインタ格納するなりlist使うなりするけど。

83 名前:デフォルトの名無しさん mailto:sage [2010/02/16(火) 17:49:29 ]
>>60
明確な実装方法を表したサイトってないの?

84 名前:デフォルトの名無しさん mailto:sage [2010/02/16(火) 17:51:39 ]
クラスを入れる、っていう表現がまかり通るのが驚き。

85 名前:デフォルトの名無しさん mailto:sage [2010/02/16(火) 17:58:08 ]
>>83
そんなものはない!

86 名前:デフォルトの名無しさん mailto:sage [2010/02/16(火) 18:03:51 ]
#define class struct
オヌヌメ

87 名前:デフォルトの名無しさん mailto:sage [2010/02/16(火) 18:09:34 ]
>>71
なるほど
ちなみにスレッドプールしておいたスレッドの空き/使用中の管理というのは自分でやる必要があるのでしょうか?

88 名前:79 mailto:sage [2010/02/16(火) 18:25:17 ]
よくやるんですね。ありがとうございます。
自分のプログラムで変なエラーが出てしまったので、もしかしたら間違ったやり方をしているのかと思いました。
できるんなら、何とかしてみます。

89 名前:デフォルトの名無しさん mailto:sage [2010/02/16(火) 18:35:46 ]
たぶんコピー、代入あたりで間違えてるんだろうな

90 名前:デフォルトの名無しさん mailto:sage [2010/02/16(火) 18:43:27 ]
pimplを勧める



91 名前:デフォルトの名無しさん mailto:sage [2010/02/16(火) 18:45:18 ]
#undef class

92 名前:デフォルトの名無しさん mailto:sage [2010/02/16(火) 19:00:34 ]
>>87
beginthread云々からWin32と仮定すると
IOCPに管理させるのが楽かもよ。

93 名前:デフォルトの名無しさん mailto:sage [2010/02/16(火) 20:48:19 ]
POSIXじゃないの?

94 名前:デフォルトの名無しさん mailto:sage [2010/02/16(火) 21:25:46 ]
おめーはpthreadも知らずWin32も知らないのか

95 名前:デフォルトの名無しさん mailto:sage [2010/02/16(火) 22:00:15 ]
誰に言ってるんだ?

96 名前:デフォルトの名無しさん mailto:sage [2010/02/16(火) 22:12:52 ]
誰が?

97 名前:デフォルトの名無しさん mailto:sage [2010/02/16(火) 22:22:49 ]
ワッフルワッフル

98 名前:97 mailto:sage [2010/02/16(火) 22:23:48 ]
誤爆しました。

99 名前:デフォルトの名無しさん mailto:sage [2010/02/16(火) 22:24:19 ]
え?

100 名前:デフォルトの名無しさん mailto:sage [2010/02/16(火) 22:25:08 ]
ww



101 名前:デフォルトの名無しさん mailto:sage [2010/02/16(火) 22:38:45 ]
うむ。苦しゅうない。

102 名前:デフォルトの名無しさん mailto:sage [2010/02/17(水) 00:38:25 ]
何の?

103 名前:デフォルトの名無しさん mailto:sage [2010/02/17(水) 01:05:07 ]
>>53
以前メモリプール使用のスマポで計測結果張ったものですが、こんなメモリプールつこてます。
ttp://codepad.org/rrn4ZXUQ
メモリ的にも処理的にも無駄を減らした実装でまだまだシンプルですが、使えるポイントはあると思います。

104 名前:デフォルトの名無しさん mailto:sage [2010/02/17(水) 01:11:05 ]

int get()
{
return mVal;
}

これよりも効率よくmValを外部に返す方法ってありますか?

105 名前:デフォルトの名無しさん mailto:sage [2010/02/17(水) 01:17:18 ]
>>72
まずインターフェースだけ考える。どんな変数を持ってるとかは敢えて考えないぐらいのつもりで、
とにかく利用者にとって自然な操作だけをメンバ関数(コンストラクタ含む)として列挙する。

それが済んでから、それらのメンバ関数を実装するための変数を必要なだけそろえる。

これなら「隠蔽になっていない」などという心配は起こりようが無いし、余計なコードも発生しない。

インターフェースを考える段階で、利用者から見て中にどんなデータが入っているのか
明らかでありメンバ関数呼び出しが煩雑なだけに見えるようなら、ただの構造体でいい。

106 名前:デフォルトの名無しさん mailto:sage [2010/02/17(水) 01:38:40 ]
>>103
Test継承したら使えないジャマイカ

107 名前:デフォルトの名無しさん mailto:sage [2010/02/17(水) 02:06:51 ]
>>104 ねーよjk

108 名前:デフォルトの名無しさん mailto:sage [2010/02/17(水) 02:13:11 ]
>>104
#define get() mVal

foo.get();

109 名前:デフォルトの名無しさん mailto:sage [2010/02/17(水) 04:46:59 ]
スレッドセーフなキューが作れれば全てのマルチスレッドは統一的に扱えるはず
とおもって探した。
lock-free wiat-freeかはしらないがこれ。無料だとこれくらいかと。

Thread Safe Template Library
sourceforge.jp/projects/freshmeat_tstl/

IntelR Threading Building Blocks
www.threadingbuildingblocks.org/


110 名前: ◆GWRSHcLrd6 [2010/02/17(水) 07:22:13 ]
>>103
あ、なんか僕が今作りなおしているやつも似た作りです。
これが効率よさそうですよね。

そういえばboostのsimple_segregated_storage(だっけ?)ってどういう仕組み何でしょうか?

>>109
なるほど。ちょいと見てみます



111 名前:デフォルトの名無しさん mailto:sage [2010/02/17(水) 10:38:15 ]
可変長引数パラメータて、使いどころがよくわからないんですが
どういった時に使うんでしょうか?
同じようなことができるboostのfunctionもです。

掴み所を教えてください

112 名前:デフォルトの名無しさん mailto:sage [2010/02/17(水) 10:58:46 ]
>>111
可変長引数パラメータって何?
関数引数の ... のこと?

113 名前:デフォルトの名無しさん mailto:sage [2010/02/17(水) 11:23:46 ]
>>112
そうです。
使い方はわかるし、boostも使い方は理解できるんですが
何に使うのかがわからないんです。

特に後者のboostは、仮想関数の引数としてfunctionを利用しても
結局テンプレートだからオーバーロードになるわけですよね?
呼び出し側で型指定するわけですし、多態的に動作させるのもできないのでは?

ここで混乱している感じです。

114 名前:デフォルトの名無しさん mailto:sage [2010/02/17(水) 11:26:48 ]
>>113
printf() とか。
まぁ C++ では基本的に使わないな。

boost::function とは関係ないと思うけど、何のこと言ってんの?

115 名前:デフォルトの名無しさん mailto:sage [2010/02/17(水) 11:32:54 ]
>>114
返り値の型、引数の型を指定して関数ポインタを楽に生成できるじゃないですか。

このテクニックを利用して、引数の数、型が変化する処理を多態的にさせたいんです。

116 名前:デフォルトの名無しさん mailto:sage [2010/02/17(水) 11:43:01 ]
>>113
可変長引数に関しては>>114に同じくprintfがいい例だと思う。
可変長引数は、C++ではあまり推奨おらず、printfに関してもboost::formatを使った方がいい。
ttp://www.kmonos.net/alang/boost/classes/format.html

boost::functionに関しては、引数の型(個数も含む)が違えば、boost::functionの型も変わる(boost::functionはクラステンプレートであってクラスそのものではない)。
テンプレートによる静的多態なので、仮想関数の動的多態のようには扱えない。

117 名前:116 mailto:sage [2010/02/17(水) 11:55:42 ]
付け加えておくと、
・可変長引数とboost::functionの使いどころは別である
・boost::functionは関数ポインタを使いやすくした物

あと、>>116の最後の行は紛らわしい書き方だった。
boost::functionの1つの具現化(戻り値と引数の型が同じ)においては、関数ポインタによる動的多態である。

118 名前:デフォルトの名無しさん mailto:sage [2010/02/17(水) 12:11:45 ]
>>117
なるほど!
多態とはまた別物なんですね。
ボリモルフィズムが一気に広がるかもと思ったんですがね。

ありがとうございました。

119 名前:デフォルトの名無しさん mailto:sage [2010/02/17(水) 12:22:49 ]
>>115
boost::function<void ()> で、引数は全部 bind するとか、
boost::function<void (std::vector<boost::any> const&)> で引数について型消去しながらやりくりするとか。

120 名前:デフォルトの名無しさん mailto:sage [2010/02/17(水) 13:01:27 ]
(´;ω;`)さ、さ、さむいお



121 名前:デフォルトの名無しさん mailto:sage [2010/02/17(水) 13:22:58 ]
利用者が仮想関数を呼び出す時、仮想関数の実装を知らなけば引数を渡せなくなって、ポリモーフィズムのメリットがなくなる気がするけど。

122 名前:デフォルトの名無しさん mailto:sage [2010/02/17(水) 14:15:09 ]
いらない

123 名前:デフォルトの名無しさん mailto:sage [2010/02/17(水) 15:13:58 ]
非ブロッキング、ロックフリー、ウェイトフリーの定義

www.gameenginejp.com/misc/2010/2010.html

124 名前:デフォルトの名無しさん mailto:sage [2010/02/17(水) 15:37:29 ]
スレッドセーフのSTLクラスは使えるな。
boostのどのライブラリより上では。
boostにこんなのないだろ。

125 名前:デフォルトの名無しさん mailto:sage [2010/02/17(水) 15:45:26 ]
ありますがな・・・

126 名前:デフォルトの名無しさん mailto:sage [2010/02/17(水) 15:46:17 ]
ありませんがな・・・

127 名前:デフォルトの名無しさん mailto:sage [2010/02/17(水) 15:50:33 ]
TBBの日本語サンプルサイトつくってくれよ。
マルチコア時代で、CPUメーカー製の、フリーのこのライブラリは強力すぎる。
できたら毎日クリックしに行くからさ。

ja.wikipedia.org/wiki/Intel_Threading_Building_Blocks

抜粋

並列処理アルゴリズム
parallel_for ループ間で依存性がない単純なループの並列処理
parallel_reduce 指定した範囲をより小さな範囲に再帰的に分割し並列処理
parallel_scan 並列プリフィックスを計算
parallel_while 不明領域、動的領域変更を伴う独立したループ操作
parallel_sort 並列処理でソートを行う
pipeline パイプライン処理

コンテナクラス
concurrent_hash_map STLのmapクラスをスレッドセーフにしたもの
concurrent_queue STLのqueueクラスをスレッドセーフにしたもの
concurrent_vector STLのvectorクラスをスレッドセーフにしたもの

128 名前:デフォルトの名無しさん mailto:sage [2010/02/17(水) 16:13:42 ]
サンプルはないけど日本語リファレンスあるし間に合ってる感じ

129 名前:デフォルトの名無しさん mailto:sage [2010/02/17(水) 18:53:08 ]
もうひとつだけ例を見てみましょう。
static LONG flag;
if (flag == FALSE) {
flag = TRUE;
...
flag = FALSE;
}



このコードがまずいことはもうお分かりですね。 NT にはフラグのチェックとセットをアトミックに行える InterlockedCompareExchange がありますから、そちらを使いましょう。
if (InterlockedCompareExchange(&flag, TRUE, FALSE) == FALSE) {
...
InterlockedExchange(&flag, FALSE);
}

hp.vector.co.jp/authors/VA000092/win32/standard-coding.html

130 名前:デフォルトの名無しさん mailto:sage [2010/02/17(水) 18:58:30 ]


8スレッド
InterlockedIncrement 4.398sec
InterlockedCompareExchange 4.460sec
CriticalSection 6.297sec
d.hatena.ne.jp/streakeagle/20090205/1233833511

VC++ CriticalSectionの速度
何もないループが、0.515106秒に対しクリティカルセクションでは7.089556秒となった。
www.cycleof5th.com/tips/index.php?date=2007-05-30/3


同期オブジェクトの要約
速度
クリティカル セクション 高
ミューテックス 低
セマフォ 低
イベント 低
メータード セクション 高
msdn.microsoft.com/ja-jp/library/cc429052.aspx





131 名前:デフォルトの名無しさん mailto:sage [2010/02/17(水) 19:08:05 ]
スレッドセーフなキューを複数個用意してキューにデータ来たら、
それぞれ直列に動作する関数を動かしたいんだけど
作業が終わったらキューを観察に行くけど無かった場合、次に入ってくるまで
どうやってまてばいいんだ? ひとつとしてビジーループはあるが。
それなら別変数用意してロック掛けた方が良い。ロック無しで出来る?
キューは一カ所にしてすべての処理関数スレッドで共有する方が無駄ないか。

132 名前:デフォルトの名無しさん mailto:sage [2010/02/17(水) 19:22:53 ]
キューに挿入する側が、余りのスレッドを監視して空いてたら処理させればいいか。
これならロック無しでアトミック命令だけでいけそう。

133 名前:デフォルトの名無しさん mailto:sage [2010/02/17(水) 19:24:54 ]
しかしスレッドを生成するコストも馬鹿にならないから
スレッドの生成・消滅はせず、恥に生成したやつを使い回したいところ。
やっぱロックいるか。処理終了してキュー待ちのロック。

134 名前:デフォルトの名無しさん mailto:sage [2010/02/17(水) 19:27:47 ]
スレッドの生成は恥

135 名前:デフォルトの名無しさん mailto:sage [2010/02/17(水) 19:41:16 ]
wait付きのビジーループでいいか

136 名前:デフォルトの名無しさん mailto:sage [2010/02/17(水) 20:32:25 ]
C++でコルーチンってできないの?

137 名前:デフォルトの名無しさん mailto:sage [2010/02/17(水) 20:32:53 ]
boostにあるにょ

138 名前:デフォルトの名無しさん mailto:sage [2010/02/17(水) 20:35:08 ]
あるんだ
boostまじ何でもあるな
奴らはいったい誰と戦ってるんだ

139 名前:デフォルトの名無しさん mailto:sage [2010/02/17(水) 20:37:11 ]
言われてみるとその言葉かなりしっくりくるよな。
C++の最適化に伴う変態記法なんて禿に親を殺されでもしない限りできないし。

140 名前:デフォルトの名無しさん mailto:sage [2010/02/17(水) 20:39:02 ]
>>138
部品の足りない世界じゃないの?

というかWTLもC#並に充実させてください



141 名前:デフォルトの名無しさん mailto:sage [2010/02/17(水) 20:45:06 ]
駆動系の部品はハイスペックだが
シートもハンドルもなく部品丸出しの車

142 名前:デフォルトの名無しさん mailto:sage [2010/02/17(水) 20:47:45 ]
C++はC++です車ではありません
好い加減な比喩は滑稽なのでやめてください

143 名前:デフォルトの名無しさん mailto:sage [2010/02/17(水) 20:48:41 ]
コルーチン
ttp://ja.wikipedia.org/wiki/%E3%82%B3%E3%83%AB%E3%83%BC%E3%83%81%E3%83%B3

Boost C++の何て言うライブラリで出来るのですか?

144 名前:デフォルトの名無しさん mailto:sage [2010/02/17(水) 20:49:43 ]
boost.cotoutine
vaultにあるにょ

145 名前:デフォルトの名無しさん [2010/02/17(水) 20:52:04 ]
>>141
部品丸出しな上
自己責任で組み替え自由な仕様だな。

146 名前:デフォルトの名無しさん [2010/02/17(水) 20:52:32 ]
>>141
部品丸出しな上
自己責任で組み替え自由な仕様だな。

147 名前:デフォルトの名無しさん mailto:sage [2010/02/17(水) 20:52:41 ]
>>141
部品丸出しな上
自己責任で組み替え自由な仕様だな。

148 名前:デフォルトの名無しさん mailto:sage [2010/02/17(水) 20:53:21 ]
車への例えがどれも的外れでワロスw

149 名前:デフォルトの名無しさん mailto:sage [2010/02/17(水) 20:53:33 ]
>>141
部品丸出しな上
自己責任で組み替え自由な仕様だな。

150 名前:デフォルトの名無しさん mailto:sage [2010/02/17(水) 20:55:48 ]
だからといってヨソの車がそんなに安全かというと……



151 名前:デフォルトの名無しさん mailto:sage [2010/02/17(水) 20:57:31 ]
>>144
valtですか。
ありがとうございます。


152 名前:デフォルトの名無しさん [2010/02/17(水) 20:58:22 ]
Boost.Coroutine
ttp://hamigaki.sourceforge.jp/doc/html/coroutine.html

2009-12-12 - melpon日記 - C++すら(ry
Boost][C++]Boost.勉強会の資料
ttp://d.hatena.ne.jp/melpon/20091212
ttp://melt.sytes.net/data/Boost.Coroutine.ppt
・Boost.Fiber という対抗馬も最近出てきた


153 名前:デフォルトの名無しさん mailto:sage [2010/02/17(水) 20:59:10 ]
理想的には部品丸出しではないが、
バカが作ると部品を理解していなければならなくなる
仕様だな。


154 名前:デフォルトの名無しさん mailto:sage [2010/02/17(水) 21:06:26 ]
マルチスレッドキューでロックしないサンプルできた。読み込むに失敗・キューがないときにwaitはいれたが。

#include "include/tbb/concurrent_queue.h"
#pragma comment (lib, "tbb.lib")
#include <process.h>
#include <windows.h>
#include <iostream>
using namespace std;
using namespace tbb;


concurrent_queue<int> que;
int s[2]={0,0};

unsigned WINAPI fnc(void *n) {
int x,num=(int)n;
while(1) {
if( !que.try_pop(x) ) { Sleep(100); continue; }
if(x==-1)return 0;
s[num]+=x; }
}


int main() {
HANDLE hd[2];
int n;
for(n=0; n<2; n++) hd[n]=(HANDLE)_beginthreadex(NULL, 0, fnc,NULL, n ,NULL);
for(n=0; n<=1000; n++) que.push(n);
que.push(-1); que.push(-1);
WaitForMultipleObjects(2, hd, TRUE, INFINITE);
cout<< s[0]+s[1]<<endl;
getchar(); }

155 名前:デフォルトの名無しさん mailto:sage [2010/02/17(水) 21:08:51 ]
0から1000まで足すだけ。キューへマルチスレッドでpush、popして
読み取って空いてるスレッドが足し合わせていくサンプル。
答えは合ってたよ。

156 名前:デフォルトの名無しさん mailto:sage [2010/02/17(水) 21:10:28 ]
キューではロックしているだろうがな。そこを自作せずに済んだという話だ。

157 名前:デフォルトの名無しさん mailto:sage [2010/02/17(水) 21:20:49 ]
プログラム組んでて
returnって打ったつもりだったら

tryit,

って打ってた
なんか感動した

158 名前:デフォルトの名無しさん mailto:sage [2010/02/17(水) 21:21:46 ]
rをtにずらして打ってみると・・・!?

159 名前:デフォルトの名無しさん mailto:sage [2010/02/17(水) 21:22:04 ]
ゴルゴはtrycatchfinallyを0.5秒でタイプするらしい

160 名前:デフォルトの名無しさん mailto:sage [2010/02/17(水) 21:23:35 ]
>>157
夢を感じた



161 名前:デフォルトの名無しさん [2010/02/17(水) 21:33:09 ]
HDL ではごく普通というか大前提の話なんだが
直列処理という枠に凝り固まった頭で見ると驚きの連続なんだろうな

162 名前:デフォルトの名無しさん mailto:sage [2010/02/17(水) 21:39:17 ]
任意の整数を返す関数が、失敗も正常フローだった場合に
すっきりするエラー通知の仕方はある?

163 名前:デフォルトの名無しさん mailto:sage [2010/02/17(水) 21:40:28 ]
任意の整数を返す関数が、失敗も正常フローだった場合に
すっきりするエラー通知の仕方はある?

164 名前:デフォルトの名無しさん mailto:sage [2010/02/17(水) 21:42:11 ]
任意の整数を返す関数が、失敗も正常フローだった場合に
すっきりするエラー通知の仕方はある?

165 名前:デフォルトの名無しさん mailto:sage [2010/02/17(水) 21:45:58 ]
任意の整数を返す関数が、失敗も正常フローだった場合に
すっきりするエラー通知の仕方はある?

166 名前:デフォルトの名無しさん mailto:sage [2010/02/17(水) 21:46:42 ]
パラメータになんか持たせるとか

167 名前:デフォルトの名無しさん mailto:sage [2010/02/17(水) 21:57:56 ]
なにを?

168 名前: ◆GWRSHcLrd6 mailto:sage [2010/02/17(水) 22:01:15 ]
_beginthreadとCreateThreadは何が違うんですか?
というかどっちを使った方がいいんですか?

169 名前:デフォルトの名無しさん mailto:sage [2010/02/17(水) 22:07:13 ]
>>167
判断できる情報を

>>168
適材適所。常にどちらかがよいということはない

170 名前:デフォルトの名無しさん mailto:sage [2010/02/17(水) 22:11:21 ]
C++の配列サイズ指定で変数は使えることもあるんでしょうか?それともコンパイラ依存でしょうか?
MinGWで下をコンパイルは正常にでき(Warningも出ない)、arrayのsizeofは32byteとなってちゃんと確保されているようです。

#include <iostream>
using namespace std;
int main() {
int num = 3 + 5;
int array[num];
for (int i = 0; i < num; i++) {
array[i] = i;
}
cout << sizeof array << endl;
}




171 名前:デフォルトの名無しさん mailto:sage [2010/02/17(水) 22:12:44 ]
正確にはC++ではなくC99で使える様になったはず

172 名前:デフォルトの名無しさん mailto:sage [2010/02/17(水) 22:18:32 ]
>>170
gccの独自拡張

173 名前:デフォルトの名無しさん mailto:sage [2010/02/17(水) 22:25:20 ]
>>168
CreateThreadはWindowsAPI、_beginthreadはCランタイム。

CreateThreadで生成したスレッドでCランタイム関数を使うとExitThreadしたときにわずかだがメモリリークが発生するため、
MSはそのような場合には_beginthreadを使うように推奨している。


174 名前: ◆GWRSHcLrd6 mailto:sage [2010/02/17(水) 22:32:21 ]
なるほど。
参考になりました。

unix - windows 互換のスレッド関係の関数は無いんですかね・・・

175 名前:デフォルトの名無しさん mailto:sage [2010/02/17(水) 22:38:29 ]
Cランタイムって何?

176 名前:154 mailto:sage [2010/02/17(水) 22:41:42 ]
修正。引数渡す場所間違えて一スレッドしか動いていない。
#include "include/tbb/concurrent_queue.h"
#pragma comment (lib, "tbb.lib")
#include <process.h>
#include <windows.h>
#include <iostream>
using namespace std;
using namespace tbb;
#define N 3
concurrent_queue<int> que;
int s[N];
unsigned WINAPI fnc(void *n) {
int x,num=(int)n;
while(1) {
if( !que.try_pop(x) ) { Sleep(100); continue; }
if(x==-1){ cout<<"正常終了number:"<<num<<endl; return 0;}
s[num]+=x;Sleep(rand()%50); }}

int main() {
HANDLE hd[N];
int n;
for(n=0; n<N; n++) s[n]=0;
for(n=0; n<N; n++) hd[n]=(HANDLE)_beginthreadex(NULL, 0, fnc, (void*)n, 0 ,NULL);
for(n=0; n<=50; n++) que.push(n);
for(n=0; n<N; n++) que.push(-1);
WaitForMultipleObjects(N, hd, TRUE, INFINITE);
int sum=0;
for(n=0; n<N; n++) {cout<< "スレッド"<<n <<"の合計 "<<s[n]<<endl; sum+=s[n]; }
cout<<"総和 "<<sum<<endl;
getchar(); }

177 名前:デフォルトの名無しさん mailto:sage [2010/02/17(水) 22:44:40 ]
>>174
pスレッド windowsというのがあるが、おすすめしない。
一度にアクセスが起きるとバグった経験有り。同じ物をwindowsの命令に書き換えたら動いた。
スレッドのどれか一つ or全部の終了待ちがない気がする。

178 名前:デフォルトの名無しさん mailto:sage [2010/02/17(水) 22:47:23 ]

Open Source POSIX Threads for Win32
sourceware.org/pthreads-win32/


179 名前:デフォルトの名無しさん mailto:sage [2010/02/17(水) 22:51:55 ]
一時期windowsであっても、linuxの互換コードで書くべきだという考えが起こり
全て統一しようとしたがPthread for winがうまく動作しないので諦めた経験ある。
現在の環境で生産性の良い、短いコードで済ますのが一番という考えになった。
完成品が出来なければ意味ない。完成していれば他OSへも移植しやすい。




180 名前:デフォルトの名無しさん mailto:sage [2010/02/17(水) 23:00:42 ]
QtやBoostその他 ラッパライブラリじゃできないの?




181 名前:デフォルトの名無しさん mailto:sage [2010/02/17(水) 23:02:56 ]
Qtもboostも標準にはいってないじゃん
サイズもでかいし
linuxでどこでも使えるのはPthreadだけでは

182 名前:180 mailto:sage [2010/02/17(水) 23:07:16 ]
>>181
その方、Pthreadはいつから標準になったと申すか。

183 名前:デフォルトの名無しさん mailto:sage [2010/02/17(水) 23:09:31 ]
POSIX Threads, or Pthreadsのライセンスは
This implementation is free software, distributed under the GNU Lesser General Public License (LGPL).

え?誰も聞いてないって?


184 名前:デフォルトの名無しさん mailto:sage [2010/02/17(水) 23:13:49 ]
入ってないlinuxはないんでは。c/c++がコンパイル可能な環境なら。

185 名前:デフォルトの名無しさん mailto:sage [2010/02/17(水) 23:16:36 ]
標準っていうか、プリインストールって言いたかったわけか。


186 名前:デフォルトの名無しさん mailto:sage [2010/02/17(水) 23:18:22 ]
ち、違うよ。

187 名前:デフォルトの名無しさん mailto:sage [2010/02/18(木) 00:57:43 ]
どっちもbccでうごかん。 
lock-freeの高速キューを作ってくれよ。
インラインアセンブラ・マクロの特殊構文の多用が原因と思われる。
windows 標準のcas命令のみで頼む。

Thread Safe Template Library
sourceforge.jp/projects/freshmeat_tstl/

Intel Threading Building Blocks
www.threadingbuildingblocks.org/

188 名前:デフォルトの名無しさん mailto:sage [2010/02/18(木) 01:43:02 ]
bccなんてポンコツ捨てろよ

189 名前:デフォルトの名無しさん mailto:sage [2010/02/18(木) 04:41:14 ]
bccは毎年新規で販売してるんだぞ。
コンパイル速度速くて良いんだこれは。

190 名前:デフォルトの名無しさん mailto:sage [2010/02/18(木) 04:49:50 ]
httpサーバーなどへIf-Modified-Sinceをつける場合statでファイルの更新日付を
取得してどのように変換すればいいのでしょうか?

日本時間に直すサンプルは見かけるのですがGMTのまま文字列化する方法が
わかりません



191 名前:デフォルトの名無しさん mailto:sage [2010/02/18(木) 08:08:13 ]
スレッドセーフキューがマルチスレッドの要なんです
マクロやアセンブラ使わずに書いてくれると喜ばれますよ

192 名前:デフォルトの名無しさん mailto:sage [2010/02/18(木) 08:22:15 ]
STLportがスレッドセーフなSTLだった
これつかお

193 名前:デフォルトの名無しさん mailto:sage [2010/02/18(木) 11:43:35 ]
わざわざいうな

194 名前:デフォルトの名無しさん mailto:sage [2010/02/18(木) 15:34:49 ]
>>190
strftimeじゃできないの?

195 名前:デフォルトの名無しさん mailto:sage [2010/02/18(木) 19:14:32 ]
プロの方はスマートポインタを使うのが基本とのことですが、例えば引数なんかも
hoge( shared_ptr<Test>& sp )といったかんじになるんでしょうか?
それとも受け渡しは生のポインタで行い、オブジェクト側でスマートポインタに格納ような
使い方ですか?

196 名前:デフォルトの名無しさん mailto:sage [2010/02/18(木) 19:44:09 ]
参照渡しだよ

197 名前:デフォルトの名無しさん mailto:sage [2010/02/18(木) 20:07:01 ]
STLportがbccでコンパイルできん

198 名前: ◆GWRSHcLrd6 mailto:sage [2010/02/18(木) 20:43:01 ]
>>195
僕はクラスのメンバ関数が前提なら、
関数を所有するクラスがオブジェクトをメンバ変数に保持するときはスマートポインタを、
一時的に使うだけなら参照で渡します。

>それとも受け渡しは生のポインタで行い、オブジェクト側でスマートポインタに格納ような
一番やっちゃいけない気がするんですけど・・・


199 名前:デフォルトの名無しさん mailto:sage [2010/02/18(木) 21:44:30 ]
>>171 >>172
アドバイスありがとうございます。
手元のどの参考書見ても変数は使えないと書いてあってあれ?と思っていたしだいです。
Visual C++で使えないようなのでgccだけなんですね。

200 名前:デフォルトの名無しさん mailto:sage [2010/02/18(木) 22:19:13 ]
>196 >19
ありがとうございます。
今試してみましたが同一ポインタを複数のshared_ptrに格納すると、
shared_ptrの数だけデストラクタが呼ばれてしまうんですね。
基本は参照で複製を作らないようにするということですね。



201 名前:デフォルトの名無しさん [2010/02/18(木) 22:21:29 ]
>>200
そう。
RAIIを徹底しろ。

202 名前:デフォルトの名無しさん mailto:sage [2010/02/18(木) 22:21:59 ]
失礼しました。
>>196 >>198でした。

203 名前:デフォルトの名無しさん mailto:sage [2010/02/18(木) 22:22:59 ]
g++やVC++などの有名どころのC++コンパイラについてお聞きしたいのですが、
コンパイル時定数を使った
ttp://codepad.org/EmT4J9d3
こんなifによる分岐があるとします。

このとき、成果物.exeはちゃんと最適化されて
分岐が消えるのでしょうか?

よろしくお願いします。


204 名前:デフォルトの名無しさん mailto:sage [2010/02/18(木) 22:25:05 ]
codepadで使ってるg++とVC9.0では消失を確認

205 名前:デフォルトの名無しさん mailto:sage [2010/02/18(木) 22:36:54 ]
ありがとうございます。
const bool ctc = 100; // compile-time constants

bool ctc = 100; // NOT compile-time constants
にしても同じでしょうか?
(volatileは付けません。)

お手数をおかけ致しますが、よろしくお願いします。



206 名前:デフォルトの名無しさん mailto:sage [2010/02/18(木) 22:50:06 ]
const bool ctc = 100; // compile-time constants
に関しても同じ(キャストはちゃんとした方がいい)。
そもそも実行時への互換性を保たないと最適化というのはできないからね。

bool ctc = 100; // NOT compile-time constants
でも、単純にctcへの変更が無い事から最適化がなされた(204と同じ環境で)。
ただ、このケースは後のコードに完全に依存しているから考察する価値はあるのかどうか疑問だな。

207 名前:205 mailto:sage [2010/02/18(木) 23:02:24 ]
>>206
ご教示ありがとうございます。

そういったことは、どうやって調べればよいのでしょうか?
.asmを出力して調べているのでしょうか?


208 名前:デフォルトの名無しさん mailto:sage [2010/02/18(木) 23:05:31 ]
>>207
そうだよ。

209 名前:デフォルトの名無しさん mailto:sage [2010/02/18(木) 23:08:17 ]
YOUバイナリ読んじゃいなYO

210 名前:デフォルトの名無しさん mailto:sage [2010/02/18(木) 23:08:49 ]
>>208
ありがとうございます。
asmからは逃げ回ってきているので全然読めそうにありません。
勉強しなければなりませんね。。。



211 名前:デフォルトの名無しさん mailto:sage [2010/02/18(木) 23:09:33 ]
別に勉強しなくても片手間にasmの命令リストと見比べてるだけだけどね。

212 名前:デフォルトの名無しさん mailto:sage [2010/02/18(木) 23:15:53 ]
asmってコンパイラやアセンブラによって
扱いが違うからやだ

213 名前:デフォルトの名無しさん mailto:sage [2010/02/18(木) 23:16:19 ]
なんかアセンブリって難しそうなイメージある
低級だから追いかけるのが大変なだけで難しい構文とかはむしろ少ないんだろうけど・・・

214 名前:デフォルトの名無しさん mailto:sage [2010/02/18(木) 23:21:24 ]
アセンブリ自体は簡単だけど、他の言語で出来ることをアセンブリでするとか考え出すと難しい

215 名前:デフォルトの名無しさん mailto:sage [2010/02/18(木) 23:23:20 ]
アセンブリで全部済むならプログラミング言語なんて必要ないわけで

216 名前:デフォルトの名無しさん mailto:sage [2010/02/18(木) 23:27:53 ]
そう考えるとC言語とか
移植性もあってすげえ言語だな。
今更だけど。



217 名前:デフォルトの名無しさん mailto:sage [2010/02/19(金) 00:45:23 ]
>>216
cが優秀じゃなくてcコンパイラ作った人が優秀なだけだな

218 名前:デフォルトの名無しさん mailto:sage [2010/02/19(金) 01:11:59 ]
規格作ったやつだ。
Cコンパイラは、上司が監視して下っ端が要求通り作ってるだけ。
初めの設計図が一番。
たとえば、アニメは動画マンという超低賃金のやつらがやっているが
宮崎駿や原作漫画家がいるから開発できるんだ。

219 名前:デフォルトの名無しさん mailto:sage [2010/02/19(金) 01:18:03 ]
>>218
現存するコンパイラは確かに規格ありきで作り始めてそうだけど、元々は
たくさんの環境向けに作られていた C の共通部分を元に規格化されたんだから、
先にコンパイラ作ってた人が下っ端ということはないだろう。

220 名前:デフォルトの名無しさん mailto:sage [2010/02/19(金) 01:33:47 ]
>>219
まあ初期のC言語確立やコンパイラ作ったような人たちは
上も下もねーだろうな
小さいチームで多少リーダー的存在がいるくらいだろうし
そういう中で試行錯誤しながらとかだろうし

その後の各環境ごとのコンパイラ開発はC言語そのものがあるんだし
それにあわせちゃえばいいので作業だろうな
(でもそれなりに知識は要るので下っ端ってわけじゃないだろうけど



221 名前:デフォルトの名無しさん mailto:sage [2010/02/19(金) 02:48:53 ]
>195
そんな渡し方したら危険じゃない?


222 名前:デフォルトの名無しさん mailto:sage [2010/02/19(金) 05:22:11 ]
ファイルIO( open close load)がかなり時間かかるから
要求を並列で出しておくと時間短縮するね。
細かい多数のファイルで2倍-3倍くらいの向上。

223 名前:デフォルトの名無しさん mailto:sage [2010/02/19(金) 06:34:44 ]
5倍を目指してくれ

224 名前:デフォルトの名無しさん mailto:sage [2010/02/19(金) 07:29:30 ]
files=20

225 名前:デフォルトの名無しさん mailto:sage [2010/02/19(金) 12:47:04 ]
dmr にあやまれ。

226 名前:デフォルトの名無しさん mailto:sage [2010/02/19(金) 14:45:10 ]
How many files(0-15)?■

227 名前:デフォルトの名無しさん mailto:sage [2010/02/19(金) 15:58:57 ]
じじい乙

228 名前:デフォルトの名無しさん mailto:sage [2010/02/19(金) 17:54:32 ]
ここの人ってワイルドカード欲しい時に何使ってるの?
boost使ってる人なら正規表現なんだろうけど、
使って無い人が気になる。

229 名前:デフォルトの名無しさん mailto:sage [2010/02/19(金) 18:03:44 ]
windows api か
正規表現で代用

230 名前:デフォルトの名無しさん mailto:sage [2010/02/19(金) 18:21:07 ]
俺は魔法だなあ



231 名前:デフォルトの名無しさん [2010/02/19(金) 21:12:55 ]
そもそもワイルドカードと正規表現がどうつながるんだ?

232 名前:デフォルトの名無しさん mailto:sage [2010/02/19(金) 21:14:55 ]
ワイルドカードでできる事は正規表現でできるだろ

233 名前:デフォルトの名無しさん [2010/02/19(金) 21:31:27 ]
C++ でできる事はアセンブラでもできるんだが
そういう問題ではあるまい?

234 名前:デフォルトの名無しさん mailto:sage [2010/02/19(金) 21:33:36 ]
何を言ってるんだ…

235 名前:デフォルトの名無しさん mailto:sage [2010/02/19(金) 21:36:52 ]
ポインタが使える人、暇な人に質問です。
下のコードはメモリの確保と解放がきちんとなされてるでしょうか?
codepad.org/GUSgjZWM

236 名前:デフォルトの名無しさん mailto:sage [2010/02/19(金) 21:39:35 ]
異常なし

237 名前:デフォルトの名無しさん mailto:sage [2010/02/19(金) 21:45:42 ]
暇な人とは失礼な

改めていわれなくてもこんなところ見てる段階で暇・・・

238 名前:デフォルトの名無しさん [2010/02/19(金) 22:05:30 ]
>>233
正規表現が無い環境だってあるじゃない。
外部ライブラリも不可とか。
その例で言うとC++が使えない環境という事。
「C++使えないなんてあるわけないじゃん」とは言えまい?

239 名前:デフォルトの名無しさん mailto:sage [2010/02/19(金) 22:10:36 ]
>>238
C++使えないって、組み込み系とかですか?
なんかろくなコンパイラがないってことなんでしょうか。

240 名前:デフォルトの名無しさん mailto:sage [2010/02/19(金) 22:19:26 ]
>>239
例えばの話です。
組み込み系なんてサッパリ^O^



241 名前:デフォルトの名無しさん mailto:sage [2010/02/19(金) 22:23:34 ]
なんで2つの言葉のつながりから、環境がどうこうの話になるんだ。
話の流れ方に病的なものを感じる。

242 名前:デフォルトの名無しさん mailto:sage [2010/02/19(金) 22:24:52 ]
病的っていうか、知ったばかりの単語を中学生が使いたがってるだけな雰囲気

243 名前:デフォルトの名無しさん [2010/02/19(金) 22:26:19 ]
>>238
あったねー、OS にワイルドカードがなくてアプリが独自にサポートしてたケース
アプリごとに微妙に解釈が違ってて脱力ずっこけが何度もあった

>>239
C++ 自体はどのシステムにでも使えるぞ、C++ で HEX や HDL が作れるわけで

244 名前:デフォルトの名無しさん mailto:sage [2010/02/19(金) 22:26:46 ]
>>235
パッと見だがリークすると思う

t = new Test;
を解放してない

delete t;
が必要じゃない?

245 名前:デフォルトの名無しさん mailto:sage [2010/02/19(金) 22:28:24 ]
聞く前にop new/deleteでカウントするぐらいはやってみようよ

246 名前:235 mailto:sage [2010/02/19(金) 23:07:57 ]
>>244
見落としてました。
>>245
new、deleteをオーバーライドってことでしょうか?
やってみます。

どうもありがとです。

247 名前:デフォルトの名無しさん mailto:sage [2010/02/19(金) 23:49:29 ]
Test *New(int index0,int index1,int index2);
の途中で失敗した場合のリークも


248 名前:デフォルトの名無しさん mailto:sage [2010/02/20(土) 01:39:58 ]
worker threadパターンを実装したいので
既存の関数を実効させる部分をテンプレートで
実装したいのですが、どのように書けばいいのか
わかりません。

たとえば、f1、f2、f3を同じworke threadクラスで
扱うにはどのようにコーディングするのが正しいのでしょうか

249 名前:デフォルトの名無しさん mailto:sage [2010/02/20(土) 01:47:04 ]
スレッドを起動させっぱなしにするのがワーカースレッドっていうのか。

>>176のunsigned WINAPI fnc(void *n);もワーカースレッドだな。参考にしてくれよ。

250 名前:デフォルトの名無しさん mailto:sage [2010/02/20(土) 01:48:51 ]
>>176は一つのキューに挿入と取り出しを行い、3スレッド並列で空いたら
スレッドからデータを取り出し処理を行う。



251 名前:デフォルトの名無しさん mailto:sage [2010/02/20(土) 01:51:15 ]
キューが貯まったら各関数に通知したら、ビジーループを防げるけど
面倒なので100ms毎に確認しに行くようになっている。

252 名前:デフォルトの名無しさん mailto:sage [2010/02/20(土) 11:59:32 ]
プログラムする時のやり方聞きたいんだが
いきなり書き始める?
きっちり考えて書く?
書き始めたとしても、ヘッダでインラインで書きまくって、動作したらcppと分割する?
それとも最初からわけて書く?

253 名前:デフォルトの名無しさん mailto:sage [2010/02/20(土) 12:28:31 ]
自分の場合大まかな方針は決めてから書く
ただ、確実にこれはいるなってデータや関数は
あまり考えないでも書く

ヘッダにインラインで書くのはコンパイル時間との兼ね合い
大きいプログラムを書くときは最初から分ける

俺のオススメは
2回同じことを書くまでは出来るだけ抽象化しない
逆に2回同じことを書いた時点で必ず抽象化する
こうすると、バグの発生源が重複しないので大分バグをつぶしやすくなる
ただ、多人数での開発には使いにくいだろうが

254 名前:デフォルトの名無しさん mailto:sage [2010/02/20(土) 12:30:19 ]
>>252
まず絶対UMLとシーケンス図を書く
その後細かいところはフローチャートを書く
2、3時間でできることだから必ず行う

その後1回で製造する。



255 名前:デフォルトの名無しさん mailto:sage [2010/02/20(土) 12:42:07 ]
>>252
いきなり書く。
パフォーマンスを計る。
もう一度書く。
ライブラリ化する。


256 名前:デフォルトの名無しさん mailto:sage [2010/02/20(土) 12:51:21 ]
いきなり書くやつは下っ端だな。与えられる仕様をただこなすだけ。
ビル・橋・道路の設計者ではなく、日雇いの土木作業員。

257 名前:デフォルトの名無しさん mailto:sage [2010/02/20(土) 12:58:58 ]
まぁ、いきなり「本番」のコードを書くのは無謀だと思うけれども、
頭の中で色々練っている最中に、その助けとしてちょこちょこ手を動かすことはある。
メモというかスケッチというか、そんな感じのコード。
で、その一部が断片的に「本番」に流用されることならある。

258 名前:デフォルトの名無しさん mailto:sage [2010/02/20(土) 14:52:22 ]
すらすらとコードが書けないときは何かが間違ってるというのはあるねぇ

259 名前:デフォルトの名無しさん mailto:sage [2010/02/20(土) 15:00:58 ]
図に書く
スクリプトで書く
遅いところをC/C++に置き換える
寝る

260 名前:デフォルトの名無しさん mailto:sage [2010/02/20(土) 15:08:48 ]
まずコメントを先に書く
トイレに行く
コードを書きながら飯を食べる
コメントを直す



261 名前:デフォルトの名無しさん mailto:sage [2010/02/20(土) 15:11:11 ]
冷静に考えればいいだけだろうがばかどもが

262 名前:デフォルトの名無しさん mailto:sage [2010/02/20(土) 15:13:31 ]
やりたい事を考える
下っ端に薄給で作らせる

263 名前:デフォルトの名無しさん mailto:sage [2010/02/20(土) 17:57:01 ]
継続での脱出みたいなことってC++で出来ますか?
たとえばこんな関数があったときに、どこかでret=trueになったら
一番最初にfを呼び出した箇所へ飛んで関数を終わらせたい

bool f(){
bool ret=false;
//処理によってret=trueになったりならなかったり
for(int i=0;i<n;++i){ret|=f();}
return ret;
}
gotoで抜けられるのは今いる関数内のループだけだと思うので無理?

264 名前:デフォルトの名無しさん mailto:sage [2010/02/20(土) 18:00:50 ]
>>263
無理です。


265 名前:デフォルトの名無しさん mailto:sage [2010/02/20(土) 18:07:53 ]
>>263
たとえば、例外的なことがおきたときにプログラムの実行を中断したいというのであれば、
例外が使える。
だけど、例外は例外的な事以外に乱用すると非常に見通しの悪いプログラムになるから注意。


266 名前:デフォルトの名無しさん mailto:sage [2010/02/20(土) 20:34:56 ]
>>263
bool f(){
//処理によってret=trueになったりならなかったり
for(int i=0;i<n;++i){if(f())return true;}
return false;
}

267 名前:デフォルトの名無しさん mailto:sage [2010/02/20(土) 23:19:09 ]
makeって使ったことがないのですが、
勉強した方がいいのでしょうか。


268 名前:デフォルトの名無しさん mailto:sage [2010/02/20(土) 23:24:24 ]
いい

269 名前:デフォルトの名無しさん mailto:sage [2010/02/20(土) 23:25:15 ]
IDEに任せっきりでmakeってのから逃げまくっていたのですが、
やっぱり勉強します。

ありがとうございます。

270 名前:デフォルトの名無しさん mailto:sage [2010/02/21(日) 00:14:10 ]
tbbを実用で使い出したけど、メモリ関係の例外が出まくるぞ。
いつもではなくたまに。どうみてもエラーになり得ないところで例外。
そのためにtbb_allocがついているのか。
メモリ管理をtbb専用で全部置き換えれば直るんですか。



271 名前:デフォルトの名無しさん mailto:sage [2010/02/21(日) 00:29:16 ]
>270
>いつもではなくたまに。どうみてもエラーになり得ないところで例外。
使い方が間違ってて排他処理で失敗してるだけじゃないの?

272 名前:デフォルトの名無しさん mailto:sage [2010/02/21(日) 00:49:38 ]
そうか。試しに全書き換えでやってみる。

273 名前:デフォルトの名無しさん mailto:sage [2010/02/21(日) 01:16:49 ]
#define allocator scalable_allocator
とやると、
std::allocator がstd::scalable_allocatorになる。
std::allocator がtbb::scalable_allocatorにはどすればいい。
::がdefineにかけない。


274 名前:デフォルトの名無しさん mailto:sage [2010/02/21(日) 01:19:09 ]
#define std tbbにしたらエラーでまくり。当然全関数対応しているわけはなく。

275 名前:デフォルトの名無しさん mailto:sage [2010/02/21(日) 01:33:30 ]
namespace std {
 typedef xxx::myallocator myallocator;
}
#define allocator myallocator

276 名前:デフォルトの名無しさん mailto:sage [2010/02/21(日) 01:47:52 ]
できないです

template<typename T> class scalable_allocator;

となっていて、テンプレート引数が必要と出ます

277 名前:デフォルトの名無しさん mailto:sage [2010/02/21(日) 01:53:11 ]
単純なdefineの文字置き換えで出来ないかと考え中。
stdをstd0に書き換えて、tbbをstdにして、ここでヘッダを読み込み
std0をstdに戻せば、善さげなきはする。
別名で存在している関数をdefineで置き換えたらいけそう

278 名前:デフォルトの名無しさん mailto:sage [2010/02/21(日) 02:06:20 ]
駄目だった 再定義とか出る

279 名前:デフォルトの名無しさん mailto:sage [2010/02/21(日) 02:08:02 ]
バグの温床になりそうだな

280 名前:デフォルトの名無しさん mailto:sage [2010/02/21(日) 02:25:01 ]
悪夢だ・・・



281 名前:デフォルトの名無しさん mailto:sage [2010/02/21(日) 02:26:17 ]
アロケータの置き換えはTBBのチュートリアルにやり方が書いてある

282 名前:デフォルトの名無しさん mailto:sage [2010/02/21(日) 02:44:48 ]
面倒になってきたので標準装備のみで0から作るぜ

283 名前:デフォルトの名無しさん mailto:sage [2010/02/21(日) 02:57:58 ]
std::vector<int, tbb::scalable_allocator<int> >などとその都度指定する、
それをtypedefするというのは駄目なの?正統派だと思うのだけど。

C++0xなら
template<typename T>
using vector_tbb<T> = std::vector<tbb::scalable_allocator<T>>;
と書いて、vector_tbb<int>とかvector_tbb<std::string>とか書けるようになるんだけど、
まだ未来の話……。

284 名前:デフォルトの名無しさん mailto:sage [2010/02/21(日) 06:26:39 ]
if文で真偽値を評価すると真になる要素がいくつあるか数えるのを短く書きたいです。

vector<int> a;
// ;;;;;;;

int n = 0;
for(int i = 0; i < a.size(); ++i)
if( a[i] )
n++;

これを、
int n = std::count( a.begin(), a.end(), ?? );
ぐらいに短く書きたいのですが、なにかいい方法あります

285 名前:デフォルトの名無しさん mailto:sage [2010/02/21(日) 06:30:24 ]
ファンクタ使えば?

286 名前:デフォルトの名無しさん mailto:sage [2010/02/21(日) 06:37:40 ]
int n = a.size() - std::count(a.begin(),a.end(),0);

287 名前:デフォルトの名無しさん mailto:sage [2010/02/21(日) 07:02:32 ]
みなさまありがとうございます。


>>285
クラスを定義しようとすると、結局長くなってしまいますし、離れた場所に書くことになるため気に入りません。

>>286
それが良いですね。勉強になりました。

intの場合はそれでいいのですが、もうすこし一般化して、 if( a[i] >= 0 ) の場合などにも使える方法はありますか?

288 名前:デフォルトの名無しさん mailto:sage [2010/02/21(日) 08:10:08 ]
>>287
関数内クラス
boost::lambda
c+0x lambda関数


289 名前:デフォルトの名無しさん mailto:sage [2010/02/21(日) 08:49:16 ]
>>287
count_if(a.begin(), a.end(), bind2nd(not_equal_to<int>(), 0))
みたいなのをちょっとずつ変えれば

290 名前:デフォルトの名無しさん mailto:sage [2010/02/21(日) 12:20:46 ]
トークン結合演算子##を利用して
どうにかならんかね?



291 名前:デフォルトの名無しさん mailto:sage [2010/02/21(日) 18:00:32 ]
関数内にしかスコープのない関数って作れる?
void foo(){
std::cout << "foo\n";
}
の中で

void foo(){
void bar(){std::cout << "bar\n";}

bar();bar();bar();bar();
std::cout << "foo\n";
}

こんな風に。
普通に考えてC++では違反だと思うのだが、
どうにか回避するトリックとか。


292 名前:デフォルトの名無しさん mailto:sage [2010/02/21(日) 18:03:15 ]
>>291
ローカルクラスを使う。
ttp://www.fides.dti.ne.jp/~oka-t/cpplab-tips-1.html

293 名前:デフォルトの名無しさん mailto:sage [2010/02/21(日) 22:27:52 ]
ローカルクラスは結構便利なんだけどなぜかあまり浸透してないよね

294 名前:デフォルトの名無しさん mailto:sage [2010/02/21(日) 22:37:37 ]
だってtemplateで外部にクラス渡せないし

295 名前:デフォルトの名無しさん mailto:sage [2010/02/21(日) 23:05:50 ]
名前空間やモジュールシステムを持たないJavaScriptのような言語ならともかく
C++ではあまり必要性がないと思う。ローカルクラスや関数内関数
クロージャはまた別だけど

296 名前:デフォルトの名無しさん mailto:sage [2010/02/21(日) 23:08:02 ]
ローカルクラスはtemplate引数も使えない。
あと0xでlambdaの型が外部に渡せるのに未だ渡せないローカルクラスは生きている意味があるのかと問いたい。

297 名前:デフォルトの名無しさん mailto:sage [2010/02/21(日) 23:13:18 ]
fainalなクラスとか?
ローカルクラスにできて他にできないことって特にないよなぁ
ローカルのほうが散らかさないで書ける場合はあるけど

298 名前:デフォルトの名無しさん mailto:sage [2010/02/21(日) 23:17:58 ]
「外部に渡せる」の意味がわからん

299 名前:デフォルトの名無しさん mailto:sage [2010/02/21(日) 23:18:33 ]
ローカルクラスは昔使ってたけど、関数が大きくなって読みにくくなるんで匿名名前空間に置くようになった。


300 名前:デフォルトの名無しさん mailto:sage [2010/02/21(日) 23:27:08 ]
ローカルクラスはデストラクタで自動でリソース解放するのにたまに使ったり。
(=スマートポインタのデリーターみたいな感じ。)

それとC++0xからはテンプレート引数に渡せるようになるね。



301 名前:デフォルトの名無しさん mailto:sage [2010/02/21(日) 23:29:21 ]
 × デリーター
 ○ カスタムデリーター
です。

302 名前:デフォルトの名無しさん mailto:sage [2010/02/21(日) 23:35:29 ]
無名の名前空間だとヘッダに書かないといけないテンプレートクラスに使えないね


303 名前:291 mailto:sage [2010/02/22(月) 00:16:05 ]
>>292
ありがとうございます。


304 名前:デフォルトの名無しさん mailto:sage [2010/02/22(月) 00:49:41 ]
std::string str[] = {
"A",
"B"
};
これってバグの元になる?
int i = sizeof(str) / sizeof(str[0]);
こうするときとかに。

305 名前:デフォルトの名無しさん mailto:sage [2010/02/22(月) 00:52:44 ]
動的配列であってもその実体は内部にelementのpointerを持っているだけなので
中身のデータが違ってもインスタンスの大きさはそれぞれ同じ。

306 名前:デフォルトの名無しさん mailto:sage [2010/02/22(月) 00:54:13 ]
>>305
即レスかつわかりやすい説明ありがとうございます。
不安がなくなりました。

307 名前:デフォルトの名無しさん mailto:sage [2010/02/22(月) 00:58:51 ]
C99で絶望するがよい。

308 名前:デフォルトの名無しさん mailto:sage [2010/02/22(月) 01:01:14 ]
素直にvector<string>使いなよ。

309 名前:デフォルトの名無しさん mailto:sage [2010/02/22(月) 01:03:48 ]
>>304-306
何を心配してたのかわかんない。少し解説してもらえるとうれしい。

310 名前:デフォルトの名無しさん mailto:sage [2010/02/22(月) 01:08:08 ]
std::string a = "asdf", b = "9999999999999999999999999999999";
って文字列の長さが違うからsizeof(a)とsizeof(b)で同じ数値になるの!?
std::stringで配列作っていいの!?!?!??!?!!!???わかんないです><;;;;;

→ のーぷろぶれむ




311 名前:304 mailto:sage [2010/02/22(月) 01:15:14 ]
>>310
ありがとう。
その通りでした。

>>308
あとあと編集しづらいかな見にくいかなと思ったので。

312 名前:デフォルトの名無しさん mailto:sage [2010/02/22(月) 01:47:53 ]
クラス内にstatic constのint値を定義して,
#defineの代わりにしたいんですが,
このint値はそのクラスのインスタンスを生成してなくても,
メモリ上に存在するのでしょうか?
そうなると,大規模開発では避けるべきなのでしょうか?

313 名前:デフォルトの名無しさん mailto:sage [2010/02/22(月) 01:51:08 ]
#defineされた値だとプログラム全体の最適化がされない限り書く度に別々のところに数値が配置されるけどね。

314 名前:デフォルトの名無しさん mailto:sage [2010/02/22(月) 02:00:33 ]
グローバル変数ってlibファイルで共有?
モジュールで共有?


315 名前:デフォルトの名無しさん mailto:sage [2010/02/22(月) 17:47:17 ]
>>312
最適化すりゃどうせ消える

316 名前:デフォルトの名無しさん mailto:sage [2010/02/22(月) 21:00:22 ]
>>312
まあ理屈はそうだけども、
現実的にはその最適化がなされないような状況は
明示的にコンパイルオプションで止めろ!
と言わない限りおこんなinじゃない?


317 名前:デフォルトの名無しさん mailto:sage [2010/02/22(月) 21:40:04 ]
staticなんだからインスタンスは関係ないんじゃ

318 名前:デフォルトの名無しさん mailto:sage [2010/02/22(月) 21:56:37 ]
templateクラスのstatic変数ならあるいは

319 名前:デフォルトの名無しさん mailto:sage [2010/02/22(月) 22:40:59 ]
hiphopのwindows binaryありますか。phpコードをc++に書き換え、phpから利用できるようになるようなんですが。
ソースコード。
github.com/facebook/hiphop-php

320 名前:デフォルトの名無しさん mailto:sage [2010/02/23(火) 01:04:04 ]
来月出版の
C++テンプレートメタプログラミング
糞本かな?

えぴなんとかさんの書いた類の糞本レベル?



321 名前:デフォルトの名無しさん [2010/02/23(火) 05:41:33 ]
禿本の邦訳にも係わってる人だよ

322 名前:デフォルトの名無しさん mailto:sage [2010/02/23(火) 12:14:03 ]
えぴなんとかさんってすごいのかどうかよくわからん
昔の掲示板ログとか見るととんちんかんな感じだよね
えぴなんとかさんが初心者だったころなのかもしれないけど

323 名前:デフォルトの名無しさん mailto:sage [2010/02/23(火) 18:19:02 ]
これのことかな
episteme.wankuma.com/stlprog/index.html


324 名前:デフォルトの名無しさん mailto:sage [2010/02/23(火) 18:48:30 ]
わんくま同盟ってなんか気持ち悪いよね
公開しているドキュメントでお世話になってはいるけど、近づきたくない感じ

325 名前:デフォルトの名無しさん mailto:sage [2010/02/23(火) 19:14:15 ]
気持ち悪いというあいまいで感覚的な概念が気持ち悪い



326 名前:デフォルトの名無しさん mailto:sage [2010/02/23(火) 19:41:10 ]
単に偉そうでむかつくんだろ

327 名前:デフォルトの名無しさん mailto:sage [2010/02/23(火) 19:47:58 ]
「気持ち悪い」のはともかく、「よね」が意味わからん

328 名前:デフォルトの名無しさん mailto:sage [2010/02/23(火) 20:52:33 ]
内輪ネタを表に出したがるあたりと偉そうなのはむかつくが同意は求めない

329 名前:デフォルトの名無しさん mailto:sage [2010/02/24(水) 00:19:05 ]
えぴなんとかさんって
インなんとかさんみたいなもんか?

330 名前:デフォルトの名無しさん mailto:sage [2010/02/24(水) 00:42:06 ]
ペンネームに機種依存文字を使うプログラマの人って…



331 名前:デフォルトの名無しさん mailto:sage [2010/02/24(水) 00:50:37 ]
ビル☆ゲイツの悪口はそこまでだ

332 名前:デフォルトの名無しさん mailto:sage [2010/02/24(水) 01:07:23 ]
C++学ぶのにいい本ありませんか?


333 名前:デフォルトの名無しさん mailto:sage [2010/02/24(水) 01:08:02 ]
>>332 >>4-5

334 名前:デフォルトの名無しさん mailto:sage [2010/02/24(水) 01:11:44 ]
>>330
今チェックしたんだけど
機種依存文字じゃなかったぞ

335 名前:デフォルトの名無しさん mailto:sage [2010/02/24(水) 06:51:15 ]
>>332
こいつはマルチポストだから相手にしないように!


336 名前:デフォルトの名無しさん mailto:sage [2010/02/24(水) 18:30:19 ]
単項演算子-のオーバーロードについて質問があります。
独習C++という本で勉強しているのですが、以下のようなサンプルコードがあります。(※一部省略)
class coord{
int x,y;
public:
coord(){x=0;y=0;}

coord operator-(coord ob2);//2項負符号
coord operator-();//単項負符号
};
//単項-をcoordクラスに対してオーバーロードする
coord coord::operator-(){
x=-x;
y=-y;
return *this;
}
上記の場合、
coord ob1;
coord ob2;
ob2=-ob1;
としただけで、ob1の内容が変わってしまうと思うのですが、
このサンプルコードは正しいのでしょうか?
以下のほうがいいと思うのですが。
//単項-をcoordクラスに対してオーバーロードする
coord coord::operator-()
{
coord temp;
temp.x=-x;
temp.y=-y;
return temp;
}

337 名前:デフォルトの名無しさん mailto:sage [2010/02/24(水) 18:33:57 ]
俺もそのほうが良いと思う
一般に組み込み型と同じ挙動になるようにデザインするほうが良いと
EffectiveC++にも書いてあるし

338 名前:デフォルトの名無しさん mailto:sage [2010/02/24(水) 18:40:12 ]
そしてconstを付けるべき

339 名前:デフォルトの名無しさん mailto:sage [2010/02/24(水) 19:21:48 ]
>>336
君の意見は正しい。
coord coord::operator-()const;
とすれば納得できると思う。

340 名前:336 mailto:sage [2010/02/24(水) 19:57:51 ]
>337-339
ありがとうございました。
これで先に進めます。



341 名前:デフォルトの名無しさん mailto:sage [2010/02/24(水) 23:20:04 ]

*thisを返すからいいんじゃないの?

342 名前:デフォルトの名無しさん mailto:sage [2010/02/24(水) 23:23:33 ]
this->xが変わるからダメなんじゃないの

343 名前:デフォルトの名無しさん mailto:sage [2010/02/24(水) 23:28:54 ]
プログラムに致命的なエラーがあり
(取り扱えない例外をキャッチしたなど。)
そこで即座に終了したい場合、
assert(0);
exit(1);
のどちらが望ましいのでしょうか?

また、この2つにはどんな違いがあるのでしょうか?

よろしくお願い申し上げます。

344 名前:デフォルトの名無しさん mailto:sage [2010/02/24(水) 23:33:31 ]
>>342
ああ、すまない。ぼけてたorz
もう寝る…

345 名前:デフォルトの名無しさん mailto:sage [2010/02/24(水) 23:42:17 ]
>>343
assertは、ここでこうなってるはずがない、というプログラマの意思表示
んで、それはリリースビルドだとなくなるロジック

346 名前:デフォルトの名無しさん [2010/02/24(水) 23:59:19 ]
インターフェースと実装を分離したいと思ってて、pImplイディオムを利用しようと考えています。
一般的なpImplイディオムは、コンストラクタでimpクラスをnewしていますが、
いま設計しているpImplを利用したクラスは、何度もインスタンス化されるので、newしたくありません。
また、Factory関数を作って、利用者側にわざわざ呼ばせたくありません。

つまり、クラスの利用者から、実装クラスを隠蔽し、かつインスタンス化時に何度もnewしないような方法はありますでしょうか?
(妥協して、メンバ変数だけインターフェース部に持ってきて、実装クラスをSingletonにする、など考えてみましたが、案の定イマイチでした)


347 名前:デフォルトの名無しさん mailto:sage [2010/02/25(木) 00:22:00 ]
一つ一つ中身が違うならプールして再利用ぐらいしか思い付かないなぁ


348 名前:デフォルトの名無しさん mailto:sage [2010/02/25(木) 01:11:41 ]
>>343
その用途だと abort() あるいは terminate() が正解だと思う。
assert() と exit() 含めて、それぞれの違いはライブラリのドキュメント読んでね。

349 名前:デフォルトの名無しさん mailto:sage [2010/02/25(木) 01:14:23 ]
>>346
new したくないっていうのは動的メモリ確保のコストを嫌っての話だよね?
そういうことなら、外側のクラスに char impl_storage[max_size] みたいな領域だけ
置いといて、実装クラスでは new (impl_storage) impl(....) すればいいかもしれない。

350 名前:デフォルトの名無しさん mailto:sage [2010/02/25(木) 01:16:15 ]
>>346
dlmallocなんて単純だからすぐ作れるし
自分でmalloc作ればいいよ



351 名前:デフォルトの名無しさん mailto:sage [2010/02/25(木) 01:20:56 ]
>>346
まず、ふつうに new する状態でパフォーマンスに問題があって、次にそのボトルネックが
new にあるという確認を済ませ、さらに >350 の言うように dlmalloc などによる高速化を試みた後、
それでも問題が残るようなら >349 のような奇怪なコードを、十分なコメントを添えたうえであれば、
書いても良い。

それ以外は許さん。

352 名前:デフォルトの名無しさん mailto:sage [2010/02/25(木) 01:51:00 ]
>346
実装インスタンスのnewコストを気にするんだったら、不要になったら再利用できるように簡単なGC作ったら?
実装インスタンス自体は利用者から見えないから、別にFactory関数で管理しても問題ないだろうし。
お手軽に実装するんだったらboost::shared_ptr + deleterかね。


353 名前:デフォルトの名無しさん mailto:sage [2010/02/25(木) 02:01:58 ]
>>343
assertは開発作業中のマーキングや「しおり」のようなものだと考えたほうがいいと思う。
exitはatexitの登録関数やストリームI/Oの後始末をしてから終了する。
C用の例外の代替物と見るべきで、C++では使わないだろう。デストラクタは実行されないし。
terminate(abort)なら後始末もせずに割り込みを掛けて即座に終了するが、
そこまでしたい状況は考えにくい。
結局、例外をそのまま放っておいてmainでキャッチしてreturn 1;とかするのが
常道だと思う。

354 名前:デフォルトの名無しさん mailto:sage [2010/02/25(木) 02:05:19 ]
>>343
取り扱えない例外ははじめからキャッチするなよ。
万一そんな状況がやむを得ないとすれば、 throw; で外に向けて投げとけばいいよ。
そうすれば勝手に terminate() するかもしれないし、誰かがキャッチしてくれるかもしれない。

355 名前:デフォルトの名無しさん mailto:sage [2010/02/25(木) 03:30:24 ]
enum型を引数に持つときって参照渡しにした方がいいの?
構造体とは違うっぽいのでしなくてもいい?速度的に

356 名前:デフォルトの名無しさん mailto:sage [2010/02/25(木) 03:38:12 ]
>>355
速度が気になるなら計測してみるがいい。

参照渡しがよくあるポインタと同様の実装だと考えると、 enum のサイズがポインタより
大きくなることはなさそうで、あまりメリットはなさそうな感じではある。

357 名前:デフォルトの名無しさん mailto:sage [2010/02/25(木) 03:54:59 ]
>>351
配置newって嫌われ者なの?

358 名前:デフォルトの名無しさん mailto:sage [2010/02/25(木) 05:48:41 ]
>>355
列挙型の実態が整数"ではない”実装を見たことがない。

359 名前:デフォルトの名無しさん mailto:sage [2010/02/25(木) 09:35:37 ]
>>357
別に配置newは嫌いじゃないですが、必要ないところで使うような人は嫌いです。

360 名前:デフォルトの名無しさん mailto:sage [2010/02/25(木) 10:53:34 ]
誰もつっこまないけどchar impl_storage[max_size]なんてしたらアライメントどうするんだよ。



361 名前:デフォルトの名無しさん mailto:sage [2010/02/25(木) 10:55:15 ]
>>360 boost::aligned_storage あたりでおきかえる。

362 名前:デフォルトの名無しさん mailto:sage [2010/02/25(木) 11:33:04 ]
じゃあ最初からboost::aligned_storageって書けよ

363 名前:349 mailto:sage [2010/02/25(木) 12:07:15 ]
>>362
boost::aligned_storage は標準ライブラリでもないし、コンパイラの拡張機能で指定した
ほうがいいかもしれないし、その場で適当な union 作ってしのぐのがいいかもしれないし、
そんな気持ちを込めて「〜みたいな領域」と書きました。

364 名前:343 mailto:sage [2010/02/25(木) 12:49:32 ]
>>345>>348>>353-354
ありがとうございます。
assert() exit() terminate() abort()
について勉強してきます。



365 名前:デフォルトの名無しさん mailto:sage [2010/02/25(木) 17:02:41 ]
>>363
>そんな気持ちを込めて「〜みたいな領域」と書きました。
どう考えてもそれだけの情報からその気持ちは伝わらないから。
頭大丈夫?日本語分かる?精神鑑定してもらったら?

366 名前:デフォルトの名無しさん mailto:sage [2010/02/25(木) 20:49:40 ]
解析で使う

  A-Z  a-z  0-9
1  1   2   3
2  1   2 3
3
4

な表ってなんて名前だっけ?

367 名前:デフォルトの名無しさん mailto:sage [2010/02/25(木) 20:57:50 ]
>>366
LR解析表なのか?状態複数あって
LR衝突してないのか?

368 名前:デフォルトの名無しさん mailto:sage [2010/02/25(木) 21:03:59 ]
>>367
表の中は説明で適当に書いただで意味はないんだ。
どんな名前だったか忘れてしまったもんで。
助かったよ。ありがとう


369 名前:デフォルトの名無しさん mailto:sage [2010/02/25(木) 22:34:38 ]
>>365
俺には伝わっていたが、伝わらない人がいるのもわかる。
そして、伝わらなかったからといってそのようなレスをするあなたが心配です。

370 名前:デフォルトの名無しさん mailto:sage [2010/02/26(金) 13:26:29 ]
一般に、
g++ -lhoge test.cpp
という調子でライブラリを読み込んで成功したとき、
hogeの場所を知るコマンドってありますか?

具体的には
g++ -llapack test.cpp
なのですが、これは
Fortranのライブラリをリンクしているそうです。

Fortranでは
DSYEV
という関数名なのがC系だと
dsyev_
と、アンダーバーがつくようになるというのがよく分からないので・・・。




371 名前:デフォルトの名無しさん mailto:sage [2010/02/26(金) 14:38:16 ]
よくわからんが、場所っていうのはディレクトリ名じゃなくて関数名のことかい
それにOS依存の話題だったら微妙にスレ違いだぜ

372 名前:デフォルトの名無しさん mailto:sage [2010/02/26(金) 15:45:41 ]
LD_LIBRARY_PATHとか

373 名前:デフォルトの名無しさん mailto:sage [2010/02/26(金) 15:47:09 ]
・リンカが検索に用いるパスを探すことで場所を知ることができる
・ラッピングした際に小文字にしたんでしょう

374 名前:デフォルトの名無しさん mailto:sage [2010/02/26(金) 16:06:37 ]
>>370
www.netlib.org/clapack/faq.html
As previously stated, the CLAPACK library was built using
a Fortran to C conversion utility called f2c. The entire
Fortran 77 LAPACK library is run through f2c to obtain C
code, and then modified to improve readability. CLAPACK's
goal is to provide LAPACK for someone who does not have
access to a Fortran compiler.

It is important to note that this f2c conversion was run on
a machine that appends an underscore to differentiate C
and Fortran 77 namespaces. If your machine does not append
an underscore to differentiate namespaces, then CLAPACK
will not work on your machine.


375 名前:デフォルトの名無しさん mailto:sage [2010/02/26(金) 17:11:46 ]
ありがとうございます。
だんだん事情が分かってきました。
人間がCに移植しているわけではないのですね。
clapack.h
をみても、単に宣言が書いてあるだけなので、
Cのソースコードとしてincludeするわけでもないのか。

あと前半はたしかにOS依存の話ですね。
手元の環境ではLD_LIBRARY_PATHも空だったし。
すみませんでした。

376 名前:デフォルトの名無しさん [2010/02/26(金) 20:04:26 ]
/*******************************************************/
 #define MAX(x,y) ((x)>(y) ? (x):(y))
 int a = 3;
 int b = 3;
 int m = MAX(a,++b);
はプリプロセッサによって
 int a = 3;
 int b = 3;
 int m = ((a)>(++b) ? (a):(++b));
と展開されます。
結果的に++bが2度評価され、bとmは5になってしまいます。
/*******************************************************/
という記述を見たのですが、標準C++の規格ではbとmは5になるってのは保証されますか?
私には未定義の動作になりそうに見えるのですが。

よろしくお願いします。



377 名前:デフォルトの名無しさん mailto:sage [2010/02/26(金) 20:07:07 ]
保証されますよ

378 名前:デフォルトの名無しさん mailto:sage [2010/02/26(金) 20:25:05 ]
>>377
 int m =++b, a , ++b;
の場合はどうなりますか?
bとmが5になりますか?
それとも未定義の動作でしょうか?

379 名前:デフォルトの名無しさん mailto:sage [2010/02/26(金) 20:30:14 ]
未定義の動作ですよ

380 名前:デフォルトの名無しさん mailto:sage [2010/02/26(金) 20:39:49 ]
 int m = (a)>(++b) ? (a):(++b);
だとOKで、
 int m =++b, a , ++b;
だと未定義の動作なのですね。

うーん、ややこしいです。
両方とも一つの式の中で2回bの値が
変化しているように思うのですが、
どういった相違により
片方がOKでもう一方はダメに
なるのでしょうか?




381 名前:デフォルトの名無しさん mailto:sage [2010/02/26(金) 20:41:58 ]
カンマがね、ヤバイんですよ・・・ここだけの話

382 名前:デフォルトの名無しさん mailto:sage [2010/02/26(金) 20:54:23 ]
unsigned A(){
struct{unsigned a;unsigned operator()(int x){return ++a<<x;}}r={1};
retrun r(0)|r(8)|r(16)|r(24);}

0x04030201 // 式中でオブジェクトの順状態て保証される?

383 名前:デフォルトの名無しさん mailto:sage [2010/02/26(金) 21:00:47 ]
>>382
されない

384 名前:デフォルトの名無しさん mailto:sage [2010/02/26(金) 21:42:11 ]
なんか関数の実引数の区切りのカンマと、カンマ演算子を間違っているやつがいるようだ。
>>378 の m, b ともに 5 になることは保証されているぞ (5.18-1)
m=func(++b, a, ++b); だと未定義動作だけどな。

>>376 副作用完了点でぐぐってみるべし

385 名前:デフォルトの名無しさん mailto:sage [2010/02/26(金) 22:03:09 ]
a++, a++;

未定義

386 名前:380 mailto:sage [2010/02/26(金) 22:23:55 ]
int m=func(++x, ++x); が未定義動作というのは全会一致ってことですね。

 int m = (a)>(++b) ? (a):(++b); は正当で
 int m =++b, a , ++b; も正当
ですが
 int m =++b, ++b;
は未定義ということなのですか?

int m=(++x) + (++x); は未定義動作になりますか?



387 名前:デフォルトの名無しさん mailto:sage [2010/02/26(金) 22:39:06 ]
未定義

388 名前:デフォルトの名無しさん mailto:sage [2010/02/26(金) 22:39:58 ]
>>384
int a=3;
int b=3;
int m =++b, a , ++b;

このときにmが5になることが保証されているといっている?

389 名前:デフォルトの名無しさん mailto:sage [2010/02/26(金) 22:40:35 ]
>>378 これはコンパイルエラーでしょ。

390 名前:デフォルトの名無しさん mailto:sage [2010/02/26(金) 22:43:36 ]
>>384
カンマ演算子は副作用完了点たりえないのでは?



391 名前:390 mailto:sage [2010/02/26(金) 22:45:15 ]
間違えて覚えてたみたい。ごめんなさい。

392 名前:384 mailto:sage [2010/02/26(金) 22:46:49 ]
章番号までちゃんと示してある。言語規格書呼んでから話するんだな。

393 名前:デフォルトの名無しさん mailto:sage [2010/02/26(金) 22:54:23 ]
>>392
自信満々のところ水を差すようだけど、 >389 の言うとおりコンパイルエラーになると思うんだ。

カンマ演算子とか言ってるところを見ると、
 int m =(++b, a , ++b);
こう解釈したんだろうとは思うけど。

394 名前:デフォルトの名無しさん mailto:sage [2010/02/26(金) 22:54:31 ]
特例は3項演算子、カンマ演算子のほかに&&と||もあるから
int b=1;
int a=++b&&++b&&b;
こんなのでもちゃんとa=3になるな
しかしひどいコードだ

395 名前:デフォルトの名無しさん mailto:sage [2010/02/26(金) 22:57:41 ]
もういいから黙って二行に分けろよカス

396 名前:デフォルトの名無しさん mailto:sage [2010/02/26(金) 22:59:04 ]
>>393
その程度だろ
codepad.org/8ZqDzVjC
今話してる話題と関係ないだろ

397 名前:デフォルトの名無しさん mailto:sage [2010/02/26(金) 23:07:28 ]
何そのイン○リさんみたいな返し?流行ってんの?

398 名前:デフォルトの名無しさん mailto:sage [2010/02/26(金) 23:08:14 ]
何言ってんだか

399 名前:デフォルトの名無しさん mailto:sage [2010/02/26(金) 23:11:21 ]
>>393
コンパイルエラーにはならず、カンマ演算子の最後、つまり2回目の++bが値として使われるので
mに4が代入された後、bはインクリメントされる。
なので、>>388を書いた。

400 名前:デフォルトの名無しさん mailto:sage [2010/02/26(金) 23:16:56 ]
>>399
なんだか知らんが
++bは前置増分演算子って呼ぶってことは知ってるの?



401 名前:デフォルトの名無しさん mailto:sage [2010/02/26(金) 23:20:01 ]
ttp://codepad.org/xadcb34S
ああこういう意味でコンパイルエラーってことね。

上記の話をまとめると
 int m =(++b, a , ++b);

 ttp://codepad.org/J7jHthUQ
のようになり、正当な動作をするって考えていいのね。



402 名前:デフォルトの名無しさん mailto:sage [2010/02/26(金) 23:21:46 ]
つまり
3項演算子(条件演算子
カンマ演算子
&&
||
の4つは、副作用完了点となるから
それらのオペランドに++aが複数回出現しても
未定義の動作にならないってこと?


403 名前:デフォルトの名無しさん mailto:sage [2010/02/26(金) 23:29:57 ]
>>400
なんだかどうしようもないところでボケていてすまんかった

404 名前:デフォルトの名無しさん mailto:sage [2010/02/26(金) 23:45:55 ]
>>402
「オーバーロードされてなければ」それで合ってる

405 名前:デフォルトの名無しさん mailto:sage [2010/02/27(土) 15:54:25 ]
ttp://codepad.org/AsWip2mX
このコードで
std::cout << hairetsunoyousosuu(arr) << std::endl;
の部分は 期待通りになるのですが
std::cout << foo(arr) << std::endl;
の部分が期待通りになりません。

どうすれば
「引数として渡された配列の要素数を返す『関数』」
が書けるでしょうか?

よろしくお願い申し上げます。


406 名前:デフォルトの名無しさん mailto:sage [2010/02/27(土) 16:00:57 ]
関数の仮引数の[]はただのポインタに変わる
コンパイル時にわかるものなら_countofを参考にする
それをDLLとして公開するとか誰が渡すんだかわからないものを自動で取得する汎用的な方法はない

407 名前:デフォルトの名無しさん mailto:sage [2010/02/27(土) 16:03:23 ]
>>405
main::arrはint[5]型
foo::argはint[]型
sizeof(int[5])はsizeof(int*) * 5
sizeof(int[])はsizeof(int*)
int*とintの大きさがたまたま同じだっただけ。

408 名前:デフォルトの名無しさん mailto:sage [2010/02/27(土) 16:05:30 ]
>>406
ポインタとは違ってmainで定義したarrの要素全部がコピーされるけどね。

409 名前:デフォルトの名無しさん mailto:sage [2010/02/27(土) 16:34:50 ]
構造体と勘違いしてんじゃねえのお前

410 名前:デフォルトの名無しさん mailto:sage [2010/02/27(土) 16:42:25 ]
こまけぇことはいいんだ、vector使え!



411 名前:デフォルトの名無しさん mailto:sage [2010/02/27(土) 18:23:11 ]
>>405
なんか codepad は Error 500 で見れなかったんだけども、こういう話?
d.hatena.ne.jp/matsutakegohan1/20071006/1191643652

412 名前:405 mailto:sage [2010/02/27(土) 19:19:17 ]
>>406-411
みなさんありがとうございます。

template<class T, int N> int len(T (&)[N]){return N;}

#include <cstddef>
template<typename T, std::size_t N>
char (&lengthof_helper_char_array(T (&a)[N]))[N];
#define lengthof(a) (sizeof(lengthof_helper_char_array(a)))
ですと、どちらが望ましいのでしょうか?


413 名前:デフォルトの名無しさん mailto:sage [2010/02/27(土) 19:24:04 ]
>>412
どちらが望ましいかは場合によるね。
前者はコンパイル時定数としては使えない。
後者はコンパイル時定数として使えるようにしてあるけど、そのために読みにくく
なっているし、基本的に避けるべきであるマクロまで組み合わされている。

414 名前:デフォルトの名無しさん mailto:sage [2010/02/27(土) 19:39:51 ]
>>413
なるほど、そう言った違いがあるのですね。

ありがとうございました。

415 名前:デフォルトの名無しさん mailto:sage [2010/02/27(土) 19:43:00 ]
ttp://www.kijineko.co.jp/tech/superstitions/parameter-of-isalpha-is-char.html
ここに書いてあることについてお伺いしたいのですが。


const char str[] = "abc123";
for (char* s = str; *s != '\0'; s++)
{
 if (isalpha(static_cast<unsigned char>(s)))
 {
  ...
 }
}
こうすべきとのことですが、これは
const char str[] = "abc123";
for (char* s = str; *s != '\0'; s++)
{
 if (isalpha(s))
 {
  ...
 }
}
の用にキャストを外すと動かないことがあるということでしょうか?
"abc123"のように、内容全てがASCII文字であってもだめなのでしょうか?

よろしくお願い申し上げます。



416 名前:デフォルトの名無しさん mailto:sage [2010/02/27(土) 19:46:07 ]
>通常は問題ないのですが、多バイト文字を含む文字列の各要素を順に is 系関数で調べる場合などは、

417 名前:デフォルトの名無しさん mailto:sage [2010/02/27(土) 20:04:49 ]
>>416
多バイト文字を含む文字列の各要素も
isalphaでアルファベットかどうかを調べることが可能と言うことでしょうか?

たとえば
"あいうえおabcd"
のような全角文字でもできるのでしょうか?

418 名前:デフォルトの名無しさん mailto:sage [2010/02/27(土) 20:10:47 ]
その記事も含めてそんなことをいってる奴は居ない

419 名前:デフォルトの名無しさん mailto:sage [2010/02/27(土) 20:11:28 ]
> is 系関数に実引数として渡すことができる値は、0 〜 UCHAR_MAX または EOF だけです

420 名前:デフォルトの名無しさん mailto:sage [2010/02/27(土) 20:30:00 ]
ASCIIだけなら問題ないんじゃない?
他の文字コード入ってたら知らんけど



421 名前:デフォルトの名無しさん mailto:sage [2010/02/27(土) 20:58:27 ]
"abc123"は多バイト文字を含む文字列ではありませんよね。
では多バイト文字を含む文字列の各要素を順に is 系関数で調べる場合など
とは、具体的にはどんな文字列のことなのでしょうか?



422 名前:デフォルトの名無しさん mailto:sage [2010/02/27(土) 21:17:37 ]
sjisとかunicodeとか。
isalphaのかわりに_ismbcalphaやiswalphaで調べられる。

423 名前:デフォルトの名無しさん mailto:sage [2010/02/27(土) 21:22:38 ]
3の倍数のときだけ多バイトな文字列の例.
"123456789"


424 名前:デフォルトの名無しさん mailto:sage [2010/02/27(土) 21:39:22 ]
それスゲー迷惑だけどオッサンが漢字キーを駆使しながら頑張って作ったものだと想像するに少し許せる
正規表現置換とかだったら死刑

425 名前:デフォルトの名無しさん mailto:sage [2010/02/27(土) 23:14:54 ]
文字コードって訳わかんない
ひとつに絞って他のコードは国際法で規制しろよ

426 名前:デフォルトの名無しさん mailto:sage [2010/02/27(土) 23:43:28 ]
>>425
トロンコード最強ってことで。くっくっく。

427 名前:デフォルトの名無しさん mailto:sage [2010/02/28(日) 00:29:23 ]
>>415
isalpha()に「0〜UCHAR_MAX または EOF 以外の値」が渡された時の動作は未定義
ということはわかっているのかね。きじねこは不可解な動作やらクラッシュという表現をしてるが

例えばstrにSJIS全角文字「A」(コード0x8260)を含んでいたとして(str="Aabc123"とか)
forループ内でisaplha()に、0x82、0x60と渡されていくことになるが、
例えばcharが符号付きでint型が32ビットの処理系だと0x82→0xffffff82と
符号拡張で変換されるから「0〜UCHAR_MAX または EOF 以外の値」となって未定義となる
unsigned charにキャストしとけば「0〜UCHAR_MAX または EOF」には納まる

このきじねこの記事雑だな
constや*忘れてる

428 名前:415 mailto:sage [2010/02/28(日) 00:34:56 ]
>>422
>>423
>>427
解説ありがとうございます。
そう言った意味なんですね。


429 名前:デフォルトの名無しさん mailto:sage [2010/02/28(日) 18:15:24 ]
hoge *p = new hoge;

my::smp q(new hoge); // ok
my::smp r(p); // no!

上の初期化法だけを許可したいんだけど、方法はある?
つまりテンポラリなポインタだけを受け取れるような方法
C++0xだと右辺値参照というのがあるからできるらしいのだけど・・・
今ではまだメタプログラミングを駆使しても不可能かな?

430 名前:デフォルトの名無しさん mailto:sage [2010/02/28(日) 18:20:41 ]
無理。my::smpのコンストラクタ内でnew hogeを実行するようにすれば近いことはできるんじゃない?
引数付きのコンストラクタも考えると現実的でないが



431 名前:デフォルトの名無しさん mailto:sage [2010/02/28(日) 19:01:30 ]
>>430
thx
コピーコストが気になるけどその方向で考えてみますわ

432 名前:デフォルトの名無しさん mailto:sage [2010/02/28(日) 21:10:12 ]
boostにそんなのがあった気が

433 名前:デフォルトの名無しさん [2010/02/28(日) 23:34:24 ]
テンプレートクラスについてお聞きします。
テンプレートクラスは、ヘッダファイル内に関数の実装の定義も書きますよね?
もしテンプレートの特殊化をした場合は、cppファイルに書いていいものなのでしょうか?

たとえば、テンプレートパラメータにbool値をとるクラスを定義したとして、
関数の実装をヘッダファイルに書かず、
テンプレートパラメータがtrueのときの処理と、falseのときの処理を
それぞれcppファイル側に書いてもいいものでしょうか?
(そのようなクラス設計がいいかどうかは別として・・・)

434 名前:デフォルトの名無しさん mailto:sage [2010/02/28(日) 23:36:04 ]
>>433
まずいだろう
他のファイルからもそのヘッダファイルを参照していたらどうなる?

435 名前:デフォルトの名無しさん mailto:sage [2010/02/28(日) 23:50:58 ]
>>433
いいよ

template<bool A>
struct X
{
void f() {}
};

template<>
struct X<true>
{
void f();
};

とヘッダーに書いて

void X<true>::f(){}

を別のコンパイル単位に書くのはOK。
bool が typename でも同じ

436 名前:デフォルトの名無しさん [2010/02/28(日) 23:51:44 ]
クラス設計に関して質問です。

Waveファイルの入出力に関するクラスと、再生に関するクラスの2つを作ったとします。

実際waveファイルを入力して、再生するというプログラムを書く場合オブジェクトを何にしたらいいでしょうか?
オブジェクト指向がよくわかっていなくて・・・

437 名前:デフォルトの名無しさん mailto:sage [2010/02/28(日) 23:59:35 ]
// ヘッダファイル
template<bool B>
struct hoge
{
hoge();
};
// ソースファイル
template<>
hoge<true>::hoge() {}

template<>
hoge<false>::hoge() {}

これで問題ないね

438 名前:433 [2010/03/01(月) 00:18:10 ]
>>435
>>437
ありがとうございました!

439 名前:デフォルトの名無しさん mailto:sage [2010/03/01(月) 00:45:56 ]
>>436
WaveIO obj = new WaveIO(filePath);
Player obj2 = new Player();
obj2.Play(obj);
とかってなるんでないの

440 名前:デフォルトの名無しさん mailto:sage [2010/03/01(月) 02:23:03 ]
マルチスレッドキューありますか。
自作しようして無理だった。



441 名前:デフォルトの名無しさん mailto:sage [2010/03/01(月) 05:44:38 ]
>>432
make_sharedだな。TR1にもC++0xにもある。

>>440
Intel TBBになんかあったはず。

442 名前:デフォルトの名無しさん mailto:sage [2010/03/03(水) 00:34:04 ]
クラスのメンバ関数とそのconst関数の共通化をしようとして失敗しています。
以下のコードでは [ ]演算子のオーバーロードがその例です。
どうしたら理想([ ]によるメンバ変数arrayの中身変更)的な動作になるでしょうか?
codepad.org/9YXChfJT

443 名前:デフォルトの名無しさん mailto:sage [2010/03/03(水) 00:56:27 ]
高校1年の春、2年生に進級する直前のできごとでした。
僕は難関、最初の壁と名高いポインタにぶつかりました。
ポインタ・・・彼は僕を苦しめました
存在が意味不明でした。

『本当に必要なのか?
いつ、使うの?君はなんなんだい?』

僕は寝ることをやめて飲まず食わず
1週間、ずっとポインタを見つめた結果
理解できませんでした・・
そのときの挫折はまさに、絶望でした。
自分の理解力の無さと頭の悪さに怒りを覚え
その怒りはそのうちに悲しみにかわり
僕は1ヶ月、眠れませんでした。


444 名前:デフォルトの名無しさん mailto:sage [2010/03/03(水) 01:11:16 ]
>>442
× return const_cast<double&>( static_cast<const Test>(*this)[pos] );
○ return const_cast<double&>( static_cast<const Test&>(*this)[pos] );

445 名前:デフォルトの名無しさん mailto:sage [2010/03/03(水) 01:14:32 ]
そんな僕がまたプログラマ目指そうと思ったのですが
どう思います?

446 名前:デフォルトの名無しさん mailto:sage [2010/03/03(水) 01:17:12 ]
>>445
好きにすればいい。分からない事があったらここに書き込めば俺は答える。

447 名前:デフォルトの名無しさん mailto:sage [2010/03/03(水) 02:35:19 ]
>>444
ありがとうございます。

<間違い> return const_cast<double&>( static_cast<const Test>(*this)[pos] );
は、static_cast<const Test>(*this) で *this の中身をコピーした const Test型 のオブジェクトを生成し、
その生成されたオブジェクトに [pos] でアクセスしている。
だから、実際には *this の中身にアクセスできていない。

という解釈で良いでしょうか?

448 名前:デフォルトの名無しさん mailto:sage [2010/03/03(水) 02:38:14 ]
>>442
こういうのも
return const_cast<double&>( static_cast<const Test*>(this)->operator[](pos) );

449 名前:デフォルトの名無しさん mailto:sage [2010/03/03(水) 02:41:27 ]
>>447 そういうこと。

450 名前:442 mailto:sage [2010/03/03(水) 04:18:56 ]
>>448
>>449
ありがとうございます!



451 名前:デフォルトの名無しさん [2010/03/03(水) 07:50:18 ]
ツリーのクラス構造について質問です。
現在、以下のようなクラスを考えています。

class Base{}
class ParentBase : public Base { };
class Parent : public ParentBase { };
class ChildBase : public Base { };
class Child : public ChildBase { };

class ChildA : public Child {}
class ChildB : public Child {}
class ParentA : public Parent
{
public:
   ChildA childa;
   ChildB childb;
};
class ParentB : public Parent
{
 public:
   ParentA parenta;
};

Parentの派生クラスは、メンバ変数でChildだったり、Parentのオブジェクトの実体を保持します。(例:ParentA, B)

ここで、各Parentが保持するオブジェクトから、親オブジェクトへアクセスする方法はないでしょうか?
やりたいことは、ParentA::childaで、ParentAの関数を呼ぶ、ParentB::parentaで、ParentBの関数を呼ぶ、ということがしたいのです。

一番基底クラスのBaseクラスで、Baseクラスへのポインタ持たせてやろうと思ったのですが、そのポインタへの実体のセット方法がわからなくて、迷ってしまいました。

何かいい方法はないでしょうか?

452 名前:デフォルトの名無しさん mailto:sage [2010/03/03(水) 11:04:37 ]
ポインタを理解したのは、確かポインタ渡し、参照渡し、値渡しの違いを知ったときだった憶えがある

453 名前:デフォルトの名無しさん mailto:sage [2010/03/03(水) 11:15:38 ]
>>451
コンストラクタで渡すなりセットするメンバ関数を作るなり public にして設定するなり、
いろいろあるだろ。何が気に入らないんだ?

454 名前:デフォルトの名無しさん mailto:sage [2010/03/03(水) 11:27:28 ]
struct hoge: public unary_function<int,int> {
int operator(int);
};
的な関数オブジェクトを
g++ -Weffc++ hoge.cpp
でコンパイルした場合、
warning: base class struct std::unary_function<int, int> has a non-virtual destructor
というエラーがどうしても出るのですが、
ライブラリの責任であってユーザ側からは対応しようがない、
というので正しいでしょうか?

455 名前:デフォルトの名無しさん mailto:sage [2010/03/03(水) 11:41:08 ]
protected継承

456 名前:デフォルトの名無しさん mailto:sage [2010/03/03(水) 11:43:09 ]
>>454 ja.lmgtfy.com/?q=%22warning%3A+base+class%22+std%3A%3Aunary_function+%22has+a+non-virtual+destructor%22

457 名前:デフォルトの名無しさん mailto:sage [2010/03/03(水) 12:35:06 ]
>>456
要するにGCCがそうだと言ってるからそうだ、ということですね。
これに対するライブラリ実装者の答えが欲しいのですが・・・。

458 名前:デフォルトの名無しさん mailto:sage [2010/03/03(水) 12:38:09 ]
>>457 どうしてそうなったw

459 名前:デフォルトの名無しさん mailto:sage [2010/03/03(水) 12:42:54 ]
>>457
>456 のリンクをたどると、 >454 の警告に関する gcc の「バグ」報告に連れて行かれて、
その報告は今でも "NEW" として残っているんだが、何か違うものが見えるのかい?

460 名前:デフォルトの名無しさん mailto:sage [2010/03/03(水) 12:46:39 ]
そう読むのか。
コメントのほうを読んで誤解してしまいました・・・。
ありがとうございます。



461 名前:デフォルトの名無しさん mailto:sage [2010/03/03(水) 16:09:59 ]
>>454 が何を問題だと言っているのか判らない。
もしかして、Effective C++ 読まずに問題視してる?

462 名前:デフォルトの名無しさん mailto:sage [2010/03/03(水) 22:27:54 ]
調子に乗って struct を class みたいに使うのが悪いんじゃね?


463 名前:デフォルトの名無しさん mailto:sage [2010/03/03(水) 22:37:41 ]
どうせポリモルに扱わないんだからほっとけよ

464 名前:デフォルトの名無しさん [2010/03/03(水) 22:37:41 ]
>>454
どこに「エラー」って書いてあるんだよ
もしかしてエラーと警告を混同してるか?

465 名前:デフォルトの名無しさん mailto:sage [2010/03/03(水) 23:00:41 ]
C++のキャストって長ったらしくてあまり使わないんですが,
実際C++のキャストで助かった&Cのキャストではまった
経験をお持ちの方っていますか?


466 名前:デフォルトの名無しさん mailto:sage [2010/03/03(水) 23:08:51 ]
C++スタイルはデバッグで見つけやすい

467 名前:デフォルトの名無しさん mailto:sage [2010/03/03(水) 23:18:38 ]
>>465
キャストは奨励できないからC++のキャストは長い。
キャストにも色々な目的があるので種類がある。目的に合わない変換不可能なものにはエラーが出る。
あらゆる変換ができるCスタイルのキャストはバグを見つけにくいので使わないほうがいい。


468 名前:デフォルトの名無しさん mailto:sage [2010/03/03(水) 23:20:00 ]
long longな値をstd::fstreamに<<すると三桁区切りにcommaが入ってPCが爆発するんだけど
書式設定だとか弄ってcomma入れないような設定できなかったっけ?

469 名前:デフォルトの名無しさん mailto:sage [2010/03/03(水) 23:50:17 ]
>>465
意図しない、または、意図した以上のキャストをコンパイル時に発見できる

470 名前:デフォルトの名無しさん mailto:sage [2010/03/03(水) 23:59:55 ]
>>468
localeとfacet

thousands_sep()が返す値を確認するとよい



471 名前:デフォルトの名無しさん mailto:sage [2010/03/04(木) 00:28:37 ]
C++スタイルのキャストでコンパイルエラーがでる度に助かっているわけだ

472 名前:デフォルトの名無しさん mailto:sage [2010/03/04(木) 00:44:21 ]
>465
検索が簡単。

473 名前:デフォルトの名無しさん mailto:sage [2010/03/04(木) 05:25:49 ]
分かってても、警告がうざい&タイプが面倒だから、使ってしまう(int)キャスト

474 名前:デフォルトの名無しさん mailto:sage [2010/03/04(木) 06:50:49 ]
>>473 しね

475 名前:デフォルトの名無しさん mailto:sage [2010/03/04(木) 07:30:55 ]
dynamic_castの機能はCスタイルのキャストでは実現できない

476 名前:デフォルトの名無しさん mailto:sage [2010/03/04(木) 08:12:19 ]
キャストの多さは設計の不十分さを示す良い指標

477 名前:デフォルトの名無しさん mailto:sage [2010/03/04(木) 10:50:11 ]
dynamic_castはゆとり
const_castはバグ

478 名前:デフォルトの名無しさん mailto:sage [2010/03/04(木) 12:20:32 ]
stdの特殊化が許されてるのはswapだけですか?

479 名前:デフォルトの名無しさん mailto:sage [2010/03/04(木) 13:28:12 ]
ていうかstatic_castも暗黙的な変換ができないポインタ変換に対して使えちゃうだろ。
static_castは甘え

480 名前:デフォルトの名無しさん mailto:sage [2010/03/04(木) 13:33:06 ]
dynamic_castを使う設計てどっかミスってるはず
ダウンキャストするんだったら自前の仮想関数テーブル作れよって話しだ



481 名前:デフォルトの名無しさん mailto:sage [2010/03/04(木) 13:35:39 ]
いやdynamic_castでいいだろw

482 名前:デフォルトの名無しさん mailto:sage [2010/03/04(木) 13:37:38 ]
>>481
アップキャストした後にダウンキャストとかポリモーですらないじゃん

483 名前:デフォルトの名無しさん mailto:sage [2010/03/04(木) 13:40:39 ]
クロスキャストなんてboostにそれ専用のがあるだろ?

484 名前:デフォルトの名無しさん mailto:sage [2010/03/04(木) 13:43:24 ]
>>483
うるせーテーブル作らせろ

いやまじでダウンキャストとか使う場面なくね?
面倒だからやっちゃえとかならわかるんだが

485 名前:デフォルトの名無しさん mailto:sage [2010/03/04(木) 13:54:06 ]
同意
内部でdynamic_cast使ってるboostとか糞だよな

486 名前:デフォルトの名無しさん mailto:sage [2010/03/04(木) 14:14:02 ]
RTTI嫌ってるやつって厨二病みたいなもんだろ?

487 名前:デフォルトの名無しさん mailto:sage [2010/03/04(木) 14:32:25 ]
RTTIは遅くなるっていうけど、実際影響がどんなもんか分からん

488 名前:デフォルトの名無しさん mailto:sage [2010/03/04(木) 14:39:26 ]
RTTIで起きる速度低下の影響は自前で仮想関数テーブルを用意する場合と同じ。

489 名前:デフォルトの名無しさん mailto:sage [2010/03/04(木) 14:41:41 ]
見栄の問題なのか?w

490 名前:デフォルトの名無しさん mailto:sage [2010/03/04(木) 15:06:56 ]
>>489
見栄だよ
型名保持してポインタを型変換するだけだし
でも使ってない



491 名前:デフォルトの名無しさん mailto:sage [2010/03/04(木) 16:48:51 ]
C++ってゲームプログラミングに使える?

492 名前:デフォルトの名無しさん mailto:sage [2010/03/04(木) 16:56:09 ]
>>491
DirectX使えば、いろいろ綺麗に作れるぞ。

493 名前:デフォルトの名無しさん mailto:sage [2010/03/04(木) 18:18:44 ]
>>492
取り合えず勉強してみます
ありがとう!

494 名前:デフォルトの名無しさん mailto:sage [2010/03/04(木) 20:14:40 ]
キャストは結局のところ「正しくないかもしれないけど見逃してくれ」とコンパイラに指示している。
キャストが正しいことをプログラマーが保証しなければならない。
dynamic_cast(RTTI)もNULLが返る可能性も考えてプログラムを作らなければならない。
どんなにデバッグしても、キャストは客先でプログラムがクラッシュするかもしれない時限爆弾を抱えるようなものである。

暗黙の型変換や仮想関数であれば必ず正しい動作をすることがコンパイラが保証するので堅牢になる。
わずかな設計の見直しでリスクを減らせるんだからキャストは控えるのを勧める。


495 名前:デフォルトの名無しさん [2010/03/04(木) 20:22:37 ]
プログラムが正しいかどうかをコンパイラに丸投げする考えのほうがよっぽど危険だよ
第三者たるコンパイラが勘違いしそうな「本当は正しい」ところをマークするのがキャストだ

できちゃいけないキャストが通る理不尽な仕様は確かにあるが、それは
できることとしていいことの分別がつく人しか C++ を使うべきではないということだ

496 名前:デフォルトの名無しさん mailto:sage [2010/03/04(木) 20:31:50 ]
キャストは影響を局所化してさらに見えないように包めばいいじゃない

497 名前:デフォルトの名無しさん mailto:sage [2010/03/04(木) 20:35:09 ]
>>487
1万回ループさせて0.1秒差とかそんなもん

>>494
NULLが返る可能性を考えないのにdynamic_castを使うとか意味がわからん
そんなの参照と例外に狂ってるやつくらいだろ

498 名前:デフォルトの名無しさん mailto:sage [2010/03/04(木) 20:37:50 ]
暗黙の型変換でプログラムが堅牢になると聞いて

499 名前:デフォルトの名無しさん mailto:sage [2010/03/04(木) 20:37:59 ]
たった10000回で100msも差がでるのか。
100000000回で10msくらいでもまだ遅いのに

500 名前:デフォルトの名無しさん mailto:sage [2010/03/04(木) 20:42:30 ]
>>499
そんな見栄を張るなよw



501 名前:デフォルトの名無しさん mailto:sage [2010/03/04(木) 20:43:44 ]
>>478
swap以外もすべて明示的特殊化してよい。


502 名前:デフォルトの名無しさん mailto:sage [2010/03/04(木) 20:45:32 ]
暗黙の型変換で堅牢
ハハッ

503 名前:デフォルトの名無しさん mailto:sage [2010/03/04(木) 20:45:45 ]
>>500
ごめん・・・最近なにしても楽しくないし2chで見栄張る位しか生き甲斐がなくて・・・。
もう自衛隊に入るわ。最近政治がアレだし俺みたいなクズ人間は戦争で死んでも誰も悲しまないだろう。

504 名前:デフォルトの名無しさん mailto:sage [2010/03/04(木) 21:04:38 ]
>>503
自衛隊がお断りだ

505 名前:デフォルトの名無しさん mailto:sage [2010/03/04(木) 21:19:52 ]
>>504
もうニート生活はやだよ・・・

506 名前:デフォルトの名無しさん mailto:sage [2010/03/04(木) 23:01:18 ]
普通にstatic_castしか使わない = Cのキャストでおk

static_castでエラーが出るケースなんて,経験でわかるようになる程度じゃろ


507 名前:デフォルトの名無しさん mailto:sage [2010/03/04(木) 23:06:17 ]
>>506
> static_castでエラーが出るケースなんて,経験でわかるようになる程度じゃろ
いや、わからない人用にあるわけじゃないんだけど。


508 名前:デフォルトの名無しさん mailto:sage [2010/03/04(木) 23:09:06 ]
>>506
どんなに経験積んだって人間は間違えるから予防が必要なんだよ

509 名前:デフォルトの名無しさん mailto:sage [2010/03/04(木) 23:14:27 ]
構文が悪い

static_cast<int>(var)と(int)varじゃ
後者を使いたくなるのもわかる

510 名前:デフォルトの名無しさん mailto:sage [2010/03/04(木) 23:15:31 ]
>>506
よくないよ。
static_cast 継承関係に無い型をキャストしようとエラーになる
Cスタイルキャスト 継承関係に無い型をキャストしてもエラーにならない。





511 名前:デフォルトの名無しさん [2010/03/05(金) 00:31:20 ]
インディアン 嘘つかない

512 名前:デフォルトの名無しさん mailto:sage [2010/03/05(金) 00:46:24 ]
Cスタイルのキャストを残したビャーネが悪い

513 名前:デフォルトの名無しさん mailto:sage [2010/03/05(金) 01:00:33 ]
残すも何も互換性だから

514 名前:デフォルトの名無しさん mailto:sage [2010/03/05(金) 01:04:56 ]
じゃあ完全互換じゃなくしたビャーネはもっと悪い

515 名前:デフォルトの名無しさん mailto:sage [2010/03/05(金) 01:07:44 ]
CとC++って完全互換じゃないの?
extern C/C++ とかでなんとかなると思ってたんだけど
だれか反例教えちくり

516 名前:デフォルトの名無しさん mailto:sage [2010/03/05(金) 01:13:04 ]
100%の互換となることを目標としたことは一度もない、とプログラミング言語C++に書かれているよ

517 名前:デフォルトの名無しさん mailto:sage [2010/03/05(金) 01:26:17 ]
そうなのか,買って呼んでみるよ

518 名前:デフォルトの名無しさん mailto:sage [2010/03/05(金) 01:28:12 ]
>>515
www.google.co.jp/search?q=C+C%2B%2B+%E4%BA%92%E6%8F%9B%E6%80%A7
www.google.co.jp/search?q=C+C%2B%2B+compatibility

519 名前:デフォルトの名無しさん [2010/03/05(金) 01:30:15 ]
int class;
この時点から 100% じゃないしな

520 名前:デフォルトの名無しさん mailto:sage [2010/03/05(金) 01:31:10 ]
>>515
変数名に new とか関数名に delete とか、余裕で死ねる。



521 名前:デフォルトの名無しさん mailto:sage [2010/03/05(金) 01:31:25 ]
C89 でもちょこちょこ違うのに、C99 で決定的になったからな<非互換性。
ああ、すべての言語に複合リテラルがあればいいのに。

522 名前:デフォルトの名無しさん [2010/03/05(金) 01:47:46 ]
>>521
残念ながら C++ は C89 ではなく K&R C から派生した言語なので
C++ が C89 に対して互換性がないのではなく、
C89 が C++ に対して互換性がないんだよ

C++ 側に「捨てた罪」があるのは K&R C に対してだけなのが原則で
extern "C" などの後付け設定がこの原則の例外

523 名前:デフォルトの名無しさん mailto:sage [2010/03/05(金) 01:50:13 ]
>>522
> 残念ながら C++ は C89 ではなく K&R C から派生した言語なので
はつみみです

ソースある?

524 名前:デフォルトの名無しさん mailto:sage [2010/03/05(金) 01:51:49 ]
D&Eでございます。

525 名前:デフォルトの名無しさん mailto:sage [2010/03/05(金) 02:05:31 ]
それ、禿一人で作ってたころのはなしじゃねーの?
少なくとも ISO C++ が参照してる C は ISO C だし。

526 名前:デフォルトの名無しさん [2010/03/05(金) 02:07:38 ]
どのクラスからも呼び出すことの出来る変数はどのように宣言するのでしょうか?
staticやexternがあるみたいですが
いかんせんエラーが出ます。どうか教えてください

527 名前:デフォルトの名無しさん mailto:sage [2010/03/05(金) 02:08:00 ]
>>522
C++ の設計が K&R C から始まったとして、どうしてそれが
標準 C++ と標準 C との互換性の主従に関係するの?

528 名前:デフォルトの名無しさん mailto:sage [2010/03/05(金) 02:08:44 ]
>>526 ソースとエラーメッセージうp 長いなら >>6

529 名前:デフォルトの名無しさん [2010/03/05(金) 02:15:54 ]
>>528
長いんで省略した形で記述します。
たとえば
==================================
//○×.h
class Cabc : public **
{
省略
public:
//ここでグローバル変数を記述したい
static CString str;
//省略
}
/////////////////////////////////////
○X.cpp
//省略
str = _T("a");
//省略
/////////////////////////////////////

このstrの値を他のクラスで使いたい場合
CString buf;
buf = Cabc::str ;
のようにしてもダメなんでしょうか?
わかりにくくてごめんなさい
なにぶん初心者ですのでよろしくおねがいします


530 名前:デフォルトの名無しさん [2010/03/05(金) 02:17:13 ]
>>527
公式に「主従」なんかないだろう
俺は事の経緯から導かれる道義的な関係を指摘したまで



531 名前:デフォルトの名無しさん mailto:sage [2010/03/05(金) 02:22:40 ]
>>515
extern "C"はCとC++の間でグローバルな関数・変数がリンクできるようになるだけ。
構文の解釈が変わるなどといったことは起こらない。

互換でない例としてはvoid*から他のポインタ型の暗黙変換が可能か否かなど。

532 名前:デフォルトの名無しさん mailto:sage [2010/03/05(金) 02:31:53 ]
>>530
いや、導かれてないから。 >>522 の1行目が事実だとしても2行目以降は
あんたが勝手に言ってるだけでしょ。道義的関係とか意味わかんないし。
C89 が当時の標準化もされていなかった C++ と互換性がないとか、当たり前だし。

533 名前:デフォルトの名無しさん [2010/03/05(金) 02:36:39 ]
>>532
C89 の目玉が C++ からの逆輸入という事実もあるわな
当時の C++ が標準化がされていようがいまいが C89 はその道を選んだ
どっちが合わせるべき立場にあったかは明確であろう

534 名前:デフォルトの名無しさん [2010/03/05(金) 02:37:24 ]
今日は寝落ち

535 名前:デフォルトの名無しさん mailto:sage [2010/03/05(金) 02:45:27 ]
>>533
合わせるべき立場とか、無いから。それ、妄想だから。

その調子で「C++0x は C# に合わせるべき立場にいる」とか
「C++0x は D に合わせるべき立場にいる」言い出すやつが
いたとしたらどう思うよ?

あんたが C++ 大好きなのはわかったが、これはさすがに
言いすぎだろ。

536 名前:デフォルトの名無しさん mailto:sage [2010/03/05(金) 02:58:29 ]
先発のものが後発に合わせるわけにはいかないってだけのことだろ
C#がC++0xに対して互換性が無いのと一緒

537 名前:デフォルトの名無しさん mailto:sage [2010/03/05(金) 03:00:29 ]
long longや可変個引数マクロ、数学関数などC99からC++0xへ持ち込まれるものだってある。
初期化リストをC99の複合リテラルと互換性のある構文にしようという提案が出たことだってあった。
CとC++は,お互いに影響を与えつつ受けつつという関係だと思うなぁ。

538 名前:デフォルトの名無しさん mailto:sage [2010/03/05(金) 03:04:36 ]
内部クラスではtemplateが使えないのでしょうか?
以下のようなコードとコンパイルエラーが出ます。


gcc version 4.4.1 (Ubuntu 4.4.1-4ubuntu9)
test0.cpp: In function ‘void func()’:
test0.cpp:14: error: expected primary-expression before ‘template’
test0.cpp:14: error: expected ‘;’ before ‘template’
test0.cpp:30: error: expected ‘}’ at end of input

12: void func()
13: {
14:  template<class T>
15:  class Hoge{
16:   public:
17:    static void foo( const T& val ){
18:     cout << val << endl;
19:    }
20:  };
21:
22:  Hoge::foo();
23: }


539 名前:デフォルトの名無しさん mailto:sage [2010/03/05(金) 03:24:35 ]
使えない。

540 名前:デフォルトの名無しさん mailto:sage [2010/03/05(金) 06:03:48 ]
>>529
> わかりにくくてごめんなさい
わかりにくいのは、エラーが何なのかをキミが隠しているからだ。
人生相談コーナーに「とある良くないことが起きました。どうすればいいですか?」とだけ書いて
送っても、「まぁ、気を落とさずに」みたいな曖昧なアドバイスしか来ないぞ。



541 名前:デフォルトの名無しさん mailto:sage [2010/03/05(金) 06:57:39 ]
>>529
.cppのstrって何者?

542 名前:デフォルトの名無しさん [2010/03/05(金) 07:37:28 ]
>>540
えっと、、そこまで難しいことではないんです
ただ、たとえばどんなクラスからでも使えるCStringの変数が欲しいわけ
でそういうのはどうするのか?という質問なんです。

543 名前:デフォルトの名無しさん [2010/03/05(金) 07:39:41 ]
>>541
ヘッダで宣言したCStringのつもりです。
このstrをどんなクラスからでも参照可能にするにはどうしたらいいのでしょうか?
とても困っています
よろしくお願いします

544 名前:デフォルトの名無しさん mailto:sage [2010/03/05(金) 07:42:25 ]
ここまで頑としてエラーを書かないのは何でだろうね。
クイズの出題者気取り?

545 名前:デフォルトの名無しさん mailto:sage [2010/03/05(金) 07:44:23 ]
静的メンバ変数でググれ

546 名前:デフォルトの名無しさん [2010/03/05(金) 07:50:13 ]
>>544
エラーは
LicenselistViewerList.obj : error LNK2001: 外部シンボル
""public: static class ATL::CStringT<char,class StrTraitMFC_DLL<char,class
ATL::ChTraitsCRT<char> > > CLicenselistViewerList::strrr" (?strrr@CLicenselistViewerList@@2V?$CStringT@DV?$StrTraitMFC_DLL@DV?$ChTraitsCRT@D@ATL@@@@@ATL@@A)" は未解決です。

です。
俺はただこの問題が解決してほしいだけなのでクイズとかそんなんではないです
本当に困っています

547 名前:デフォルトの名無しさん [2010/03/05(金) 07:51:54 ]
>>545
ググって解決できないから頼んでます。
静的メンバ変数だとこのやりかたで宣言したstrは
Cabc::strで外の変数を使えるとあります。
使えません
どうしてでしょうか?

548 名前:デフォルトの名無しさん mailto:sage [2010/03/05(金) 08:03:30 ]
宣言はあってる
定義の仕方が悪い

549 名前:デフォルトの名無しさん mailto:sage [2010/03/05(金) 08:08:19 ]
>>546
エラーメッセージは開発者がなにをすべきか直ぐ分かるようにするために出力してるんだぜ

class名::str;
を.cppの先頭付近にでも書いとけ

550 名前:デフォルトの名無しさん mailto:sage [2010/03/05(金) 11:48:45 ]
>>546
> strrr
"r" 増えてね?



551 名前:デフォルトの名無しさん mailto:sage [2010/03/05(金) 11:52:05 ]
デュラララみたいな

552 名前:デフォルトの名無しさん mailto:sage [2010/03/05(金) 13:23:56 ]
>>546
static CString CLicenselistViewerList::strrrという静的メンバ変数の
実体の定義が見つからないのでリンクできないというエラー

静的メンバ変数はヘッダで宣言のみではダメで実体の定義
CString CLicenselistViewerList::strrr;
を.cppファイルに記述する必要がある

553 名前:デフォルトの名無しさん [2010/03/05(金) 14:19:52 ]
あのー
*x1 += a;
ってどういう演算するんですか?

554 名前:デフォルトの名無しさん mailto:sage [2010/03/05(金) 14:21:33 ]
>>553
x1 の指すオブジェクトに a を加えるっぽい。

これ以上は x1, a の型を明らかにしないとわからん。

555 名前:デフォルトの名無しさん [2010/03/05(金) 14:28:19 ]
っへー!!
てっきり、num1 = a + *x1;
とかで何か用意しないとこのaと *x1の合計は作れないものだと思ってました!
てことは -=で引き算出来るんですか?
ホンマ助かりました。今ポインターの勉強してるんです。

ちなみに問題は最初に点数を指定させて、加算点を入力させるというものです。
やさしいc++第3版 著高橋 をやっていました。回答例に出てきていたので
なんぞこれってかんじでした

556 名前:デフォルトの名無しさん mailto:sage [2010/03/05(金) 14:30:03 ]
引き算できるよ。*=,/=もあるし&=,|=,>>=みたいなのもある

557 名前:デフォルトの名無しさん [2010/03/05(金) 14:31:29 ]
人の顔のAA二ミエマス。
ホントに貴方紳士ですね!また質問に着ます!
有り難うございました

558 名前:デフォルトの名無しさん mailto:sage [2010/03/05(金) 14:41:48 ]
>>557 名無しさんが一人だとでも思ってるのか?

559 名前:デフォルトの名無しさん mailto:sage [2010/03/05(金) 15:29:43 ]
環境:WindowsXP、VS2008 Express Edition

知っている方がいましたら教えて下さい。
現在、GUIアプリの作成を行っているのですが、
(Windowsフォームアプリケーション開発)
一つ分からない事があります。
下のURLにあるようなTreeViewが欲しいのですが(ページの上の方にあるやつです)、
www.codeguru.com/cpp/controls/treeview/multiview/article.php/c3985

どうやって実現するのでしょうか?
ツールボックスを見ても、TreeViewはあるのですが、
上記のようなTreeView+Columnというのがどこにあるのか分からなくて・・・。



560 名前:デフォルトの名無しさん mailto:sage [2010/03/05(金) 15:48:23 ]
こっちで訊くのがいいと思う
pc12.2ch.net/test/read.cgi/tech/1259076828/



561 名前:デフォルトの名無しさん mailto:sage [2010/03/05(金) 15:50:34 ]
>>560
誘導サンクス。

>>569は誘導先で聞いてみます。


562 名前:561 mailto:sage [2010/03/05(金) 15:51:16 ]
×>>569
>>559


563 名前:デフォルトの名無しさん mailto:sage [2010/03/05(金) 15:51:18 ]
struct a{ virtual ~a{} };
struct b : a{ int array[8] };
//...
a *ptr = new b;
//...
delete ptr; //ptrはa*だけど実際に指しているのはヒープに配置されたbのインスタンス. sizeof(a) != sizeof(b)なのにこんな事してもいいの?

564 名前:デフォルトの名無しさん mailto:sage [2010/03/05(金) 15:57:40 ]
いいよ

565 名前:デフォルトの名無しさん mailto:sage [2010/03/05(金) 15:58:11 ]
全て分かった上で、話題作りで書き込んでる様に見えるんだが
そりゃ解体子が仮想だから

566 名前:デフォルトの名無しさん mailto:sage [2010/03/05(金) 16:15:07 ]
>>565
destructorがvirtualかどうかは関係ないでしょ?
>>563
newしたときのサイズがどこかにしまってあるから。

567 名前:デフォルトの名無しさん mailto:sage [2010/03/05(金) 16:22:33 ]
>>566
すまんが釣りに見える

568 名前:563 mailto:sage [2010/03/05(金) 16:30:00 ]
解体子っていうのはクラス内部のリソースを開放したりするためのもので、
自身がヒープに配置されていたり、それのメモリ管理は関係ないような認識でした。
事実、インスタンスがスタックに配置されていてもデストラクタは走ります。
これは、インスタンスのメモリ管理はインスタンスを抱えているスコープが管理するべきだという事です。
曖昧な理解が解消して助かりました。ありがとうございます。

569 名前:デフォルトの名無しさん mailto:sage [2010/03/05(金) 17:11:53 ]
Java厨は勉強熱心だなぁ
それにくらべてC++erは・・・

570 名前:デフォルトの名無しさん mailto:sage [2010/03/05(金) 17:17:57 ]
>>566
ちょっと焦ったわ
なわけねえだろw



571 名前:デフォルトの名無しさん mailto:sage [2010/03/05(金) 17:46:12 ]
JavaとC++の両刀使いの人っている?

572 名前:デフォルトの名無しさん mailto:sage [2010/03/05(金) 17:47:38 ]
ASもJSもPerlもRubyもEsolangも普通にやるがね

573 名前:デフォルトの名無しさん mailto:sage [2010/03/05(金) 18:54:59 ]
563は納得したのだろうか。
確保した領域の大きさについてだけ言えば566が正しいと思う。
確保した自由記憶領域の大きさはOS(システムコール)が記録している。
解放する時に大きさを知っている必要は無い。
p = malloc( N ) の後 free( p ) だけでいい(Nを指定する必要が無い)
のと同じ。
そういう意味では565は見当外れ。
まぁC++スレだし、そういうことを訊きたい訳じゃないんだろうけど

574 名前:デフォルトの名無しさん mailto:sage [2010/03/05(金) 18:58:27 ]
ポインタを整数サイズで-1して整数表現で取り出したらサイズだったなんてことはよくある事

575 名前:デフォルトの名無しさん mailto:sage [2010/03/05(金) 19:09:37 ]
上のシンプルな例ならともかく多重継承なら死にかねない

576 名前:デフォルトの名無しさん mailto:sage [2010/03/05(金) 19:58:38 ]
copy(vec.begin(),vec.end(),ostream_iterator<T>(cout,"#"));
だと最後にもセパレータが入って
1#2#3#
となってしまいますが、
1#2#3
がたいてい欲しいものだと思います。
whileの内で条件分岐させる以外にうまい方法知りませんか?

577 名前:デフォルトの名無しさん mailto:sage [2010/03/05(金) 20:20:28 ]
最後の一つ前までやればいいだけにみえる

578 名前:デフォルトの名無しさん mailto:sage [2010/03/05(金) 20:34:14 ]
>>577
--vec.end()
なんて怖すぎます!
・・・ブルブル。

579 名前:デフォルトの名無しさん mailto:sage [2010/03/05(金) 20:37:18 ]
ランダムアクセスイテレータならcontainer.end() - 1でいいだろ

580 名前:デフォルトの名無しさん mailto:sage [2010/03/05(金) 20:37:49 ]
怖くねーよカス



581 名前:デフォルトの名無しさん mailto:sage [2010/03/05(金) 20:42:41 ]
あれ、空のときに困ると思ったんだけど、
やってみたら大丈夫だった・・・?!

582 名前:デフォルトの名無しさん mailto:sage [2010/03/05(金) 20:44:05 ]
あ、わかった。
要素が一個だけのとき、何も出力されなくなる。

583 名前:デフォルトの名無しさん mailto:sage [2010/03/05(金) 20:46:19 ]
>たいてい欲しいものだと思います

いや別に。
上手いやり方か知らんが、自分で適当に
↓みたいな反復子を作るのは駄目なのか?
codepad.org/o3QbtQyC

584 名前:デフォルトの名無しさん mailto:sage [2010/03/05(金) 20:47:03 ]
いや、そもそもぜんぜんダメだ。
v=[3,4]
のとき、出力が
3#
ですよ。。。

585 名前:デフォルトの名無しさん mailto:sage [2010/03/05(金) 20:51:56 ]
>>583
やっぱそっちですか。
イテレータとかすぐに書けないけど・・・。
ありがとうございます。

586 名前:デフォルトの名無しさん mailto:sage [2010/03/05(金) 21:46:35 ]
>>585
楽してイテレーター書くならこんなのどうかな。
www.kmonos.net/alang/boost/classes/iterators.html


587 名前:デフォルトの名無しさん mailto:sage [2010/03/05(金) 21:59:38 ]
boostはホント何でもありますね・・・。
なるべく依存したくないけど。

>>583
理解できたので、ほとんどそのまま使いまわせそうです。
たいへん助かりました。

588 名前:デフォルトの名無しさん mailto:sage [2010/03/05(金) 22:04:19 ]
>>587
boostでテクニック勉強したら、自分でサブセットなライブラリを作れば依存しなくてすむんじゃないかな。


589 名前:デフォルトの名無しさん mailto:sage [2010/03/06(土) 00:54:10 ]
>>575 何のこと?

590 名前:デフォルトの名無しさん mailto:sage [2010/03/06(土) 07:16:34 ]
Hoge Hoge::getObj( ){
 return *this;
}

Hoge& Hoge::getObj( ){
 return *this;
}

return *this はそのままで戻り値の書き方次第(Hoge& or Hoge)で
参照返しとオブジェクトのコピー返しと変わってしまうというのに違和感を感じる。
上の2通りの違いを *this の部分でも書き示す方(例:参照返し→ @*this )が良かったのに、と思ってしまうのですが
どうですか?
(どうですか?、って言っても仕様だからどうかなる話ではないのですが)




591 名前:デフォルトの名無しさん mailto:sage [2010/03/06(土) 07:42:38 ]
それが気になる人は、それ以上に、関数を呼び出すほうも気になるだろうね。
int func1(const Hoge& h);
int func2(Hoge h);
Hoge hoge;
func1(hoge);
func2(hoge); // 同じ書き方

関数定義を書いている時は、すぐそこに戻り値の扱いが見えてる安心感があってまだいいけど、
関数呼び出しを書いている時は、関数の宣言or定義がよその何処かに書かれてる。
エディタ支援があるとはいえ、「遠くの何かを知ってなきゃいけない」感じがあって、より落ち着かないのでは。

592 名前:デフォルトの名無しさん mailto:sage [2010/03/06(土) 08:48:31 ]
constなら区別して呼び出せるけどね

void foo(int& a);
void foo(const int& a);

int a; //constではない
foo(const_cast<const int&>(a)); //ここはconst版を呼びたい


593 名前:デフォルトの名無しさん mailto:sage [2010/03/06(土) 10:22:01 ]
関数宣言見ただけじゃ参照かどうかわからなくて困るだろ
と思ったけど
int &a = @b;
みたいにしてほしいってことなのかな

594 名前:デフォルトの名無しさん mailto:sage [2010/03/06(土) 11:19:24 ]
constにするときはstatic_castでいいんじゃないか

595 名前:デフォルトの名無しさん mailto:sage [2010/03/06(土) 11:30:14 ]
そんなことよりint @sp = spnew int [10]; int $wp = wpnew sp;を組み込んでくれ

596 名前:デフォルトの名無しさん mailto:sage [2010/03/06(土) 11:31:26 ]
シンタックスシュガーは
もっと多くてもいい

597 名前:デフォルトの名無しさん mailto:sage [2010/03/06(土) 11:42:32 ]
オレサマプリプロセッサ作って好きに構文創作しれ

598 名前:デフォルトの名無しさん mailto:sage [2010/03/06(土) 13:55:16 ]
>>597
#define amigo friend;

愛用してます

599 名前:デフォルトの名無しさん mailto:sage [2010/03/06(土) 15:28:31 ]
フレンド程度に内面を洗いざらいさらしていいのか?

600 名前:デフォルトの名無しさん mailto:sage [2010/03/06(土) 15:34:29 ]
>>597
#define foreach BOOST_FOREACH




601 名前:デフォルトの名無しさん mailto:sage [2010/03/06(土) 15:37:34 ]
>>599
friendのおかげで、余計なpublicを作らずprivateで済ませられるんじゃないのか。


602 名前:デフォルトの名無しさん mailto:sage [2010/03/06(土) 15:40:05 ]
#define buddy friend;
じゃないの?

603 名前:デフォルトの名無しさん mailto:sage [2010/03/06(土) 15:42:12 ]
friendはクラステンプレート中にテンプレート関数を定義したい
時に、暗黙の型変換ができるように使っている。

Effective C++で紹介されていた内容。


604 名前:デフォルトの名無しさん mailto:sage [2010/03/06(土) 15:56:22 ]
>>598
ほらみろよく判って無い奴が調子に乗って暴れ出したじゃないか

605 名前:デフォルトの名無しさん mailto:sage [2010/03/06(土) 15:59:18 ]
そこは指摘せずにそっとしておく所だろ

606 名前:デフォルトの名無しさん mailto:sage [2010/03/06(土) 16:54:52 ]
abort() if (!p);

みたいに書けるようにはならんのか。


607 名前:デフォルトの名無しさん mailto:sage [2010/03/06(土) 17:25:45 ]
if (!p) abort() ; 

608 名前:デフォルトの名無しさん mailto:sage [2010/03/06(土) 17:35:50 ]
>>606
C++などのほかの言語なんかに手を出さず、一生perlを使い続けるべきだと思います。

609 名前:デフォルトの名無しさん mailto:sage [2010/03/06(土) 17:42:02 ]
perlではif文を後に書くのか?

610 名前:デフォルトの名無しさん mailto:sage [2010/03/06(土) 17:56:39 ]
>>596
言語の文法は最小限でライブラリで拡張できるほうがいい。



611 名前:598 mailto:sage [2010/03/06(土) 18:17:05 ]
すいません嘘です

612 名前:デフォルトの名無しさん mailto:sage [2010/03/06(土) 19:54:49 ]
abort() if(!p) else exit();
とか普通に書きたいんじゃないの?

613 名前:デフォルトの名無しさん mailto:sage [2010/03/06(土) 19:55:27 ]
>609
文修飾子という扱いで後ろにも置ける。

if(e) { func(); }
func() if e;

は OK だけど、

if(e) func();
{ func() } if e;

はできない。

614 名前:デフォルトの名無しさん [2010/03/06(土) 20:00:36 ]
>>613
2種類の書き方があるっていうか、そういうのって分りにくくないのかな?
後に書くということは
func(すっげー長い式なんたらかんたらどうのこうの) if e;
だと読むときifを読み落としそうだなあ。


615 名前:デフォルトの名無しさん mailto:sage [2010/03/06(土) 20:01:35 ]
ワケ分からんw

C++だと、func() ;も{ func() ; }も、ひとつのstatementなので、ものすごい違和感があるな。
{ func() ; } if e ;
ができないというのは、ものすごく違和感があるな。

616 名前:デフォルトの名無しさん mailto:sage [2010/03/06(土) 20:06:35 ]
struct A;
struct B{ B( A& ); }
A a(); // これとか
B b( A() ); //これが
関数宣言にみなされない書き方ないの?
A a;
B b( a );
とかじゃない方法で。

617 名前:デフォルトの名無しさん mailto:sage [2010/03/06(土) 20:09:39 ]
>>615
思うに。
{
すげーー長い文
なんたらかんたら
だらだらだらだら
}
if e;
って読むのに困るよね。
do{}while()でも読みにくいのね。

618 名前:デフォルトの名無しさん mailto:sage [2010/03/06(土) 20:22:06 ]
do... whileは、まだ、先頭にdoがあるから、「あ、これはdo... while文の始まりだな」と分かるわけで、
それほど読みにくいってほどでもないんじゃないかな。

619 名前:デフォルトの名無しさん mailto:sage [2010/03/06(土) 20:23:29 ]
>>616 ないよ。

620 名前:デフォルトの名無しさん mailto:sage [2010/03/06(土) 20:31:05 ]
func() if e; はシンタックスシュガーの一例か?

混乱の割にメリットは感じられない。




621 名前:デフォルトの名無しさん mailto:sage [2010/03/06(土) 20:51:51 ]
ループの先頭などで、
break if foo
continue if bar
とかするのは気持ちいい。

622 名前:デフォルトの名無しさん mailto:sage [2010/03/06(土) 21:14:57 ]
だから、perl以外の言語は触らずに
perlだけ使ってなよ。

623 名前:デフォルトの名無しさん mailto:sage [2010/03/06(土) 21:25:16 ]
        ハ,,ハ
       (*゚ω゚ )  >>622お断りします。Rubyも使います。
.       (=====)
      _(_⌒) )
    /\  `J  ̄ ̄\
     ̄ ̄ ̄ ̄| | ̄ ̄ ̄
            |
          / \
             ̄ ̄

624 名前:デフォルトの名無しさん mailto:sage [2010/03/06(土) 22:07:59 ]
perlで俺シンタックスシュガープリプロセッサ作ればいいんじゃね?


625 名前:デフォルトの名無しさん mailto:sage [2010/03/06(土) 22:18:21 ]
foreach(int x, std::make_pair(v.begin(), it))
みたいにカンマが含まれても大丈夫なマクロが欲しいです

626 名前:デフォルトの名無しさん mailto:sage [2010/03/06(土) 22:57:30 ]
>614
Perl には TMTOWTDI(There's More Than One Way To Do It:やり方は一つじゃない)という
スローガンがあってな。

>615
Perl では { } は block であって文じゃないんだ。

>620
if (e) func(); ができなくていちいち block 書くのが面倒という事なんだと思う。

627 名前:デフォルトの名無しさん mailto:sage [2010/03/06(土) 22:57:49 ]
>616
ttp://www.parashift.com/c++-faq-lite/ctors.html#faq-10.19

628 名前:デフォルトの名無しさん mailto:sage [2010/03/06(土) 23:36:34 ]
あの、ひとついいですか?
僕は現在高校2年生です。そんなぼくにもC++はマスター
できます?

629 名前:デフォルトの名無しさん mailto:sage [2010/03/06(土) 23:40:22 ]
それなりのことはできるようになりますがマスターはそう簡単にはできません

630 名前:デフォルトの名無しさん mailto:sage [2010/03/06(土) 23:46:51 ]
>>628
それはお前次第やろ



631 名前:デフォルトの名無しさん mailto:sage [2010/03/06(土) 23:55:49 ]
>>625
C99の__VA_ARGS__が、C++0xに入る。

632 名前:デフォルトの名無しさん mailto:sage [2010/03/07(日) 01:23:57 ]
double* darray = new double[0];
delete [] darray;

のようなことがプログラム中で起こるのですが、問題ありますか?

633 名前:デフォルトの名無しさん mailto:sage [2010/03/07(日) 01:25:45 ]
>>632 いいえ。何が心配?

634 名前:デフォルトの名無しさん mailto:sage [2010/03/07(日) 01:35:02 ]
サイズ0だと続けて次に確保したときに、おんなじ場所を確保しちゃうような気がする
ダミーで1byteぐらい確保されんのかな

635 名前:デフォルトの名無しさん mailto:sage [2010/03/07(日) 01:37:05 ]
>>634
ヌルを返したり他のオブジェクトと同じアドレスを返したりしちゃいけないことになってるから、
だいたいの実装がそんな感じ。

636 名前:デフォルトの名無しさん mailto:sage [2010/03/07(日) 02:15:18 ]
0バイトのオブジェクトは存在できないから標準に従えば1バイト以上確保することになる
だがdarray[0]にアクセスすると未定義動作
変なの

637 名前:デフォルトの名無しさん mailto:sage [2010/03/07(日) 02:27:16 ]
void *operator new (std::size_t size)
{
if(size == 0) throw std::bad_alloc("Fack you!"); return std::malloc(size);
}

638 名前:デフォルトの名無しさん mailto:sage [2010/03/07(日) 02:35:06 ]
error: no matching function for call to 'std::bad_alloc::bad_alloc(const char [10])'

639 名前:デフォルトの名無しさん mailto:sage [2010/03/07(日) 07:00:01 ]
"C++"で、依存関係を解決するためにインターフェイス指向な設計に取り入れるってこと多いかなぁ?
テンプレートではなく、仮想関数を使う方法で。

640 名前:デフォルトの名無しさん mailto:sage [2010/03/07(日) 07:00:33 ]
s/設計に/設計を/



641 名前:デフォルトの名無しさん mailto:sage [2010/03/07(日) 07:09:36 ]
>>639
あると思うよ。
今の時代だとクリティカルな部分さえ最適化できればいいから動的型付けに対してそんなに神経質になる必要も無い。
ソフトウェア工学から見たある程度の規模からの開発のし易さや動的な依存関係の解決には仮想関数が向いているし
テンプレートを用いた静的な型レベルの解決なら実行速度に対する最適化が向いている。
臨機応変に適材適所できるからC++が選ばれる、何てこともあるね。
強い動的型付けな言語(Rubyとか)になっちゃうと融通が利かないし。
でもRubyとかを採用する現場では速度低下の弊害より人材のコスト考えてる場合ばおおいね

642 名前:デフォルトの名無しさん mailto:sage [2010/03/07(日) 08:52:23 ]
>>639
俺はよく使ってる。
継承を使う時は、純粋仮想関数のみで構成されたクラスの継承がほとんど。

テンプレートを依存関係を解決するために使うのは、本当にテンプレートが効果的かよく考えてやった方がいいと思う。

643 名前:デフォルトの名無しさん mailto:sage [2010/03/07(日) 09:44:55 ]
>>634
コンストラクタで malloc() を呼ぶと
malloc(0) でも8バイトぐらいは確保される。

ここらへんは Cライブラリの実装次第だが、
あとで realloc()/free() に渡す可能性があるポインタということを
考えると0バイトであってもユニークなポインタが返されるべき。


644 名前:デフォルトの名無しさん mailto:sage [2010/03/07(日) 10:48:18 ]
templateを使った依存関係の解決ってどういうの?

645 名前:デフォルトの名無しさん mailto:sage [2010/03/07(日) 12:20:35 ]
>>644
class Hoge {
void foo() { fuga_.(this); }
Fuga<Hoge> fuga_;
}
俺はこんなのを想像した。これは相互参照か?

単に特定のクラスに依存したら拡張性がなくなるから、テンプレート引数で指定できるようにしたいという事かもしれない。

646 名前:645 mailto:sage [2010/03/07(日) 12:22:14 ]
2行目訂正
void foo() { fuga_.bar(this); }

647 名前:デフォルトの名無しさん mailto:sage [2010/03/07(日) 12:30:42 ]
こういうのを相互参照って言うんじゃないか
class b;

class a
{
b* bb;
};

class b
{
a* aa;
};


648 名前:デフォルトの名無しさん mailto:sage [2010/03/07(日) 12:59:32 ]
多態性を持ちつつどこかに保存しなければならない場合にはインターフェース(か、型消去)を使うかな
でも保存する必要が無い関数の引数とかだったらテンプレートの方がいいと思う
例えば標準のアルゴリズムをテンプレートじゃなくてインターフェースで解決しようとしたら結構めんどくさいだろう
std::random_access_iterator_interfaceみたいなのが沢山作られて、それを適切に継承してないイテレータは対応アルゴリズムが使えない
みたいな感じで、行儀はいいんだけど、すごいめんどくさくなる

649 名前:デフォルトの名無しさん mailto:sage [2010/03/07(日) 16:00:23 ]
理想的には継承と多相は独立した概念なんでしょうね。
要求される振る舞いが出来ることを保証する仕組みの一つが
継承であるだけで。

650 名前:デフォルトの名無しさん mailto:sage [2010/03/07(日) 16:10:37 ]
いわゆるダックタイピング



651 名前:デフォルトの名無しさん mailto:sage [2010/03/07(日) 16:40:10 ]
>>649
多相を実現する手段の一つが継承


652 名前:デフォルトの名無しさん mailto:sage [2010/03/07(日) 18:35:47 ]
ダックタイピングはコンセプトがあればなぁ

653 名前:デフォルトの名無しさん mailto:sage [2010/03/07(日) 18:50:34 ]
せめてコンパイラのエラーメッセージがわかりやすくなれば

654 名前:デフォルトの名無しさん mailto:sage [2010/03/07(日) 23:48:11 ]
スマポのお勉強してるんですが
キャストってどうやって実装してるんでしょうか?

class hoge : public fuga;
void test(const oreore::unique_ptr<fuga> &p);
oreore::unique_ptr<hoge> p(new hoge);
test(p);

といった感じの使い方を許可したいんですがどうにもうまくいきません
所有権の移動を禁止する方針で作っている(コピー代入を封印)のでキャストするときにテンポラリな値を返せません

template <class Other> oreore::unique_ptr<Other> (void)
{
return oreore::unique_ptr<Other>(*this); // 禁止されてる
}

655 名前:デフォルトの名無しさん mailto:sage [2010/03/08(月) 00:10:08 ]
>>654 std::move するんだよ。

656 名前:デフォルトの名無しさん mailto:sage [2010/03/08(月) 03:22:13 ]
>>654
C++0xなら、rvalue referenceが使える。

それ以前のC++では、一応、auto_ptrを実装できるぐらいの方法はあるが、
そのテクニックを学ぶことは、精神衛生上よろしくないので、おすすめしない。

657 名前:デフォルトの名無しさん [2010/03/08(月) 04:21:56 ]
>>654
コピー代入を封じるなら無理。
キャストは、元オブジェクトからキャスト先オブジェクトという作るという点では、複製に等しいため。

それこそ>>655の言うように所有権の移動を許可する方向でやるしかない。
(もちろん所有権が移る以上、本来のキャストとは若干異なるセマンティクスになる)

658 名前:デフォルトの名無しさん mailto:sage [2010/03/08(月) 07:36:01 ]
const_cast ってconstはずしだから <> の中に型書くの無駄だなぁって思ってしまう。
const int* からconstとったら int* に決まってんじゃん、と。

659 名前:デフォルトの名無しさん mailto:sage [2010/03/08(月) 08:09:18 ]
>>658
const_castがオマエの言うような機能だったとして、このコードはどうすればいいんだ?

int x = 0 ;
int const * const p = &x ;

const_cast(p) ;

さあどれだ?
const_cast<int * const>(p) ;
const_cast<int const * const>(p) ;
const_cast<int *>(p) ;



660 名前:デフォルトの名無しさん mailto:sage [2010/03/08(月) 11:12:58 ]
template<class vtype>
class Test
{
 public:
  Test( ){ }
  void func( );
};

のようなクラスのとき、
vtype が P と Test<P> (Pはプリミティブ型) とで呼び出す func( ) を変える方法はありますか?



661 名前:デフォルトの名無しさん mailto:sage [2010/03/08(月) 11:33:00 ]
特殊化すればいいよ

662 名前:660 mailto:sage [2010/03/08(月) 12:15:01 ]
>>661
このようにしたのですが、うまく行きません。。。

template<class vtype>
void Test<vtype>::func( )
{
 cout << "aaa" << endl;
}

template<class vtype>
void Test<Test<vtype> >::func( )
{
 cout << "bbb" << endl;
}


663 名前:デフォルトの名無しさん mailto:sage [2010/03/08(月) 12:22:01 ]
>>662
codepad.org/isjE5LKn

664 名前:660 mailto:sage [2010/03/08(月) 12:39:43 ]
>>663
ありがとうございます。
クラスレベルで特殊化してしまうと、メンバ関数が沢山ある場合
同じようなコードが沢山生まれてしまうので
関数部分だけ特殊化できれば、と思ったのですが
クラスのところで特殊化しなきゃダメなのですね。



665 名前:デフォルトの名無しさん mailto:sage [2010/03/08(月) 12:40:57 ]
>>664
codepad.org/QzjNzjhA

666 名前:660 mailto:sage [2010/03/08(月) 12:52:05 ]
>>665
テンプレートと継承の組み合わせというのは考えられませんでした。
ありがとうございます。


667 名前:デフォルトの名無しさん mailto:sage [2010/03/08(月) 13:41:10 ]
>>655-657
サンクスです
キャスト≒複製って知りませんでした
時期標準のソースをチラ見したところ標準もキャストはサポートされてなかったので、uniqueの方はキャスト諦めることにしました

668 名前:デフォルトの名無しさん mailto:sage [2010/03/08(月) 15:54:42 ]
構造体のメンバ変数を一括で代入する方法ってないんですか?
例えば構造体Aの変数のメンバ変数を全て0にするとか…

669 名前:デフォルトの名無しさん mailto:sage [2010/03/08(月) 16:26:02 ]
struct S { int a, b, c; double x, y, z; static S empty; };
S S::empty = { 0 };

S var;
var = S::empty;

670 名前:デフォルトの名無しさん mailto:sage [2010/03/08(月) 17:44:32 ]
サンクス。クラス使わないとダメなんすか?



671 名前:デフォルトの名無しさん mailto:sage [2010/03/08(月) 18:03:45 ]
pod作る関数を作ればいい。テンプレートで

672 名前:デフォルトの名無しさん mailto:sage [2010/03/08(月) 18:05:33 ]
struct S { int a, b, c; double x, y, z;};
S a={0};
これで事足りるんじゃ

673 名前:デフォルトの名無しさん mailto:sage [2010/03/08(月) 18:14:12 ]
>>672 それは代入じゃない。

674 名前:デフォルトの名無しさん mailto:sage [2010/03/08(月) 18:17:26 ]
あーざっす

675 名前:デフォルトの名無しさん mailto:sage [2010/03/08(月) 18:17:34 ]
初期化だ(キリッ

676 名前:デフォルトの名無しさん mailto:sage [2010/03/08(月) 19:48:52 ]
>>659
const_cast<int *>(p)だろ
他のconstが必要なら後で付ければいい
何があかんのですか

677 名前:デフォルトの名無しさん mailto:sage [2010/03/08(月) 20:22:05 ]
const const_iterator* it;
const_cast(it)

これはどうなるんだ?
const_iteratorはポインタかもしれないしクラスかもしれない

678 名前:デフォルトの名無しさん mailto:sage [2010/03/08(月) 20:35:48 ]
const_iteratorがconst Type*だった場合、
itの型はconst Type *constでconst_castするとconst Type*になる。
そうでない場合、const_castするとconst_iteratorになる。ただそれだけの話。

679 名前:デフォルトの名無しさん mailto:sage [2010/03/08(月) 20:43:53 ]
>>676
void const * const * const cpcpc = 0;
void ** pp = const_cast<void**>(cpcpc);
void const ** cpp = const_cast<void const**>(pp); // このcastはどうすんの?


680 名前:デフォルトの名無しさん mailto:sage [2010/03/08(月) 20:54:34 ]
>>678
>itの型はconst Type *constでconst_castするとconst Type*になる。
なんでType*じゃないんだ?>>676と矛盾しない?



681 名前:デフォルトの名無しさん mailto:sage [2010/03/08(月) 22:11:07 ]
std::complexのconj( )って何でメンバ関数ではなくグローバル関数なのですか?

682 名前:デフォルトの名無しさん mailto:sage [2010/03/08(月) 22:15:54 ]
無闇にメンバ関数にするとprivateにアクセス出来てしまうから、
privateにアクセスする必要のない関数は
メンバでもfriendでもない関数にするのが良いって
偉い人が言ってた

683 名前:681 mailto:sage [2010/03/08(月) 22:28:24 ]
>>682
ありがとうございます。

もし自分がcomplex作ったら、conj( )をメンバ関数にして
privateなデータを変更してしまうように実装しそうなのですが
これは良くないんですかね?

684 名前:デフォルトの名無しさん mailto:sage [2010/03/08(月) 22:34:42 ]
そもそも変更することがおかしいんじゃないかい。
メンバ変数にするにしてもconstにするべきだと思う。
共役複素数を求めるだけだよね?

685 名前:デフォルトの名無しさん mailto:sage [2010/03/08(月) 22:42:05 ]
むしろその程度の軽い型なら不変型にしちゃった方が

686 名前:681 mailto:sage [2010/03/08(月) 23:02:53 ]
>>684
イメージ的にはこんな感じです。

myComplex<double> mc0(2,2); // 2+2i
mc0.conj( ); // 2-2i

グローバル関数にするとコピーが発生してしまうので
良くないのかなぁ、と思ったのですが。

687 名前:デフォルトの名無しさん mailto:sage [2010/03/08(月) 23:14:08 ]
実測した訳じゃないが、
あまり効果なさそうな気はする。
コードを見やすくしたほうがいいんじゃないだろうか。

688 名前:デフォルトの名無しさん mailto:sage [2010/03/08(月) 23:28:29 ]
なんで配列はイニシャライザリストで初期化出来ないんですか?

689 名前:デフォルトの名無しさん mailto:sage [2010/03/08(月) 23:50:50 ]
C++0xにご期待ください

690 名前:デフォルトの名無しさん mailto:sage [2010/03/09(火) 01:16:28 ]
>>679
const増やすのはstatic_castでもreinterpret_castでも出来る
お好きな方で



691 名前:デフォルトの名無しさん mailto:sage [2010/03/09(火) 01:19:23 ]
>>690 キャスト無しで通っちゃうよ。

692 名前:デフォルトの名無しさん mailto:sage [2010/03/09(火) 01:28:37 ]
>>676
void f(void const* a[]); // const 一個付け忘れてるけど変更できない外部ライブラリ
void f(void* a[]); // 同上、ただし非 const データを対象とするオーバーロード

// ここから自前のコード
void g(void const* const a[])
{
f(const_cast(a)); // 上のオーバーロードに渡したいのに下のほうにいっちゃう
}

こわくね?

693 名前:デフォルトの名無しさん mailto:sage [2010/03/09(火) 02:23:22 ]
まあconst_cast使うなってのが基本だから
それを書きやすくするうえに他のキャストと違う形になる
省略記法なんて認められないと思われる

694 名前:デフォルトの名無しさん mailto:sage [2010/03/09(火) 07:04:10 ]
>>690-691
うちのVC++2008EEではconst_castかC style castでないと通らないんだけど、
なんかおかしいのかな。

695 名前:デフォルトの名無しさん mailto:sage [2010/03/09(火) 07:21:42 ]
どうせ<>書いてないとか

696 名前:デフォルトの名無しさん mailto:sage [2010/03/09(火) 07:26:55 ]
通らない
ttp://codepad.org/d4Wo3ozT

697 名前:デフォルトの名無しさん mailto:sage [2010/03/09(火) 07:48:53 ]
void ** const cpp = static_cast<void **>(pp);
えっ?

698 名前:デフォルトの名無しさん mailto:sage [2010/03/09(火) 07:49:47 ]
>>696
それは、規格の文面によって、明示的に禁止されている。
4.4 Qualification conversions [conv.qual]

なぜできないのかというと、それを用いることによって、const性に穴が生じるから。
規格のサンプルコードを、適当にコメントを補って引用すると、

int main() {
const char c = ’c’;
char* pc;
const char** pcc = &pc; // 仮に、これが許可されているとする
*pcc = &c;// ppcを介して、pcを変更している。
*pc = ’C’; // pcはconstでもないのに、constなはずのcを参照出来ているので、変更できる。
}

つまり、constなppcを介して、非constなpcを変更できてしまうので、
pcが、明示的なキャストもなしに、constなオブジェクトを参照することが可能になってしまう。

699 名前:デフォルトの名無しさん mailto:sage [2010/03/09(火) 07:57:03 ]
>>698
規格の参照までしていただいて、ありがとうございます。
参考になります。

ということで、これを踏まえて改めて>>679

700 名前:デフォルトの名無しさん mailto:sage [2010/03/09(火) 07:57:31 ]
ubuntu の gcc version 4.4.1 (Ubuntu 4.4.1-4ubuntu9)
環境で例外クラスの実装を見ようと思ったのですが
/usr/include/c++/4.4/stdexcept
に logic_error などの宣言はあるのに実装が書いてありません。
どのファイルを見たら良いでしょうか?



701 名前:デフォルトの名無しさん mailto:sage [2010/03/09(火) 08:07:03 ]
const_castの話してるやつはコテ着けるか
婉曲表現と皮肉をやめて直接主張しろ
何人かいて訳が分からない

702 名前:デフォルトの名無しさん mailto:sage [2010/03/09(火) 08:40:34 ]
はがす時は全はがしが楽じゃね?ってことが基点となっていると思うので

void const * const * const cpcpc = 0;
void ** pp = const_cast<>(cpcpc); // 全はがし
void const ** cpp = const_cast<void const**>(pp); // つける時は書く
// void const ** cpp = const_cast<void const**>(cpcpc); // 一部はがしのときもこれまで同様書ける

というのを望んでんのかも

703 名前:デフォルトの名無しさん mailto:sage [2010/03/09(火) 09:06:33 ]
がんばれ
658 :デフォルトの名無しさん :2010/03/08(月) 07:36:01
const_cast ってconstはずしだから <> の中に型書くの無駄だなぁって思ってしまう。
const int* からconstとったら int* に決まってんじゃん、と。

704 名前:デフォルトの名無しさん mailto:sage [2010/03/09(火) 14:09:06 ]
constの話で盛り上ってるからついでに聞きたいんだけど

struct X {
int *p;

void test(int x) const
{
*p = x;
}
};

こう書くとconst指定してるのにオブジェクトの内容が変化してる
これって合法なの?


705 名前:デフォルトの名無しさん mailto:sage [2010/03/09(火) 14:14:13 ]
>>704
Xのオブジェクトはpであることを思い出せ。
pはint*型だから「int型の値のあるメモリの位置」を指している。
*p = xは「pの指している先のint型の値に対する副作用」であって「pに対する副作用」ではない。

706 名前:デフォルトの名無しさん mailto:sage [2010/03/09(火) 15:34:24 ]
pは宝の地図
*pは宝の中身
Xのメンバはpつまり宝の地図
だからtest(int x) constとは宝の地図を書き換えちゃいけないってこと
*p = xは宝の中身を入れ替えているだけ

707 名前:デフォルトの名無しさん mailto:sage [2010/03/09(火) 15:39:05 ]
中々面白い例え方をするな。

708 名前:デフォルトの名無しさん mailto:sage [2010/03/09(火) 15:54:36 ]
**pは宝の地図の在り処を書いた地図か。判りやすいね。

709 名前:デフォルトの名無しさん mailto:sage [2010/03/09(火) 15:57:01 ]
ゲームのお使いクエストだな。
そのお宝の例えは俺は結構好きだな。

710 名前:デフォルトの名無しさん mailto:sage [2010/03/09(火) 16:19:18 ]
へー、いい表現じゃん



711 名前:デフォルトの名無しさん mailto:sage [2010/03/09(火) 16:23:11 ]
サンクス
正常な動作だったのね

712 名前:デフォルトの名無しさん mailto:sage [2010/03/09(火) 17:43:29 ]
new intは新しく宝を作るが、この式自体は新しく作られた宝のありかを示す地図を返す。
new int*は宝の地図を新しく作りその地図のありかを返す式だが、新しく作られた宝の地図には宝のありかは書いてない。
難しいな。

713 名前:デフォルトの名無しさん mailto:sage [2010/03/09(火) 19:38:02 ]
new int*なんてあんの? あるなら知らなかった。

714 名前:デフォルトの名無しさん mailto:sage [2010/03/09(火) 19:44:58 ]
型なら何でもnew出来るだろ

715 名前:デフォルトの名無しさん mailto:sage [2010/03/09(火) 19:46:35 ]
関数型もできるっけ?
関数ポインタじゃなくて。

716 名前:706 mailto:sage [2010/03/09(火) 21:01:33 ]
何の気無しに書いたんで、反応あって驚いてる。
>>706は、一番最初にポインタを勉強する時に俺が(たまたま)イメージしたもので、
今にして思うと、地図という「質量を持った物体」でポインタを喩えたのが好都合だった気がする。
たまたまそういうイメージをしたお陰で、ポインタもまた「そういう値」である、って所で
まったく混乱せずに済んだ。>>708が言うように、ポインタのポインタも
「勇者は宝箱を開けた。なんと宝の地図を見つけた!」ということだと考えれば楽だったし。

717 名前:デフォルトの名無しさん mailto:sage [2010/03/09(火) 22:24:46 ]
C++は勉強するほど自信がなくなっていくな・・・boostマジキチ

718 名前:デフォルトの名無しさん mailto:sage [2010/03/09(火) 23:10:15 ]
>>716
初心者には分かりやすい言い例えだね。
俺もそれ使わせてもらいます。


719 名前:デフォルトの名無しさん mailto:sage [2010/03/09(火) 23:24:34 ]
住所とか例えるより絶対わかりやすい。

720 名前:デフォルトの名無しさん mailto:sage [2010/03/09(火) 23:30:25 ]
>「勇者は宝箱を開けた。なんと宝の地図を見つけた!」

あるあるw



721 名前:デフォルトの名無しさん [2010/03/09(火) 23:38:31 ]
ポインタを宝箱に例えるなら、中身の種類は開ける前から判っているんだが

722 名前:デフォルトの名無しさん [2010/03/09(火) 23:38:54 ]
s/宝箱/宝箱の地図/

723 名前:デフォルトの名無しさん mailto:sage [2010/03/10(水) 00:06:18 ]
で?

724 名前:デフォルトの名無しさん mailto:sage [2010/03/10(水) 00:35:08 ]
ヌルポインタはミミックだな
開けると死ぬ

725 名前:デフォルトの名無しさん mailto:sage [2010/03/10(水) 01:44:47 ]
住所にたとえるのと変わらんと思うがね

726 名前:デフォルトの名無しさん mailto:sage [2010/03/10(水) 01:46:21 ]
ていうか別に喩えなくても分かるから

727 名前:デフォルトの名無しさん [2010/03/10(水) 01:46:56 ]
ミミックは固定ボスだから、地図が読めない奴が初見殺しされるだけだろ

728 名前:デフォルトの名無しさん mailto:sage [2010/03/10(水) 04:46:42 ]
minorという変数がプログラム中にありますが、
cstdlibをインクルードしたら以下のようなエラーが出るようになりました。

error: macro "minor" passed 2 arguments, but takes just 1

これは単純に、minorという変数名を使うな、という解釈でよいでしょうか?

729 名前:デフォルトの名無しさん mailto:sage [2010/03/10(水) 04:58:04 ]
>>728
どう読んだらそんな解釈になるんだよ。

そのエラーが再現する最小ソースを作ってみれ。

730 名前:728 mailto:sage [2010/03/10(水) 05:25:53 ]
>>729
言葉足らずでした。

上記のエラーは、
ctdlib の中(もしくはcstdlibがインクルードしているファイルの中)に
引数を1つとるminorというマクロ(?)があるから、
引数が2つある自作クラスのオブジェクト名をminorにしてはいけない
ということでしょうか?

以下ソース

#include <cstdlib>

class Hoge
{
 public:
  Hoge( int i, int j ){ }
};


int main(int argc, char* argv[])
{
 Hoge minor(1,1);

 return 0;
}




731 名前:デフォルトの名無しさん mailto:sage [2010/03/10(水) 05:36:58 ]
>>730
別に言葉足らずじゃない。>>729が寝ぼけてるだけ。
環境によってはsys/types.hにminorマクロがあるので使わない方がいい。

732 名前:デフォルトの名無しさん mailto:sage [2010/03/10(水) 05:43:19 ]
>>731
ありがとうございます。

733 名前:デフォルトの名無しさん mailto:sage [2010/03/10(水) 05:56:50 ]
>>730
手元の Cygwin g++ 4.3.4 では何事もなくコンパイルが通ったよ。

ちなみに >728 の環境(OS、コンパイラ、そのバージョン)は何?

734 名前:デフォルトの名無しさん mailto:sage [2010/03/10(水) 06:01:57 ]
>>731
cstdlib のインクルードでユーザーが使える名前がマクロ定義されてるのは
コンパイラのバグ(標準違反)だと言ってしまっていいと思うんだけど、そういう
予防しとかないといけないものなの?どっかの環境での常識?

735 名前:728 mailto:sage [2010/03/10(水) 06:04:13 ]
>>733
Ubuntu 9.10
gcc version 4.4.1

です。

gcc -v の内容全部貼ると
Using built-in specs.
Target: i486-linux-gnu
Configured with: ../src/configure -v
--with-pkgversion='Ubuntu 4.4.1-4ubuntu9'
--with-bugurl=file:///usr/share/doc/gcc-4.4/README.Bugs
--enable-languages=c,c++,fortran,objc,obj-c++ --prefix=/usr --enable-shared --enable-multiarch
--enable-linker-build-id --with-system-zlib --libexecdir=/usr/lib --without-included-gettext
--enable-threads=posix --with-gxx-include-dir=/usr/include/c++/4.4 --program-suffix=-4.4
--enable-nls --enable-clocale=gnu --enable-libstdcxx-debug --enable-objc-gc
--enable-targets=all --disable-werror --with-arch-32=i486 --with-tune=generic
--enable-checking=release --build=i486-linux-gnu --host=i486-linux-gnu
--target=i486-linux-gnu
Thread model: posix
gcc version 4.4.1 (Ubuntu 4.4.1-4ubuntu9)

736 名前:デフォルトの名無しさん mailto:sage [2010/03/10(水) 06:14:04 ]
-std=c++98 とかすれば逃げれたりするんじゃないかなー。
まぁ #undef すりゃいいんだけどね。

737 名前:728 mailto:sage [2010/03/10(水) 06:35:01 ]
以下のソースコードコンパイルすると

#include <cstdlib>

void minor( int i, int j )
{
}

int main(int argc, char* argv[])
{
 return 0;
}


test.cpp:5:26: error: macro "minor" passed 2 arguments, but takes just 1
test.cpp:5: error: variable or field ‘minor’ declared void
test.cpp:5: warning: extended initializer lists only available with -std=c++0x or -std=gnu++0x

というerrorと、warningが出ます。
>>730のソースコードではwarning出ませんでした。

738 名前:デフォルトの名無しさん mailto:sage [2010/03/10(水) 09:54:54 ]
functionってすげいな
ソース眺めるだけで勉強になる

739 名前:デフォルトの名無しさん mailto:sage [2010/03/10(水) 17:43:07 ]
struct A;
struct B{A a;};
struct A{int a;};
int main(){return 0;}

前方宣言したら、後で定義してれば
使えると思ってたんですが
これがエラーになります
Bの中をA* aにするとエラーが消えるのですが
その辺に理由があるんでしょうか?

740 名前:デフォルトの名無しさん mailto:sage [2010/03/10(水) 17:53:13 ]
ちょっと実験してみたところ、前方宣言って思ったほど強くない?んですね
Aのデータは定義されるまでは全く参照出来ないのか

struct A;
struct B{void f(A *a){}}; //セーフ
//struct B{void f(A& a){}}; //セーフ
//struct B{void f(A a){}}; //アウト
//struct B{void f(A& a){a.a;}}; //アウト
//struct B{void f(A* a){a->a;}}; //アウト
struct A{int a;};
int main(){return 0;}



741 名前:デフォルトの名無しさん mailto:sage [2010/03/10(水) 18:01:37 ]
サイズがわかってるかどうかで判断できるよ

742 名前:デフォルトの名無しさん mailto:sage [2010/03/10(水) 19:10:29 ]
なるほど、セーフなのはアドレスですもんね
ありがとうございました

743 名前:デフォルトの名無しさん mailto:sage [2010/03/10(水) 22:23:35 ]
>>738
しかしそんなソースを仕事で書いたら
同僚に白い目で見られそうだww

744 名前:デフォルトの名無しさん mailto:sage [2010/03/10(水) 22:40:04 ]
すみません
vectorのresizeでサイズを大きくした時に
拡張した結果メモリの再配置が起こったとすると
resizeする前のデータはコピーされるのでしょうか?

745 名前:デフォルトの名無しさん mailto:sage [2010/03/10(水) 22:42:12 ]
ざれます

746 名前:デフォルトの名無しさん mailto:sage [2010/03/10(水) 22:43:10 ]
>>744
www.fides.dti.ne.jp/~oka-t/cpplab-vector-new.html

747 名前:デフォルトの名無しさん mailto:sage [2010/03/10(水) 22:43:18 ]
ありがとうございます><.

748 名前:デフォルトの名無しさん mailto:sage [2010/03/11(木) 00:56:34 ]
クラスを使ってプログラミングする場合、main関数はどのように使用すればいいのでしょうか?

749 名前:デフォルトの名無しさん mailto:sage [2010/03/11(木) 00:59:17 ]
普通に使用すればいいです

Javaみたいにどっかのクラスのstatic関数にする必要はなし、というか無理

750 名前:デフォルトの名無しさん mailto:sage [2010/03/11(木) 01:51:16 ]
オペレータオーバーロードの ->* って、どう定義してどう使うんですか?
ググール先生に聞こうと思ったんだけど記号検索できませんでした



751 名前:デフォルトの名無しさん mailto:sage [2010/03/11(木) 01:55:22 ]
ttp://homepage2.nifty.com/well/Operator.html#arrow_ast

752 名前:デフォルトの名無しさん mailto:sage [2010/03/11(木) 02:06:36 ]
結合力最強の二項演算子なので
マクロとかで細工するときに便利なこともあります

753 名前:デフォルトの名無しさん mailto:sage [2010/03/11(木) 02:24:57 ]
>>751
どうもです
しかしなんだこれって感じですね
ポインタエミュレートのために
(myp_hoge->*(&MyPtr<hoge>::Func))(a, b, c);
といった形で使いたいんですが、定義の仕方が分からないです(->なら簡単なんですが・・・)

>>752
そういう特殊な使い方ってよく思いつくもんですよね

754 名前:デフォルトの名無しさん mailto:sage [2010/03/11(木) 03:03:47 ]
>>748
徹底したクラス指向で行くならこの程度のものになる。
int main()
{
 MainClass m;
 return m.main();
}

755 名前:デフォルトの名無しさん mailto:sage [2010/03/11(木) 04:20:39 ]
int main()
{
 return MainClass()();
}
徹底するならこうだろーと思った俺はそろそろ寝るべきか

756 名前:デフォルトの名無しさん mailto:sage [2010/03/11(木) 04:51:32 ]
operator RESULT(); //用意するだろ普通

757 名前:デフォルトの名無しさん mailto:sage [2010/03/11(木) 16:29:37 ]
throwでint投げると問題があるようなことを聞いたのですが、
どんな問題があるんでしょうか?
ポインタでキャッチしてしまうとか?

758 名前:デフォルトの名無しさん mailto:sage [2010/03/11(木) 16:33:36 ]
受け取る方はみんなstd::exceptionを継承してて欲しいなーって思ってるから

759 名前:デフォルトの名無しさん mailto:sage [2010/03/11(木) 16:44:47 ]
なるほど。よくわかりました。

760 名前:デフォルトの名無しさん mailto:sage [2010/03/11(木) 17:01:56 ]
istringstream の putback って何回でも呼んでおk?



761 名前:デフォルトの名無しさん mailto:sage [2010/03/11(木) 21:28:31 ]
boost::functionとstd::functionって混在しても問題ありませんか?
それともどちらか一方にすべきでしょうか?

762 名前:デフォルトの名無しさん mailto:sage [2010/03/11(木) 21:54:55 ]
混在させたこと無いからわからんけど、大丈夫じゃね?
どっちも最終的にはただの関数オブジェクトになるわけだから
boostのほうにstdのfunctionを代入することも逆もできるはず
名前は名前空間があるからかぶるわけないし

763 名前:デフォルトの名無しさん mailto:sage [2010/03/11(木) 22:54:37 ]
ABI互換性は?

764 名前:デフォルトの名無しさん mailto:sage [2010/03/11(木) 23:03:33 ]
混在といっても、ひとつのコンパイラでコンパイルするんだからABI関係なくね?


765 名前:デフォルトの名無しさん mailto:sage [2010/03/11(木) 23:15:46 ]
namespace boost = std ;

766 名前:デフォルトの名無しさん mailto:sage [2010/03/11(木) 23:28:03 ]
ありがとうございます。
今のところはboostが使えるならboostが無難かと
思うのでboostにします。


767 名前:デフォルトの名無しさん mailto:sage [2010/03/11(木) 23:34:01 ]
>>766
えぇーーー
普通は逆でしょ
標準で済むなら標準を使うのが筋でしょ

768 名前:デフォルトの名無しさん mailto:sage [2010/03/11(木) 23:38:24 ]
>>767 std::function はまだ標準じゃないでしょ。

769 名前:767 mailto:sage [2010/03/11(木) 23:40:20 ]
>>768
そりゃそうだ
boost と std だけ見て function を見てなかったよ

770 名前:デフォルトの名無しさん mailto:sage [2010/03/11(木) 23:48:14 ]
>>766も「今のところは」って言ってるしな。




771 名前:デフォルトの名無しさん mailto:sage [2010/03/12(金) 01:27:32 ]
placement newを使わずに、任意のメモリ領域にコンストラクタを呼ぶことは不可能?

772 名前:デフォルトの名無しさん mailto:sage [2010/03/12(金) 01:30:56 ]
>>771
何がしたいのかわからないけど、コピーでいいなら std::allocator::construct() とか
std::uninitialized_copy() とかが使えるんじゃない?

773 名前:デフォルトの名無しさん mailto:sage [2010/03/12(金) 10:16:48 ]
template <class T> void Caller( T &f ){ f(); }
に対して、
void Callee();
があり、
Caller( Callee ); // これだとコンパイルが通るのに、
Caller( &Callee ); // こっちは通らない
のはなぜですか?

774 名前:デフォルトの名無しさん mailto:sage [2010/03/12(金) 10:40:58 ]
codepad.org/WzrQ1BNa
それはポインタだからさ

775 名前:デフォルトの名無しさん mailto:sage [2010/03/12(金) 20:32:25 ]
関数の引数に配列の参照を渡したいんですが、どうすればいいですか

776 名前:デフォルトの名無しさん mailto:sage [2010/03/12(金) 20:54:16 ]
>>774
サンクスです。
T &fは「関数の参照型」と言えばいいんでしょうか?
また、関数ポインタを呼ぶ際は、
(*f)(); //デリファレンスあり
f();//なし
2通りで呼べますが、これはシンタックスシュガー的なものですか?
どっち使ってもOKですか?

777 名前:デフォルトの名無しさん mailto:sage [2010/03/12(金) 20:54:42 ]
template<typename T, size_t N> void func(T (&x)[N])

778 名前:デフォルトの名無しさん mailto:sage [2010/03/13(土) 00:39:50 ]
typedef std::deque<int>::iterator iterator;
iterator tekitou;
//...
tekitou == iterator(); //tekitouに代入処理がなかったらtrue
を期待して組んでたら例外が発生してパソコンが爆発したんですけど
tekitouがデフォルトコンストラクタ走ったまま何も触られて無いかどうかを判定する方法はありませんか?

779 名前:デフォルトの名無しさん mailto:sage [2010/03/13(土) 00:52:18 ]
>>778
パソコンが爆発するプログラムを作っているんだったら
いますぐやめなさい。

780 名前:デフォルトの名無しさん mailto:sage [2010/03/13(土) 00:53:54 ]
パソコンが爆発するプログラムを作っているのではありません。
パソコンが爆発するのを防ぐプログラムを作っているのです。



781 名前:デフォルトの名無しさん [2010/03/13(土) 01:15:50 ]
爆発させるプログラムにも実に巧妙なメカニズムがあってだな・・・

782 名前:デフォルトの名無しさん mailto:sage [2010/03/13(土) 01:17:30 ]
兎に角、例外が発生してプログラムが正常に動作しないと爆発を防ぐ事ができないのです。
ご教示いただけないでしょうか?

783 名前:デフォルトの名無しさん mailto:sage [2010/03/13(土) 01:20:26 ]
判定する方法は無い
ポインタと違ってイテレータにはNULL入れられないからねぇ
int *ptr = 0;

784 名前:デフォルトの名無しさん mailto:sage [2010/03/13(土) 01:21:45 ]
本当に爆発するというなら、
本題なんてどーでもよくて、爆発させる方法を知りたい気すらする。

785 名前:デフォルトの名無しさん mailto:sage [2010/03/13(土) 01:22:35 ]
bool変数でも使って対処しとけ

786 名前:デフォルトの名無しさん mailto:sage [2010/03/13(土) 01:24:23 ]
std::pair<iterator, param>ってしてたけどSTLがクソ過ぎてstd::pair<std::pair<iterator, bool>, param>って書かなきゃいけなくなったわ・・・

787 名前:デフォルトの名無しさん mailto:sage [2010/03/13(土) 01:25:48 ]
こういうときは boost::optional だっけ?

788 名前:デフォルトの名無しさん mailto:sage [2010/03/13(土) 01:26:47 ]
つtuple

789 名前:デフォルトの名無しさん mailto:sage [2010/03/13(土) 01:30:12 ]
end()をNULL代わりにしたらあかんの?

790 名前:デフォルトの名無しさん mailto:sage [2010/03/13(土) 01:32:49 ]
今回もそうでしたが、コンテナを特定できないとそれは使えません。



791 名前:デフォルトの名無しさん mailto:sage [2010/03/13(土) 01:55:44 ]
じゃあNULL用の適当なコンテナ作ればいいじゃん

792 名前:デフォルトの名無しさん mailto:sage [2010/03/13(土) 01:58:30 ]
std::pair<iterator, param>ってしてたけどSTLがクソ過ぎてstd::pair<std::pair<iterator, dummy_container>, param>って書かなきゃいけなくなったわ・・・

793 名前:デフォルトの名無しさん mailto:sage [2010/03/13(土) 01:59:08 ]
nil使えよ

794 名前:デフォルトの名無しさん mailto:sage [2010/03/13(土) 02:06:15 ]
iteratorがコンテナと関連付けられてるかチェックしたいってことなのかな?
わざわざややこしいことやってるように見えるけど

795 名前:デフォルトの名無しさん mailto:sage [2010/03/13(土) 02:43:02 ]
namespace boost {
namespace detail { struct none_helper{}; }
typedef int detail::none_helper::*none_t ;
} // namespace boost
namespace boost {
none_t const none = ((none_t)0) ;
} // namespace boost

このコードはいったい何をしようとしてるわけ?

796 名前:デフォルトの名無しさん mailto:sage [2010/03/13(土) 02:55:22 ]
ググった?

797 名前:デフォルトの名無しさん mailto:sage [2010/03/13(土) 04:11:26 ]
>>795
他のどんな型からも自動変換されないし、
他のどんな型へも自動変換されないような変数を定義してるんじゃね?


798 名前:デフォルトの名無しさん mailto:sage [2010/03/13(土) 06:23:39 ]
>>468といい>>778といい、最近のPCは爆発しすぎだな

799 名前:デフォルトの名無しさん mailto:sage [2010/03/13(土) 06:27:14 ]
俺のPCは蒸着するぜ0.05秒で。

800 名前:デフォルトの名無しさん mailto:sage [2010/03/13(土) 06:52:58 ]
手荷物どころかそのうち航空貨物での取り扱いも断られる



801 名前:デフォルトの名無しさん mailto:sage [2010/03/13(土) 07:31:03 ]
そして単純所持禁止へ

802 名前:デフォルトの名無しさん mailto:sage [2010/03/13(土) 07:33:53 ]
コンピュータが爆発するって
昔の映画や漫画によくあったな

803 名前:デフォルトの名無しさん mailto:sage [2010/03/13(土) 07:52:27 ]
「映画の中のコンピュータ」って
ジョークがあったな

804 名前:デフォルトの名無しさん mailto:sage [2010/03/13(土) 08:20:38 ]
「なお、このPCは自動的に消滅する」

805 名前:デフォルトの名無しさん mailto:sage [2010/03/13(土) 10:22:54 ]
>>799
あれってさリュック背負ってたりするとセムシ形状に成ったりするん?

806 名前:デフォルトの名無しさん mailto:sage [2010/03/13(土) 12:27:14 ]
>>795
なんだこれ超ムズイじゃねぇか。


807 名前:デフォルトの名無しさん mailto:sage [2010/03/13(土) 13:03:28 ]
pointer to memberって使ったことあんましないからわからんけど
ほかのpointer to memberじゃないとキャストできない(void *にreinterしても変換できなかった)から他の型と比較できない
なおかつメンバが空だからnullしか入れるものがない
したがってただひとつの状態を持てるってことかな
C++ってこういう気持ち悪いバッドノウハウ多すぎるよね
すなおに仕様でnil型導入すればいいのに

808 名前:デフォルトの名無しさん mailto:sage [2010/03/13(土) 13:26:04 ]
一般的な実装上の都合からいうと、
メンバへのポインターは、単なるオフセットに過ぎない。

809 名前:デフォルトの名無しさん mailto:sage [2010/03/13(土) 13:30:01 ]
null_ptrをお待ちください

810 名前:デフォルトの名無しさん mailto:sage [2010/03/13(土) 17:15:12 ]
>>807
実装上の都合を言語ユーザに押し付けてる感はあるな



811 名前:デフォルトの名無しさん mailto:sage [2010/03/13(土) 19:14:16 ]
>>810


812 名前:デフォルトの名無しさん mailto:sage [2010/03/13(土) 19:16:22 ]
ごめん、途中で送信してしまった。

>>810
他の言語はともかく、
余計なオーバーヘッドを嫌うC++なら、こういう制限も許される(むしろ歓迎される?)よね。

813 名前:デフォルトの名無しさん mailto:sage [2010/03/13(土) 19:38:24 ]
>>810
型変換については妥当な話だと思うし、 nil の不在は実装上の都合ではないだろうし、
何のことを言ってるの?

814 名前:デフォルトの名無しさん mailto:sage [2010/03/13(土) 21:11:09 ]
void Test(int *array) {
// ごにょごにょ(配列の長さについては考えないとする)
}

みたいな関数があったとき、
int array[3] = {0,0,0};
Test(array);
はコンパイルできるのに、
Test({0,0,0});
はコンパイルできない。
配列に付ける名前が不足しちゃうのでなんとか名前を付けずにやりたいんだけど、
良い手段ない?
それともなんでもいいからとりあえず名前を付けざるを得ないんだろうか。

815 名前:デフォルトの名無しさん mailto:sage [2010/03/13(土) 21:18:13 ]
名前付けないと可読性下がりそう

816 名前:デフォルトの名無しさん mailto:sage [2010/03/13(土) 21:21:19 ]
>>814
C++0x をお待ちください。

名前が不足するとかいうのがよくわからんが、マクロでスコープきったり、必要なら
__LINE__ あたりとくっつけとけばよかったりしない?

C++0x 全部じゃなくても、 gcc みたいに C99 の機能が取り込まれてるコンパイラなら
↓こんなのが使えたり。

void Test(int *array);
#define TEST(...) do { int array[] = __VA_ARGS__; Test(array); } while(0)
void Tests()
{
TEST({1,2,3});
TEST({4,5,6});
TEST({7,8,9});
}

817 名前:デフォルトの名無しさん mailto:sage [2010/03/13(土) 21:26:22 ]
可変長引数マクロ関数使えるのか

818 名前:デフォルトの名無しさん mailto:sage [2010/03/13(土) 21:26:36 ]
>>814
ヘルパー関数を使って、
std::vector<int> make_vector(int num, ...);
Test(&make_vector(3,0,0,0)[0]);
とか、
Test((int*)"\x00\x00\x00\x00""\x00\x00\x00\x00""\x00\x00\x00\x00""\x00\x00\x00\x00");
などの悪手しか思いつかない。

819 名前:デフォルトの名無しさん mailto:sage [2010/03/13(土) 21:26:59 ]
配列リテラルとかLL出身者っぽい要望だなぁ

820 名前:デフォルトの名無しさん mailto:sage [2010/03/13(土) 21:31:05 ]
>>816
レスありがとうございます。
> 名前が不足するというのがよくわからん
Testを沢山呼ぶんですよ。

それで、
int array1[3] = {0,0,0};
Test(array1);
int array2[3] = {0,0,1};
Test(array1);
int array3[3] = {0,0,2};
Test(array1);
以下大量に。
(実際は配列の中身はもっとぐしゃぐしゃで、規則性はないデータになる)

__LINE__をつけるというのはいいですね。

>>818
レスありがとうございます。
STL不勉強のためすみませんが今はちょっとよくわかりません。

>>819
はい・・・LL出身です・・・。

とりあえず__LINE__くっつける方法で行きたいと思います。ありがとうございました。



821 名前:デフォルトの名無しさん mailto:sage [2010/03/13(土) 21:31:50 ]
>>820
なんかTestの引数が全部array1になっちゃってますが、
2回目はarray2、3回目はarray3です・・・。

822 名前:デフォルトの名無しさん mailto:sage [2010/03/13(土) 21:36:44 ]
C99にはズバリの機能(複合リテラル)があるのだが、C++0xに入るとは聞いていない。
Test((int[]){0,0,0});

823 名前:デフォルトの名無しさん mailto:sage [2010/03/13(土) 21:37:24 ]
二次元配列にすればいいだけなんじゃない
int arys[100][3];
for(int i=0;i<100;++i){
arys[i][0]=0;
arys[i][1]=0;
arys[i][2]=i;
test(arys[i]);
}

824 名前:デフォルトの名無しさん mailto:sage [2010/03/13(土) 21:40:22 ]
>>822
std::initializer_listが入る

825 名前:814 mailto:sage [2010/03/13(土) 21:41:00 ]
>>823
>>820でちょこっと書きましたが、実際には配列のデータはもっとぐしゃぐしゃで、
必ずしも
arys[i][0]=0;
arys[i][1]=0;
arys[i][2]=i;
となるわけではないのです。
質問のために簡略化しているので・・・すみません。

826 名前:デフォルトの名無しさん mailto:sage [2010/03/13(土) 21:44:44 ]
それなら読み込めばいいんでは?
int arys[100][3];
for(int i=0;i<100;++i){
cin >> arys[i][0] >> arys[i][1] >> arys[i][2];
test(arys[i]);
}
これは標準入力だけど、別にファイルからでもいいし

827 名前:814 mailto:sage [2010/03/13(土) 21:50:09 ]
>>826
そうした方がいいでしょうかね・・・大量のデータをソースコードにべた書きするのは
よくないかなぁと思ったんですが、
データをあまり見られたくないんですよ。
それで、別ファイルにするよりはソースコードに埋め込んだほうがどちらかというと
見られにくいかなぁと思ったので。
別にソースに埋め込んでも見ようとすれば見れるのでなんてことはないんですが。

828 名前:デフォルトの名無しさん mailto:sage [2010/03/13(土) 21:54:44 ]
慣れたLLでコードジェネレートしればいいじゃない

829 名前:814 mailto:sage [2010/03/13(土) 21:57:51 ]
>>828
なるほど、考えてみます。ありがとうございます。

830 名前:デフォルトの名無しさん mailto:sage [2010/03/13(土) 21:58:14 ]
>>827
__VA_ARGS__ は使えんのか? >>816 にあるやつ。



831 名前:814 mailto:sage [2010/03/13(土) 22:02:11 ]
>>830
Visual C++ 2008なので使えると思います。
考えてみます。

832 名前:デフォルトの名無しさん mailto:sage [2010/03/13(土) 22:04:48 ]
>>820
int *arrays[] = {
{ 0,0,0 },
{ 0,0,1 },
{ 0,0,2 }
};

みたいなのじゃダメなの?
argv と同じやりかた。


833 名前:デフォルトの名無しさん mailto:sage [2010/03/13(土) 22:07:18 ]
>>832 コンパイルしてみてから言おうな。

834 名前:デフォルトの名無しさん mailto:sage [2010/03/13(土) 22:14:19 ]
めんどくせw


835 名前:デフォルトの名無しさん mailto:sage [2010/03/13(土) 22:19:38 ]
>>816
__LINE__とくっつけたとして、どうやって参照するの?同じ行が前提?

836 名前:デフォルトの名無しさん mailto:sage [2010/03/13(土) 22:50:27 ]
>>835
同じ行に書くか、ひとつのマクロ内であれば問題なく使えるでしょ。

この場合は単にスコープ分けるだけでも済みそうだし、
__VA_ARGS__ が使えるなら >816 のやつがいいと思う。

837 名前:デフォルトの名無しさん mailto:sage [2010/03/13(土) 22:58:41 ]
つーか規則性の無いグシャグシャなデータにしたのがそもそも間違いだろ。なんで誰も突っ込まないんだよ
データってのは規則正しい形式なのが当たり前で、規則正しいからこそコードを簡潔に記述できるんだよ

struct Recode
{
int num[5]; char str[80];
};

Recode recodes[N] =
{
{〜},
{〜},
};

for(int i = 0; i < N; ++i) Test(recodes[i]);

こんな感じに書くのが基本に忠実な答え
まずはデータ形式から見直そう

838 名前:デフォルトの名無しさん mailto:sage [2010/03/13(土) 23:08:15 ]
>>837
int の配列って言ってるだろ。十分なデータ構造じゃないか。
規則性がなくてぐしゃぐしゃなのは配列の中の値だろ。

839 名前:デフォルトの名無しさん mailto:sage [2010/03/13(土) 23:20:29 ]
(データ長+データ実体)*nを1次元配列で持つとか

840 名前:デフォルトの名無しさん mailto:sage [2010/03/13(土) 23:24:19 ]
質問のために簡略化してるって構造のことじゃなくて値のことだったのか?
だったら二次元配列を使おう、でおしまいだね。いったい何を悩んでるんだろう



841 名前:814 mailto:sage [2010/03/13(土) 23:52:42 ]
Visual C++ 2008ってC99は未だっぽいようです・・・
つまり複合リテラル>>822も可変長引数マクロ関数>>816も無理のようです。

>>840
構造も、値も、です。

>>814にかいたTestは実際はオブジェクトのコンストラクタなのですが、これの定義は
CTest::CTest(int Id, const char* Name, const char* Species, const char *Sex, int* Hp_max, int* Attack, int* Speed)
: (メンバ初期化リスト省略) {}
と、>>814で挙げました配列は3つ、さらに文字列や整数値が引数にあります。
で、これのインスタンスを5個ほど作る処理を書きたいのです。

多次元配列を用いようとすると、Hp_maxとAttack、Speedをまとめて記述し、IdやName,Speciesなどの値と離れて記述する
ことになります。できればインスタンス毎にまとめておきたいのですが・・・

842 名前:デフォルトの名無しさん mailto:sage [2010/03/14(日) 00:07:58 ]
実際にどう記述してるのか分からん

843 名前:814 mailto:sage [2010/03/14(日) 00:09:58 ]
一応締切?とさせていただきます。
レスを頂いた皆さま、大変参考になりました。ありがとうございました。

844 名前:デフォルトの名無しさん mailto:sage [2010/03/14(日) 00:14:23 ]
>>841
じゃあ

struct X {
int Id;
const char* Name;
const char* Species;
const char* Sex;
int Hp_max[N];
int Attack[M];
int Speed[O];
};

X xs[] = {
{1, "a", "b", "c", {1, 2}, {3, 4}, {5, 6, 7}}
};

では?

845 名前:814 mailto:sage [2010/03/14(日) 00:24:12 ]
>>844
メンバ変数のうち、Id、Name、Hp_max、Attack、Speedは親クラスから継承しているメンバなのです。
親クラスが存在するクラスではそういう書き方はできなかったかと・・・

846 名前:844 mailto:sage [2010/03/14(日) 00:28:37 ]
>>845
初期化用データの格納用に >>844 の X のような構造体を定義すれば
初期化データをすっきり記述できるんじゃないかってこと

847 名前:デフォルトの名無しさん mailto:sage [2010/03/14(日) 00:28:58 ]
データ部分は関係ないだろ

848 名前:デフォルトの名無しさん mailto:sage [2010/03/14(日) 00:30:13 ]
>>827
どれくらい見られたくないのかにもよるけど、別ファイルにしてスクランブルかけた方が見られにくいよ

849 名前:デフォルトの名無しさん mailto:sage [2010/03/14(日) 00:35:39 ]
>>841
ひでぇ。最初っからそう聞けよ。 >814 みたいにしたせいで無駄なレスがあんなに。

850 名前:デフォルトの名無しさん mailto:sage [2010/03/14(日) 00:35:49 ]
コンストラクタを一つ増やせってことじゃない?



851 名前:デフォルトの名無しさん mailto:sage [2010/03/14(日) 00:37:51 ]
>>845
CTest::CTest(const X &init) : m_id(init.id), ・・・
{
}

852 名前:814 mailto:sage [2010/03/14(日) 00:38:12 ]
>>849
すみません。私の聞き方が悪かったせいで、これ以上続けても私が質問したいことを上手く書けるか分かりませんので、
これで終わりにさせてください。
乱暴なようで申し訳ないのですが、以後レスは致しません。

853 名前:デフォルトの名無しさん mailto:sage [2010/03/14(日) 00:38:22 ]
warota

854 名前:デフォルトの名無しさん [2010/03/14(日) 00:39:42 ]
                 ┌─┐
                 |も.|
                 |う |
                 │来│
                 │ね│
                 │え .|
                 │よ .|
      バカ    ゴルァ  │ !!.│
                 └─┤    プンプン
    ヽ(`Д´)ノ ヽ(`Д´)ノ  (`Д´)ノ    ( `Д)
    | ̄ ̄ ̄|─| ̄ ̄ ̄|─| ̄ ̄ ̄|─□( ヽ┐U
〜 〜  ̄◎ ̄  . ̄◎ ̄   ̄◎ ̄   ◎−>┘◎

855 名前:デフォルトの名無しさん mailto:sage [2010/03/14(日) 00:41:22 ]
gccのC99拡張機能を有り難がって使ってんじゃねーぞ
聞く方が混乱するだけだ

856 名前:デフォルトの名無しさん mailto:sage [2010/03/14(日) 00:42:56 ]
えっ

857 名前:デフォルトの名無しさん mailto:sage [2010/03/14(日) 01:15:29 ]
template <int num_of_args> class hoge
{
void operator () (int a1, int a2, ...);
};

num_of_argsに対応してoperator ()の引数の数を変動させたいのですが、特殊化をジェネレートするほかにいい方法は無いですかね?

858 名前:デフォルトの名無しさん mailto:sage [2010/03/14(日) 01:22:48 ]
>>857
「ジェネレート」がコンパイル以外のプロセスを指しているのなら、 Boost.Preprocessor が
いくらかマシな手段となるかもしれない。

859 名前:デフォルトの名無しさん mailto:sage [2010/03/14(日) 01:23:52 ]
>>857
これじゃダメっすか

template<int N> class hoge {
void operator()(int a) { BOOST_STATIC_ASSERT(N == 1); }
void operator()(int a, int b) { BOOST_STATIC_ASSERT(N == 2); }
void operator()(int a, int b, int c) { BOOST_STATIC_ASSERT(N == 3); }
};

860 名前:デフォルトの名無しさん mailto:sage [2010/03/14(日) 01:26:06 ]
>>857
C++0xを、首を長くして待て。



861 名前:デフォルトの名無しさん mailto:sage [2010/03/14(日) 01:28:23 ]
きりんさんになっちゃいそうです><

862 名前:デフォルトの名無しさん mailto:sage [2010/03/14(日) 01:38:21 ]
>>857
num_of_argsが要らなくない?無いほうがすっきりしないか?

863 名前:デフォルトの名無しさん mailto:sage [2010/03/14(日) 01:55:12 ]
俺もそう思う。
どうせ特殊化で生成するなら、オーバーロードでいいんじゃね?

864 名前:デフォルトの名無しさん mailto:sage [2010/03/14(日) 02:07:19 ]
>>858
boostはよく知らないんですが後でちょっと探ってきます

>>589
これは面白いですね
コード生成は避けられんませんが、ちょっとシンプルになりました

>>860
待ちきれません

>>862,863
array<3> a(10, 15, 20);
a(1, 5, 3) = 100;
こんな感じで使おうと思ってるんで、num_of_argsは欲しいです

865 名前:デフォルトの名無しさん mailto:sage [2010/03/14(日) 02:10:31 ]
俺も要らないと思うわ

866 名前:デフォルトの名無しさん mailto:sage [2010/03/14(日) 02:13:28 ]
なぜ[a,b,c]という演算子がないのかっていう有意義な疑問に帰着するわけね。


867 名前:デフォルトの名無しさん mailto:sage [2010/03/14(日) 02:14:53 ]
>>866
x[Index(a, b, c)] で代用できるから

868 名前:デフォルトの名無しさん mailto:sage [2010/03/14(日) 02:27:47 ]
1次元の配列が作れる。n次元の配列に[a]演算子を適用するとn+1次元の配列が作れるならば、数学的帰納法で無限の次元の配列が作れることが証明できる。
早い話がvector<vector<vector<int>>>だね。

869 名前:デフォルトの名無しさん mailto:sage [2010/03/14(日) 02:39:36 ]
>>860
g++ 4.4ではもう使える。

870 名前:デフォルトの名無しさん mailto:sage [2010/03/14(日) 02:40:37 ]
ここ数日の質問って何をしたいのか見えてこないのが多いな



871 名前:デフォルトの名無しさん mailto:sage [2010/03/14(日) 03:10:09 ]
c++の文法書ってありますか?
書店に行ってもプログラミングの入門書ばかりで
言語仕様の解説書が見つからなくて困ってる

組み込みやる事になってgcc、GNUARM使う事になったんだが
文法がまるで分からん(K&R〜ANSIの頃のCは随分使ったんだが)

872 名前:デフォルトの名無しさん mailto:sage [2010/03/14(日) 03:11:27 ]
仕様書読めばいいじゃない

873 名前:デフォルトの名無しさん mailto:sage [2010/03/14(日) 03:13:49 ]
>>871
JIS規格ならJISのサイトや取り扱ってる書店で発注すれば購入できたり無料で見たりできるお!!!!!!

874 名前:デフォルトの名無しさん mailto:sage [2010/03/14(日) 03:16:24 ]
>>871 ja.lmgtfy.com/?q=C%2B%2B

875 名前:デフォルトの名無しさん mailto:sage [2010/03/14(日) 03:19:23 ]
文法がまるでわからないのなら
むしろ入門書のほうがいいんじゃないのかw
ってか組み込みならそんなに難しい文法の知識いらないし、
むしろ環境構築の方が面倒な気がするけどね

876 名前:デフォルトの名無しさん mailto:sage [2010/03/14(日) 03:22:54 ]
>>871
単にCの延長でいいなら入門書読めば事足りるはず。
C++らしいコードが書きたいなら
Effective C++とかMore Effective C++でも読んどけば?という感じ。
厳密な文法が知りたければISO/IEC 14882:2003が言語仕様書ということになってるが、
これを読んで特定の目的を達成するコードが書けるとは思えんなあ。

877 名前:デフォルトの名無しさん mailto:sage [2010/03/14(日) 03:26:22 ]
まぁ気持ちは分かる
入門書だとオペレーターオーバーロードとかnamespaceとかそんなん吹き飛ばして
いきなりstd::coutとか使い出すし

878 名前:デフォルトの名無しさん mailto:sage [2010/03/14(日) 03:30:29 ]
>>877
しかも、その場合、ADLまで絡んでくるしな。

879 名前:デフォルトの名無しさん mailto:sage [2010/03/14(日) 03:34:03 ]
俺も昔厳密な仕様が知りたいけど
仕様書とかダルイっていう舐めた態度の時にこの本買った
www.hir-net.com/book/book14/index.html
>>877
な感じで詰まってるなら入門書と並行してこういう本買ってもいいかもね
最近は色々種類あるだろうし翻訳物もあるだろうから本屋行って選ぶよろし

880 名前:デフォルトの名無しさん mailto:sage [2010/03/14(日) 04:04:01 ]
組み込みなら組み込みのスレで尋ねた方がいいと思うぜ
C++の一般論が必ずしも当てはまるとは限らんから



881 名前:デフォルトの名無しさん mailto:sage [2010/03/14(日) 12:59:49 ]
>>871
組み込みなら C 使えよ。
お前みたいなのが C++ 使うとバグが増える。

とりあえずヘッダ自動生成とかのツール類で
勉強してからにしろ。


882 名前:デフォルトの名無しさん mailto:sage [2010/03/14(日) 13:03:01 ]
デストラクタもないCにいわれてもな


883 名前:デフォルトの名無しさん mailto:sage [2010/03/14(日) 13:06:49 ]
>>881
> とりあえずヘッダ自動生成とかのツール類で
> 勉強してからにしろ。
何を言っているんだw

884 名前:デフォルトの名無しさん mailto:sage [2010/03/14(日) 13:13:53 ]
というか、強い静的型付けもないCなんかで書いたら、誰でもバグが増えるわ。

885 名前:デフォルトの名無しさん mailto:sage [2010/03/14(日) 13:58:08 ]
>>882-884
組み込みは製品になるとスタックダンプとレジスタぐらいしか
なくてアセンブラだけで解析すんの大変なんだぜ。

お前らみたいな糞コードのバグ解析がこっちに
回ってきて迷惑なんだよ。


886 名前:デフォルトの名無しさん mailto:sage [2010/03/14(日) 14:04:43 ]
そういうクソを調教するためにMISRA-Cとかがあります

887 名前:デフォルトの名無しさん mailto:sage [2010/03/14(日) 14:29:06 ]
>>885
組み込みつったって規模があるだろう
それこそメモリが数kbしかないものもあれば、OSが載っているようなシステムだってある
少し極論じゃないのか

888 名前:デフォルトの名無しさん mailto:sage [2010/03/14(日) 14:40:51 ]
Cでバグが減る根拠を挙げてもらおうか

889 名前:デフォルトの名無しさん mailto:sage [2010/03/14(日) 14:46:53 ]
誰もそんな事言ってないから

890 名前:デフォルトの名無しさん [2010/03/14(日) 18:41:27 ]
 template<typename T>
 void foo(const T& arg){
 
 if(T::hoge_flag){
     func_true(arg);
     }
 else{
     func_false(arg);
     }
 
 return;
 }

この様なコードがありまして、T::hoge_flagは
T型によりコンパイル時に決定されるconst bool型の定数とします。
すなわち T::hoge_flag の真偽によって
func_true(arg);とfunc_false(arg);の一方だけが必ず実行され
他方は必ず実行されないことになります。

こういった場合は、テンプレートメタプログラミングを使って
一方だけのコードが実行バイナリファイルに含まれるようにすべきなのでしょうか。
それともコンパイラの最適化を期待して上記のコードのままでも良いのでしょうか。

よろしくお願い申し上げます。





891 名前:デフォルトの名無しさん mailto:sage [2010/03/14(日) 19:09:38 ]
コンパイラの機嫌しだい

892 名前:デフォルトの名無しさん mailto:sage [2010/03/14(日) 19:10:12 ]
>>890
最適化に期待すれば十分だと思うよ。
実測してその部分がパフォーマンスに影響することが分かってから改良しても遅くないよ。

893 名前:デフォルトの名無しさん mailto:sage [2010/03/14(日) 19:20:20 ]
そういう場合テンプレートメタプログラミングを理解できないコンパイラだったら
困る・・・か?そんなバカコンパイラは想定しない方が良いか。



894 名前:デフォルトの名無しさん mailto:sage [2010/03/14(日) 19:20:28 ]
struct when_true{ inline static void func(arg_t); }; struct when_false { (ry };
if_<flag, when_true, when_false>::type::func(arg);

確実性を考えると↑のように関数化しないといけない
結局のところオーバーヘッドは避けられないからif elseのままでいいよ

895 名前:デフォルトの名無しさん mailto:sage [2010/03/14(日) 19:25:09 ]
たとえば、
template<bool N>
void func();
でN値による特殊化なんかできるのかな

896 名前:デフォルトの名無しさん mailto:sage [2010/03/14(日) 19:32:55 ]
こんなので切り替えれられるとおも浮けど、わざわざ属性を示すクラスが下からあればいいけど、わざわざ作るなら、ifのほうが分りやすいかもな。
class TypeA{};
class TypeB{};

class hoge :public TypeA
{
};
class fuga :public TypeB
{
};
template<class T>
void func(const T& obj,typename boost::enable_if<boost::is_convertible<T*,TypeA*>>:type* =0)
{
}
template<class T>
void func(const T& obj,typename boost::enable_if<boost::is_convertible<T*,TypeB*>>:type* =0)
{
}
void test()
{
hoge h;
fuga f;
func(h);
func(f);
}


897 名前:デフォルトの名無しさん mailto:sage [2010/03/14(日) 20:07:40 ]
if文の削除なんてあまりにも可読性が低くなってる場合しかオレはやらないな
速度やコードサイズの最適化なんてたかがしれてるだろ

>>896
わざわざややこしくしてないか?
それだったらenable_if_cにして直接T::hoge_flagを突っ込めばいいんじゃん
typename boost::enable_if_c<T::hoge_flag>:typeと
typename boost::disable_if_c<T::hoge_flag>:typeだけで
他にクラスや関数を用意する必要はないはず

まあこんなことしなきゃならないほどカツカツなら
他に検討すべき箇所があるんじゃないのかね

898 名前:デフォルトの名無しさん mailto:sage [2010/03/14(日) 20:08:46 ]
>>895
できるっしょ。
 template<bool b>
 void func(){〜};
 template<>
 void func<true>(〜);

これでおkでは?


899 名前:デフォルトの名無しさん mailto:sage [2010/03/14(日) 20:44:03 ]
もう面倒だからboolじゃなくて関数ポインタででも持たせとけよ。

900 名前:デフォルトの名無しさん mailto:sage [2010/03/14(日) 20:50:27 ]
関数ポインタは最適化の障害で(ry




901 名前:デフォルトの名無しさん mailto:sage [2010/03/14(日) 20:55:24 ]
コストとコードサイズ小さくしたいのにカンポはねーよ・・・

902 名前:デフォルトの名無しさん mailto:sage [2010/03/14(日) 20:57:24 ]
結局ifelse書いて最適化に期待するのに落ち着きそうだな
関数化するまでも無い分岐の場合は特にそうだろう

903 名前:デフォルトの名無しさん mailto:sage [2010/03/14(日) 20:59:40 ]
この状況で関数ポインタ持たせたら
逆効果じゃねぇかwwwww


904 名前:デフォルトの名無しさん mailto:sage [2010/03/14(日) 21:00:55 ]
コンパイル時に定まるif elseで絶対に実行されないことが
分かる場合、それでも最適化できないバカコンパイラって
知っている?

それを最適化できないとなるともっと重大な所でも
最適化できなさそうな気がするが。


905 名前:デフォルトの名無しさん mailto:sage [2010/03/14(日) 21:19:48 ]
codepad.org/3HNtsPNZ
なんでこれが期待どおりに動いてるのかよく分からない

906 名前:デフォルトの名無しさん mailto:sage [2010/03/14(日) 21:47:54 ]
Conceptさん・・・Conceptさんを呼べ!!


907 名前:デフォルトの名無しさん mailto:sage [2010/03/14(日) 21:51:07 ]
templateの部分特殊化とSFINAE。
メンバT::swapが存在し、かつvoid (T::*)(T &)が&T::swapに置き換え可能ならば
(その場合のみ)has_swap_implの部分特殊化が選択される。

908 名前:デフォルトの名無しさん mailto:sage [2010/03/14(日) 21:55:48 ]
カードゲームの効果解説かと思った。

909 名前:デフォルトの名無しさん mailto:sage [2010/03/14(日) 22:40:36 ]
>>888
>>871 は C はそれなりに書けるようだが、
解説書見ながら C++ で書いてより高品質なソフトが
書ける理由がないだろ。

どうせ new[] したのを delete するようなコード
書いて地雷仕込むのがオチ。


910 名前:デフォルトの名無しさん mailto:sage [2010/03/14(日) 23:18:09 ]
>>905
まず、has_swap<T>はどんな型にも適合するのでhas_swap<hoge>の実体化が行われる。

コンパイラはhas_swap<hoge>の基底クラスとして、has_swap_impl<hoge, void>を実体化しようとする。
なお、has_swap_implの第2テンプレート引数は省略されているのでデフォルトのvoidが使われる。

has_swap_impl<hoge, void>を実体化しようとした際に、
コンパイラはまず、より特殊化されたバージョンである
14行目のバージョンに適合するかのチェックを行う。
ここで問題は、typename has_swap_helper<T, &T::swap>::type が void と一致するかどうか。
・メンバ関数としてvoid T::swap(T&)が存在するならば、has_swap_helperのテンプレート引数が確定し、
 かつ4行目のテンプレートに適合するので、4行目のテンプレートが実体化され、voidになる。
 すると、has_swap_impl<hoge, void>は14行目のバージョンに適合する。
・void T::swap(T&)が存在しないならば、適合するhas_swap_helperは「存在しない」。
 通常の感覚ならばエラーになりそうだが、 SFINAEの規則によってエラーとはならず、
 単に14行目のバージョンが候補から除外される。
 コンパイラは次に9行目のバージョンの実体化を行おうとする。
 9行目は何でも適合するので、has_swap_impl<fuga, void>は9行目のバージョンに適合する。

あくまでもhas_swap_impl<hoge, void>がどれにマッチするかが問題なので、
たとえば6行目のtypedefをintに変えたりするとダメ
(その場合、9行目を class U = int にすればいい)



911 名前:デフォルトの名無しさん mailto:sage [2010/03/14(日) 23:20:30 ]
っていうオーバーロード解決に至るまでの経過を出力してくれるコンパイラないかなぁ
特殊化とかADLとか絡んでついていけない時がままある

912 名前:デフォルトの名無しさん mailto:sage [2010/03/14(日) 23:25:19 ]
言い出しっぺの法則発動

913 名前:デフォルトの名無しさん mailto:sage [2010/03/14(日) 23:33:42 ]
あ、>>910間違えてた。
誤) ・void T::swap(T&)が存在しないならば、適合するhas_swap_helperは「存在しない」。
正) ・void T::swap(T&)が存在しないならば、has_swap_helperのテンプレート引数が確定しない。

914 名前:デフォルトの名無しさん mailto:sage [2010/03/14(日) 23:34:08 ]
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
typedef struct TestData {
int id; char *name; char *sp; char *sx;
int nr_param; char *param;
} TestData;
#define PARA(max,at,sp) ":" #max "," #at "," #sp
static TestData test_array[] = {
{ 1, "NA", "SpA", "M", 3, PARA(0, 0, 1) PARA(2, 3, 4) PARA(5, 6, 7), },
{ 2, "NB", "SpB", "???", 1, PARA(1, 2, 3), },
};
void dump_testdata(TestData *t) {
int i;
const char *p;
printf(" Id:%d, Name:%s, Sp:%s, Sx:%s\n", t->id, t->name, t->sp, t->sx);
p = t->param;
for ( i = 0; i < t->nr_param ;i++) {
int m, a, s;
m = atoi(p = strchr(p, ':')+1);
a = atoi(p = strchr(p, ',')+1);
s = atoi(p = strchr(p, ',')+1);
printf(" param: max:%d, attack:%d, speed:%d\n", m, a, s);
}
}
int main(void) {
dump_testdata(&test_array[0]);
dump_testdata(&test_array[1]);
return 0;
}


915 名前:デフォルトの名無しさん mailto:sage [2010/03/14(日) 23:35:40 ]
アンカー消えた。
>>914>>852

これくらいしか思いつかん。


916 名前:デフォルトの名無しさん mailto:sage [2010/03/14(日) 23:57:05 ]
>>907,910
どうもありがとう、なんとなくわかってきた
なるべく特殊化が強いのを優先的にリストアップして最初に合致したやつを使うということですね

917 名前:デフォルトの名無しさん mailto:sage [2010/03/15(月) 00:03:50 ]
C++使ってちょうど2年半の者です。

テンプレートメタプログラミングって
とても難解そうで ほとんど学んでいないのですが、
例えば>>890さんの場合ですとどうすればいいことになるのでしょうか。

どなたかコードを(boost::mplのような出来合いのライブラリを
使用せずに)書いてくださいませんでしょうか。

よろしくお願いします。


918 名前:デフォルトの名無しさん mailto:sage [2010/03/15(月) 00:19:42 ]
>>917
最近、C++を勉強し始めたからテンプレートを勉強していないんだけど
こんな難しそうなのを「みんな出きるのか〜」とビビってたぜ

あぁ〜安心した

919 名前:デフォルトの名無しさん mailto:sage [2010/03/15(月) 00:24:32 ]
メタプロはライブラリ作者のためのものと言い切っても過言ではない
知ってても使う場面は実はそれほど多くない(なくても実装できることが多い)し
使える場面だとしてもすでにできの良いライブラリがあるからそっちを使うことになる

920 名前:デフォルトの名無しさん mailto:sage [2010/03/15(月) 00:24:39 ]
これは静的(コンパイル時)なのか動的(実行時)なのか
とかを意識すると多少理解が楽になる



921 名前:デフォルトの名無しさん mailto:sage [2010/03/15(月) 00:35:15 ]
>>917
boost::mplを使えるようになれば自然と覚えられるよ。


922 名前:デフォルトの名無しさん mailto:sage [2010/03/15(月) 01:13:45 ]
こういうこと言うと否定されるのかもしれないけど
TMPって出来合いのライブラリを使うプログラミングだと思う
自分でメタ関数やシーケンスをフル実装してる奴とかいるのかね

そういやTMPの本が出版されたんだっけ?

923 名前:デフォルトの名無しさん mailto:sage [2010/03/15(月) 01:19:46 ]
templateでメタプログラミングするのが嫌なら別の方法でメタプログラミングすればいいよ。
template使ってる人は型レベルとの相性が良い(というか型レベルそのものだ)から好きで使ってるだけ。

924 名前:デフォルトの名無しさん mailto:sage [2010/03/15(月) 05:19:50 ]
>>917
自信ないけどこんなんでどうか
ttp://codepad.org/jyhjFg0S

ところで、こういうのって、boolでやるのと
struct true_tag {};
struct false_tag {};
とかを定義してやるのと、どっちがいいんだろ?

925 名前:デフォルトの名無しさん mailto:sage [2010/03/15(月) 06:57:33 ]
>>917
これでいいっしょ。
template<typename T, bool b>
void foo_impl(const T &arg) { func_true(arg); }
template<typename T>
void foo_impl<T, false>(const T &arg) { func_false(arg); }
template<typename T>
void foo(const T& arg) { foo_impl<T, T::hoge_flag>(arg); }

まあTMPなんて必要性が感じられなければ無理に使うような物でもないと思うよ。
付け焼刃の知識では早々使えるコードが出てくることもない。
何に使えるのかわかってからでも使い始めるのは遅くない。
まずは既存のコードでどう使われているのか観察することだな。

926 名前:917 mailto:sage [2010/03/15(月) 10:53:59 ]
みなさんありがとうございます。

C++0xではテンプレートメタプログラミングをサポートするためだけにあるような
機能が増えると伺っておりましたので、そろそろ勉強し始めるときが
来たような気がしています。


927 名前:デフォルトの名無しさん mailto:sage [2010/03/15(月) 12:28:21 ]
>>922
そうだとおもう。テンプレートは作るのは地獄だけど、使うのは楽になるように作るように心がけてる。

関数テンプレートなんか型推論で殆ど型引数を書かなくてすむのに正しいコードが出るんだから、丁寧に作った関数テンプレートは使う側にとって大きなメリットがあると思う。

928 名前:デフォルトの名無しさん mailto:sage [2010/03/15(月) 13:17:19 ]
>>927
お前はテンプレートメタプログラミングってなんだか理解しているのか?

> 関数テンプレートなんか型推論で殆ど型引数を書かなくてすむのに
> 正しいコードが出るんだから、丁寧に作った関数テンプレートは
> 使う側にとって大きなメリットがあると思う。
>>922もみんなもテンプレートメタプログラミングの話をしているんだけど。。。


929 名前:928 mailto:sage [2010/03/15(月) 13:18:35 ]
ああ、分かった。

>>927はTMPがTeMPlateの略だと思ってた訳か。
これで文脈が繋がった。


930 名前:デフォルトの名無しさん mailto:sage [2010/03/15(月) 15:19:03 ]
ネットの画像のURLから隠しフォルダ「Temporary Internet Files\Content.IE5」以下に検索をかけてファイルを見つけようとしています。
ファイルは見つかるんですが、a.com/aa.jpgからだとファイル名はaa[1].jpgになっています。

zzzzzz.com/aa.jpg とではファイル名の区別がつきません。Temporary Internet Filesのファイルをプロパディで
見るとURLの情報が解るのですが、この情報を参照できるような関数や方法ってありませんか?



931 名前:デフォルトの名無しさん mailto:sage [2010/03/15(月) 17:08:24 ]
環境依存OKなスレで聞きなよ

932 名前:930 mailto:sage [2010/03/15(月) 17:21:02 ]
>>931
もしかして自分だけですかね?Temporary Internet Filesの特性かと思っていました。

933 名前:デフォルトの名無しさん mailto:sage [2010/03/15(月) 17:31:05 ]
それで?C++という言語の何を訊きたいの?

934 名前:デフォルトの名無しさん mailto:sage [2010/03/15(月) 17:35:21 ]
return static_cast<931::環境依存>(930の悩み); //invalid static_cast form type "932.オレだけ?" to type "世界平和"

935 名前:930 mailto:sage [2010/03/15(月) 17:52:06 ]
C++で作って詰まって短絡的に聞いてしまいました、すみません。
D:\Temporary Internet Files\Content.IE5を見たところindex.datがあるので、ここでファイルとアドレスを関連付けて
\Temporary Internet Filesに表示させてる? datをC++で読み込んで目当てのファイルを見つけることは可能でしょうか?


936 名前:デフォルトの名無しさん mailto:sage [2010/03/15(月) 18:01:30 ]
     _,,_
     /´o ヽ
   ,.ィゝ     l   
    ̄ヽ     l
       l     ヽ___
     /  ,,...---`ニニニ==、,,__
     l  / ヽ ヽ ヽ ヽ ヽ ヽ ヽ l三三三>
      |  iヽ ヽ ヽ ヽ ヽ ヽ ヽ/三三/''ー- 、
     ヽ. ヽ、ヽ ヽ ヽ ヽ ヽ.∠三=‐''´>‐--‐'
       ヽ、`'''ー‐---‐'''´_,,...--‐'''´
         `''ーッ--t_,r'''´
        _/._/

937 名前:デフォルトの名無しさん mailto:sage [2010/03/15(月) 18:33:35 ]
>>935
そうでなくて、Windowsという環境依存なプログラムについては「環境依存OKなスレで聞きなよ」ってことでしょ

938 名前:デフォルトの名無しさん mailto:sage [2010/03/15(月) 18:56:25 ]
>>930

【初心者歓迎】C/C++室 Ver.71【環境依存OK】
pc12.2ch.net/test/read.cgi/tech/1264774545/l50


939 名前:930 mailto:sage [2010/03/15(月) 19:00:08 ]
スレチですね。見当違いですみません…

940 名前:デフォルトの名無しさん mailto:sage [2010/03/15(月) 20:13:17 ]
>>925
二つ目のfoo_impl()はコンパイルエラー起こすだろ
関数テンプレートで部分的特殊化は無理



941 名前:デフォルトの名無しさん mailto:sage [2010/03/15(月) 21:25:05 ]
STLのvecterの配列に対してクイックソートを組んだんですが動きません

ソース : codepad.org/YM2RidkL
47、48行目の再帰処理のあたりが原因だと思うのですが、誰か助けてください

942 名前:デフォルトの名無しさん mailto:sage [2010/03/15(月) 21:55:20 ]
勘だけど 43、44行目あたりかな

943 名前:デフォルトの名無しさん mailto:sage [2010/03/15(月) 22:01:47 ]
見た感じだと44行目か36行目のどっちかだな

944 名前:デフォルトの名無しさん mailto:sage [2010/03/15(月) 22:10:03 ]
見てないけど44行目かな

945 名前:デフォルトの名無しさん mailto:sage [2010/03/15(月) 22:14:34 ]
どうみても44が--

946 名前:デフォルトの名無しさん mailto:sage [2010/03/15(月) 22:45:42 ]
>>944
> 見てないけど
おいw


947 名前:デフォルトの名無しさん mailto:sage [2010/03/15(月) 23:16:01 ]
>>871です
>>876
ありがとうございます、一番参考になりました
近日中に都会に出かけるのでwあったら立ち読み&購入検討してきます

何度かパーサを書く仕事をしたので、どうしてもライブラリより構文に目が行ってしまいます
最近はそういうの流行らないみたいですね

もはやIBM流の構文チャート?やBNFで定義できるような言語じゃないとは
噂で聞いてはおりますが…

948 名前:デフォルトの名無しさん mailto:sage [2010/03/16(火) 00:23:47 ]
>>941
添え字10のアクセス違反って出てるじゃん
m_array[9]に値入れた後にjをインクリメントしてるんだろ

>>947は組み込み自体やった事なさそうな感じ

949 名前:デフォルトの名無しさん mailto:sage [2010/03/16(火) 02:36:50 ]
class hoge
{
const fuga &f;
public:
hoge() : f(fuga_sub())
{
}
};

const参照はテンポラリオブジェクトを束縛すると聞いたんですが、↑のようにするとバグります。なぜなんでしょうか?

950 名前:デフォルトの名無しさん mailto:sage [2010/03/16(火) 02:37:50 ]
fはhogeのコンストラクタスコープでしか生きてないインスタンスをさしてるから



951 名前:デフォルトの名無しさん mailto:sage [2010/03/16(火) 05:58:00 ]
>>948
ええ、組み込みは初めてです
使ってもいいライブラリはサンプル等あるんで問題ないんですが
コンストラクタの初期化リストなんて初めて見ました

トッパンのC++の本なら昔買いましたが、今更役に立ちませんよねw

952 名前:デフォルトの名無しさん mailto:sage [2010/03/16(火) 07:58:42 ]
>>949
初期化リストで使った場合、コンストラクタの終わりまでしか延命されない。
規格の 12.2 p5 より。
> ... A temporary bound to a reference member in a constructor's ctor-initializer
> persists until the constructor exits. ...

その特別ルールが役に立つのはほぼ自動変数だけ。






[ 新着レスの取得/表示 (agate) ] / [ 携帯版 ]

前100 次100 最新50 [ このスレをブックマーク! 携帯に送る ] 2chのread.cgiへ
[+板 最近立ったスレ&熱いスレ一覧 : +板 最近立ったスレ/記者別一覧]( ´∀`)<218KB

read.cgi ver5.27 [feat.BBS2 +1.6] / e.0.2 (02/09/03) / eucaly.net products.
担当:undef