C++相談室 part78
レス数が1000を超えています。これ以上書き込みはできません。
0001v(^・^)v
2010/02/13(土) 23:18:03ただし質問の前にはFAQに一通り目を通してください。
IDE (VC++など)などの使い方の質問はその開発環境のスレに
お願いします。
前スレ
C++相談室 part77
http://pc12.2ch.net/test/read.cgi/tech/1263556932/
0002デフォルトの名無しさん
2010/02/13(土) 23:20:55[C++ FAQ]
http://www.parashift.com/c++-faq-lite/
http://www.bohyoh.com/CandCPP/FAQ/ (日本語)
Cとその仕様を比較しながらの解説なので分かりやすい。
***** 質問の前に必ずこの二つに目を通してください *****
[C/C++ リファレンス]
http://www.cppreference.com/ (英語)
http://www.cppreference.com/wiki/jp/ (↑の日本語訳だけどまだ未完)
[禿 Stroustrup]
http://www.research.att.com/~bs/
[C++ International Standard]
http://www.iso.org/iso/iso_catalogue/catalogue_tc/catalogue_detail.htm?csnumber=38110
[JTC1/SC22/WG21 - C++]
http://www.open-std.org/jtc1/sc22/wg21/
ここから規格の最新(2003より新しい)ドラフトがダウンロードできる。
[JIS X3014]
http://www.jisc.go.jp/app/pager?id=15868
ISO規格の日本語訳。JIS X 3014:2003はISO/IEC 14882:2003 (E)に対応。
0003デフォルトの名無しさん
2010/02/13(土) 23:24:24[Boost]
Boost http://www.boost.org/
(日本語) http://www.kmonos.net/alang/boost/
(日本語) http://shinh.skr.jp/boost/
[標準ライブラリ]
SGI-STL http://www.sgi.com/tech/stl/
STLport http://stlport.sourceforge.net/
GNU libstdc++ http://gcc.gnu.org/libstdc++/
Apache C++ Standard Library (STDCXX) http://stdcxx.apache.org/
STLFilt http://www.bdsoft.com/tools/stlfilt.html
(日本語) http://episteme.wankuma.com/stlprog/ (※1999年発行注意)
[Loki]
http://sourceforge.net/projects/loki-lib/
LokiPort-MSVC6sp5 http://fara.cs.uni-potsdam.de/~kaufmann/?page=lokiport
0004デフォルトの名無しさん
2010/02/13(土) 23:28:14amazon.com C,C++関連書籍
http://www.amazon.com/exec/obidos/tg/browse/-/3956/ref=br_bx_c_1_3/
The C++ Programming Language
http://www.amazon.com/exec/obidos/ASIN/0201700735/
http://www.amazon.co.jp/exec/obidos/ASIN/475611895X/ (翻訳)
C++ Primer (3rd Edition)
http://www.amazon.com/exec/obidos/ASIN/0201824701/
http://www.amazon.co.jp/exec/obidos/ASIN/4756140068/ (翻訳)
The C++ Standard Library
http://www.amazon.com/exec/obidos/ASIN/0201379260/
http://www.amazon.co.jp/exec/obidos/ASIN/4756137156/ (翻訳)
Effective C++
http://www.amazon.com/exec/obidos/ASIN/0201924889/
http://www.amazon.co.jp/exec/obidos/ASIN/4756118089/ (翻訳)
More Effective C++
http://www.amazon.com/exec/obidos/ASIN/020163371X/
http://www.amazon.co.jp/exec/obidos/ASIN/4756118534/ (翻訳)
Exceptional C++
http://www.amazon.com/exec/obidos/ASIN/0201615622/
http://www.amazon.co.jp/exec/obidos/ASIN/4894712709/ (翻訳)
More Exceptional C++
http://www.amazon.com/exec/obidos/ASIN/020170434X/
Exceptional C++ Style
http://www.amazon.com/exec/obidos/ASIN/0201760428/
0005デフォルトの名無しさん
2010/02/13(土) 23:29:23Effective STL
http://www.amazon.com/exec/obidos/ASIN/0201749629/
http://www.amazon.co.jp/exec/obidos/ASIN/4894714108/ (翻訳)
Modern C++ Design
http://www.amazon.com/exec/obidos/ASIN/0201704315/
http://www.amazon.co.jp/exec/obidos/ASIN/4894714353/ (翻訳)
C++ Templates
http://www.amazon.com/exec/obidos/ASIN/0201734842/
C++ Template Metaprogramming
http://www.amazon.com/exec/obidos/ASIN/0321227255/
0006デフォルトの名無しさん
2010/02/13(土) 23:30:53http://codepad.org/
0007v(^・^)v
2010/02/13(土) 23:36:05後は好きにして。
0008デフォルトの名無しさん
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言語はこちらへ
ぐらいか?
0009デフォルトの名無しさん
2010/02/14(日) 02:08:30ヘッダに定義書いても全然問題ないことをどっちか片方が知らないように感じた。
俺の誤解だといいんだけど。
0010デフォルトの名無しさん
2010/02/14(日) 08:16:000011デフォルトの名無しさん
2010/02/14(日) 09:26:00age
0012デフォルトの名無しさん
2010/02/14(日) 09:59:23環境によるだろ。
俺はBorland-C++5.6.2に -D_RTLDLL オプションを指定して、極力
ランタイムを使用するようにして使っているが、例えばstd::vectorを
使っても使わない時と比べ10Kほどしか増えない
すげえ。ダイナミックリンクしといてファイルサイズが増えないとかいってるよ。この人。
C1010: プリコンパイル済みヘッダーの検索中に予期しない EOF を検出しました。
とかいうエラーが出るんだけどこれってどうすればいいの?
#include <stdafx.h>
後死ね。
言葉が悪いな。それで教えているつもりか。
まぁヒントぐらいにはなったな。
うむごくろう。
0013デフォルトの名無しさん
2010/02/14(日) 10:06:33いつ頃 正式なC++になるんですか?
0014デフォルトの名無しさん
2010/02/14(日) 10:12:350015デフォルトの名無しさん
2010/02/14(日) 10:19:300016デフォルトの名無しさん
2010/02/14(日) 17:31:43地鎮乙
0017デフォルトの名無しさん
2010/02/14(日) 19:14:00チェックするのが、どうにも気持ち悪いのですが
何か別の方法はないでしょうか?
0018デフォルトの名無しさん
2010/02/14(日) 19:15:460019デフォルトの名無しさん
2010/02/14(日) 19:16:360020 ◆GWRSHcLrd6
2010/02/14(日) 19:18:15スマートポインタにメモリプールを実装してみました。
(なんか保守的GCみないな感じになりましたが・・・)
まだうpしてませんが(随分汚いので)、ベンチだけ取ってみました。
0021デフォルトの名無しさん
2010/02/14(日) 19:21:35boost::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%はアップすると思います。
0023デフォルトの名無しさん
2010/02/14(日) 19:30:100024デフォルトの名無しさん
2010/02/14(日) 19:30:310025デフォルトの名無しさん
2010/02/14(日) 20:03:400026デフォルトの名無しさん
2010/02/14(日) 21:01:28多用されてるでしょ。主にoperator系、特にストリーム操作とか。
印象は違うかもしれないけどオブジェクトのメソッドがオブジェクト自身を返して連鎖していくって意味では
まさにメソッドチェーン。
あるんですか?
http://cdtest.genin.jp/projects/smart_ptr/pool_system.png
>>25
効率が悪いからでは?
0028デフォルトの名無しさん
2010/02/14(日) 21:10:01このスマポってライセンス何なの?
まだ考えてない?
0030デフォルトの名無しさん
2010/02/14(日) 21:20:00実用プログラムに組み込みたいと思ってる奴なんて要るの?
0031デフォルトの名無しさん
2010/02/14(日) 21:21:410032デフォルトの名無しさん
2010/02/14(日) 21:21:480033デフォルトの名無しさん
2010/02/14(日) 21:29:51NYSLライクなら昔作ったスレッドセーフ用のスマポと比較して
性能が良かったら使おうと思った
ライブラリに合わせて改変することになるだろうからLGPLとかだと無理なんだけど
この先も色々評価して高速化するなら需要はあるんじゃね?
0034デフォルトの名無しさん
2010/02/14(日) 21:32:57こんなの遅くて使いものにならんでしょ。
以下の問いに対して、少なくともdlmallocよりも高効率なのかよw?
こんな糞データ構造で、メモリの空き領域をどうやって効率的にさがせる
のか答えてみろよw?これじゃ単なる線形リストだろw
このスレに2度と来るないいな?わかったか?
0035デフォルトの名無しさん
2010/02/14(日) 21:35:20>>27 の質問を良く見てみろ
まあ、これから頑張って独自性がでるようになってきたら、
ライセンスをつけたいと思います。
それまでは改変自由で(まだ大したものじゃないですしね)。
>>31
tcmalloc、ググりました。
こういうアロケートの仕方もあるんですね。
でもあれってアロケートはシステムコールとかで
バリバリにコーディングされているのかな?
ちょっとコード見てきます。
申し訳ないです・・・
0038デフォルトの名無しさん
2010/02/14(日) 21:37:45突然どうした
ちょっと落ち着け
0039デフォルトの名無しさん
2010/02/14(日) 21:38:24安定していて使いやすいこと。
しかしGoogleのメモリ管理もあまり流行ってないし、普及させられるほどの価値ある物は出来ないと思う。
メモリプールしても全体の速度向上はほとんど望めない。
普及させられるとしたら、boost互換のインターフェースでboostよりメリットがあること。
0040デフォルトの名無しさん
2010/02/14(日) 21:42:38メモリ操作のみなら、Googleのメモリ管理は超速だが
実際にアプリに組み込むと何の変化も出ない。
現実アプリはメモリの生成・解放ばかりしていない。
プールはおまけにするか、Google任せにしてスマートポインタ開発のほうが
需要出ると思う。
0041デフォルトの名無しさん
2010/02/14(日) 21:54:29ちょっと見てみたけどtcmallocって改良版dlmallocみたいなのか。
0042デフォルトの名無しさん
2010/02/14(日) 22:48:55線形以外の探索ってどんなのがいいのかねぇ
0043デフォルトの名無しさん
2010/02/14(日) 22:59:37このプールから削除する場合はどうなるんだ?使い捨て?
0044デフォルトの名無しさん
2010/02/14(日) 23:04:19最速の固定長の小メモリブロックアロケータは simple segregated storage だとわかりきっている。
探索しないでいい。
0045デフォルトの名無しさん
2010/02/14(日) 23:36:170046デフォルトの名無しさん
2010/02/14(日) 23:50:34inner_ptrの方でゼロ初期化され、新たなアロケートで再利用されます。
というかカウント0のものはゴミとみなして新しくAllocした時にそれを使います。
で、ブロックが空、なおかつ、ブロックを多く確保しすぎている場合は
そのブロックはdeleteされて前後のブロックをリストで繋ぎます。
>>45
そうなんですよw
0048デフォルトの名無しさん
2010/02/14(日) 23:59:54N 十分大
char* p[0]・・・p[N] メモリブロック
メモリの使用状態を1ビットで表す 00011100010101000000
連続領域が必要なら0の連続を選択。
はじめはp[i]はNULLにしておく。
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
0050デフォルトの名無しさん
2010/02/15(月) 00:00:37いったい何を目指しているの?
メモリブロック確保の速度なんて operator new の実装に任せておけばいいこと。
そんなところをがんばるよりも、他にすることは無いの?
0052デフォルトの名無しさん
2010/02/15(月) 00:02:15すいません。高速化しようと思って少しそれてしまいました・・・
0054デフォルトの名無しさん
2010/02/15(月) 00:03:49キューに入れて順番に処理すると良い思うが、キューへのアクセスにロックが必要
ロック無しにする方法ないか。
0055デフォルトの名無しさん
2010/02/15(月) 00:05:520056デフォルトの名無しさん
2010/02/15(月) 00:07:060057デフォルトの名無しさん
2010/02/15(月) 00:08:510058デフォルトの名無しさん
2010/02/15(月) 00:09:43なら operator new を Google メモリ管理で置き換えればいいじゃない。
0059デフォルトの名無しさん
2010/02/15(月) 00:23:34実装方法わからん。cas命令らしいけど
0060デフォルトの名無しさん
2010/02/15(月) 00:46:42http://www.slideboom.com/presentations/133166
これによると std::shared_ptr (C++0x) はとてつもなく遅くて使えんとあるな。
だから Hazard ポインタを使えともある。
0061デフォルトの名無しさん
2010/02/15(月) 01:01:25スマートポインタでLock-freeにするには? という話なのに、
Lock-freeを実現するために使用するスマートポインタの話をするのは順番が逆でしょう。
でも >>60 のような用途に使える軽快なスマポは確かに欲しいけど。
0062デフォルトの名無しさん
2010/02/15(月) 01:14:46可能なら、RCU的な手法にする方が良い。
http://www.atmarkit.co.jp/flinux/rensai/watch2010/watch01b.html
みたいな記事もある。
0063デフォルトの名無しさん
2010/02/15(月) 23:47:170064デフォルトの名無しさん
2010/02/15(月) 23:48:21マルチコア時代
を相手にするならスマポのコストが問題となることは
大抵ないと思うんだが。
0065デフォルトの名無しさん
2010/02/15(月) 23:49:25記事の中よめよ
リンク先にまるなげだけどちゃんとあるだろう
http://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
0066デフォルトの名無しさん
2010/02/15(月) 23:55:180067デフォルトの名無しさん
2010/02/16(火) 00:06:350068デフォルトの名無しさん
2010/02/16(火) 00:59:05マルチコア関係なくね?
0069デフォルトの名無しさん
2010/02/16(火) 01:48:54おい!
0070デフォルトの名無しさん
2010/02/16(火) 08:04:43処理担当スレッドを作る場合、必要になったらbeginthread(もしくはbeginthreadex)で
スレッドを起動して作業が終わったらおしまいとするのとスレッドプールをするのでは
どちらがいいのでしょうか?
0071デフォルトの名無しさん
2010/02/16(火) 13:05:40頻繁に起動終了を繰り返すようなものならスレッドプールが良いと思うよ。
スレッドの生成破棄もコストはあるからね。
0072デフォルトの名無しさん
2010/02/16(火) 15:32:45●getterについて
・setterに対してgetterも用意されていたら、隠蔽になっていないのではないか?
・利用者がsetした時の情報を保持すればgetterはいらないのではないか?
●setterについて
・コンストラクタの引数で受け取る物は、setterも用意したくなるが同じ機能を2箇所に書いている感が?
書いたクラスが各メンバ変数に対してgetter/setterが存在する物になっていると、
無駄に手間をかけただけの構造体なんじゃないかと不安になります。
必要十分なgetter/setterを持つクラスを設計するには、どういう事を考えればいいのでしょうか?
0073デフォルトの名無しさん
2010/02/16(火) 15:45:03>・setterに対してgetterも用意されていたら、隠蔽になっていないのではないか?
なんでそうなる
他にもいろんなprivate変数持ってる場合がほとんどだろ
0074デフォルトの名無しさん
2010/02/16(火) 15:54:44「コンストラクタも含めて外部からget/setされないメンバ変数」を持たないクラスも多いです。
10個近くの設定値が必要なクラスとか、コードのうちgetter/setterが占める割合が多くなって、「なんだかなー」と思います。
0075デフォルトの名無しさん
2010/02/16(火) 15:59:39でもgetter/setterを敢えて持つ理由は、プログラマに「今private変数を
いじってますよ」という事を常に意識させる効果がある
0076デフォルトの名無しさん
2010/02/16(火) 16:10:53class 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));
こうする
0077デフォルトの名無しさん
2010/02/16(火) 16:39:05一貫性がないのは嫌なので、public変数にするとなると全てのクラスをpublic変数にする事になって、これも嫌な感じがします。
>>76
確かに隠蔽性がなくなるわけではありませんでした。
インターフェイスがすっきりしないのが嫌なところですね。
設定値が多い時は、構造体に纏めてget/setするという事ですね。
0078デフォルトの名無しさん
2010/02/16(火) 17:08:13内部実装のためにあるデータだってあるでしょ
外部から見たときにset/getする必要があるやつだけ
publicなsetter/getterを定義すればいいよ
0079デフォルトの名無しさん
2010/02/16(火) 17:30:040080デフォルトの名無しさん
2010/02/16(火) 17:30:440081デフォルトの名無しさん
2010/02/16(火) 17:37:080082デフォルトの名無しさん
2010/02/16(火) 17:40:03とても若干良くある
クラスのコピーコストが気になるレベルならポインタ格納するなりlist使うなりするけど。
0083デフォルトの名無しさん
2010/02/16(火) 17:49:29明確な実装方法を表したサイトってないの?
0084デフォルトの名無しさん
2010/02/16(火) 17:51:390085デフォルトの名無しさん
2010/02/16(火) 17:58:08そんなものはない!
0086デフォルトの名無しさん
2010/02/16(火) 18:03:51オヌヌメ
0087デフォルトの名無しさん
2010/02/16(火) 18:09:34なるほど
ちなみにスレッドプールしておいたスレッドの空き/使用中の管理というのは自分でやる必要があるのでしょうか?
008879
2010/02/16(火) 18:25:17自分のプログラムで変なエラーが出てしまったので、もしかしたら間違ったやり方をしているのかと思いました。
できるんなら、何とかしてみます。
0089デフォルトの名無しさん
2010/02/16(火) 18:35:460090デフォルトの名無しさん
2010/02/16(火) 18:43:270091デフォルトの名無しさん
2010/02/16(火) 18:45:180092デフォルトの名無しさん
2010/02/16(火) 19:00:34beginthread云々からWin32と仮定すると
IOCPに管理させるのが楽かもよ。
0093デフォルトの名無しさん
2010/02/16(火) 20:48:190094デフォルトの名無しさん
2010/02/16(火) 21:25:460095デフォルトの名無しさん
2010/02/16(火) 22:00:150096デフォルトの名無しさん
2010/02/16(火) 22:12:520097デフォルトの名無しさん
2010/02/16(火) 22:22:49009897
2010/02/16(火) 22:23:480099デフォルトの名無しさん
2010/02/16(火) 22:24:190100デフォルトの名無しさん
2010/02/16(火) 22:25:080101デフォルトの名無しさん
2010/02/16(火) 22:38:450102デフォルトの名無しさん
2010/02/17(水) 00:38:250103デフォルトの名無しさん
2010/02/17(水) 01:05:07以前メモリプール使用のスマポで計測結果張ったものですが、こんなメモリプールつこてます。
ttp://codepad.org/rrn4ZXUQ
メモリ的にも処理的にも無駄を減らした実装でまだまだシンプルですが、使えるポイントはあると思います。
0104デフォルトの名無しさん
2010/02/17(水) 01:11:05int get()
{
return mVal;
}
これよりも効率よくmValを外部に返す方法ってありますか?
0105デフォルトの名無しさん
2010/02/17(水) 01:17:18まずインターフェースだけ考える。どんな変数を持ってるとかは敢えて考えないぐらいのつもりで、
とにかく利用者にとって自然な操作だけをメンバ関数(コンストラクタ含む)として列挙する。
それが済んでから、それらのメンバ関数を実装するための変数を必要なだけそろえる。
これなら「隠蔽になっていない」などという心配は起こりようが無いし、余計なコードも発生しない。
インターフェースを考える段階で、利用者から見て中にどんなデータが入っているのか
明らかでありメンバ関数呼び出しが煩雑なだけに見えるようなら、ただの構造体でいい。
0106デフォルトの名無しさん
2010/02/17(水) 01:38:40Test継承したら使えないジャマイカ
0107デフォルトの名無しさん
2010/02/17(水) 02:06:510108デフォルトの名無しさん
2010/02/17(水) 02:13:11#define get() mVal
foo.get();
0109デフォルトの名無しさん
2010/02/17(水) 04:46:59とおもって探した。
lock-free wiat-freeかはしらないがこれ。無料だとこれくらいかと。
Thread Safe Template Library
http://sourceforge.jp/projects/freshmeat_tstl/
IntelR Threading Building Blocks
http://www.threadingbuildingblocks.org/
0110 ◆GWRSHcLrd6
2010/02/17(水) 07:22:13あ、なんか僕が今作りなおしているやつも似た作りです。
これが効率よさそうですよね。
そういえばboostのsimple_segregated_storage(だっけ?)ってどういう仕組み何でしょうか?
>>109
なるほど。ちょいと見てみます
0111デフォルトの名無しさん
2010/02/17(水) 10:38:15どういった時に使うんでしょうか?
同じようなことができるboostのfunctionもです。
掴み所を教えてください
0112デフォルトの名無しさん
2010/02/17(水) 10:58:46可変長引数パラメータって何?
関数引数の ... のこと?
0113デフォルトの名無しさん
2010/02/17(水) 11:23:46そうです。
使い方はわかるし、boostも使い方は理解できるんですが
何に使うのかがわからないんです。
特に後者のboostは、仮想関数の引数としてfunctionを利用しても
結局テンプレートだからオーバーロードになるわけですよね?
呼び出し側で型指定するわけですし、多態的に動作させるのもできないのでは?
ここで混乱している感じです。
0114デフォルトの名無しさん
2010/02/17(水) 11:26:48printf() とか。
まぁ C++ では基本的に使わないな。
boost::function とは関係ないと思うけど、何のこと言ってんの?
0115デフォルトの名無しさん
2010/02/17(水) 11:32:54返り値の型、引数の型を指定して関数ポインタを楽に生成できるじゃないですか。
このテクニックを利用して、引数の数、型が変化する処理を多態的にさせたいんです。
0116デフォルトの名無しさん
2010/02/17(水) 11:43:01可変長引数に関しては>>114に同じくprintfがいい例だと思う。
可変長引数は、C++ではあまり推奨おらず、printfに関してもboost::formatを使った方がいい。
ttp://www.kmonos.net/alang/boost/classes/format.html
boost::functionに関しては、引数の型(個数も含む)が違えば、boost::functionの型も変わる(boost::functionはクラステンプレートであってクラスそのものではない)。
テンプレートによる静的多態なので、仮想関数の動的多態のようには扱えない。
0117116
2010/02/17(水) 11:55:42・可変長引数とboost::functionの使いどころは別である
・boost::functionは関数ポインタを使いやすくした物
あと、>>116の最後の行は紛らわしい書き方だった。
boost::functionの1つの具現化(戻り値と引数の型が同じ)においては、関数ポインタによる動的多態である。
0118デフォルトの名無しさん
2010/02/17(水) 12:11:45なるほど!
多態とはまた別物なんですね。
ボリモルフィズムが一気に広がるかもと思ったんですがね。
ありがとうございました。
0119デフォルトの名無しさん
2010/02/17(水) 12:22:49boost::function<void ()> で、引数は全部 bind するとか、
boost::function<void (std::vector<boost::any> const&)> で引数について型消去しながらやりくりするとか。
0120デフォルトの名無しさん
2010/02/17(水) 13:01:270121デフォルトの名無しさん
2010/02/17(水) 13:22:580122デフォルトの名無しさん
2010/02/17(水) 14:15:090123デフォルトの名無しさん
2010/02/17(水) 15:13:58http://www.gameenginejp.com/misc/2010/2010.html
0124デフォルトの名無しさん
2010/02/17(水) 15:37:29boostのどのライブラリより上では。
boostにこんなのないだろ。
0125デフォルトの名無しさん
2010/02/17(水) 15:45:260126デフォルトの名無しさん
2010/02/17(水) 15:46:170127デフォルトの名無しさん
2010/02/17(水) 15:50:33マルチコア時代で、CPUメーカー製の、フリーのこのライブラリは強力すぎる。
できたら毎日クリックしに行くからさ。
http://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クラスをスレッドセーフにしたもの
0128デフォルトの名無しさん
2010/02/17(水) 16:13:420129デフォルトの名無しさん
2010/02/17(水) 18:53:08static LONG flag;
if (flag == FALSE) {
flag = TRUE;
...
flag = FALSE;
}
このコードがまずいことはもうお分かりですね。 NT にはフラグのチェックとセットをアトミックに行える InterlockedCompareExchange がありますから、そちらを使いましょう。
if (InterlockedCompareExchange(&flag, TRUE, FALSE) == FALSE) {
...
InterlockedExchange(&flag, FALSE);
}
http://hp.vector.co.jp/authors/VA000092/win32/standard-coding.html
0130デフォルトの名無しさん
2010/02/17(水) 18:58:308スレッド
InterlockedIncrement 4.398sec
InterlockedCompareExchange 4.460sec
CriticalSection 6.297sec
http://d.hatena.ne.jp/streakeagle/20090205/1233833511
VC++ CriticalSectionの速度
何もないループが、0.515106秒に対しクリティカルセクションでは7.089556秒となった。
http://www.cycleof5th.com/tips/index.php?date=2007-05-30/3
同期オブジェクトの要約
速度
クリティカル セクション 高
ミューテックス 低
セマフォ 低
イベント 低
メータード セクション 高
http://msdn.microsoft.com/ja-jp/library/cc429052.aspx
0131デフォルトの名無しさん
2010/02/17(水) 19:08:05それぞれ直列に動作する関数を動かしたいんだけど
作業が終わったらキューを観察に行くけど無かった場合、次に入ってくるまで
どうやってまてばいいんだ? ひとつとしてビジーループはあるが。
それなら別変数用意してロック掛けた方が良い。ロック無しで出来る?
キューは一カ所にしてすべての処理関数スレッドで共有する方が無駄ないか。
0132デフォルトの名無しさん
2010/02/17(水) 19:22:53これならロック無しでアトミック命令だけでいけそう。
0133デフォルトの名無しさん
2010/02/17(水) 19:24:54スレッドの生成・消滅はせず、恥に生成したやつを使い回したいところ。
やっぱロックいるか。処理終了してキュー待ちのロック。
0134デフォルトの名無しさん
2010/02/17(水) 19:27:470135デフォルトの名無しさん
2010/02/17(水) 19:41:160136デフォルトの名無しさん
2010/02/17(水) 20:32:250137デフォルトの名無しさん
2010/02/17(水) 20:32:530138デフォルトの名無しさん
2010/02/17(水) 20:35:08boostまじ何でもあるな
奴らはいったい誰と戦ってるんだ
0139デフォルトの名無しさん
2010/02/17(水) 20:37:11C++の最適化に伴う変態記法なんて禿に親を殺されでもしない限りできないし。
0140デフォルトの名無しさん
2010/02/17(水) 20:39:02部品の足りない世界じゃないの?
というかWTLもC#並に充実させてください
0141デフォルトの名無しさん
2010/02/17(水) 20:45:06シートもハンドルもなく部品丸出しの車
0142デフォルトの名無しさん
2010/02/17(水) 20:47:45好い加減な比喩は滑稽なのでやめてください
0143デフォルトの名無しさん
2010/02/17(水) 20:48:41ttp://ja.wikipedia.org/wiki/%E3%82%B3%E3%83%AB%E3%83%BC%E3%83%81%E3%83%B3
Boost C++の何て言うライブラリで出来るのですか?
0144デフォルトの名無しさん
2010/02/17(水) 20:49:43vaultにあるにょ
0145デフォルトの名無しさん
2010/02/17(水) 20:52:04部品丸出しな上
自己責任で組み替え自由な仕様だな。
0146デフォルトの名無しさん
2010/02/17(水) 20:52:32部品丸出しな上
自己責任で組み替え自由な仕様だな。
0147デフォルトの名無しさん
2010/02/17(水) 20:52:41部品丸出しな上
自己責任で組み替え自由な仕様だな。
0148デフォルトの名無しさん
2010/02/17(水) 20:53:210149デフォルトの名無しさん
2010/02/17(水) 20:53:33部品丸出しな上
自己責任で組み替え自由な仕様だな。
0150デフォルトの名無しさん
2010/02/17(水) 20:55:480151デフォルトの名無しさん
2010/02/17(水) 20:57:31valtですか。
ありがとうございます。
0152デフォルトの名無しさん
2010/02/17(水) 20:58:22ttp://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 という対抗馬も最近出てきた
0153デフォルトの名無しさん
2010/02/17(水) 20:59:10バカが作ると部品を理解していなければならなくなる
仕様だな。
0154デフォルトの名無しさん
2010/02/17(水) 21:06:26#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(); }
0155デフォルトの名無しさん
2010/02/17(水) 21:08:51読み取って空いてるスレッドが足し合わせていくサンプル。
答えは合ってたよ。
0156デフォルトの名無しさん
2010/02/17(水) 21:10:280157デフォルトの名無しさん
2010/02/17(水) 21:20:49returnって打ったつもりだったら
tryit,
って打ってた
なんか感動した
0158デフォルトの名無しさん
2010/02/17(水) 21:21:460159デフォルトの名無しさん
2010/02/17(水) 21:22:040160デフォルトの名無しさん
2010/02/17(水) 21:23:35夢を感じた
0161デフォルトの名無しさん
2010/02/17(水) 21:33:09直列処理という枠に凝り固まった頭で見ると驚きの連続なんだろうな
0162デフォルトの名無しさん
2010/02/17(水) 21:39:17すっきりするエラー通知の仕方はある?
0163デフォルトの名無しさん
2010/02/17(水) 21:40:28すっきりするエラー通知の仕方はある?
0164デフォルトの名無しさん
2010/02/17(水) 21:42:11すっきりするエラー通知の仕方はある?
0165デフォルトの名無しさん
2010/02/17(水) 21:45:58すっきりするエラー通知の仕方はある?
0166デフォルトの名無しさん
2010/02/17(水) 21:46:420167デフォルトの名無しさん
2010/02/17(水) 21:57:560169デフォルトの名無しさん
2010/02/17(水) 22:07:13判断できる情報を
>>168
適材適所。常にどちらかがよいということはない
0170デフォルトの名無しさん
2010/02/17(水) 22:11:21MinGWで下をコンパイルは正常にでき(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;
}
0171デフォルトの名無しさん
2010/02/17(水) 22:12:440172デフォルトの名無しさん
2010/02/17(水) 22:18:32gccの独自拡張
0173デフォルトの名無しさん
2010/02/17(水) 22:25:20CreateThreadはWindowsAPI、_beginthreadはCランタイム。
CreateThreadで生成したスレッドでCランタイム関数を使うとExitThreadしたときにわずかだがメモリリークが発生するため、
MSはそのような場合には_beginthreadを使うように推奨している。
0175デフォルトの名無しさん
2010/02/17(水) 22:38:290176154
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(); }
0177デフォルトの名無しさん
2010/02/17(水) 22:44:40pスレッド windowsというのがあるが、おすすめしない。
一度にアクセスが起きるとバグった経験有り。同じ物をwindowsの命令に書き換えたら動いた。
スレッドのどれか一つ or全部の終了待ちがない気がする。
0178デフォルトの名無しさん
2010/02/17(水) 22:47:23Open Source POSIX Threads for Win32
http://sourceware.org/pthreads-win32/
0179デフォルトの名無しさん
2010/02/17(水) 22:51:55全て統一しようとしたがPthread for winがうまく動作しないので諦めた経験ある。
現在の環境で生産性の良い、短いコードで済ますのが一番という考えになった。
完成品が出来なければ意味ない。完成していれば他OSへも移植しやすい。
0180デフォルトの名無しさん
2010/02/17(水) 23:00:420181デフォルトの名無しさん
2010/02/17(水) 23:02:56サイズもでかいし
linuxでどこでも使えるのはPthreadだけでは
0183デフォルトの名無しさん
2010/02/17(水) 23:09:31This implementation is free software, distributed under the GNU Lesser General Public License (LGPL).
え?誰も聞いてないって?
0184デフォルトの名無しさん
2010/02/17(水) 23:13:490185デフォルトの名無しさん
2010/02/17(水) 23:16:360186デフォルトの名無しさん
2010/02/17(水) 23:18:220187デフォルトの名無しさん
2010/02/18(木) 00:57:43lock-freeの高速キューを作ってくれよ。
インラインアセンブラ・マクロの特殊構文の多用が原因と思われる。
windows 標準のcas命令のみで頼む。
Thread Safe Template Library
http://sourceforge.jp/projects/freshmeat_tstl/
Intel Threading Building Blocks
http://www.threadingbuildingblocks.org/
0188デフォルトの名無しさん
2010/02/18(木) 01:43:020189デフォルトの名無しさん
2010/02/18(木) 04:41:14コンパイル速度速くて良いんだこれは。
0190デフォルトの名無しさん
2010/02/18(木) 04:49:50取得してどのように変換すればいいのでしょうか?
日本時間に直すサンプルは見かけるのですがGMTのまま文字列化する方法が
わかりません
0191デフォルトの名無しさん
2010/02/18(木) 08:08:13マクロやアセンブラ使わずに書いてくれると喜ばれますよ
0192デフォルトの名無しさん
2010/02/18(木) 08:22:15これつかお
0193デフォルトの名無しさん
2010/02/18(木) 11:43:350194デフォルトの名無しさん
2010/02/18(木) 15:34:49strftimeじゃできないの?
0195デフォルトの名無しさん
2010/02/18(木) 19:14:32hoge( shared_ptr<Test>& sp )といったかんじになるんでしょうか?
それとも受け渡しは生のポインタで行い、オブジェクト側でスマートポインタに格納ような
使い方ですか?
0196デフォルトの名無しさん
2010/02/18(木) 19:44:090197デフォルトの名無しさん
2010/02/18(木) 20:07:01僕はクラスのメンバ関数が前提なら、
関数を所有するクラスがオブジェクトをメンバ変数に保持するときはスマートポインタを、
一時的に使うだけなら参照で渡します。
>それとも受け渡しは生のポインタで行い、オブジェクト側でスマートポインタに格納ような
一番やっちゃいけない気がするんですけど・・・
0199デフォルトの名無しさん
2010/02/18(木) 21:44:30アドバイスありがとうございます。
手元のどの参考書見ても変数は使えないと書いてあってあれ?と思っていたしだいです。
Visual C++で使えないようなのでgccだけなんですね。
0200デフォルトの名無しさん
2010/02/18(木) 22:19:13ありがとうございます。
今試してみましたが同一ポインタを複数のshared_ptrに格納すると、
shared_ptrの数だけデストラクタが呼ばれてしまうんですね。
基本は参照で複製を作らないようにするということですね。
0201デフォルトの名無しさん
2010/02/18(木) 22:21:29そう。
RAIIを徹底しろ。
0202デフォルトの名無しさん
2010/02/18(木) 22:21:59>>196 >>198でした。
0203デフォルトの名無しさん
2010/02/18(木) 22:22:59コンパイル時定数を使った
ttp://codepad.org/EmT4J9d3
こんなifによる分岐があるとします。
このとき、成果物.exeはちゃんと最適化されて
分岐が消えるのでしょうか?
よろしくお願いします。
0204デフォルトの名無しさん
2010/02/18(木) 22:25:050205デフォルトの名無しさん
2010/02/18(木) 22:36:54const bool ctc = 100; // compile-time constants
を
bool ctc = 100; // NOT compile-time constants
にしても同じでしょうか?
(volatileは付けません。)
お手数をおかけ致しますが、よろしくお願いします。
0206デフォルトの名無しさん
2010/02/18(木) 22:50:06に関しても同じ(キャストはちゃんとした方がいい)。
そもそも実行時への互換性を保たないと最適化というのはできないからね。
bool ctc = 100; // NOT compile-time constants
でも、単純にctcへの変更が無い事から最適化がなされた(204と同じ環境で)。
ただ、このケースは後のコードに完全に依存しているから考察する価値はあるのかどうか疑問だな。
0207205
2010/02/18(木) 23:02:24ご教示ありがとうございます。
そういったことは、どうやって調べればよいのでしょうか?
.asmを出力して調べているのでしょうか?
0208デフォルトの名無しさん
2010/02/18(木) 23:05:31そうだよ。
0209デフォルトの名無しさん
2010/02/18(木) 23:08:170210デフォルトの名無しさん
2010/02/18(木) 23:08:49ありがとうございます。
asmからは逃げ回ってきているので全然読めそうにありません。
勉強しなければなりませんね。。。
0211デフォルトの名無しさん
2010/02/18(木) 23:09:330212デフォルトの名無しさん
2010/02/18(木) 23:15:53扱いが違うからやだ
0213デフォルトの名無しさん
2010/02/18(木) 23:16:19低級だから追いかけるのが大変なだけで難しい構文とかはむしろ少ないんだろうけど・・・
0214デフォルトの名無しさん
2010/02/18(木) 23:21:240215デフォルトの名無しさん
2010/02/18(木) 23:23:200216デフォルトの名無しさん
2010/02/18(木) 23:27:53移植性もあってすげえ言語だな。
今更だけど。
0217デフォルトの名無しさん
2010/02/19(金) 00:45:23cが優秀じゃなくてcコンパイラ作った人が優秀なだけだな
0218デフォルトの名無しさん
2010/02/19(金) 01:11:59Cコンパイラは、上司が監視して下っ端が要求通り作ってるだけ。
初めの設計図が一番。
たとえば、アニメは動画マンという超低賃金のやつらがやっているが
宮崎駿や原作漫画家がいるから開発できるんだ。
0219デフォルトの名無しさん
2010/02/19(金) 01:18:03現存するコンパイラは確かに規格ありきで作り始めてそうだけど、元々は
たくさんの環境向けに作られていた C の共通部分を元に規格化されたんだから、
先にコンパイラ作ってた人が下っ端ということはないだろう。
0220デフォルトの名無しさん
2010/02/19(金) 01:33:47まあ初期のC言語確立やコンパイラ作ったような人たちは
上も下もねーだろうな
小さいチームで多少リーダー的存在がいるくらいだろうし
そういう中で試行錯誤しながらとかだろうし
その後の各環境ごとのコンパイラ開発はC言語そのものがあるんだし
それにあわせちゃえばいいので作業だろうな
(でもそれなりに知識は要るので下っ端ってわけじゃないだろうけど
0221デフォルトの名無しさん
2010/02/19(金) 02:48:53そんな渡し方したら危険じゃない?
0222デフォルトの名無しさん
2010/02/19(金) 05:22:11要求を並列で出しておくと時間短縮するね。
細かい多数のファイルで2倍-3倍くらいの向上。
0223デフォルトの名無しさん
2010/02/19(金) 06:34:440224デフォルトの名無しさん
2010/02/19(金) 07:29:300225デフォルトの名無しさん
2010/02/19(金) 12:47:040226デフォルトの名無しさん
2010/02/19(金) 14:45:100227デフォルトの名無しさん
2010/02/19(金) 15:58:570228デフォルトの名無しさん
2010/02/19(金) 17:54:32boost使ってる人なら正規表現なんだろうけど、
使って無い人が気になる。
0229デフォルトの名無しさん
2010/02/19(金) 18:03:44正規表現で代用
0230デフォルトの名無しさん
2010/02/19(金) 18:21:070231デフォルトの名無しさん
2010/02/19(金) 21:12:550232デフォルトの名無しさん
2010/02/19(金) 21:14:550233デフォルトの名無しさん
2010/02/19(金) 21:31:27そういう問題ではあるまい?
0234デフォルトの名無しさん
2010/02/19(金) 21:33:360235デフォルトの名無しさん
2010/02/19(金) 21:36:52下のコードはメモリの確保と解放がきちんとなされてるでしょうか?
http://codepad.org/GUSgjZWM
0236デフォルトの名無しさん
2010/02/19(金) 21:39:350237デフォルトの名無しさん
2010/02/19(金) 21:45:42改めていわれなくてもこんなところ見てる段階で暇・・・
0238デフォルトの名無しさん
2010/02/19(金) 22:05:30正規表現が無い環境だってあるじゃない。
外部ライブラリも不可とか。
その例で言うとC++が使えない環境という事。
「C++使えないなんてあるわけないじゃん」とは言えまい?
0239デフォルトの名無しさん
2010/02/19(金) 22:10:36C++使えないって、組み込み系とかですか?
なんかろくなコンパイラがないってことなんでしょうか。
0240デフォルトの名無しさん
2010/02/19(金) 22:19:26例えばの話です。
組み込み系なんてサッパリ^O^
0241デフォルトの名無しさん
2010/02/19(金) 22:23:34話の流れ方に病的なものを感じる。
0242デフォルトの名無しさん
2010/02/19(金) 22:24:520243デフォルトの名無しさん
2010/02/19(金) 22:26:19あったねー、OS にワイルドカードがなくてアプリが独自にサポートしてたケース
アプリごとに微妙に解釈が違ってて脱力ずっこけが何度もあった
>>239
C++ 自体はどのシステムにでも使えるぞ、C++ で HEX や HDL が作れるわけで
0244デフォルトの名無しさん
2010/02/19(金) 22:26:46パッと見だがリークすると思う
t = new Test;
を解放してない
delete t;
が必要じゃない?
0245デフォルトの名無しさん
2010/02/19(金) 22:28:240247デフォルトの名無しさん
2010/02/19(金) 23:49:29の途中で失敗した場合のリークも
0248デフォルトの名無しさん
2010/02/20(土) 01:39:58既存の関数を実効させる部分をテンプレートで
実装したいのですが、どのように書けばいいのか
わかりません。
たとえば、f1、f2、f3を同じworke threadクラスで
扱うにはどのようにコーディングするのが正しいのでしょうか
0249デフォルトの名無しさん
2010/02/20(土) 01:47:04>>176のunsigned WINAPI fnc(void *n);もワーカースレッドだな。参考にしてくれよ。
0250デフォルトの名無しさん
2010/02/20(土) 01:48:51スレッドからデータを取り出し処理を行う。
0251デフォルトの名無しさん
2010/02/20(土) 01:51:15面倒なので100ms毎に確認しに行くようになっている。
0252デフォルトの名無しさん
2010/02/20(土) 11:59:32いきなり書き始める?
きっちり考えて書く?
書き始めたとしても、ヘッダでインラインで書きまくって、動作したらcppと分割する?
それとも最初からわけて書く?
0253デフォルトの名無しさん
2010/02/20(土) 12:28:31ただ、確実にこれはいるなってデータや関数は
あまり考えないでも書く
ヘッダにインラインで書くのはコンパイル時間との兼ね合い
大きいプログラムを書くときは最初から分ける
俺のオススメは
2回同じことを書くまでは出来るだけ抽象化しない
逆に2回同じことを書いた時点で必ず抽象化する
こうすると、バグの発生源が重複しないので大分バグをつぶしやすくなる
ただ、多人数での開発には使いにくいだろうが
0254デフォルトの名無しさん
2010/02/20(土) 12:30:19まず絶対UMLとシーケンス図を書く
その後細かいところはフローチャートを書く
2、3時間でできることだから必ず行う
その後1回で製造する。
0255デフォルトの名無しさん
2010/02/20(土) 12:42:07いきなり書く。
パフォーマンスを計る。
もう一度書く。
ライブラリ化する。
0256デフォルトの名無しさん
2010/02/20(土) 12:51:21ビル・橋・道路の設計者ではなく、日雇いの土木作業員。
0257デフォルトの名無しさん
2010/02/20(土) 12:58:58頭の中で色々練っている最中に、その助けとしてちょこちょこ手を動かすことはある。
メモというかスケッチというか、そんな感じのコード。
で、その一部が断片的に「本番」に流用されることならある。
0258デフォルトの名無しさん
2010/02/20(土) 14:52:220259デフォルトの名無しさん
2010/02/20(土) 15:00:58スクリプトで書く
遅いところをC/C++に置き換える
寝る
0260デフォルトの名無しさん
2010/02/20(土) 15:08:48トイレに行く
コードを書きながら飯を食べる
コメントを直す
0261デフォルトの名無しさん
2010/02/20(土) 15:11:110262デフォルトの名無しさん
2010/02/20(土) 15:13:31下っ端に薄給で作らせる
0263デフォルトの名無しさん
2010/02/20(土) 17:57:01たとえばこんな関数があったときに、どこかでret=trueになったら
一番最初にfを呼び出した箇所へ飛んで関数を終わらせたい
bool f(){
bool ret=false;
//処理によってret=trueになったりならなかったり
for(int i=0;i<n;++i){ret|=f();}
return ret;
}
gotoで抜けられるのは今いる関数内のループだけだと思うので無理?
0264デフォルトの名無しさん
2010/02/20(土) 18:00:50無理です。
0265デフォルトの名無しさん
2010/02/20(土) 18:07:53たとえば、例外的なことがおきたときにプログラムの実行を中断したいというのであれば、
例外が使える。
だけど、例外は例外的な事以外に乱用すると非常に見通しの悪いプログラムになるから注意。
0266デフォルトの名無しさん
2010/02/20(土) 20:34:56bool f(){
//処理によってret=trueになったりならなかったり
for(int i=0;i<n;++i){if(f())return true;}
return false;
}
0267デフォルトの名無しさん
2010/02/20(土) 23:19:09勉強した方がいいのでしょうか。
0268デフォルトの名無しさん
2010/02/20(土) 23:24:240269デフォルトの名無しさん
2010/02/20(土) 23:25:15やっぱり勉強します。
ありがとうございます。
0270デフォルトの名無しさん
2010/02/21(日) 00:14:10いつもではなくたまに。どうみてもエラーになり得ないところで例外。
そのためにtbb_allocがついているのか。
メモリ管理をtbb専用で全部置き換えれば直るんですか。
0271デフォルトの名無しさん
2010/02/21(日) 00:29:16>いつもではなくたまに。どうみてもエラーになり得ないところで例外。
使い方が間違ってて排他処理で失敗してるだけじゃないの?
0272デフォルトの名無しさん
2010/02/21(日) 00:49:380273デフォルトの名無しさん
2010/02/21(日) 01:16:49とやると、
std::allocator がstd::scalable_allocatorになる。
std::allocator がtbb::scalable_allocatorにはどすればいい。
::がdefineにかけない。
0274デフォルトの名無しさん
2010/02/21(日) 01:19:090275デフォルトの名無しさん
2010/02/21(日) 01:33:30typedef xxx::myallocator myallocator;
}
#define allocator myallocator
0276デフォルトの名無しさん
2010/02/21(日) 01:47:52template<typename T> class scalable_allocator;
となっていて、テンプレート引数が必要と出ます
0277デフォルトの名無しさん
2010/02/21(日) 01:53:11stdをstd0に書き換えて、tbbをstdにして、ここでヘッダを読み込み
std0をstdに戻せば、善さげなきはする。
別名で存在している関数をdefineで置き換えたらいけそう
0278デフォルトの名無しさん
2010/02/21(日) 02:06:200279デフォルトの名無しさん
2010/02/21(日) 02:08:020280デフォルトの名無しさん
2010/02/21(日) 02:25:010281デフォルトの名無しさん
2010/02/21(日) 02:26:170282デフォルトの名無しさん
2010/02/21(日) 02:44:480283デフォルトの名無しさん
2010/02/21(日) 02:57:58それをtypedefするというのは駄目なの?正統派だと思うのだけど。
C++0xなら
template<typename T>
using vector_tbb<T> = std::vector<tbb::scalable_allocator<T>>;
と書いて、vector_tbb<int>とかvector_tbb<std::string>とか書けるようになるんだけど、
まだ未来の話……。
0284デフォルトの名無しさん
2010/02/21(日) 06:26:39vector<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(), ?? );
ぐらいに短く書きたいのですが、なにかいい方法あります
0285デフォルトの名無しさん
2010/02/21(日) 06:30:240286デフォルトの名無しさん
2010/02/21(日) 06:37:400287デフォルトの名無しさん
2010/02/21(日) 07:02:32>>285
クラスを定義しようとすると、結局長くなってしまいますし、離れた場所に書くことになるため気に入りません。
>>286
それが良いですね。勉強になりました。
intの場合はそれでいいのですが、もうすこし一般化して、 if( a[i] >= 0 ) の場合などにも使える方法はありますか?
0288デフォルトの名無しさん
2010/02/21(日) 08:10:08関数内クラス
boost::lambda
c+0x lambda関数
0289デフォルトの名無しさん
2010/02/21(日) 08:49:16count_if(a.begin(), a.end(), bind2nd(not_equal_to<int>(), 0))
みたいなのをちょっとずつ変えれば
0290デフォルトの名無しさん
2010/02/21(日) 12:20:46どうにかならんかね?
0291デフォルトの名無しさん
2010/02/21(日) 18:00:32void foo(){
std::cout << "foo\n";
}
の中で
void foo(){
void bar(){std::cout << "bar\n";}
bar();bar();bar();bar();
std::cout << "foo\n";
}
こんな風に。
普通に考えてC++では違反だと思うのだが、
どうにか回避するトリックとか。
0292デフォルトの名無しさん
2010/02/21(日) 18:03:15ローカルクラスを使う。
ttp://www.fides.dti.ne.jp/~oka-t/cpplab-tips-1.html
0293デフォルトの名無しさん
2010/02/21(日) 22:27:520294デフォルトの名無しさん
2010/02/21(日) 22:37:370295デフォルトの名無しさん
2010/02/21(日) 23:05:50C++ではあまり必要性がないと思う。ローカルクラスや関数内関数
クロージャはまた別だけど
0296デフォルトの名無しさん
2010/02/21(日) 23:08:02あと0xでlambdaの型が外部に渡せるのに未だ渡せないローカルクラスは生きている意味があるのかと問いたい。
0297デフォルトの名無しさん
2010/02/21(日) 23:13:18ローカルクラスにできて他にできないことって特にないよなぁ
ローカルのほうが散らかさないで書ける場合はあるけど
0298デフォルトの名無しさん
2010/02/21(日) 23:17:580299デフォルトの名無しさん
2010/02/21(日) 23:18:330300デフォルトの名無しさん
2010/02/21(日) 23:27:08(=スマートポインタのデリーターみたいな感じ。)
それとC++0xからはテンプレート引数に渡せるようになるね。
0301デフォルトの名無しさん
2010/02/21(日) 23:29:21○ カスタムデリーター
です。
0302デフォルトの名無しさん
2010/02/21(日) 23:35:290304デフォルトの名無しさん
2010/02/22(月) 00:49:41"A",
"B"
};
これってバグの元になる?
int i = sizeof(str) / sizeof(str[0]);
こうするときとかに。
0305デフォルトの名無しさん
2010/02/22(月) 00:52:44中身のデータが違ってもインスタンスの大きさはそれぞれ同じ。
0306デフォルトの名無しさん
2010/02/22(月) 00:54:13即レスかつわかりやすい説明ありがとうございます。
不安がなくなりました。
0307デフォルトの名無しさん
2010/02/22(月) 00:58:510308デフォルトの名無しさん
2010/02/22(月) 01:01:140309デフォルトの名無しさん
2010/02/22(月) 01:03:48何を心配してたのかわかんない。少し解説してもらえるとうれしい。
0310デフォルトの名無しさん
2010/02/22(月) 01:08:08って文字列の長さが違うからsizeof(a)とsizeof(b)で同じ数値になるの!?
std::stringで配列作っていいの!?!?!??!?!!!???わかんないです><;;;;;
→ のーぷろぶれむ
0312デフォルトの名無しさん
2010/02/22(月) 01:47:53#defineの代わりにしたいんですが,
このint値はそのクラスのインスタンスを生成してなくても,
メモリ上に存在するのでしょうか?
そうなると,大規模開発では避けるべきなのでしょうか?
0313デフォルトの名無しさん
2010/02/22(月) 01:51:080314デフォルトの名無しさん
2010/02/22(月) 02:00:33モジュールで共有?
0315デフォルトの名無しさん
2010/02/22(月) 17:47:17最適化すりゃどうせ消える
0316デフォルトの名無しさん
2010/02/22(月) 21:00:22まあ理屈はそうだけども、
現実的にはその最適化がなされないような状況は
明示的にコンパイルオプションで止めろ!
と言わない限りおこんなinじゃない?
0317デフォルトの名無しさん
2010/02/22(月) 21:40:040318デフォルトの名無しさん
2010/02/22(月) 21:56:370319デフォルトの名無しさん
2010/02/22(月) 22:40:59ソースコード。
http://github.com/facebook/hiphop-php
0320デフォルトの名無しさん
2010/02/23(火) 01:04:04C++テンプレートメタプログラミング
糞本かな?
えぴなんとかさんの書いた類の糞本レベル?
0321デフォルトの名無しさん
2010/02/23(火) 05:41:330322デフォルトの名無しさん
2010/02/23(火) 12:14:03昔の掲示板ログとか見るととんちんかんな感じだよね
えぴなんとかさんが初心者だったころなのかもしれないけど
0323デフォルトの名無しさん
2010/02/23(火) 18:19:02http://episteme.wankuma.com/stlprog/index.html
0324デフォルトの名無しさん
2010/02/23(火) 18:48:30公開しているドキュメントでお世話になってはいるけど、近づきたくない感じ
0325デフォルトの名無しさん
2010/02/23(火) 19:14:150326デフォルトの名無しさん
2010/02/23(火) 19:41:100327デフォルトの名無しさん
2010/02/23(火) 19:47:580328デフォルトの名無しさん
2010/02/23(火) 20:52:330329デフォルトの名無しさん
2010/02/24(水) 00:19:05インなんとかさんみたいなもんか?
0330デフォルトの名無しさん
2010/02/24(水) 00:42:060331デフォルトの名無しさん
2010/02/24(水) 00:50:370332デフォルトの名無しさん
2010/02/24(水) 01:07:230333デフォルトの名無しさん
2010/02/24(水) 01:08:020334デフォルトの名無しさん
2010/02/24(水) 01:11:44今チェックしたんだけど
機種依存文字じゃなかったぞ
0335デフォルトの名無しさん
2010/02/24(水) 06:51:15こいつはマルチポストだから相手にしないように!
0336デフォルトの名無しさん
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;
}
0337デフォルトの名無しさん
2010/02/24(水) 18:33:57一般に組み込み型と同じ挙動になるようにデザインするほうが良いと
EffectiveC++にも書いてあるし
0338デフォルトの名無しさん
2010/02/24(水) 18:40:120339デフォルトの名無しさん
2010/02/24(水) 19:21:48君の意見は正しい。
coord coord::operator-()const;
とすれば納得できると思う。
0340336
2010/02/24(水) 19:57:51ありがとうございました。
これで先に進めます。
0341デフォルトの名無しさん
2010/02/24(水) 23:20:04*thisを返すからいいんじゃないの?
0342デフォルトの名無しさん
2010/02/24(水) 23:23:330343デフォルトの名無しさん
2010/02/24(水) 23:28:54(取り扱えない例外をキャッチしたなど。)
そこで即座に終了したい場合、
assert(0);
exit(1);
のどちらが望ましいのでしょうか?
また、この2つにはどんな違いがあるのでしょうか?
よろしくお願い申し上げます。
0344デフォルトの名無しさん
2010/02/24(水) 23:33:31ああ、すまない。ぼけてたorz
もう寝る…
0345デフォルトの名無しさん
2010/02/24(水) 23:42:17assertは、ここでこうなってるはずがない、というプログラマの意思表示
んで、それはリリースビルドだとなくなるロジック
0346デフォルトの名無しさん
2010/02/24(水) 23:59:19一般的なpImplイディオムは、コンストラクタでimpクラスをnewしていますが、
いま設計しているpImplを利用したクラスは、何度もインスタンス化されるので、newしたくありません。
また、Factory関数を作って、利用者側にわざわざ呼ばせたくありません。
つまり、クラスの利用者から、実装クラスを隠蔽し、かつインスタンス化時に何度もnewしないような方法はありますでしょうか?
(妥協して、メンバ変数だけインターフェース部に持ってきて、実装クラスをSingletonにする、など考えてみましたが、案の定イマイチでした)
0347デフォルトの名無しさん
2010/02/25(木) 00:22:000348デフォルトの名無しさん
2010/02/25(木) 01:11:41その用途だと abort() あるいは terminate() が正解だと思う。
assert() と exit() 含めて、それぞれの違いはライブラリのドキュメント読んでね。
0349デフォルトの名無しさん
2010/02/25(木) 01:14:23new したくないっていうのは動的メモリ確保のコストを嫌っての話だよね?
そういうことなら、外側のクラスに char impl_storage[max_size] みたいな領域だけ
置いといて、実装クラスでは new (impl_storage) impl(....) すればいいかもしれない。
0350デフォルトの名無しさん
2010/02/25(木) 01:16:15dlmallocなんて単純だからすぐ作れるし
自分でmalloc作ればいいよ
0351デフォルトの名無しさん
2010/02/25(木) 01:20:56まず、ふつうに new する状態でパフォーマンスに問題があって、次にそのボトルネックが
new にあるという確認を済ませ、さらに >350 の言うように dlmalloc などによる高速化を試みた後、
それでも問題が残るようなら >349 のような奇怪なコードを、十分なコメントを添えたうえであれば、
書いても良い。
それ以外は許さん。
0352デフォルトの名無しさん
2010/02/25(木) 01:51:00実装インスタンスのnewコストを気にするんだったら、不要になったら再利用できるように簡単なGC作ったら?
実装インスタンス自体は利用者から見えないから、別にFactory関数で管理しても問題ないだろうし。
お手軽に実装するんだったらboost::shared_ptr + deleterかね。
0353デフォルトの名無しさん
2010/02/25(木) 02:01:58assertは開発作業中のマーキングや「しおり」のようなものだと考えたほうがいいと思う。
exitはatexitの登録関数やストリームI/Oの後始末をしてから終了する。
C用の例外の代替物と見るべきで、C++では使わないだろう。デストラクタは実行されないし。
terminate(abort)なら後始末もせずに割り込みを掛けて即座に終了するが、
そこまでしたい状況は考えにくい。
結局、例外をそのまま放っておいてmainでキャッチしてreturn 1;とかするのが
常道だと思う。
0354デフォルトの名無しさん
2010/02/25(木) 02:05:19取り扱えない例外ははじめからキャッチするなよ。
万一そんな状況がやむを得ないとすれば、 throw; で外に向けて投げとけばいいよ。
そうすれば勝手に terminate() するかもしれないし、誰かがキャッチしてくれるかもしれない。
0355デフォルトの名無しさん
2010/02/25(木) 03:30:24構造体とは違うっぽいのでしなくてもいい?速度的に
0356デフォルトの名無しさん
2010/02/25(木) 03:38:12速度が気になるなら計測してみるがいい。
参照渡しがよくあるポインタと同様の実装だと考えると、 enum のサイズがポインタより
大きくなることはなさそうで、あまりメリットはなさそうな感じではある。
0357デフォルトの名無しさん
2010/02/25(木) 03:54:59配置newって嫌われ者なの?
0358デフォルトの名無しさん
2010/02/25(木) 05:48:41列挙型の実態が整数"ではない”実装を見たことがない。
0359デフォルトの名無しさん
2010/02/25(木) 09:35:37別に配置newは嫌いじゃないですが、必要ないところで使うような人は嫌いです。
0360デフォルトの名無しさん
2010/02/25(木) 10:53:340361デフォルトの名無しさん
2010/02/25(木) 10:55:150362デフォルトの名無しさん
2010/02/25(木) 11:33:040363349
2010/02/25(木) 12:07:15boost::aligned_storage は標準ライブラリでもないし、コンパイラの拡張機能で指定した
ほうがいいかもしれないし、その場で適当な union 作ってしのぐのがいいかもしれないし、
そんな気持ちを込めて「〜みたいな領域」と書きました。
0364343
2010/02/25(木) 12:49:32ありがとうございます。
assert() exit() terminate() abort()
について勉強してきます。
0365デフォルトの名無しさん
2010/02/25(木) 17:02:41>そんな気持ちを込めて「〜みたいな領域」と書きました。
どう考えてもそれだけの情報からその気持ちは伝わらないから。
頭大丈夫?日本語分かる?精神鑑定してもらったら?
0366デフォルトの名無しさん
2010/02/25(木) 20:49:40A-Z a-z 0-9
1 1 2 3
2 1 2 3
3
4
な表ってなんて名前だっけ?
0367デフォルトの名無しさん
2010/02/25(木) 20:57:50LR解析表なのか?状態複数あって
LR衝突してないのか?
0368デフォルトの名無しさん
2010/02/25(木) 21:03:59表の中は説明で適当に書いただで意味はないんだ。
どんな名前だったか忘れてしまったもんで。
助かったよ。ありがとう
0369デフォルトの名無しさん
2010/02/25(木) 22:34:38俺には伝わっていたが、伝わらない人がいるのもわかる。
そして、伝わらなかったからといってそのようなレスをするあなたが心配です。
0370デフォルトの名無しさん
2010/02/26(金) 13:26:29g++ -lhoge test.cpp
という調子でライブラリを読み込んで成功したとき、
hogeの場所を知るコマンドってありますか?
具体的には
g++ -llapack test.cpp
なのですが、これは
Fortranのライブラリをリンクしているそうです。
Fortranでは
DSYEV
という関数名なのがC系だと
dsyev_
と、アンダーバーがつくようになるというのがよく分からないので・・・。
0371デフォルトの名無しさん
2010/02/26(金) 14:38:16それにOS依存の話題だったら微妙にスレ違いだぜ
0372デフォルトの名無しさん
2010/02/26(金) 15:45:410373デフォルトの名無しさん
2010/02/26(金) 15:47:09・ラッピングした際に小文字にしたんでしょう
0374デフォルトの名無しさん
2010/02/26(金) 16:06:37http://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.
0375デフォルトの名無しさん
2010/02/26(金) 17:11:46だんだん事情が分かってきました。
人間がCに移植しているわけではないのですね。
clapack.h
をみても、単に宣言が書いてあるだけなので、
Cのソースコードとしてincludeするわけでもないのか。
あと前半はたしかにOS依存の話ですね。
手元の環境ではLD_LIBRARY_PATHも空だったし。
すみませんでした。
0376デフォルトの名無しさん
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になるってのは保証されますか?
私には未定義の動作になりそうに見えるのですが。
よろしくお願いします。
0377デフォルトの名無しさん
2010/02/26(金) 20:07:070378デフォルトの名無しさん
2010/02/26(金) 20:25:05int m =++b, a , ++b;
の場合はどうなりますか?
bとmが5になりますか?
それとも未定義の動作でしょうか?
0379デフォルトの名無しさん
2010/02/26(金) 20:30:140380デフォルトの名無しさん
2010/02/26(金) 20:39:49だとOKで、
int m =++b, a , ++b;
だと未定義の動作なのですね。
うーん、ややこしいです。
両方とも一つの式の中で2回bの値が
変化しているように思うのですが、
どういった相違により
片方がOKでもう一方はダメに
なるのでしょうか?
0381デフォルトの名無しさん
2010/02/26(金) 20:41:580382デフォルトの名無しさん
2010/02/26(金) 20:54:23struct{unsigned a;unsigned operator()(int x){return ++a<<x;}}r={1};
retrun r(0)|r(8)|r(16)|r(24);}
0x04030201 // 式中でオブジェクトの順状態て保証される?
0383デフォルトの名無しさん
2010/02/26(金) 21:00:47されない
0384デフォルトの名無しさん
2010/02/26(金) 21:42:11>>378 の m, b ともに 5 になることは保証されているぞ (5.18-1)
m=func(++b, a, ++b); だと未定義動作だけどな。
>>376 副作用完了点でぐぐってみるべし
0385デフォルトの名無しさん
2010/02/26(金) 22:03:09未定義
0386380
2010/02/26(金) 22:23:55int m = (a)>(++b) ? (a):(++b); は正当で
int m =++b, a , ++b; も正当
ですが
int m =++b, ++b;
は未定義ということなのですか?
int m=(++x) + (++x); は未定義動作になりますか?
0387デフォルトの名無しさん
2010/02/26(金) 22:39:060388デフォルトの名無しさん
2010/02/26(金) 22:39:58int a=3;
int b=3;
int m =++b, a , ++b;
このときにmが5になることが保証されているといっている?
0389デフォルトの名無しさん
2010/02/26(金) 22:40:350390デフォルトの名無しさん
2010/02/26(金) 22:43:36カンマ演算子は副作用完了点たりえないのでは?
0391390
2010/02/26(金) 22:45:150392384
2010/02/26(金) 22:46:490393デフォルトの名無しさん
2010/02/26(金) 22:54:23自信満々のところ水を差すようだけど、 >389 の言うとおりコンパイルエラーになると思うんだ。
カンマ演算子とか言ってるところを見ると、
int m =(++b, a , ++b);
こう解釈したんだろうとは思うけど。
0394デフォルトの名無しさん
2010/02/26(金) 22:54:31int b=1;
int a=++b&&++b&&b;
こんなのでもちゃんとa=3になるな
しかしひどいコードだ
0395デフォルトの名無しさん
2010/02/26(金) 22:57:410396デフォルトの名無しさん
2010/02/26(金) 22:59:04その程度だろ
http://codepad.org/8ZqDzVjC
今話してる話題と関係ないだろ
0397デフォルトの名無しさん
2010/02/26(金) 23:07:280398デフォルトの名無しさん
2010/02/26(金) 23:08:140399デフォルトの名無しさん
2010/02/26(金) 23:11:21コンパイルエラーにはならず、カンマ演算子の最後、つまり2回目の++bが値として使われるので
mに4が代入された後、bはインクリメントされる。
なので、>>388を書いた。
0400デフォルトの名無しさん
2010/02/26(金) 23:16:56なんだか知らんが
++bは前置増分演算子って呼ぶってことは知ってるの?
0401デフォルトの名無しさん
2010/02/26(金) 23:20:01ああこういう意味でコンパイルエラーってことね。
上記の話をまとめると
int m =(++b, a , ++b);
は
ttp://codepad.org/J7jHthUQ
のようになり、正当な動作をするって考えていいのね。
0402デフォルトの名無しさん
2010/02/26(金) 23:21:463項演算子(条件演算子
カンマ演算子
&&
||
の4つは、副作用完了点となるから
それらのオペランドに++aが複数回出現しても
未定義の動作にならないってこと?
0403デフォルトの名無しさん
2010/02/26(金) 23:29:57なんだかどうしようもないところでボケていてすまんかった
0404デフォルトの名無しさん
2010/02/26(金) 23:45:55「オーバーロードされてなければ」それで合ってる
0405デフォルトの名無しさん
2010/02/27(土) 15:54:25このコードで
std::cout << hairetsunoyousosuu(arr) << std::endl;
の部分は 期待通りになるのですが
std::cout << foo(arr) << std::endl;
の部分が期待通りになりません。
どうすれば
「引数として渡された配列の要素数を返す『関数』」
が書けるでしょうか?
よろしくお願い申し上げます。
0406デフォルトの名無しさん
2010/02/27(土) 16:00:57コンパイル時にわかるものなら_countofを参考にする
それをDLLとして公開するとか誰が渡すんだかわからないものを自動で取得する汎用的な方法はない
0407デフォルトの名無しさん
2010/02/27(土) 16:03:23main::arrはint[5]型
foo::argはint[]型
sizeof(int[5])はsizeof(int*) * 5
sizeof(int[])はsizeof(int*)
int*とintの大きさがたまたま同じだっただけ。
0408デフォルトの名無しさん
2010/02/27(土) 16:05:30ポインタとは違ってmainで定義したarrの要素全部がコピーされるけどね。
0409デフォルトの名無しさん
2010/02/27(土) 16:34:500410デフォルトの名無しさん
2010/02/27(土) 16:42:250411デフォルトの名無しさん
2010/02/27(土) 18:23:11なんか codepad は Error 500 で見れなかったんだけども、こういう話?
http://d.hatena.ne.jp/matsutakegohan1/20071006/1191643652
0412405
2010/02/27(土) 19:19:17みなさんありがとうございます。
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)))
ですと、どちらが望ましいのでしょうか?
0413デフォルトの名無しさん
2010/02/27(土) 19:24:04どちらが望ましいかは場合によるね。
前者はコンパイル時定数としては使えない。
後者はコンパイル時定数として使えるようにしてあるけど、そのために読みにくく
なっているし、基本的に避けるべきであるマクロまで組み合わされている。
0414デフォルトの名無しさん
2010/02/27(土) 19:39:51なるほど、そう言った違いがあるのですね。
ありがとうございました。
0415デフォルトの名無しさん
2010/02/27(土) 19:43:00ここに書いてあることについてお伺いしたいのですが。
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文字であってもだめなのでしょうか?
よろしくお願い申し上げます。
0416デフォルトの名無しさん
2010/02/27(土) 19:46:070417デフォルトの名無しさん
2010/02/27(土) 20:04:49多バイト文字を含む文字列の各要素も
isalphaでアルファベットかどうかを調べることが可能と言うことでしょうか?
たとえば
"あいうえおabcd"
のような全角文字でもできるのでしょうか?
0418デフォルトの名無しさん
2010/02/27(土) 20:10:470419デフォルトの名無しさん
2010/02/27(土) 20:11:280420デフォルトの名無しさん
2010/02/27(土) 20:30:00他の文字コード入ってたら知らんけど
0421デフォルトの名無しさん
2010/02/27(土) 20:58:27では多バイト文字を含む文字列の各要素を順に is 系関数で調べる場合など
とは、具体的にはどんな文字列のことなのでしょうか?
0422デフォルトの名無しさん
2010/02/27(土) 21:17:37isalphaのかわりに_ismbcalphaやiswalphaで調べられる。
0423デフォルトの名無しさん
2010/02/27(土) 21:22:38"123456789"
0424デフォルトの名無しさん
2010/02/27(土) 21:39:22正規表現置換とかだったら死刑
0425デフォルトの名無しさん
2010/02/27(土) 23:14:54ひとつに絞って他のコードは国際法で規制しろよ
0426デフォルトの名無しさん
2010/02/27(土) 23:43:28トロンコード最強ってことで。くっくっく。
0427デフォルトの名無しさん
2010/02/28(日) 00:29:23isalpha()に「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や*忘れてる
0429デフォルトの名無しさん
2010/02/28(日) 18:15:24my::smp q(new hoge); // ok
my::smp r(p); // no!
上の初期化法だけを許可したいんだけど、方法はある?
つまりテンポラリなポインタだけを受け取れるような方法
C++0xだと右辺値参照というのがあるからできるらしいのだけど・・・
今ではまだメタプログラミングを駆使しても不可能かな?
0430デフォルトの名無しさん
2010/02/28(日) 18:20:41引数付きのコンストラクタも考えると現実的でないが
0431デフォルトの名無しさん
2010/02/28(日) 19:01:30thx
コピーコストが気になるけどその方向で考えてみますわ
0432デフォルトの名無しさん
2010/02/28(日) 21:10:120433デフォルトの名無しさん
2010/02/28(日) 23:34:24テンプレートクラスは、ヘッダファイル内に関数の実装の定義も書きますよね?
もしテンプレートの特殊化をした場合は、cppファイルに書いていいものなのでしょうか?
たとえば、テンプレートパラメータにbool値をとるクラスを定義したとして、
関数の実装をヘッダファイルに書かず、
テンプレートパラメータがtrueのときの処理と、falseのときの処理を
それぞれcppファイル側に書いてもいいものでしょうか?
(そのようなクラス設計がいいかどうかは別として・・・)
0434デフォルトの名無しさん
2010/02/28(日) 23:36:04まずいだろう
他のファイルからもそのヘッダファイルを参照していたらどうなる?
0435デフォルトの名無しさん
2010/02/28(日) 23:50:58いいよ
template<bool A>
struct X
{
void f() {}
};
template<>
struct X<true>
{
void f();
};
とヘッダーに書いて
void X<true>::f(){}
を別のコンパイル単位に書くのはOK。
bool が typename でも同じ
0436デフォルトの名無しさん
2010/02/28(日) 23:51:44Waveファイルの入出力に関するクラスと、再生に関するクラスの2つを作ったとします。
実際waveファイルを入力して、再生するというプログラムを書く場合オブジェクトを何にしたらいいでしょうか?
オブジェクト指向がよくわかっていなくて・・・
0437デフォルトの名無しさん
2010/02/28(日) 23:59:35template<bool B>
struct hoge
{
hoge();
};
// ソースファイル
template<>
hoge<true>::hoge() {}
template<>
hoge<false>::hoge() {}
これで問題ないね
0439デフォルトの名無しさん
2010/03/01(月) 00:45:56WaveIO obj = new WaveIO(filePath);
Player obj2 = new Player();
obj2.Play(obj);
とかってなるんでないの
0440デフォルトの名無しさん
2010/03/01(月) 02:23:03自作しようして無理だった。
0441デフォルトの名無しさん
2010/03/01(月) 05:44:38make_sharedだな。TR1にもC++0xにもある。
>>440
Intel TBBになんかあったはず。
0442デフォルトの名無しさん
2010/03/03(水) 00:34:04以下のコードでは [ ]演算子のオーバーロードがその例です。
どうしたら理想([ ]によるメンバ変数arrayの中身変更)的な動作になるでしょうか?
http://codepad.org/9YXChfJT
0443デフォルトの名無しさん
2010/03/03(水) 00:56:27僕は難関、最初の壁と名高いポインタにぶつかりました。
ポインタ・・・彼は僕を苦しめました
存在が意味不明でした。
『本当に必要なのか?
いつ、使うの?君はなんなんだい?』
僕は寝ることをやめて飲まず食わず
1週間、ずっとポインタを見つめた結果
理解できませんでした・・
そのときの挫折はまさに、絶望でした。
自分の理解力の無さと頭の悪さに怒りを覚え
その怒りはそのうちに悲しみにかわり
僕は1ヶ月、眠れませんでした。
0444デフォルトの名無しさん
2010/03/03(水) 01:11:16× return const_cast<double&>( static_cast<const Test>(*this)[pos] );
○ return const_cast<double&>( static_cast<const Test&>(*this)[pos] );
0445デフォルトの名無しさん
2010/03/03(水) 01:14:32どう思います?
0446デフォルトの名無しさん
2010/03/03(水) 01:17:12好きにすればいい。分からない事があったらここに書き込めば俺は答える。
0447デフォルトの名無しさん
2010/03/03(水) 02:35:19ありがとうございます。
<間違い> return const_cast<double&>( static_cast<const Test>(*this)[pos] );
は、static_cast<const Test>(*this) で *this の中身をコピーした const Test型 のオブジェクトを生成し、
その生成されたオブジェクトに [pos] でアクセスしている。
だから、実際には *this の中身にアクセスできていない。
という解釈で良いでしょうか?
0448デフォルトの名無しさん
2010/03/03(水) 02:38:14こういうのも
return const_cast<double&>( static_cast<const Test*>(this)->operator[](pos) );
0449デフォルトの名無しさん
2010/03/03(水) 02:41:270451デフォルトの名無しさん
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クラスへのポインタ持たせてやろうと思ったのですが、そのポインタへの実体のセット方法がわからなくて、迷ってしまいました。
何かいい方法はないでしょうか?
0452デフォルトの名無しさん
2010/03/03(水) 11:04:370453デフォルトの名無しさん
2010/03/03(水) 11:15:38コンストラクタで渡すなりセットするメンバ関数を作るなり public にして設定するなり、
いろいろあるだろ。何が気に入らないんだ?
0454デフォルトの名無しさん
2010/03/03(水) 11:27:28int operator(int);
};
的な関数オブジェクトを
g++ -Weffc++ hoge.cpp
でコンパイルした場合、
warning: base class struct std::unary_function<int, int> has a non-virtual destructor
というエラーがどうしても出るのですが、
ライブラリの責任であってユーザ側からは対応しようがない、
というので正しいでしょうか?
0455デフォルトの名無しさん
2010/03/03(水) 11:41:080456デフォルトの名無しさん
2010/03/03(水) 11:43:090457デフォルトの名無しさん
2010/03/03(水) 12:35:06要するにGCCがそうだと言ってるからそうだ、ということですね。
これに対するライブラリ実装者の答えが欲しいのですが・・・。
0458デフォルトの名無しさん
2010/03/03(水) 12:38:090459デフォルトの名無しさん
2010/03/03(水) 12:42:54>456 のリンクをたどると、 >454 の警告に関する gcc の「バグ」報告に連れて行かれて、
その報告は今でも "NEW" として残っているんだが、何か違うものが見えるのかい?
0460デフォルトの名無しさん
2010/03/03(水) 12:46:39コメントのほうを読んで誤解してしまいました・・・。
ありがとうございます。
0461デフォルトの名無しさん
2010/03/03(水) 16:09:59もしかして、Effective C++ 読まずに問題視してる?
0462デフォルトの名無しさん
2010/03/03(水) 22:27:540463デフォルトの名無しさん
2010/03/03(水) 22:37:410464デフォルトの名無しさん
2010/03/03(水) 22:37:41どこに「エラー」って書いてあるんだよ
もしかしてエラーと警告を混同してるか?
0465デフォルトの名無しさん
2010/03/03(水) 23:00:41実際C++のキャストで助かった&Cのキャストではまった
経験をお持ちの方っていますか?
0466デフォルトの名無しさん
2010/03/03(水) 23:08:510467デフォルトの名無しさん
2010/03/03(水) 23:18:38キャストは奨励できないからC++のキャストは長い。
キャストにも色々な目的があるので種類がある。目的に合わない変換不可能なものにはエラーが出る。
あらゆる変換ができるCスタイルのキャストはバグを見つけにくいので使わないほうがいい。
0468デフォルトの名無しさん
2010/03/03(水) 23:20:00書式設定だとか弄ってcomma入れないような設定できなかったっけ?
0469デフォルトの名無しさん
2010/03/03(水) 23:50:17意図しない、または、意図した以上のキャストをコンパイル時に発見できる
0470デフォルトの名無しさん
2010/03/03(水) 23:59:55localeとfacet
thousands_sep()が返す値を確認するとよい
0471デフォルトの名無しさん
2010/03/04(木) 00:28:370472デフォルトの名無しさん
2010/03/04(木) 00:44:21検索が簡単。
0473デフォルトの名無しさん
2010/03/04(木) 05:25:490474デフォルトの名無しさん
2010/03/04(木) 06:50:490475デフォルトの名無しさん
2010/03/04(木) 07:30:550476デフォルトの名無しさん
2010/03/04(木) 08:12:190477デフォルトの名無しさん
2010/03/04(木) 10:50:11const_castはバグ
0478デフォルトの名無しさん
2010/03/04(木) 12:20:320479デフォルトの名無しさん
2010/03/04(木) 13:28:12static_castは甘え
0480デフォルトの名無しさん
2010/03/04(木) 13:33:06ダウンキャストするんだったら自前の仮想関数テーブル作れよって話しだ
0481デフォルトの名無しさん
2010/03/04(木) 13:35:390482デフォルトの名無しさん
2010/03/04(木) 13:37:38アップキャストした後にダウンキャストとかポリモーですらないじゃん
0483デフォルトの名無しさん
2010/03/04(木) 13:40:390484デフォルトの名無しさん
2010/03/04(木) 13:43:24うるせーテーブル作らせろ
いやまじでダウンキャストとか使う場面なくね?
面倒だからやっちゃえとかならわかるんだが
0485デフォルトの名無しさん
2010/03/04(木) 13:54:06内部でdynamic_cast使ってるboostとか糞だよな
0486デフォルトの名無しさん
2010/03/04(木) 14:14:020487デフォルトの名無しさん
2010/03/04(木) 14:32:250488デフォルトの名無しさん
2010/03/04(木) 14:39:260489デフォルトの名無しさん
2010/03/04(木) 14:41:410490デフォルトの名無しさん
2010/03/04(木) 15:06:56見栄だよ
型名保持してポインタを型変換するだけだし
でも使ってない
0491デフォルトの名無しさん
2010/03/04(木) 16:48:510492デフォルトの名無しさん
2010/03/04(木) 16:56:09DirectX使えば、いろいろ綺麗に作れるぞ。
0493デフォルトの名無しさん
2010/03/04(木) 18:18:44取り合えず勉強してみます
ありがとう!
0494デフォルトの名無しさん
2010/03/04(木) 20:14:40キャストが正しいことをプログラマーが保証しなければならない。
dynamic_cast(RTTI)もNULLが返る可能性も考えてプログラムを作らなければならない。
どんなにデバッグしても、キャストは客先でプログラムがクラッシュするかもしれない時限爆弾を抱えるようなものである。
暗黙の型変換や仮想関数であれば必ず正しい動作をすることがコンパイラが保証するので堅牢になる。
わずかな設計の見直しでリスクを減らせるんだからキャストは控えるのを勧める。
0495デフォルトの名無しさん
2010/03/04(木) 20:22:37第三者たるコンパイラが勘違いしそうな「本当は正しい」ところをマークするのがキャストだ
できちゃいけないキャストが通る理不尽な仕様は確かにあるが、それは
できることとしていいことの分別がつく人しか C++ を使うべきではないということだ
0496デフォルトの名無しさん
2010/03/04(木) 20:31:500497デフォルトの名無しさん
2010/03/04(木) 20:35:091万回ループさせて0.1秒差とかそんなもん
>>494
NULLが返る可能性を考えないのにdynamic_castを使うとか意味がわからん
そんなの参照と例外に狂ってるやつくらいだろ
0498デフォルトの名無しさん
2010/03/04(木) 20:37:500499デフォルトの名無しさん
2010/03/04(木) 20:37:59100000000回で10msくらいでもまだ遅いのに
0500デフォルトの名無しさん
2010/03/04(木) 20:42:30そんな見栄を張るなよw
0501デフォルトの名無しさん
2010/03/04(木) 20:43:44swap以外もすべて明示的特殊化してよい。
0502デフォルトの名無しさん
2010/03/04(木) 20:45:32ハハッ
0503デフォルトの名無しさん
2010/03/04(木) 20:45:45ごめん・・・最近なにしても楽しくないし2chで見栄張る位しか生き甲斐がなくて・・・。
もう自衛隊に入るわ。最近政治がアレだし俺みたいなクズ人間は戦争で死んでも誰も悲しまないだろう。
0504デフォルトの名無しさん
2010/03/04(木) 21:04:38自衛隊がお断りだ
0505デフォルトの名無しさん
2010/03/04(木) 21:19:52もうニート生活はやだよ・・・
0506デフォルトの名無しさん
2010/03/04(木) 23:01:18static_castでエラーが出るケースなんて,経験でわかるようになる程度じゃろ
0507デフォルトの名無しさん
2010/03/04(木) 23:06:17> static_castでエラーが出るケースなんて,経験でわかるようになる程度じゃろ
いや、わからない人用にあるわけじゃないんだけど。
0508デフォルトの名無しさん
2010/03/04(木) 23:09:06どんなに経験積んだって人間は間違えるから予防が必要なんだよ
0509デフォルトの名無しさん
2010/03/04(木) 23:14:27static_cast<int>(var)と(int)varじゃ
後者を使いたくなるのもわかる
0510デフォルトの名無しさん
2010/03/04(木) 23:15:31よくないよ。
static_cast 継承関係に無い型をキャストしようとエラーになる
Cスタイルキャスト 継承関係に無い型をキャストしてもエラーにならない。
0511デフォルトの名無しさん
2010/03/05(金) 00:31:200512デフォルトの名無しさん
2010/03/05(金) 00:46:240513デフォルトの名無しさん
2010/03/05(金) 01:00:330514デフォルトの名無しさん
2010/03/05(金) 01:04:560515デフォルトの名無しさん
2010/03/05(金) 01:07:44extern C/C++ とかでなんとかなると思ってたんだけど
だれか反例教えちくり
0516デフォルトの名無しさん
2010/03/05(金) 01:13:040517デフォルトの名無しさん
2010/03/05(金) 01:26:170518デフォルトの名無しさん
2010/03/05(金) 01:28:12http://www.google.co.jp/search?q=C+C%2B%2B+%E4%BA%92%E6%8F%9B%E6%80%A7
http://www.google.co.jp/search?q=C+C%2B%2B+compatibility
0519デフォルトの名無しさん
2010/03/05(金) 01:30:15この時点から 100% じゃないしな
0520デフォルトの名無しさん
2010/03/05(金) 01:31:10変数名に new とか関数名に delete とか、余裕で死ねる。
0521デフォルトの名無しさん
2010/03/05(金) 01:31:25ああ、すべての言語に複合リテラルがあればいいのに。
0522デフォルトの名無しさん
2010/03/05(金) 01:47:46残念ながら C++ は C89 ではなく K&R C から派生した言語なので
C++ が C89 に対して互換性がないのではなく、
C89 が C++ に対して互換性がないんだよ
C++ 側に「捨てた罪」があるのは K&R C に対してだけなのが原則で
extern "C" などの後付け設定がこの原則の例外
0523デフォルトの名無しさん
2010/03/05(金) 01:50:13> 残念ながら C++ は C89 ではなく K&R C から派生した言語なので
はつみみです
ソースある?
0524デフォルトの名無しさん
2010/03/05(金) 01:51:490525デフォルトの名無しさん
2010/03/05(金) 02:05:31少なくとも ISO C++ が参照してる C は ISO C だし。
0526デフォルトの名無しさん
2010/03/05(金) 02:07:38staticやexternがあるみたいですが
いかんせんエラーが出ます。どうか教えてください
0527デフォルトの名無しさん
2010/03/05(金) 02:08:00C++ の設計が K&R C から始まったとして、どうしてそれが
標準 C++ と標準 C との互換性の主従に関係するの?
0528デフォルトの名無しさん
2010/03/05(金) 02:08:440529デフォルトの名無しさん
2010/03/05(金) 02:15:54長いんで省略した形で記述します。
たとえば
==================================
//○×.h
class Cabc : public **
{
省略
public:
//ここでグローバル変数を記述したい
static CString str;
//省略
}
/////////////////////////////////////
○X.cpp
//省略
str = _T("a");
//省略
/////////////////////////////////////
このstrの値を他のクラスで使いたい場合
CString buf;
buf = Cabc::str ;
のようにしてもダメなんでしょうか?
わかりにくくてごめんなさい
なにぶん初心者ですのでよろしくおねがいします
0530デフォルトの名無しさん
2010/03/05(金) 02:17:13公式に「主従」なんかないだろう
俺は事の経緯から導かれる道義的な関係を指摘したまで
0531デフォルトの名無しさん
2010/03/05(金) 02:22:40extern "C"はCとC++の間でグローバルな関数・変数がリンクできるようになるだけ。
構文の解釈が変わるなどといったことは起こらない。
互換でない例としてはvoid*から他のポインタ型の暗黙変換が可能か否かなど。
0532デフォルトの名無しさん
2010/03/05(金) 02:31:53いや、導かれてないから。 >>522 の1行目が事実だとしても2行目以降は
あんたが勝手に言ってるだけでしょ。道義的関係とか意味わかんないし。
C89 が当時の標準化もされていなかった C++ と互換性がないとか、当たり前だし。
0533デフォルトの名無しさん
2010/03/05(金) 02:36:39C89 の目玉が C++ からの逆輸入という事実もあるわな
当時の C++ が標準化がされていようがいまいが C89 はその道を選んだ
どっちが合わせるべき立場にあったかは明確であろう
0534デフォルトの名無しさん
2010/03/05(金) 02:37:240535デフォルトの名無しさん
2010/03/05(金) 02:45:27合わせるべき立場とか、無いから。それ、妄想だから。
その調子で「C++0x は C# に合わせるべき立場にいる」とか
「C++0x は D に合わせるべき立場にいる」言い出すやつが
いたとしたらどう思うよ?
あんたが C++ 大好きなのはわかったが、これはさすがに
言いすぎだろ。
0536デフォルトの名無しさん
2010/03/05(金) 02:58:29C#がC++0xに対して互換性が無いのと一緒
0537デフォルトの名無しさん
2010/03/05(金) 03:00:29初期化リストをC99の複合リテラルと互換性のある構文にしようという提案が出たことだってあった。
CとC++は,お互いに影響を与えつつ受けつつという関係だと思うなぁ。
0538デフォルトの名無しさん
2010/03/05(金) 03:04:36以下のようなコードとコンパイルエラーが出ます。
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: }
0539デフォルトの名無しさん
2010/03/05(金) 03:24:350540デフォルトの名無しさん
2010/03/05(金) 06:03:48> わかりにくくてごめんなさい
わかりにくいのは、エラーが何なのかをキミが隠しているからだ。
人生相談コーナーに「とある良くないことが起きました。どうすればいいですか?」とだけ書いて
送っても、「まぁ、気を落とさずに」みたいな曖昧なアドバイスしか来ないぞ。
0541デフォルトの名無しさん
2010/03/05(金) 06:57:39.cppのstrって何者?
0542デフォルトの名無しさん
2010/03/05(金) 07:37:28えっと、、そこまで難しいことではないんです
ただ、たとえばどんなクラスからでも使えるCStringの変数が欲しいわけ
でそういうのはどうするのか?という質問なんです。
0543デフォルトの名無しさん
2010/03/05(金) 07:39:41ヘッダで宣言したCStringのつもりです。
このstrをどんなクラスからでも参照可能にするにはどうしたらいいのでしょうか?
とても困っています
よろしくお願いします
0544デフォルトの名無しさん
2010/03/05(金) 07:42:25クイズの出題者気取り?
0545デフォルトの名無しさん
2010/03/05(金) 07:44:230546デフォルトの名無しさん
2010/03/05(金) 07:50:13エラーは
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)" は未解決です。
です。
俺はただこの問題が解決してほしいだけなのでクイズとかそんなんではないです
本当に困っています
0547デフォルトの名無しさん
2010/03/05(金) 07:51:54ググって解決できないから頼んでます。
静的メンバ変数だとこのやりかたで宣言したstrは
Cabc::strで外の変数を使えるとあります。
使えません
どうしてでしょうか?
0548デフォルトの名無しさん
2010/03/05(金) 08:03:30定義の仕方が悪い
0549デフォルトの名無しさん
2010/03/05(金) 08:08:19エラーメッセージは開発者がなにをすべきか直ぐ分かるようにするために出力してるんだぜ
class名::str;
を.cppの先頭付近にでも書いとけ
0550デフォルトの名無しさん
2010/03/05(金) 11:48:45> strrr
"r" 増えてね?
0551デフォルトの名無しさん
2010/03/05(金) 11:52:050552デフォルトの名無しさん
2010/03/05(金) 13:23:56static CString CLicenselistViewerList::strrrという静的メンバ変数の
実体の定義が見つからないのでリンクできないというエラー
静的メンバ変数はヘッダで宣言のみではダメで実体の定義
CString CLicenselistViewerList::strrr;
を.cppファイルに記述する必要がある
0553デフォルトの名無しさん
2010/03/05(金) 14:19:52*x1 += a;
ってどういう演算するんですか?
0554デフォルトの名無しさん
2010/03/05(金) 14:21:33x1 の指すオブジェクトに a を加えるっぽい。
これ以上は x1, a の型を明らかにしないとわからん。
0555デフォルトの名無しさん
2010/03/05(金) 14:28:19てっきり、num1 = a + *x1;
とかで何か用意しないとこのaと *x1の合計は作れないものだと思ってました!
てことは -=で引き算出来るんですか?
ホンマ助かりました。今ポインターの勉強してるんです。
ちなみに問題は最初に点数を指定させて、加算点を入力させるというものです。
やさしいc++第3版 著高橋 をやっていました。回答例に出てきていたので
なんぞこれってかんじでした
0556デフォルトの名無しさん
2010/03/05(金) 14:30:030557デフォルトの名無しさん
2010/03/05(金) 14:31:29ホントに貴方紳士ですね!また質問に着ます!
有り難うございました
0558デフォルトの名無しさん
2010/03/05(金) 14:41:480559デフォルトの名無しさん
2010/03/05(金) 15:29:43知っている方がいましたら教えて下さい。
現在、GUIアプリの作成を行っているのですが、
(Windowsフォームアプリケーション開発)
一つ分からない事があります。
下のURLにあるようなTreeViewが欲しいのですが(ページの上の方にあるやつです)、
http://www.codeguru.com/cpp/controls/treeview/multiview/article.php/c3985
どうやって実現するのでしょうか?
ツールボックスを見ても、TreeViewはあるのですが、
上記のようなTreeView+Columnというのがどこにあるのか分からなくて・・・。
0560デフォルトの名無しさん
2010/03/05(金) 15:48:23http://pc12.2ch.net/test/read.cgi/tech/1259076828/
0561デフォルトの名無しさん
2010/03/05(金) 15:50:34誘導サンクス。
>>569は誘導先で聞いてみます。
0563デフォルトの名無しさん
2010/03/05(金) 15:51:18struct b : a{ int array[8] };
//...
a *ptr = new b;
//...
delete ptr; //ptrはa*だけど実際に指しているのはヒープに配置されたbのインスタンス. sizeof(a) != sizeof(b)なのにこんな事してもいいの?
0564デフォルトの名無しさん
2010/03/05(金) 15:57:400565デフォルトの名無しさん
2010/03/05(金) 15:58:11そりゃ解体子が仮想だから
0566デフォルトの名無しさん
2010/03/05(金) 16:15:07destructorがvirtualかどうかは関係ないでしょ?
>>563
newしたときのサイズがどこかにしまってあるから。
0567デフォルトの名無しさん
2010/03/05(金) 16:22:33すまんが釣りに見える
0568563
2010/03/05(金) 16:30:00自身がヒープに配置されていたり、それのメモリ管理は関係ないような認識でした。
事実、インスタンスがスタックに配置されていてもデストラクタは走ります。
これは、インスタンスのメモリ管理はインスタンスを抱えているスコープが管理するべきだという事です。
曖昧な理解が解消して助かりました。ありがとうございます。
0569デフォルトの名無しさん
2010/03/05(金) 17:11:53それにくらべてC++erは・・・
0570デフォルトの名無しさん
2010/03/05(金) 17:17:57ちょっと焦ったわ
なわけねえだろw
0571デフォルトの名無しさん
2010/03/05(金) 17:46:120572デフォルトの名無しさん
2010/03/05(金) 17:47:380573デフォルトの名無しさん
2010/03/05(金) 18:54:59確保した領域の大きさについてだけ言えば566が正しいと思う。
確保した自由記憶領域の大きさはOS(システムコール)が記録している。
解放する時に大きさを知っている必要は無い。
p = malloc( N ) の後 free( p ) だけでいい(Nを指定する必要が無い)
のと同じ。
そういう意味では565は見当外れ。
まぁC++スレだし、そういうことを訊きたい訳じゃないんだろうけど
0574デフォルトの名無しさん
2010/03/05(金) 18:58:270575デフォルトの名無しさん
2010/03/05(金) 19:09:370576デフォルトの名無しさん
2010/03/05(金) 19:58:38だと最後にもセパレータが入って
1#2#3#
となってしまいますが、
1#2#3
がたいてい欲しいものだと思います。
whileの内で条件分岐させる以外にうまい方法知りませんか?
0577デフォルトの名無しさん
2010/03/05(金) 20:20:280578デフォルトの名無しさん
2010/03/05(金) 20:34:14--vec.end()
なんて怖すぎます!
・・・ブルブル。
0579デフォルトの名無しさん
2010/03/05(金) 20:37:180580デフォルトの名無しさん
2010/03/05(金) 20:37:490581デフォルトの名無しさん
2010/03/05(金) 20:42:41やってみたら大丈夫だった・・・?!
0582デフォルトの名無しさん
2010/03/05(金) 20:44:05要素が一個だけのとき、何も出力されなくなる。
0583デフォルトの名無しさん
2010/03/05(金) 20:46:19いや別に。
上手いやり方か知らんが、自分で適当に
↓みたいな反復子を作るのは駄目なのか?
http://codepad.org/o3QbtQyC
0584デフォルトの名無しさん
2010/03/05(金) 20:47:03v=[3,4]
のとき、出力が
3#
ですよ。。。
0585デフォルトの名無しさん
2010/03/05(金) 20:51:56やっぱそっちですか。
イテレータとかすぐに書けないけど・・・。
ありがとうございます。
0586デフォルトの名無しさん
2010/03/05(金) 21:46:35楽してイテレーター書くならこんなのどうかな。
http://www.kmonos.net/alang/boost/classes/iterators.html
0587デフォルトの名無しさん
2010/03/05(金) 21:59:38なるべく依存したくないけど。
>>583
理解できたので、ほとんどそのまま使いまわせそうです。
たいへん助かりました。
0588デフォルトの名無しさん
2010/03/05(金) 22:04:19boostでテクニック勉強したら、自分でサブセットなライブラリを作れば依存しなくてすむんじゃないかな。
0589デフォルトの名無しさん
2010/03/06(土) 00:54:100590デフォルトの名無しさん
2010/03/06(土) 07:16:34return *this;
}
Hoge& Hoge::getObj( ){
return *this;
}
return *this はそのままで戻り値の書き方次第(Hoge& or Hoge)で
参照返しとオブジェクトのコピー返しと変わってしまうというのに違和感を感じる。
上の2通りの違いを *this の部分でも書き示す方(例:参照返し→ @*this )が良かったのに、と思ってしまうのですが
どうですか?
(どうですか?、って言っても仕様だからどうかなる話ではないのですが)
0591デフォルトの名無しさん
2010/03/06(土) 07:42:38int func1(const Hoge& h);
int func2(Hoge h);
Hoge hoge;
func1(hoge);
func2(hoge); // 同じ書き方
関数定義を書いている時は、すぐそこに戻り値の扱いが見えてる安心感があってまだいいけど、
関数呼び出しを書いている時は、関数の宣言or定義がよその何処かに書かれてる。
エディタ支援があるとはいえ、「遠くの何かを知ってなきゃいけない」感じがあって、より落ち着かないのでは。
0592デフォルトの名無しさん
2010/03/06(土) 08:48:31void foo(int& a);
void foo(const int& a);
int a; //constではない
foo(const_cast<const int&>(a)); //ここはconst版を呼びたい
0593デフォルトの名無しさん
2010/03/06(土) 10:22:01と思ったけど
int &a = @b;
みたいにしてほしいってことなのかな
0594デフォルトの名無しさん
2010/03/06(土) 11:19:240595デフォルトの名無しさん
2010/03/06(土) 11:30:140596デフォルトの名無しさん
2010/03/06(土) 11:31:26もっと多くてもいい
0597デフォルトの名無しさん
2010/03/06(土) 11:42:320598デフォルトの名無しさん
2010/03/06(土) 13:55:16#define amigo friend;
愛用してます
0599デフォルトの名無しさん
2010/03/06(土) 15:28:310600デフォルトの名無しさん
2010/03/06(土) 15:34:29#define foreach BOOST_FOREACH
0601デフォルトの名無しさん
2010/03/06(土) 15:37:34friendのおかげで、余計なpublicを作らずprivateで済ませられるんじゃないのか。
0602デフォルトの名無しさん
2010/03/06(土) 15:40:05じゃないの?
0603デフォルトの名無しさん
2010/03/06(土) 15:42:12時に、暗黙の型変換ができるように使っている。
Effective C++で紹介されていた内容。
0604デフォルトの名無しさん
2010/03/06(土) 15:56:22ほらみろよく判って無い奴が調子に乗って暴れ出したじゃないか
0605デフォルトの名無しさん
2010/03/06(土) 15:59:180606デフォルトの名無しさん
2010/03/06(土) 16:54:52みたいに書けるようにはならんのか。
0607デフォルトの名無しさん
2010/03/06(土) 17:25:450608デフォルトの名無しさん
2010/03/06(土) 17:35:50C++などのほかの言語なんかに手を出さず、一生perlを使い続けるべきだと思います。
0609デフォルトの名無しさん
2010/03/06(土) 17:42:020610デフォルトの名無しさん
2010/03/06(土) 17:56:39言語の文法は最小限でライブラリで拡張できるほうがいい。
0611598
2010/03/06(土) 18:17:050612デフォルトの名無しさん
2010/03/06(土) 19:54:49とか普通に書きたいんじゃないの?
0613デフォルトの名無しさん
2010/03/06(土) 19:55:27文修飾子という扱いで後ろにも置ける。
if(e) { func(); }
func() if e;
は OK だけど、
if(e) func();
{ func() } if e;
はできない。
0614デフォルトの名無しさん
2010/03/06(土) 20:00:362種類の書き方があるっていうか、そういうのって分りにくくないのかな?
後に書くということは
func(すっげー長い式なんたらかんたらどうのこうの) if e;
だと読むときifを読み落としそうだなあ。
0615デフォルトの名無しさん
2010/03/06(土) 20:01:35C++だと、func() ;も{ func() ; }も、ひとつのstatementなので、ものすごい違和感があるな。
{ func() ; } if e ;
ができないというのは、ものすごく違和感があるな。
0616デフォルトの名無しさん
2010/03/06(土) 20:06:35struct B{ B( A& ); }
A a(); // これとか
B b( A() ); //これが
関数宣言にみなされない書き方ないの?
A a;
B b( a );
とかじゃない方法で。
0617デフォルトの名無しさん
2010/03/06(土) 20:09:39思うに。
{
すげーー長い文
なんたらかんたら
だらだらだらだら
}
if e;
って読むのに困るよね。
do{}while()でも読みにくいのね。
0618デフォルトの名無しさん
2010/03/06(土) 20:22:06それほど読みにくいってほどでもないんじゃないかな。
0619デフォルトの名無しさん
2010/03/06(土) 20:23:290620デフォルトの名無しさん
2010/03/06(土) 20:31:05混乱の割にメリットは感じられない。
0621デフォルトの名無しさん
2010/03/06(土) 20:51:51break if foo
continue if bar
とかするのは気持ちいい。
0622デフォルトの名無しさん
2010/03/06(土) 21:14:57perlだけ使ってなよ。
0623デフォルトの名無しさん
2010/03/06(土) 21:25:16(*゚ω゚ ) >>622お断りします。Rubyも使います。
. (=====)
_(_⌒) )
/\ `J  ̄ ̄\
 ̄ ̄ ̄ ̄| | ̄ ̄ ̄
|
/ \
 ̄ ̄
0624デフォルトの名無しさん
2010/03/06(土) 22:07:590625デフォルトの名無しさん
2010/03/06(土) 22:18:21みたいにカンマが含まれても大丈夫なマクロが欲しいです
0626デフォルトの名無しさん
2010/03/06(土) 22:57:30Perl には TMTOWTDI(There's More Than One Way To Do It:やり方は一つじゃない)という
スローガンがあってな。
>615
Perl では { } は block であって文じゃないんだ。
>620
if (e) func(); ができなくていちいち block 書くのが面倒という事なんだと思う。
0627デフォルトの名無しさん
2010/03/06(土) 22:57:49ttp://www.parashift.com/c++-faq-lite/ctors.html#faq-10.19
0628デフォルトの名無しさん
2010/03/06(土) 23:36:34僕は現在高校2年生です。そんなぼくにもC++はマスター
できます?
0629デフォルトの名無しさん
2010/03/06(土) 23:40:220630デフォルトの名無しさん
2010/03/06(土) 23:46:51それはお前次第やろ
0631デフォルトの名無しさん
2010/03/06(土) 23:55:49C99の__VA_ARGS__が、C++0xに入る。
0632デフォルトの名無しさん
2010/03/07(日) 01:23:57delete [] darray;
のようなことがプログラム中で起こるのですが、問題ありますか?
0633デフォルトの名無しさん
2010/03/07(日) 01:25:450634デフォルトの名無しさん
2010/03/07(日) 01:35:02ダミーで1byteぐらい確保されんのかな
0635デフォルトの名無しさん
2010/03/07(日) 01:37:05ヌルを返したり他のオブジェクトと同じアドレスを返したりしちゃいけないことになってるから、
だいたいの実装がそんな感じ。
0636デフォルトの名無しさん
2010/03/07(日) 02:15:18だがdarray[0]にアクセスすると未定義動作
変なの
0637デフォルトの名無しさん
2010/03/07(日) 02:27:16{
if(size == 0) throw std::bad_alloc("Fack you!"); return std::malloc(size);
}
0638デフォルトの名無しさん
2010/03/07(日) 02:35:060639デフォルトの名無しさん
2010/03/07(日) 07:00:01テンプレートではなく、仮想関数を使う方法で。
0640デフォルトの名無しさん
2010/03/07(日) 07:00:330641デフォルトの名無しさん
2010/03/07(日) 07:09:36あると思うよ。
今の時代だとクリティカルな部分さえ最適化できればいいから動的型付けに対してそんなに神経質になる必要も無い。
ソフトウェア工学から見たある程度の規模からの開発のし易さや動的な依存関係の解決には仮想関数が向いているし
テンプレートを用いた静的な型レベルの解決なら実行速度に対する最適化が向いている。
臨機応変に適材適所できるからC++が選ばれる、何てこともあるね。
強い動的型付けな言語(Rubyとか)になっちゃうと融通が利かないし。
でもRubyとかを採用する現場では速度低下の弊害より人材のコスト考えてる場合ばおおいね
0642デフォルトの名無しさん
2010/03/07(日) 08:52:23俺はよく使ってる。
継承を使う時は、純粋仮想関数のみで構成されたクラスの継承がほとんど。
テンプレートを依存関係を解決するために使うのは、本当にテンプレートが効果的かよく考えてやった方がいいと思う。
0643デフォルトの名無しさん
2010/03/07(日) 09:44:55コンストラクタで malloc() を呼ぶと
malloc(0) でも8バイトぐらいは確保される。
ここらへんは Cライブラリの実装次第だが、
あとで realloc()/free() に渡す可能性があるポインタということを
考えると0バイトであってもユニークなポインタが返されるべき。
0644デフォルトの名無しさん
2010/03/07(日) 10:48:180645デフォルトの名無しさん
2010/03/07(日) 12:20:35class Hoge {
void foo() { fuga_.(this); }
Fuga<Hoge> fuga_;
}
俺はこんなのを想像した。これは相互参照か?
単に特定のクラスに依存したら拡張性がなくなるから、テンプレート引数で指定できるようにしたいという事かもしれない。
0646645
2010/03/07(日) 12:22:14void foo() { fuga_.bar(this); }
0647デフォルトの名無しさん
2010/03/07(日) 12:30:42class b;
class a
{
b* bb;
};
class b
{
a* aa;
};
0648デフォルトの名無しさん
2010/03/07(日) 12:59:32でも保存する必要が無い関数の引数とかだったらテンプレートの方がいいと思う
例えば標準のアルゴリズムをテンプレートじゃなくてインターフェースで解決しようとしたら結構めんどくさいだろう
std::random_access_iterator_interfaceみたいなのが沢山作られて、それを適切に継承してないイテレータは対応アルゴリズムが使えない
みたいな感じで、行儀はいいんだけど、すごいめんどくさくなる
0649デフォルトの名無しさん
2010/03/07(日) 16:00:23要求される振る舞いが出来ることを保証する仕組みの一つが
継承であるだけで。
0650デフォルトの名無しさん
2010/03/07(日) 16:10:370651デフォルトの名無しさん
2010/03/07(日) 16:40:10多相を実現する手段の一つが継承
0652デフォルトの名無しさん
2010/03/07(日) 18:35:470653デフォルトの名無しさん
2010/03/07(日) 18:50:340654デフォルトの名無しさん
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); // 禁止されてる
}
0655デフォルトの名無しさん
2010/03/08(月) 00:10:080656デフォルトの名無しさん
2010/03/08(月) 03:22:13C++0xなら、rvalue referenceが使える。
それ以前のC++では、一応、auto_ptrを実装できるぐらいの方法はあるが、
そのテクニックを学ぶことは、精神衛生上よろしくないので、おすすめしない。
0657デフォルトの名無しさん
2010/03/08(月) 04:21:56コピー代入を封じるなら無理。
キャストは、元オブジェクトからキャスト先オブジェクトという作るという点では、複製に等しいため。
それこそ>>655の言うように所有権の移動を許可する方向でやるしかない。
(もちろん所有権が移る以上、本来のキャストとは若干異なるセマンティクスになる)
0658デフォルトの名無しさん
2010/03/08(月) 07:36:01const int* からconstとったら int* に決まってんじゃん、と。
0659デフォルトの名無しさん
2010/03/08(月) 08:09:18const_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) ;
0660デフォルトの名無しさん
2010/03/08(月) 11:12:58class Test
{
public:
Test( ){ }
void func( );
};
のようなクラスのとき、
vtype が P と Test<P> (Pはプリミティブ型) とで呼び出す func( ) を変える方法はありますか?
0661デフォルトの名無しさん
2010/03/08(月) 11:33:000662660
2010/03/08(月) 12:15:01このようにしたのですが、うまく行きません。。。
template<class vtype>
void Test<vtype>::func( )
{
cout << "aaa" << endl;
}
template<class vtype>
void Test<Test<vtype> >::func( )
{
cout << "bbb" << endl;
}
0663デフォルトの名無しさん
2010/03/08(月) 12:22:01http://codepad.org/isjE5LKn
0664660
2010/03/08(月) 12:39:43ありがとうございます。
クラスレベルで特殊化してしまうと、メンバ関数が沢山ある場合
同じようなコードが沢山生まれてしまうので
関数部分だけ特殊化できれば、と思ったのですが
クラスのところで特殊化しなきゃダメなのですね。
0665デフォルトの名無しさん
2010/03/08(月) 12:40:57http://codepad.org/QzjNzjhA
0667デフォルトの名無しさん
2010/03/08(月) 13:41:10サンクスです
キャスト≒複製って知りませんでした
時期標準のソースをチラ見したところ標準もキャストはサポートされてなかったので、uniqueの方はキャスト諦めることにしました
0668デフォルトの名無しさん
2010/03/08(月) 15:54:42例えば構造体Aの変数のメンバ変数を全て0にするとか…
0669デフォルトの名無しさん
2010/03/08(月) 16:26:02S S::empty = { 0 };
S var;
var = S::empty;
0670デフォルトの名無しさん
2010/03/08(月) 17:44:320671デフォルトの名無しさん
2010/03/08(月) 18:03:450672デフォルトの名無しさん
2010/03/08(月) 18:05:33S a={0};
これで事足りるんじゃ
0673デフォルトの名無しさん
2010/03/08(月) 18:14:120674デフォルトの名無しさん
2010/03/08(月) 18:17:260675デフォルトの名無しさん
2010/03/08(月) 18:17:340676デフォルトの名無しさん
2010/03/08(月) 19:48:52const_cast<int *>(p)だろ
他のconstが必要なら後で付ければいい
何があかんのですか
0677デフォルトの名無しさん
2010/03/08(月) 20:22:05const_cast(it)
これはどうなるんだ?
const_iteratorはポインタかもしれないしクラスかもしれない
0678デフォルトの名無しさん
2010/03/08(月) 20:35:48itの型はconst Type *constでconst_castするとconst Type*になる。
そうでない場合、const_castするとconst_iteratorになる。ただそれだけの話。
0679デフォルトの名無しさん
2010/03/08(月) 20:43:53void const * const * const cpcpc = 0;
void ** pp = const_cast<void**>(cpcpc);
void const ** cpp = const_cast<void const**>(pp); // このcastはどうすんの?
0680デフォルトの名無しさん
2010/03/08(月) 20:54:34>itの型はconst Type *constでconst_castするとconst Type*になる。
なんでType*じゃないんだ?>>676と矛盾しない?
0681デフォルトの名無しさん
2010/03/08(月) 22:11:070682デフォルトの名無しさん
2010/03/08(月) 22:15:54privateにアクセスする必要のない関数は
メンバでもfriendでもない関数にするのが良いって
偉い人が言ってた
0683681
2010/03/08(月) 22:28:24ありがとうございます。
もし自分がcomplex作ったら、conj( )をメンバ関数にして
privateなデータを変更してしまうように実装しそうなのですが
これは良くないんですかね?
0684デフォルトの名無しさん
2010/03/08(月) 22:34:42メンバ変数にするにしてもconstにするべきだと思う。
共役複素数を求めるだけだよね?
0685デフォルトの名無しさん
2010/03/08(月) 22:42:050686681
2010/03/08(月) 23:02:53イメージ的にはこんな感じです。
myComplex<double> mc0(2,2); // 2+2i
mc0.conj( ); // 2-2i
グローバル関数にするとコピーが発生してしまうので
良くないのかなぁ、と思ったのですが。
0687デフォルトの名無しさん
2010/03/08(月) 23:14:08あまり効果なさそうな気はする。
コードを見やすくしたほうがいいんじゃないだろうか。
0688デフォルトの名無しさん
2010/03/08(月) 23:28:290689デフォルトの名無しさん
2010/03/08(月) 23:50:500690デフォルトの名無しさん
2010/03/09(火) 01:16:28const増やすのはstatic_castでもreinterpret_castでも出来る
お好きな方で
0691デフォルトの名無しさん
2010/03/09(火) 01:19:230692デフォルトの名無しさん
2010/03/09(火) 01:28:37void f(void const* a[]); // const 一個付け忘れてるけど変更できない外部ライブラリ
void f(void* a[]); // 同上、ただし非 const データを対象とするオーバーロード
// ここから自前のコード
void g(void const* const a[])
{
f(const_cast(a)); // 上のオーバーロードに渡したいのに下のほうにいっちゃう
}
こわくね?
0693デフォルトの名無しさん
2010/03/09(火) 02:23:22それを書きやすくするうえに他のキャストと違う形になる
省略記法なんて認められないと思われる
0694デフォルトの名無しさん
2010/03/09(火) 07:04:10うちのVC++2008EEではconst_castかC style castでないと通らないんだけど、
なんかおかしいのかな。
0695デフォルトの名無しさん
2010/03/09(火) 07:21:420696デフォルトの名無しさん
2010/03/09(火) 07:26:55ttp://codepad.org/d4Wo3ozT
0697デフォルトの名無しさん
2010/03/09(火) 07:48:53えっ?
0698デフォルトの名無しさん
2010/03/09(火) 07:49:47それは、規格の文面によって、明示的に禁止されている。
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なオブジェクトを参照することが可能になってしまう。
0699デフォルトの名無しさん
2010/03/09(火) 07:57:03規格の参照までしていただいて、ありがとうございます。
参考になります。
ということで、これを踏まえて改めて>>679
0700デフォルトの名無しさん
2010/03/09(火) 07:57:31環境で例外クラスの実装を見ようと思ったのですが
/usr/include/c++/4.4/stdexcept
に logic_error などの宣言はあるのに実装が書いてありません。
どのファイルを見たら良いでしょうか?
0701デフォルトの名無しさん
2010/03/09(火) 08:07:03婉曲表現と皮肉をやめて直接主張しろ
何人かいて訳が分からない
0702デフォルトの名無しさん
2010/03/09(火) 08:40:34void 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); // 一部はがしのときもこれまで同様書ける
というのを望んでんのかも
0703デフォルトの名無しさん
2010/03/09(火) 09:06:33658 :デフォルトの名無しさん :2010/03/08(月) 07:36:01
const_cast ってconstはずしだから <> の中に型書くの無駄だなぁって思ってしまう。
const int* からconstとったら int* に決まってんじゃん、と。
0704デフォルトの名無しさん
2010/03/09(火) 14:09:06struct X {
int *p;
void test(int x) const
{
*p = x;
}
};
こう書くとconst指定してるのにオブジェクトの内容が変化してる
これって合法なの?
0705デフォルトの名無しさん
2010/03/09(火) 14:14:13Xのオブジェクトはpであることを思い出せ。
pはint*型だから「int型の値のあるメモリの位置」を指している。
*p = xは「pの指している先のint型の値に対する副作用」であって「pに対する副作用」ではない。
0706デフォルトの名無しさん
2010/03/09(火) 15:34:24*pは宝の中身
Xのメンバはpつまり宝の地図
だからtest(int x) constとは宝の地図を書き換えちゃいけないってこと
*p = xは宝の中身を入れ替えているだけ
0707デフォルトの名無しさん
2010/03/09(火) 15:39:050708デフォルトの名無しさん
2010/03/09(火) 15:54:360709デフォルトの名無しさん
2010/03/09(火) 15:57:01そのお宝の例えは俺は結構好きだな。
0710デフォルトの名無しさん
2010/03/09(火) 16:19:180711デフォルトの名無しさん
2010/03/09(火) 16:23:11正常な動作だったのね
0712デフォルトの名無しさん
2010/03/09(火) 17:43:29new int*は宝の地図を新しく作りその地図のありかを返す式だが、新しく作られた宝の地図には宝のありかは書いてない。
難しいな。
0713デフォルトの名無しさん
2010/03/09(火) 19:38:020714デフォルトの名無しさん
2010/03/09(火) 19:44:580715デフォルトの名無しさん
2010/03/09(火) 19:46:35関数ポインタじゃなくて。
0716706
2010/03/09(火) 21:01:33>>706は、一番最初にポインタを勉強する時に俺が(たまたま)イメージしたもので、
今にして思うと、地図という「質量を持った物体」でポインタを喩えたのが好都合だった気がする。
たまたまそういうイメージをしたお陰で、ポインタもまた「そういう値」である、って所で
まったく混乱せずに済んだ。>>708が言うように、ポインタのポインタも
「勇者は宝箱を開けた。なんと宝の地図を見つけた!」ということだと考えれば楽だったし。
0717デフォルトの名無しさん
2010/03/09(火) 22:24:460718デフォルトの名無しさん
2010/03/09(火) 23:10:15初心者には分かりやすい言い例えだね。
俺もそれ使わせてもらいます。
0719デフォルトの名無しさん
2010/03/09(火) 23:24:340720デフォルトの名無しさん
2010/03/09(火) 23:30:25あるあるw
0721デフォルトの名無しさん
2010/03/09(火) 23:38:310722デフォルトの名無しさん
2010/03/09(火) 23:38:540723デフォルトの名無しさん
2010/03/10(水) 00:06:180724デフォルトの名無しさん
2010/03/10(水) 00:35:08開けると死ぬ
0725デフォルトの名無しさん
2010/03/10(水) 01:44:470726デフォルトの名無しさん
2010/03/10(水) 01:46:210727デフォルトの名無しさん
2010/03/10(水) 01:46:560728デフォルトの名無しさん
2010/03/10(水) 04:46:42cstdlibをインクルードしたら以下のようなエラーが出るようになりました。
error: macro "minor" passed 2 arguments, but takes just 1
これは単純に、minorという変数名を使うな、という解釈でよいでしょうか?
0729デフォルトの名無しさん
2010/03/10(水) 04:58:04どう読んだらそんな解釈になるんだよ。
そのエラーが再現する最小ソースを作ってみれ。
0730728
2010/03/10(水) 05:25:53言葉足らずでした。
上記のエラーは、
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;
}
0731デフォルトの名無しさん
2010/03/10(水) 05:36:58別に言葉足らずじゃない。>>729が寝ぼけてるだけ。
環境によってはsys/types.hにminorマクロがあるので使わない方がいい。
0732デフォルトの名無しさん
2010/03/10(水) 05:43:19ありがとうございます。
0733デフォルトの名無しさん
2010/03/10(水) 05:56:50手元の Cygwin g++ 4.3.4 では何事もなくコンパイルが通ったよ。
ちなみに >728 の環境(OS、コンパイラ、そのバージョン)は何?
0734デフォルトの名無しさん
2010/03/10(水) 06:01:57cstdlib のインクルードでユーザーが使える名前がマクロ定義されてるのは
コンパイラのバグ(標準違反)だと言ってしまっていいと思うんだけど、そういう
予防しとかないといけないものなの?どっかの環境での常識?
0735728
2010/03/10(水) 06:04:13Ubuntu 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)
0736デフォルトの名無しさん
2010/03/10(水) 06:14:04まぁ #undef すりゃいいんだけどね。
0737728
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出ませんでした。
0738デフォルトの名無しさん
2010/03/10(水) 09:54:54ソース眺めるだけで勉強になる
0739デフォルトの名無しさん
2010/03/10(水) 17:43:07struct B{A a;};
struct A{int a;};
int main(){return 0;}
前方宣言したら、後で定義してれば
使えると思ってたんですが
これがエラーになります
Bの中をA* aにするとエラーが消えるのですが
その辺に理由があるんでしょうか?
0740デフォルトの名無しさん
2010/03/10(水) 17:53:13Aのデータは定義されるまでは全く参照出来ないのか
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;}
0741デフォルトの名無しさん
2010/03/10(水) 18:01:370742デフォルトの名無しさん
2010/03/10(水) 19:10:29ありがとうございました
0743デフォルトの名無しさん
2010/03/10(水) 22:23:35しかしそんなソースを仕事で書いたら
同僚に白い目で見られそうだww
0744デフォルトの名無しさん
2010/03/10(水) 22:40:04vectorのresizeでサイズを大きくした時に
拡張した結果メモリの再配置が起こったとすると
resizeする前のデータはコピーされるのでしょうか?
0745デフォルトの名無しさん
2010/03/10(水) 22:42:120746デフォルトの名無しさん
2010/03/10(水) 22:43:10http://www.fides.dti.ne.jp/~oka-t/cpplab-vector-new.html
0747デフォルトの名無しさん
2010/03/10(水) 22:43:180748デフォルトの名無しさん
2010/03/11(木) 00:56:340749デフォルトの名無しさん
2010/03/11(木) 00:59:17Javaみたいにどっかのクラスのstatic関数にする必要はなし、というか無理
0750デフォルトの名無しさん
2010/03/11(木) 01:51:16ググール先生に聞こうと思ったんだけど記号検索できませんでした
0751デフォルトの名無しさん
2010/03/11(木) 01:55:220752デフォルトの名無しさん
2010/03/11(木) 02:06:36マクロとかで細工するときに便利なこともあります
0753デフォルトの名無しさん
2010/03/11(木) 02:24:57どうもです
しかしなんだこれって感じですね
ポインタエミュレートのために
(myp_hoge->*(&MyPtr<hoge>::Func))(a, b, c);
といった形で使いたいんですが、定義の仕方が分からないです(->なら簡単なんですが・・・)
>>752
そういう特殊な使い方ってよく思いつくもんですよね
0754デフォルトの名無しさん
2010/03/11(木) 03:03:47徹底したクラス指向で行くならこの程度のものになる。
int main()
{
MainClass m;
return m.main();
}
0755デフォルトの名無しさん
2010/03/11(木) 04:20:39{
return MainClass()();
}
徹底するならこうだろーと思った俺はそろそろ寝るべきか
0756デフォルトの名無しさん
2010/03/11(木) 04:51:320757デフォルトの名無しさん
2010/03/11(木) 16:29:37どんな問題があるんでしょうか?
ポインタでキャッチしてしまうとか?
0758デフォルトの名無しさん
2010/03/11(木) 16:33:360759デフォルトの名無しさん
2010/03/11(木) 16:44:470760デフォルトの名無しさん
2010/03/11(木) 17:01:560761デフォルトの名無しさん
2010/03/11(木) 21:28:31それともどちらか一方にすべきでしょうか?
0762デフォルトの名無しさん
2010/03/11(木) 21:54:55どっちも最終的にはただの関数オブジェクトになるわけだから
boostのほうにstdのfunctionを代入することも逆もできるはず
名前は名前空間があるからかぶるわけないし
0763デフォルトの名無しさん
2010/03/11(木) 22:54:370764デフォルトの名無しさん
2010/03/11(木) 23:03:330765デフォルトの名無しさん
2010/03/11(木) 23:15:460766デフォルトの名無しさん
2010/03/11(木) 23:28:03今のところはboostが使えるならboostが無難かと
思うのでboostにします。
0767デフォルトの名無しさん
2010/03/11(木) 23:34:01えぇーーー
普通は逆でしょ
標準で済むなら標準を使うのが筋でしょ
0768デフォルトの名無しさん
2010/03/11(木) 23:38:240770デフォルトの名無しさん
2010/03/11(木) 23:48:140771デフォルトの名無しさん
2010/03/12(金) 01:27:320772デフォルトの名無しさん
2010/03/12(金) 01:30:56何がしたいのかわからないけど、コピーでいいなら std::allocator::construct() とか
std::uninitialized_copy() とかが使えるんじゃない?
0773デフォルトの名無しさん
2010/03/12(金) 10:16:48に対して、
void Callee();
があり、
Caller( Callee ); // これだとコンパイルが通るのに、
Caller( &Callee ); // こっちは通らない
のはなぜですか?
0774デフォルトの名無しさん
2010/03/12(金) 10:40:58それはポインタだからさ
0775デフォルトの名無しさん
2010/03/12(金) 20:32:250776デフォルトの名無しさん
2010/03/12(金) 20:54:16サンクスです。
T &fは「関数の参照型」と言えばいいんでしょうか?
また、関数ポインタを呼ぶ際は、
(*f)(); //デリファレンスあり
f();//なし
2通りで呼べますが、これはシンタックスシュガー的なものですか?
どっち使ってもOKですか?
0777デフォルトの名無しさん
2010/03/12(金) 20:54:420778デフォルトの名無しさん
2010/03/13(土) 00:39:50iterator tekitou;
//...
tekitou == iterator(); //tekitouに代入処理がなかったらtrue
を期待して組んでたら例外が発生してパソコンが爆発したんですけど
tekitouがデフォルトコンストラクタ走ったまま何も触られて無いかどうかを判定する方法はありませんか?
0779デフォルトの名無しさん
2010/03/13(土) 00:52:18パソコンが爆発するプログラムを作っているんだったら
いますぐやめなさい。
0780デフォルトの名無しさん
2010/03/13(土) 00:53:54パソコンが爆発するのを防ぐプログラムを作っているのです。
0781デフォルトの名無しさん
2010/03/13(土) 01:15:500782デフォルトの名無しさん
2010/03/13(土) 01:17:30ご教示いただけないでしょうか?
0783デフォルトの名無しさん
2010/03/13(土) 01:20:26ポインタと違ってイテレータにはNULL入れられないからねぇ
int *ptr = 0;
0784デフォルトの名無しさん
2010/03/13(土) 01:21:45本題なんてどーでもよくて、爆発させる方法を知りたい気すらする。
0785デフォルトの名無しさん
2010/03/13(土) 01:22:350786デフォルトの名無しさん
2010/03/13(土) 01:24:230787デフォルトの名無しさん
2010/03/13(土) 01:25:480788デフォルトの名無しさん
2010/03/13(土) 01:26:470789デフォルトの名無しさん
2010/03/13(土) 01:30:120790デフォルトの名無しさん
2010/03/13(土) 01:32:490791デフォルトの名無しさん
2010/03/13(土) 01:55:440792デフォルトの名無しさん
2010/03/13(土) 01:58:300793デフォルトの名無しさん
2010/03/13(土) 01:59:080794デフォルトの名無しさん
2010/03/13(土) 02:06:15わざわざややこしいことやってるように見えるけど
0795デフォルトの名無しさん
2010/03/13(土) 02:43:02namespace detail { struct none_helper{}; }
typedef int detail::none_helper::*none_t ;
} // namespace boost
namespace boost {
none_t const none = ((none_t)0) ;
} // namespace boost
このコードはいったい何をしようとしてるわけ?
0796デフォルトの名無しさん
2010/03/13(土) 02:55:220797デフォルトの名無しさん
2010/03/13(土) 04:11:26他のどんな型からも自動変換されないし、
他のどんな型へも自動変換されないような変数を定義してるんじゃね?
0798デフォルトの名無しさん
2010/03/13(土) 06:23:390799デフォルトの名無しさん
2010/03/13(土) 06:27:140800デフォルトの名無しさん
2010/03/13(土) 06:52:580801デフォルトの名無しさん
2010/03/13(土) 07:31:030802デフォルトの名無しさん
2010/03/13(土) 07:33:53昔の映画や漫画によくあったな
0803デフォルトの名無しさん
2010/03/13(土) 07:52:27ジョークがあったな
0804デフォルトの名無しさん
2010/03/13(土) 08:20:380805デフォルトの名無しさん
2010/03/13(土) 10:22:54あれってさリュック背負ってたりするとセムシ形状に成ったりするん?
0806デフォルトの名無しさん
2010/03/13(土) 12:27:14なんだこれ超ムズイじゃねぇか。
0807デフォルトの名無しさん
2010/03/13(土) 13:03:28ほかのpointer to memberじゃないとキャストできない(void *にreinterしても変換できなかった)から他の型と比較できない
なおかつメンバが空だからnullしか入れるものがない
したがってただひとつの状態を持てるってことかな
C++ってこういう気持ち悪いバッドノウハウ多すぎるよね
すなおに仕様でnil型導入すればいいのに
0808デフォルトの名無しさん
2010/03/13(土) 13:26:04メンバへのポインターは、単なるオフセットに過ぎない。
0809デフォルトの名無しさん
2010/03/13(土) 13:30:010810デフォルトの名無しさん
2010/03/13(土) 17:15:12実装上の都合を言語ユーザに押し付けてる感はあるな
0811デフォルトの名無しさん
2010/03/13(土) 19:14:160812デフォルトの名無しさん
2010/03/13(土) 19:16:22>>810
他の言語はともかく、
余計なオーバーヘッドを嫌うC++なら、こういう制限も許される(むしろ歓迎される?)よね。
0813デフォルトの名無しさん
2010/03/13(土) 19:38:24型変換については妥当な話だと思うし、 nil の不在は実装上の都合ではないだろうし、
何のことを言ってるの?
0814デフォルトの名無しさん
2010/03/13(土) 21:11:09// ごにょごにょ(配列の長さについては考えないとする)
}
みたいな関数があったとき、
int array[3] = {0,0,0};
Test(array);
はコンパイルできるのに、
Test({0,0,0});
はコンパイルできない。
配列に付ける名前が不足しちゃうのでなんとか名前を付けずにやりたいんだけど、
良い手段ない?
それともなんでもいいからとりあえず名前を付けざるを得ないんだろうか。
0815デフォルトの名無しさん
2010/03/13(土) 21:18:130816デフォルトの名無しさん
2010/03/13(土) 21:21:19C++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});
}
0817デフォルトの名無しさん
2010/03/13(土) 21:26:220818デフォルトの名無しさん
2010/03/13(土) 21:26:36ヘルパー関数を使って、
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");
などの悪手しか思いつかない。
0819デフォルトの名無しさん
2010/03/13(土) 21:26:590820デフォルトの名無しさん
2010/03/13(土) 21:31:05レスありがとうございます。
> 名前が不足するというのがよくわからん
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__くっつける方法で行きたいと思います。ありがとうございました。
0821デフォルトの名無しさん
2010/03/13(土) 21:31:50なんかTestの引数が全部array1になっちゃってますが、
2回目はarray2、3回目はarray3です・・・。
0822デフォルトの名無しさん
2010/03/13(土) 21:36:44Test((int[]){0,0,0});
0823デフォルトの名無しさん
2010/03/13(土) 21:37:24int 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]);
}
0824デフォルトの名無しさん
2010/03/13(土) 21:40:22std::initializer_listが入る
0825814
2010/03/13(土) 21:41:00>>820でちょこっと書きましたが、実際には配列のデータはもっとぐしゃぐしゃで、
必ずしも
arys[i][0]=0;
arys[i][1]=0;
arys[i][2]=i;
となるわけではないのです。
質問のために簡略化しているので・・・すみません。
0826デフォルトの名無しさん
2010/03/13(土) 21:44:44int arys[100][3];
for(int i=0;i<100;++i){
cin >> arys[i][0] >> arys[i][1] >> arys[i][2];
test(arys[i]);
}
これは標準入力だけど、別にファイルからでもいいし
0827814
2010/03/13(土) 21:50:09そうした方がいいでしょうかね・・・大量のデータをソースコードにべた書きするのは
よくないかなぁと思ったんですが、
データをあまり見られたくないんですよ。
それで、別ファイルにするよりはソースコードに埋め込んだほうがどちらかというと
見られにくいかなぁと思ったので。
別にソースに埋め込んでも見ようとすれば見れるのでなんてことはないんですが。
0828デフォルトの名無しさん
2010/03/13(土) 21:54:440830デフォルトの名無しさん
2010/03/13(土) 21:58:14__VA_ARGS__ は使えんのか? >>816 にあるやつ。
0832デフォルトの名無しさん
2010/03/13(土) 22:04:48int *arrays[] = {
{ 0,0,0 },
{ 0,0,1 },
{ 0,0,2 }
};
みたいなのじゃダメなの?
argv と同じやりかた。
0833デフォルトの名無しさん
2010/03/13(土) 22:07:180834デフォルトの名無しさん
2010/03/13(土) 22:14:190835デフォルトの名無しさん
2010/03/13(土) 22:19:38__LINE__とくっつけたとして、どうやって参照するの?同じ行が前提?
0836デフォルトの名無しさん
2010/03/13(土) 22:50:27同じ行に書くか、ひとつのマクロ内であれば問題なく使えるでしょ。
この場合は単にスコープ分けるだけでも済みそうだし、
__VA_ARGS__ が使えるなら >816 のやつがいいと思う。
0837デフォルトの名無しさん
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]);
こんな感じに書くのが基本に忠実な答え
まずはデータ形式から見直そう
0838デフォルトの名無しさん
2010/03/13(土) 23:08:15int の配列って言ってるだろ。十分なデータ構造じゃないか。
規則性がなくてぐしゃぐしゃなのは配列の中の値だろ。
0839デフォルトの名無しさん
2010/03/13(土) 23:20:290840デフォルトの名無しさん
2010/03/13(土) 23:24:19だったら二次元配列を使おう、でおしまいだね。いったい何を悩んでるんだろう
0841814
2010/03/13(土) 23:52:42つまり複合リテラル>>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などの値と離れて記述する
ことになります。できればインスタンス毎にまとめておきたいのですが・・・
0842デフォルトの名無しさん
2010/03/14(日) 00:07:580843814
2010/03/14(日) 00:09:58レスを頂いた皆さま、大変参考になりました。ありがとうございました。
0844デフォルトの名無しさん
2010/03/14(日) 00:14:23じゃあ
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}}
};
では?
0845814
2010/03/14(日) 00:24:12メンバ変数のうち、Id、Name、Hp_max、Attack、Speedは親クラスから継承しているメンバなのです。
親クラスが存在するクラスではそういう書き方はできなかったかと・・・
0847デフォルトの名無しさん
2010/03/14(日) 00:28:580848デフォルトの名無しさん
2010/03/14(日) 00:30:13どれくらい見られたくないのかにもよるけど、別ファイルにしてスクランブルかけた方が見られにくいよ
0849デフォルトの名無しさん
2010/03/14(日) 00:35:39ひでぇ。最初っからそう聞けよ。 >814 みたいにしたせいで無駄なレスがあんなに。
0850デフォルトの名無しさん
2010/03/14(日) 00:35:490851デフォルトの名無しさん
2010/03/14(日) 00:37:51CTest::CTest(const X &init) : m_id(init.id), ・・・
{
}
0852814
2010/03/14(日) 00:38:12すみません。私の聞き方が悪かったせいで、これ以上続けても私が質問したいことを上手く書けるか分かりませんので、
これで終わりにさせてください。
乱暴なようで申し訳ないのですが、以後レスは致しません。
0853デフォルトの名無しさん
2010/03/14(日) 00:38:220854デフォルトの名無しさん
2010/03/14(日) 00:39:42|も.|
|う |
│来│
│ね│
│え .|
│よ .|
バカ ゴルァ │ !!.│
└─┤ プンプン
ヽ(`Д´)ノ ヽ(`Д´)ノ (`Д´)ノ ( `Д)
| ̄ ̄ ̄|─| ̄ ̄ ̄|─| ̄ ̄ ̄|─□( ヽ┐U
〜 〜  ̄◎ ̄ . ̄◎ ̄  ̄◎ ̄ ◎−>┘◎
0855デフォルトの名無しさん
2010/03/14(日) 00:41:22聞く方が混乱するだけだ
0856デフォルトの名無しさん
2010/03/14(日) 00:42:560857デフォルトの名無しさん
2010/03/14(日) 01:15:29{
void operator () (int a1, int a2, ...);
};
num_of_argsに対応してoperator ()の引数の数を変動させたいのですが、特殊化をジェネレートするほかにいい方法は無いですかね?
0858デフォルトの名無しさん
2010/03/14(日) 01:22:48「ジェネレート」がコンパイル以外のプロセスを指しているのなら、 Boost.Preprocessor が
いくらかマシな手段となるかもしれない。
0859デフォルトの名無しさん
2010/03/14(日) 01:23:52これじゃダメっすか
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); }
};
0860デフォルトの名無しさん
2010/03/14(日) 01:26:06C++0xを、首を長くして待て。
0861デフォルトの名無しさん
2010/03/14(日) 01:28:230862デフォルトの名無しさん
2010/03/14(日) 01:38:21num_of_argsが要らなくない?無いほうがすっきりしないか?
0863デフォルトの名無しさん
2010/03/14(日) 01:55:12どうせ特殊化で生成するなら、オーバーロードでいいんじゃね?
0864デフォルトの名無しさん
2010/03/14(日) 02:07:19boostはよく知らないんですが後でちょっと探ってきます
>>589
これは面白いですね
コード生成は避けられんませんが、ちょっとシンプルになりました
>>860
待ちきれません
>>862,863
array<3> a(10, 15, 20);
a(1, 5, 3) = 100;
こんな感じで使おうと思ってるんで、num_of_argsは欲しいです
0865デフォルトの名無しさん
2010/03/14(日) 02:10:310866デフォルトの名無しさん
2010/03/14(日) 02:13:280867デフォルトの名無しさん
2010/03/14(日) 02:14:53x[Index(a, b, c)] で代用できるから
0868デフォルトの名無しさん
2010/03/14(日) 02:27:47早い話がvector<vector<vector<int>>>だね。
0869デフォルトの名無しさん
2010/03/14(日) 02:39:36g++ 4.4ではもう使える。
0870デフォルトの名無しさん
2010/03/14(日) 02:40:370871デフォルトの名無しさん
2010/03/14(日) 03:10:09書店に行ってもプログラミングの入門書ばかりで
言語仕様の解説書が見つからなくて困ってる
組み込みやる事になってgcc、GNUARM使う事になったんだが
文法がまるで分からん(K&R〜ANSIの頃のCは随分使ったんだが)
0872デフォルトの名無しさん
2010/03/14(日) 03:11:270873デフォルトの名無しさん
2010/03/14(日) 03:13:49JIS規格ならJISのサイトや取り扱ってる書店で発注すれば購入できたり無料で見たりできるお!!!!!!
0874デフォルトの名無しさん
2010/03/14(日) 03:16:240875デフォルトの名無しさん
2010/03/14(日) 03:19:23むしろ入門書のほうがいいんじゃないのかw
ってか組み込みならそんなに難しい文法の知識いらないし、
むしろ環境構築の方が面倒な気がするけどね
0876デフォルトの名無しさん
2010/03/14(日) 03:22:54単にCの延長でいいなら入門書読めば事足りるはず。
C++らしいコードが書きたいなら
Effective C++とかMore Effective C++でも読んどけば?という感じ。
厳密な文法が知りたければISO/IEC 14882:2003が言語仕様書ということになってるが、
これを読んで特定の目的を達成するコードが書けるとは思えんなあ。
0877デフォルトの名無しさん
2010/03/14(日) 03:26:22入門書だとオペレーターオーバーロードとかnamespaceとかそんなん吹き飛ばして
いきなりstd::coutとか使い出すし
0878デフォルトの名無しさん
2010/03/14(日) 03:30:29しかも、その場合、ADLまで絡んでくるしな。
0879デフォルトの名無しさん
2010/03/14(日) 03:34:03仕様書とかダルイっていう舐めた態度の時にこの本買った
http://www.hir-net.com/book/book14/index.html
>>877
な感じで詰まってるなら入門書と並行してこういう本買ってもいいかもね
最近は色々種類あるだろうし翻訳物もあるだろうから本屋行って選ぶよろし
0880デフォルトの名無しさん
2010/03/14(日) 04:04:01C++の一般論が必ずしも当てはまるとは限らんから
0881デフォルトの名無しさん
2010/03/14(日) 12:59:49組み込みなら C 使えよ。
お前みたいなのが C++ 使うとバグが増える。
とりあえずヘッダ自動生成とかのツール類で
勉強してからにしろ。
0882デフォルトの名無しさん
2010/03/14(日) 13:03:010883デフォルトの名無しさん
2010/03/14(日) 13:06:49> とりあえずヘッダ自動生成とかのツール類で
> 勉強してからにしろ。
何を言っているんだw
0884デフォルトの名無しさん
2010/03/14(日) 13:13:530885デフォルトの名無しさん
2010/03/14(日) 13:58:08組み込みは製品になるとスタックダンプとレジスタぐらいしか
なくてアセンブラだけで解析すんの大変なんだぜ。
お前らみたいな糞コードのバグ解析がこっちに
回ってきて迷惑なんだよ。
0886デフォルトの名無しさん
2010/03/14(日) 14:04:430887デフォルトの名無しさん
2010/03/14(日) 14:29:06組み込みつったって規模があるだろう
それこそメモリが数kbしかないものもあれば、OSが載っているようなシステムだってある
少し極論じゃないのか
0888デフォルトの名無しさん
2010/03/14(日) 14:40:510889デフォルトの名無しさん
2010/03/14(日) 14:46:530890デフォルトの名無しさん
2010/03/14(日) 18:41:27void 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);の一方だけが必ず実行され
他方は必ず実行されないことになります。
こういった場合は、テンプレートメタプログラミングを使って
一方だけのコードが実行バイナリファイルに含まれるようにすべきなのでしょうか。
それともコンパイラの最適化を期待して上記のコードのままでも良いのでしょうか。
よろしくお願い申し上げます。
0891デフォルトの名無しさん
2010/03/14(日) 19:09:380892デフォルトの名無しさん
2010/03/14(日) 19:10:12最適化に期待すれば十分だと思うよ。
実測してその部分がパフォーマンスに影響することが分かってから改良しても遅くないよ。
0893デフォルトの名無しさん
2010/03/14(日) 19:20:20困る・・・か?そんなバカコンパイラは想定しない方が良いか。
0894デフォルトの名無しさん
2010/03/14(日) 19:20:28if_<flag, when_true, when_false>::type::func(arg);
確実性を考えると↑のように関数化しないといけない
結局のところオーバーヘッドは避けられないからif elseのままでいいよ
0895デフォルトの名無しさん
2010/03/14(日) 19:25:09template<bool N>
void func();
でN値による特殊化なんかできるのかな
0896デフォルトの名無しさん
2010/03/14(日) 19:32:55class 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);
}
0897デフォルトの名無しさん
2010/03/14(日) 20:07:40速度やコードサイズの最適化なんてたかがしれてるだろ
>>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だけで
他にクラスや関数を用意する必要はないはず
まあこんなことしなきゃならないほどカツカツなら
他に検討すべき箇所があるんじゃないのかね
0898デフォルトの名無しさん
2010/03/14(日) 20:08:46できるっしょ。
template<bool b>
void func(){〜};
template<>
void func<true>(〜);
これでおkでは?
0899デフォルトの名無しさん
2010/03/14(日) 20:44:030900デフォルトの名無しさん
2010/03/14(日) 20:50:270901デフォルトの名無しさん
2010/03/14(日) 20:55:240902デフォルトの名無しさん
2010/03/14(日) 20:57:24関数化するまでも無い分岐の場合は特にそうだろう
0903デフォルトの名無しさん
2010/03/14(日) 20:59:40逆効果じゃねぇかwwwww
0904デフォルトの名無しさん
2010/03/14(日) 21:00:55分かる場合、それでも最適化できないバカコンパイラって
知っている?
それを最適化できないとなるともっと重大な所でも
最適化できなさそうな気がするが。
0905デフォルトの名無しさん
2010/03/14(日) 21:19:48なんでこれが期待どおりに動いてるのかよく分からない
0906デフォルトの名無しさん
2010/03/14(日) 21:47:540907デフォルトの名無しさん
2010/03/14(日) 21:51:07メンバT::swapが存在し、かつvoid (T::*)(T &)が&T::swapに置き換え可能ならば
(その場合のみ)has_swap_implの部分特殊化が選択される。
0908デフォルトの名無しさん
2010/03/14(日) 21:55:480909デフォルトの名無しさん
2010/03/14(日) 22:40:36>>871 は C はそれなりに書けるようだが、
解説書見ながら C++ で書いてより高品質なソフトが
書ける理由がないだろ。
どうせ new[] したのを delete するようなコード
書いて地雷仕込むのがオチ。
0910デフォルトの名無しさん
2010/03/14(日) 23:18:09まず、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 にすればいい)
0911デフォルトの名無しさん
2010/03/14(日) 23:20:30特殊化とかADLとか絡んでついていけない時がままある
0912デフォルトの名無しさん
2010/03/14(日) 23:25:190913デフォルトの名無しさん
2010/03/14(日) 23:33:42誤) ・void T::swap(T&)が存在しないならば、適合するhas_swap_helperは「存在しない」。
正) ・void T::swap(T&)が存在しないならば、has_swap_helperのテンプレート引数が確定しない。
0914デフォルトの名無しさん
2010/03/14(日) 23:34:08#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;
}
0915デフォルトの名無しさん
2010/03/14(日) 23:35:40>>914 は >>852
これくらいしか思いつかん。
0916デフォルトの名無しさん
2010/03/14(日) 23:57:05どうもありがとう、なんとなくわかってきた
なるべく特殊化が強いのを優先的にリストアップして最初に合致したやつを使うということですね
0917デフォルトの名無しさん
2010/03/15(月) 00:03:50テンプレートメタプログラミングって
とても難解そうで ほとんど学んでいないのですが、
例えば>>890さんの場合ですとどうすればいいことになるのでしょうか。
どなたかコードを(boost::mplのような出来合いのライブラリを
使用せずに)書いてくださいませんでしょうか。
よろしくお願いします。
0918デフォルトの名無しさん
2010/03/15(月) 00:19:42最近、C++を勉強し始めたからテンプレートを勉強していないんだけど
こんな難しそうなのを「みんな出きるのか〜」とビビってたぜ
あぁ〜安心した
0919デフォルトの名無しさん
2010/03/15(月) 00:24:32知ってても使う場面は実はそれほど多くない(なくても実装できることが多い)し
使える場面だとしてもすでにできの良いライブラリがあるからそっちを使うことになる
0920デフォルトの名無しさん
2010/03/15(月) 00:24:39とかを意識すると多少理解が楽になる
0921デフォルトの名無しさん
2010/03/15(月) 00:35:15boost::mplを使えるようになれば自然と覚えられるよ。
0922デフォルトの名無しさん
2010/03/15(月) 01:13:45TMPって出来合いのライブラリを使うプログラミングだと思う
自分でメタ関数やシーケンスをフル実装してる奴とかいるのかね
そういやTMPの本が出版されたんだっけ?
0923デフォルトの名無しさん
2010/03/15(月) 01:19:46template使ってる人は型レベルとの相性が良い(というか型レベルそのものだ)から好きで使ってるだけ。
0924デフォルトの名無しさん
2010/03/15(月) 05:19:50自信ないけどこんなんでどうか
ttp://codepad.org/jyhjFg0S
ところで、こういうのって、boolでやるのと
struct true_tag {};
struct false_tag {};
とかを定義してやるのと、どっちがいいんだろ?
0925デフォルトの名無しさん
2010/03/15(月) 06:57:33これでいいっしょ。
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なんて必要性が感じられなければ無理に使うような物でもないと思うよ。
付け焼刃の知識では早々使えるコードが出てくることもない。
何に使えるのかわかってからでも使い始めるのは遅くない。
まずは既存のコードでどう使われているのか観察することだな。
0926917
2010/03/15(月) 10:53:59C++0xではテンプレートメタプログラミングをサポートするためだけにあるような
機能が増えると伺っておりましたので、そろそろ勉強し始めるときが
来たような気がしています。
0927デフォルトの名無しさん
2010/03/15(月) 12:28:21そうだとおもう。テンプレートは作るのは地獄だけど、使うのは楽になるように作るように心がけてる。
関数テンプレートなんか型推論で殆ど型引数を書かなくてすむのに正しいコードが出るんだから、丁寧に作った関数テンプレートは使う側にとって大きなメリットがあると思う。
0928デフォルトの名無しさん
2010/03/15(月) 13:17:19お前はテンプレートメタプログラミングってなんだか理解しているのか?
> 関数テンプレートなんか型推論で殆ど型引数を書かなくてすむのに
> 正しいコードが出るんだから、丁寧に作った関数テンプレートは
> 使う側にとって大きなメリットがあると思う。
>>922もみんなもテンプレートメタプログラミングの話をしているんだけど。。。
0930デフォルトの名無しさん
2010/03/15(月) 15:19:03ファイルは見つかるんですが、http://a.com/aa.jpgからだとファイル名はaa[1].jpgになっています。
http://zzzzzz.com/aa.jpg とではファイル名の区別がつきません。Temporary Internet Filesのファイルをプロパディで
見るとURLの情報が解るのですが、この情報を参照できるような関数や方法ってありませんか?
0931デフォルトの名無しさん
2010/03/15(月) 17:08:240933デフォルトの名無しさん
2010/03/15(月) 17:31:050934デフォルトの名無しさん
2010/03/15(月) 17:35:210935930
2010/03/15(月) 17:52:06D:\Temporary Internet Files\Content.IE5を見たところindex.datがあるので、ここでファイルとアドレスを関連付けて
\Temporary Internet Filesに表示させてる? datをC++で読み込んで目当てのファイルを見つけることは可能でしょうか?
0936デフォルトの名無しさん
2010/03/15(月) 18:01:30/´o ヽ
,.ィゝ l
 ̄ヽ l
l ヽ___
/ ,,...---`ニニニ==、,,__
l / ヽ ヽ ヽ ヽ ヽ ヽ ヽ l三三三>
| iヽ ヽ ヽ ヽ ヽ ヽ ヽ/三三/''ー- 、
ヽ. ヽ、ヽ ヽ ヽ ヽ ヽ.∠三=‐''´>‐--‐'
ヽ、`'''ー‐---‐'''´_,,...--‐'''´
`''ーッ--t_,r'''´
_/._/
0937デフォルトの名無しさん
2010/03/15(月) 18:33:35そうでなくて、Windowsという環境依存なプログラムについては「環境依存OKなスレで聞きなよ」ってことでしょ
0938デフォルトの名無しさん
2010/03/15(月) 18:56:25【初心者歓迎】C/C++室 Ver.71【環境依存OK】
http://pc12.2ch.net/test/read.cgi/tech/1264774545/l50
0939930
2010/03/15(月) 19:00:080940デフォルトの名無しさん
2010/03/15(月) 20:13:17二つ目のfoo_impl()はコンパイルエラー起こすだろ
関数テンプレートで部分的特殊化は無理
0941デフォルトの名無しさん
2010/03/15(月) 21:25:05ソース : http://codepad.org/YM2RidkL
47、48行目の再帰処理のあたりが原因だと思うのですが、誰か助けてください
0942デフォルトの名無しさん
2010/03/15(月) 21:55:200943デフォルトの名無しさん
2010/03/15(月) 22:01:470944デフォルトの名無しさん
2010/03/15(月) 22:10:030945デフォルトの名無しさん
2010/03/15(月) 22:14:340946デフォルトの名無しさん
2010/03/15(月) 22:45:42> 見てないけど
おいw
0947デフォルトの名無しさん
2010/03/15(月) 23:16:01>>876
ありがとうございます、一番参考になりました
近日中に都会に出かけるのでwあったら立ち読み&購入検討してきます
何度かパーサを書く仕事をしたので、どうしてもライブラリより構文に目が行ってしまいます
最近はそういうの流行らないみたいですね
もはやIBM流の構文チャート?やBNFで定義できるような言語じゃないとは
噂で聞いてはおりますが…
0948デフォルトの名無しさん
2010/03/16(火) 00:23:47添え字10のアクセス違反って出てるじゃん
m_array[9]に値入れた後にjをインクリメントしてるんだろ
>>947は組み込み自体やった事なさそうな感じ
0949デフォルトの名無しさん
2010/03/16(火) 02:36:50{
const fuga &f;
public:
hoge() : f(fuga_sub())
{
}
};
const参照はテンポラリオブジェクトを束縛すると聞いたんですが、↑のようにするとバグります。なぜなんでしょうか?
0950デフォルトの名無しさん
2010/03/16(火) 02:37:500951デフォルトの名無しさん
2010/03/16(火) 05:58:00ええ、組み込みは初めてです
使ってもいいライブラリはサンプル等あるんで問題ないんですが
コンストラクタの初期化リストなんて初めて見ました
トッパンのC++の本なら昔買いましたが、今更役に立ちませんよねw
0952デフォルトの名無しさん
2010/03/16(火) 07:58:42初期化リストで使った場合、コンストラクタの終わりまでしか延命されない。
規格の 12.2 p5 より。
> ... A temporary bound to a reference member in a constructor's ctor-initializer
> persists until the constructor exits. ...
その特別ルールが役に立つのはほぼ自動変数だけ。
0953デフォルトの名無しさん
2010/03/16(火) 13:34:16仕様でしたか・・・
静的に安全にポリモれると思ったんですが、残念です
0954デフォルトの名無しさん
2010/03/16(火) 19:52:08それ以外の初期化ではint a(0);じゃなくてint a = 0;を使うのですか?
0955デフォルトの名無しさん
2010/03/16(火) 19:55:04int a = 0;も初期化であって、代入ではないです。
0956デフォルトの名無しさん
2010/03/16(火) 19:55:35scoped_ptrやshared_ptrで掴んでおけばOK
0957デフォルトの名無しさん
2010/03/16(火) 20:06:36説明不足でした。例えば、
class A {
int a
public:
A(int _a);
};
というクラスがあったとして、コンストラクタに
A::A(int _a) { a = _a; }
よりも、初期化子リストを使った
A::A(int _a) : a(_a) { }
のほうが良いと言われているのにどうして組み込み型の場合は
int a(0);
じゃなくて
int a = 0;
と書くのかという意味です。
0958デフォルトの名無しさん
2010/03/16(火) 20:19:52組み込み型だからという問題ではない。
:{a=_a;}は代入。しかもデフォルトコンストラクタで初期化してさらに代入するという無駄がある。
:a(a)もint a=0;も一発初期化で無駄が無い。
0959デフォルトの名無しさん
2010/03/16(火) 20:35:440960デフォルトの名無しさん
2010/03/16(火) 20:49:30int a(0);もint a=0;も機能は同じ。
だけど、組み込み方とクラスで同じように式の形式で書けたら便利な場合がある。たとえば、
int a=b+c*d;
std::complex<double> ca=cb+cc*cd;
0961デフォルトの名無しさん
2010/03/16(火) 21:02:25ひょっとして
int main() {
int a(10);
}
と書かずに
int main() {
int a = 10;
}
と書くのはなぜかって話かな?
0962デフォルトの名無しさん
2010/03/16(火) 21:22:560963デフォルトの名無しさん
2010/03/16(火) 21:26:270964デフォルトの名無しさん
2010/03/16(火) 21:33:44class A {
int a = 0;
};
これが出来るようになるから
0965デフォルトの名無しさん
2010/03/16(火) 21:52:41int a(0);
};
はまだかね
0966デフォルトの名無しさん
2010/03/16(火) 21:56:41メンバの初期化をそうやって書けるようになるってこと?
そのメンバはintの様な組み込み型以外でもおkだったりする?
0967デフォルトの名無しさん
2010/03/16(火) 22:42:410968デフォルトの名無しさん
2010/03/16(火) 22:53:45するとデストラクタどうなるんだろう
0969デフォルトの名無しさん
2010/03/16(火) 22:57:070970デフォルトの名無しさん
2010/03/16(火) 23:00:01あながち間違ってない気がするが
0971デフォルトの名無しさん
2010/03/16(火) 23:04:37なんでわざわざクラス名と同じになってるんだっけ。
constructor()
destructor()
じゃダメな理由をどこかで見たんだが
思い出せないでござる
0972デフォルトの名無しさん
2010/03/16(火) 23:04:540973デフォルトの名無しさん
2010/03/16(火) 23:08:16D言語がthisと~this
だった記憶が
0974デフォルトの名無しさん
2010/03/16(火) 23:12:06親クラスのコンストラクタとか呼び出す時のためとか?
0975957
2010/03/16(火) 23:17:38int a = 0; も int a(0); も初期化なのですね。安心しました。
0976デフォルトの名無しさん
2010/03/16(火) 23:20:26そんな時はsuperを用意してだな…
0978デフォルトの名無しさん
2010/03/16(火) 23:32:09=で書こうとするとコンストラクタとコピー両方発生してしまうのね
勿体無いからクラスの場合はhoge h();のほうを使うと
0979デフォルトの名無しさん
2010/03/16(火) 23:33:060980デフォルトの名無しさん
2010/03/16(火) 23:41:540981デフォルトの名無しさん
2010/03/16(火) 23:47:050982デフォルトの名無しさん
2010/03/17(水) 00:43:46必ず存在するかじゃないか?
予約名を増やしたくないとか?
0983デフォルトの名無しさん
2010/03/17(水) 02:38:32そもそも、予約語を増やしたくないってのが C の基本の考えじゃなかったっけ
static が静的メンバだったりファイルスコープだったりと、同じ語でも複数の意味を持つことがある
0984デフォルトの名無しさん
2010/03/17(水) 03:12:49operator this() {} // ctor
operator ~this() {} // dtor
};
これはきもいか・・・
0985デフォルトの名無しさん
2010/03/17(水) 03:24:090986デフォルトの名無しさん
2010/03/17(水) 13:47:40codepadはboostに対応しているだろ?
0987デフォルトの名無しさん
2010/03/17(水) 14:12:46>>974 >>977
0988デフォルトの名無しさん
2010/03/17(水) 15:03:59過去にがんじがらめになっている、
そんなC++が大好きです。
0989デフォルトの名無しさん
2010/03/17(水) 15:06:020990デフォルトの名無しさん
2010/03/17(水) 15:06:12そうそう。
C++0xスレの
ttp://pc12.2ch.net/test/read.cgi/tech/1262874195/220
ここからツリー化して読んでみてくれ。
同じような話題が出ている。
0991デフォルトの名無しさん
2010/03/17(水) 15:07:38それもみんな思うことなんだな
C++0xスレの
ttp://pc12.2ch.net/test/read.cgi/tech/1262874195/224
ここからツリー化して読んでみてくれ。
ここでもまた同じような話題が出ている。
0992デフォルトの名無しさん
2010/03/17(水) 16:28:08という動作を繰り返す場合stlでいうとどのコンテナが最適でしょうか?
0993デフォルトの名無しさん
2010/03/17(水) 16:28:540994デフォルトの名無しさん
2010/03/17(水) 17:10:400995デフォルトの名無しさん
2010/03/17(水) 20:46:090996デフォルトの名無しさん
2010/03/18(木) 01:21:07最近すこしずつスレに書いて有ることが見えてきたよ…内容はまだあんまし判らんけどね
給料日が来たら、今度はEFFECTIVE C++を買ってくるんだ…
0997デフォルトの名無しさん
2010/03/18(木) 01:48:02というか通勤中に読書ってどういうこと?車運転しながら本読んでるの?
0998デフォルトの名無しさん
2010/03/18(木) 01:54:56ヒント:電車
0999デフォルトの名無しさん
2010/03/18(木) 01:55:05いや、通勤で読書と言えば電車とかバスだってばさw
しかし仕事帰りに読むと、良い具合に睡眠導入作用がががg
1000デフォルトの名無しさん
2010/03/18(木) 01:56:4710011001
Over 1000Threadもう書けないので、新しいスレッドを立ててくださいです。。。
レス数が1000を超えています。これ以上書き込みはできません。