C++相談室 part85

このエントリーをはてなブックマークに追加
1デフォルトの名無しさん
C++に関する質問やら話題やらはこちらへどうぞ。
ただし質問の前にはFAQに一通り目を通してください。
IDE (VC++など)などの使い方の質問はその開発環境のスレに
お願いします。

前スレ
C++相談室 part84
http://hibari.2ch.net/test/read.cgi/tech/1284736187/
2デフォルトの名無しさん:2010/10/09(土) 20:25:26
■基本■
[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)に対応。
3デフォルトの名無しさん:2010/10/09(土) 20:26:16
■Libraries■
[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
4デフォルトの名無しさん:2010/10/09(土) 20:27:41
5デフォルトの名無しさん:2010/10/09(土) 20:29:03
6デフォルトの名無しさん:2010/10/09(土) 20:42:28
■長いソースを貼るときはここへ。■
 http://codepad.org/

最近 codepad.org は調子がいまいちなので

 Ideone.com | Online IDE & Debugging Tool
 http://ideone.com/

こっちもつかってね!

7デフォルトの名無しさん:2010/10/09(土) 20:52:14
STLつかうと一気に実行ファイルサイズが10倍に?!

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

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

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

#include <stdafx.h>
後死ね。

言葉が悪いな。それで教えているつもりか。
まぁヒントぐらいにはなったな。
うむごくろう。
8デフォルトの名無しさん:2010/10/09(土) 21:03:55
> 最近 codepad.org は調子がいまいちなので

あんまり関係ないかもしれないけど、
http://d.hatena.ne.jp/yaneurao/20100929#c1286573427
> http://codepad.org/PYXHLYnN
> ヒープから確保したサイズと、それを保持するオブジェクトのサイズの合計を
> 比べて、 std::vector のほうが 24 バイト多く必要。
> http://ideone.com/BCBAg
> 同じコードですがこちらの環境では差は 4 バイトにまで縮まっています。

↑で operator new のログを取るコードが挙がってるんだけど、
codepad のほうの結果に main() より前に operator new/delete が
使われてて、さらに delete が出てない奴まである。

うちのマシンでやると ideone のほうと同じように、普通に想定される
operator new/delete のぶんしか出ない。

codepad のほうのメモリ確保、何だかわかる?
9デフォルトの名無しさん:2010/10/09(土) 21:12:14
>>4
関連書籍検索が何で洋書なんだ???
和書の貼れよ
ttp://www.amazon.co.jp/b/?node=754384
10デフォルトの名無しさん:2010/10/09(土) 22:12:09
■C言語のみの質問はC言語スレで聞いた方がいいです。■
C++とC言語は別の言語なので、
CのみのコードならC言語スレに行った方が良いと思います。

理由:
 1. C言語用のスレがせっかくあるのだから。
 2. C言語はほぼC++に取り込まれているが、だからといってC++スレで
  聞いたからにはC++にしか通用しない文法や標準ライブラリやクラスで
  で返されても仕方ないことだから。

11デフォルトの名無しさん:2010/10/10(日) 15:45:12
__   __       ┌──┐  ┌───────┐
\  \ \  \     └┐  │  └──────  │
  \  \ \  \     │  │           / /
   \  \ \  \    │  │         / /
     \  \ \  \  │  │        / /
     /  / /  /  │  │      / /
   /  / /  /    │  │    _ / /
  /  / /  /     │  │   (  /____/\
/  / /  /       │  │   \            )
 ̄ ̄    ̄ ̄         └─┘      ̄ ̄ ̄ ̄ ̄ ̄ ̄
12デフォルトの名無しさん:2010/10/10(日) 21:02:39
12に見えるぞ
13デフォルトの名無しさん:2010/10/10(日) 21:22:53
クラス内の配列をキャスト演算子で配列引数のテンプレート関数に渡せるような書き方ってないですか?
14デフォルトの名無しさん:2010/10/10(日) 21:34:46
ないあるよ
15デフォルトの名無しさん:2010/10/10(日) 21:52:45
>>13 クラスにそれを吐くメソッド入れるってのは無しなんだよね?
16デフォルトの名無しさん:2010/10/10(日) 22:05:43
>>13
配列なら、配列引数の関数テンプレートに渡せるだろjk
なんでキャスト演算子とか出てくるのかわけわからん。
17デフォルトの名無しさん:2010/10/10(日) 22:20:12
new使った動的配列だとか?
もしそうなら
int[10]とint*であれば*(int (*)[10])&pみたいになるな
18デフォルトの名無しさん:2010/10/10(日) 22:24:19
CとC++の違いって何ですか?
19デフォルトの名無しさん:2010/10/10(日) 22:25:05
C++の方がなんか強そう
20デフォルトの名無しさん:2010/10/10(日) 22:26:19
Cは職人
C++は工場
21デフォルトの名無しさん:2010/10/10(日) 22:27:00
>>15
それはつまり目的のテンプレート関数の機能をもうクラスに入れちゃうってことですか
ただ想定としてはいろんなテンプレート文字配列関数にそのまま渡せるような
キャストがあれば知りたいなと思いまして、上ような関数なんかも目からウロコでしたし

>>16
すんません、配列をメンバに持つクラスをキャストして上のような関数に渡せないかということです

>>17
いえ、申し訳ないですが静的な配列です
22デフォルトの名無しさん:2010/10/10(日) 22:44:17
配列の参照を返すoperator()を定義でいいんじゃない
23デフォルトの名無しさん:2010/10/10(日) 23:49:15
>>21
>22 の言う方法でお題は達成できるんだろうけど、キャストを持ち出すべき
ところかなあ?そのキャストが入ったコード読んでも意味わからない状態に
ならない?

ちゃんと名前をつけて配列の参照を返す関数を作ったほうがいいんじゃないか?
24デフォルトの名無しさん:2010/10/10(日) 23:59:16
一応目的は配列引数のテンプレート関数にクラスを渡す方法なんで
それがキャストである必要は無いですね
25デフォルトの名無しさん:2010/10/11(月) 01:22:22
http://codepad.org/PiClDyzn
なんでそうなのか分かるから歯がゆいいいい
26デフォルトの名無しさん:2010/10/11(月) 01:55:27
もしかしたら、テンプレート関数のほうを改造するほうが良い可能性も考えられる。
27デフォルトの名無しさん:2010/10/11(月) 02:05:21
最近姿を見せなかったGが今6匹いっせいに飛び出してきた
地震に注意しろよオマイラage
28デフォルトの名無しさん:2010/10/11(月) 02:16:40
>>25
おお!すごい!
>typedef char (&S)[N]
これで配列参照の戻り値にできたんですね(なんだか関数ポインタに似てる)
実は今までキャスト以外でも配列の参照を返せませんでした…
29デフォルトの名無しさん:2010/10/11(月) 03:27:44
std::valarray<>について質問です

template<class T>
std::valarray<T> doSomething(const std::valarray<T> &v){
...
}

std::valarray<float> A, x;
....
doSomething(A - x);


これでちゃんとdoSomethingが呼ばれるかと思いましたが,

doSomething(std::_Expr<std::_BinClos<std::__minus, std::_ValArray,
std::_ValArray, float, float>, float>)

が無いと言われてコンパイルエラーになりました.
std::valarrayとして渡せないはずは無いと思うのですが・・・
30デフォルトの名無しさん:2010/10/11(月) 03:53:32
valarrayの - 演算子って定義されてるの?
31デフォルトの名無しさん:2010/10/11(月) 03:58:43
エラーメッセージ見ると、どうやらその実装はExpressoin Template的なものを使ってそうだな
doSomething(std::valarray<float>(A - x));
とか
doSomething(A -= x);
でどうだ?

MSVCの実装は単に要素ごとに引いてるだけだから、コンパイル通ったけどね
32デフォルトの名無しさん:2010/10/11(月) 11:34:43
templateを使ったコードは実行速度が遅くなりますか?
33デフォルトの名無しさん:2010/10/11(月) 11:38:32
いいえ
3432:2010/10/11(月) 11:48:03
>>33
thx
35デフォルトの名無しさん:2010/10/11(月) 11:55:05
コンパイラの実行速度が遅くなります
36デフォルトの名無しさん:2010/10/11(月) 14:01:39
抽象クラスに静的メンバ変数もたせても、その変数は使えますか?
37デフォルトの名無しさん:2010/10/11(月) 14:10:52
使える。
38デフォルトの名無しさん:2010/10/11(月) 14:20:22
ありがとう。一生忘れない。
39デフォルトの名無しさん:2010/10/11(月) 14:29:37
C++でコードの一部の実行時間を計るのにそのコードだけにかかる
時間を計ることは出来ますか?
普通はどうやって測るのが一般的ですか?
40デフォルトの名無しさん:2010/10/11(月) 14:31:24
時間の差
41デフォルトの名無しさん:2010/10/11(月) 14:49:34
関数の前と後にtimeGettime
42デフォルトの名無しさん:2010/10/11(月) 14:52:01
>>39
自前でコードに精密タイマ埋め込んで計る。
あるいはインテルなど各社から出ている測定ツール使う。
43デフォルトの名無しさん:2010/10/11(月) 15:29:20
純粋仮想デストラクタを定義して、その派生クラスでデストラクタを定義したんですが、
なぜか外部参照エラーが出ます。
エラーは基底クラスのデストラクタを参照してエラーが出ているようです。

原因として何が考えられるでしょうか?
44デフォルトの名無しさん:2010/10/11(月) 15:32:55
基本クラスのデストラクタがないから
派生クラスのデストラクタは必ず自動的に基本クラスのデストラクタを呼ぶ
45デフォルトの名無しさん:2010/10/11(月) 15:33:22
抽象クラスを作って、その派生クラスを作ります。
派生クラスのインスタンスが消滅した場合、抽象クラスのデストラクタも
実行されるのでしょうか?
46デフォルトの名無しさん:2010/10/11(月) 15:35:19
はい
47デフォルトの名無しさん:2010/10/11(月) 15:35:29
>>44
でもその基本クラスのデストラクタが定義されてないのでエラーがでるということですか?
もしそうなら、純粋仮想デストラクタというものは定義できないのでしょうか?
48デフォルトの名無しさん:2010/10/11(月) 15:37:24
純粋仮想関数も中身を定義できるんだぞ
49デフォルトの名無しさん:2010/10/11(月) 15:42:48
とeffective C++にかいてあるんだぞ
50デフォルトの名無しさん:2010/10/11(月) 15:44:21
う〜ん。
純粋仮想関数化すれば、基本クラスのデストラクタが実行されないと思ったので、無駄な処理が
省けると思ったのですが。

でも純粋仮想関数化(後ろに=0つける)したのに、外部参照エラーが出るんです。
具体的にどうしたらよいでしょう?
51デフォルトの名無しさん:2010/10/11(月) 15:47:41
>>50
純粋じゃなくて中身か空のデストラクタにすればいいんじゃね。
52デフォルトの名無しさん:2010/10/11(月) 15:51:14
辻褄合わせに必死の言語なんだから、深い事は考えてはいけない。
純粋仮想デストラクタの(中身空の)定義も書いてやればいい。

class a {
virtual ~a() = 0;
};
a::~a() {}
53デフォルトの名無しさん:2010/10/11(月) 15:52:27
IEnumerableオブジェクトが勝手に定める順序で列挙されるでいいんじゃなイカ?
ランダムだろうと気分だろうと勝手に定めた順序だ
54デフォルトの名無しさん:2010/10/11(月) 15:53:14
>>53
誤爆です。すみません
55デフォルトの名無しさん:2010/10/11(月) 15:56:55
unique_ptrからshared_ptrへの変換は安全なのでしょうか。

std::unique_ptr<std::wstring> GetName();
のような関数があって、普通は戻り値のunique_ptrをそのまま
使えばいいのですが、vectorに入れたいケースがあり、shared_ptrに
変換したく、次のようなコードを書きました。

std::vector<std::shared_ptr<std::wstring>>> vec;
std::shared_ptr<std::wstring> str = GetName();
vec.push_back(str);

こういう書き方って安全なんですか?
unique_ptrの一時オブジェクトが作られ、それからshared_ptrへのムーブが
暗黙のうちに行われているので安全ではないか、と考えているのですが。
56デフォルトの名無しさん:2010/10/11(月) 15:57:47
>>51,52
できました!ありがとうございます!
この場合これを継承した派生クラスが消滅した場合、
この抽象クラスのデストラクタは実行されないんですかね?
57デフォルトの名無しさん:2010/10/11(月) 16:10:13
>>55
VC10でソース見たけど、shared_ptrにunique_ptrの右辺値参照する代入演算子が定義されてるね。
OKのようだね。
これは便利だ。ありがたく使わせてもらうよ。
58デフォルトの名無しさん:2010/10/11(月) 16:59:09
というかその程度の機能すら持ってなかったら標準ライブラリとして使い物にならないよ
59デフォルトの名無しさん:2010/10/11(月) 17:59:45
もっとも、unique_ptrをvectorの要素にすることだって可能だよ。
60デフォルトの名無しさん:2010/10/11(月) 19:33:47
>>59
unique_ptrならauto_ptrと違ってvectorそのものの動作に問題はないんでしょうけど、
要素を取り出すとき、つまらないミスをしそうですね。
暗黙のムーブを発生させちゃって、vectorには無効なunique_ptrが残ることに。
61デフォルトの名無しさん:2010/10/11(月) 19:46:27
……と思ったけど、>>55 が可能なのは GetName() の戻り値が右辺値たり得るからですね。
vector から要素を取り出すときは常に左辺値になるから、そんな心配はいらないのか。
62デフォルトの名無しさん:2010/10/11(月) 19:52:15
明示的にムーブしない限りは大丈夫じゃない?
63デフォルトの名無しさん:2010/10/11(月) 19:57:38
auto x = vec.front();
とかやって「先輩!コンパイルできません!」と泣きついてくる奴はいそうな気がする。

auto &x = vec.front();
「こうすれば大丈夫だよ」と理由や副作用も含めて教えてあげればいいんだが、

auto x = std::move(vec.front());
こういうやり方を教えて「こうすればコンパイルできるみたいだよ」なんて言う奴は
ウチの会社にはいないはず……うん、いないはず……
64デフォルトの名無しさん:2010/10/11(月) 20:23:16
>>55-63
それを説明するには、lvalueとrvalueの区別をきっちり説明しなくちゃいけないな。
俺自信ない。
65デフォルトの名無しさん:2010/10/11(月) 20:53:10
03ですら使わせてほんとに大丈夫かっていう連中がそこかしこにいるのに
0xになってさらに混乱しそうな仕様がいくつも追加されても困るよな
まあ業務では0xコンパイラ使わなきゃいいだけって話だけど
66デフォルトの名無しさん:2010/10/11(月) 20:57:13
98ならおkってわけでもないんだろ?
Javaでもやらせとけ
67デフォルトの名無しさん:2010/10/11(月) 21:10:25
ようするにC++は玄人の玩具的な扱いが加速しすぎているんだよ
もっと仕様を軽量化単純化したC++Liteを作るべき
68デフォルトの名無しさん:2010/10/11(月) 21:13:56
Embeded C++ ゴゴゴゴゴゴゴゴ・・・
69デフォルトの名無しさん:2010/10/11(月) 21:18:42
>>67
いちいちアレが使えてこれが使えなくてとか確認することになるぜ
余計ややこしくするだけだっての
他の言語かC使えばいいんだよ

>>68
組み込みもやってるけど一度も使った事ないわそれw
70デフォルトの名無しさん:2010/10/11(月) 21:34:17
> いちいちアレが使えてこれが使えなくてとか確認することになるぜ

今現在そのような状況なのを何とかしてほしいってことだろ
関数テンプレートの部分初期化とかリンカがコンパイラを呼び出したりとか
71デフォルトの名無しさん:2010/10/11(月) 21:52:50
>>68
わらたw
72デフォルトの名無しさん:2010/10/11(月) 21:58:14
けどC++は何でもありってのは良いところでもあると思うんだけどな
自分のグループやプロジェクトではそれなりにルール決めると良いだろうが
たまに Java 使うと窮屈に感じてしょうがない
73デフォルトの名無しさん:2010/10/11(月) 22:16:07
C++ で配列の要素数を求めるテンプレート作りたいのですが、

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


const BYTE* ptr = &values[0];
inr length = length(ptr);

とすると
error C2784: 'int length(const T (&)[N])' :テンプレート 引数を 'const T (&)[N]' に対して 'const BYTE *' から減少できませんでした

とエラーが出てしまいます。
どうすればいいのでしょうか?
74デフォルトの名無しさん:2010/10/11(月) 22:20:31
>>73
const BYTE* ptr これ配列じゃないよ
75デフォルトの名無しさん:2010/10/11(月) 22:24:40
length(values)
ぷっ
76デフォルトの名無しさん:2010/10/11(月) 22:29:27
>>74 すみません。

void hogehoge(const BYTE *values)
{

なんです。

void hogehoge(const BYTE values[])
{
にしても、C2784エラーがでてしまいます。
77デフォルトの名無しさん:2010/10/11(月) 22:31:14
>>76
そのhogehogeもテンプレートにしちゃいないよ。
78デフォルトの名無しさん:2010/10/11(月) 22:31:17
それも配列ではないよ
79デフォルトの名無しさん:2010/10/11(月) 22:33:22
>>76
だめだこりゃ!
80デフォルトの名無しさん:2010/10/11(月) 22:46:43
void hogehoge(const BYTE& values)
{

こうですか?
81デフォルトの名無しさん:2010/10/11(月) 22:47:49
素直に vector 使え
もう大分前から STL は C++ 標準
82デフォルトの名無しさん:2010/10/11(月) 23:04:56
関数を沢山作ると、関数の並び方によって見やすさが変わると思います
void print1();
void print2();
void print3();
の方が
void print3();
void print1();
void print2();
より見やすい気がする

お前らはどんなルールで関数を宣言していますか?
83デフォルトの名無しさん:2010/10/11(月) 23:07:59
世界最高峰のプログラマーだが、そんなこと気にしたことないね。
書けるとこに書けばいい。
スレ違いだから。
84デフォルトの名無しさん:2010/10/11(月) 23:08:06
>>82
両方とも醜いです
85デフォルトの名無しさん:2010/10/11(月) 23:45:08
>>92
printを使うのは良いとして 1,2,3 なんてイミフなラベル付けないなぁ
86デフォルトの名無しさん:2010/10/11(月) 23:45:56
処理される順に書くか対になるものを並べるかは迷うことが多い

init → begin → end → free か
init → free → begin → end
8785:2010/10/11(月) 23:46:01
あんかー間違えた。すまん >>92>>82
88デフォルトの名無しさん:2010/10/11(月) 23:48:07
説明しやすいように連番使っただけでそこをgdgd言うのは単なる揚げ足取りだろう・・・
89デフォルトの名無しさん:2010/10/11(月) 23:48:13
単なる関数名の例にケチつけるとはさすが
90デフォルトの名無しさん:2010/10/12(火) 00:53:21
辞書順だろ
結局はこれが一番一覧性高い
91デフォルトの名無しさん:2010/10/12(火) 00:59:38
>>82
それぞれどんな機能差があるか分からないけど、番号だけで分けるなんて安易で酷いと思うよ
92デフォルトの名無しさん:2010/10/12(火) 01:02:47
>>88-89
説明のためだけなら、実用における
void print1();
void print2();
void print3();

void print3();
void print1();
void print2();
の違いがさっぱり分からないわけだが。
93デフォルトの名無しさん:2010/10/12(火) 01:05:00
>>82
宣言とか定義場所の並び順なら、グループ別に分けてコメントで見出しと説明文とgrep用の印付ける。
その上で呼び出し順序のある物ならその順番で書いて、そうじゃない単位での並び順はそんなわらわら増えた事も無いし適当。
94デフォルトの名無しさん:2010/10/12(火) 01:14:12
>>92
辞書順の例を出しただけ。
他にどんなルールで並べてるのかを聞いてるんだよ
95デフォルトの名無しさん:2010/10/12(火) 01:16:17
想像力の欠乏した奴が多いなw
96デフォルトの名無しさん:2010/10/12(火) 01:53:40
>>94
というか辞書順という言葉が分からなかったんだろ?
9729:2010/10/12(火) 06:16:30
>>30
>valarrayの - 演算子って定義されてるの?
演算子いっぱい定義されてます.
http://www.cplusplus.com/reference/std/valarray/valarray/operators/


>>31
遅延評価をやってるってことですよね?
doSomething(std::valarray<float>(A - x));
でも
doSomething(A -= x);
でもコンパイル通りました.ありがとうございます!
(言い忘れましたが私はgcc 4.5を使っています)

ただ,なぜ自動的に型変換されないのでしょう.
std::valarrayのコンストラクタにA-xは渡せるのだから引数に渡るとき暗黙に型変換されるものだと思っていましたが・・
98デフォルトの名無しさん:2010/10/12(火) 06:55:39
1,2,3だけで辞書順であることを想像しろと言われてもなぁ。せめてA,B,Cにしろよ。
99デフォルトの名無しさん:2010/10/12(火) 08:24:34
>>80
テンプレート配列
#include <iostream>

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

int _tmain(int argc, _TCHAR* argv[])
{
int s[70];
std::cout<<length<>(s);
return 0;
}
100デフォルトの名無しさん:2010/10/12(火) 08:42:14
誰かSleepをしない、fps計測コードを貼ってくれませんか?
お願いします。