5ちゃんねる ★スマホ版★ ■掲示板に戻る■ 全部 1- 最新50  

■ このスレッドは過去ログ倉庫に格納されています

【標準C++】C++相談室 part39【STL含む】

1 :v(^・^)v:05/01/23 16:45:03
C++に関する質問やら話題やらはこちらへどうぞ。
ただし質問の前にはFAQに一通り目を通してください。
boost,loki,テンプレートメタプログラミング等に関する質問は
専用の別スレにお願いッス。

前スレ part38
http://pc5.2ch.net/test/read.cgi/tech/1096304546/

過去スレ、関連スレ、関連リンクなどは >>2-20 あたり

510 :デフォルトの名無しさん:05/02/08 02:07:20
>505
非型テンプレート引数には外部リンケージを持つものしか指定できないので
その違いが出ることは理解できるのですが,
その例を見てもやはり無名名前空間だけで事足りるような気がします.
440で指摘されるような使い分けがなぜ必要なのかがやはり分かりません.
内部リンケージであることが積極的に必要な状況が知りたいです.

511 :デフォルトの名無しさん:05/02/08 03:03:42
>>504
propertyクラス自身を返すようにすればできるかもしれませんねえ。検討してみます。
ただ、operator[]の最後の1回は参照を返すが、それまではインスタンスを返す実装なので
(Boost.Functionの定義がfunction<T ()>かfunction<T& ()>で異なるため)
見直しが必要かもしれません。

CRTP?
ttp://www.fides.dti.ne.jp/~oka-t/cpplab-selfref-template-2.html

512 :デフォルトの名無しさん:05/02/08 07:09:50
template <class T>
void f(T) {}
int n;
f(static_cast<int&>(n));
↑ようにキャストしても T が参照型とならないのは何故なんでしょうか?
あと、
class C {
public:
C() {}
C(const C&) { std::cout << "copy-ctor" << std::endl; }
};

template <class T>
void f(T t)
{ std::cout << &t << std::endl; }

int main()
{
C c;

std::cout << &c << std::endl;
f<C&>(c);
f(boost::cref(c));

return 0;
}
これで boost::cref は参照でわたっているにもかかわらずアドレスが
違うようなのですが、何故なのでしょうか?

VC7.1

513 :デフォルトの名無しさん:05/02/08 07:46:43
>>512
f<int&>(n);

解決!

514 :デフォルトの名無しさん:05/02/08 08:02:29
>>510 ttp://www.open-std.org/jtc1/sc22/wg21/docs/cwg_closed.html#174

515 :デフォルトの名無しさん:05/02/08 15:06:01
C のライブラリを C++ で書いてます。

完全に C のライブラリを隠蔽してしまいたいのですが、mylib/types.h で
typedef int my_char_t; みたいなことをされています。

C++ 側のヘッダで my_char_t を使うには mylib/types.h を隠蔽してしまうしか
無いのでしょうか?

構造体みたいに

extern "C" {
my_char_t;
}

みたいな事はできない?

516 :デフォルトの名無しさん:05/02/08 15:35:29
>>515
そのままC++側でもtypedef int my_char_t;って書けばいいだけじゃないのか?

517 :デフォルトの名無しさん:05/02/08 15:48:04
>>516
それしかないんですね。了解しました。
ありがとうございます。

518 :デフォルトの名無しさん:05/02/08 20:37:05
こういうことしたいんだけど、何か良い手はないものか
他によりよい手がなきゃ仕方ないけど、なるべく virtual は使いたくない
template <typename wanker, typename bore>
struct dipshit
{
void jerk();
};
template <typename wanker>
inline void dipshit<wanker, int>::jerk()
{
}
template <typename wanker>
inline void dipshit<wanker, char*>::jerk()
{
// differs from int when char*
}

519 :デフォルトの名無しさん:05/02/08 21:16:12
>>515
> C のライブラリを C++ で書いてます。
> 完全に C のライブラリを隠蔽してしまいたいのですが、
????
何をしてるって?

520 :デフォルトの名無しさん:05/02/08 21:54:40
>>518
部分特殊化?

template <typename wanker, typename bore>
struct dipshit
{
void jerk();
};

template <typename wanker>
struct dipshit<wanker, int>
{
void jerk() { /* int ver */ }
};

template <typename wanker>
struct dipshit<wanker, char*>
{
void jerk() { /* char* ver */ }
};


521 :コマンドラインオプションの処理:05/02/08 21:57:29
GNU Common C++ を使っていらっしゃる方おられますか?
http://www.gnu.org/software/commoncpp/
コマンドラインオプションのパースに便利らしいクラスライブラリが
含まれているのですが、まともなドキュメントがなく使い方が分かりません。

もし他にコマンドラインオプションの処理に便利なクラスライブラリがあったら
それを使うことも検討しています。皆さん、コマンドラインオプションの
処理ってどうやってらっしゃいます?やはり独自のパーサを作ってますか?

522 :デフォルトの名無しさん:05/02/08 22:00:55
>>520
レスthx
main()
{
dipshit<int, int> a;
a.jerk();
// a.airhead();
}
小出しになって申し訳ないがこれもしたい

523 :デフォルトの名無しさん:05/02/08 22:01:28
こういうことね
template <typename wanker, typename bore>
struct dipshit
{
void jerk();
void airhead() { }
};

524 :デフォルトの名無しさん:05/02/08 22:09:03
>>521
僕らの boost があるじゃないか。

http://www.boost.org/doc/html/program_options.html


525 :デフォルトの名無しさん:05/02/08 22:10:04
template <typename wanker, typename bore>
struct dipshit_base
{
void airhead() { }
};
template <typename wanker, typename bore>
struct dipshit : public dipshit_base<wanker,bore>
{
void jerk();
};

template <typename wanker>
struct dipshit<wanker, int> : public dipshit_base<wanker,bore>
{
void jerk() { /* int ver */ }
};

template <typename wanker>
struct dipshit<wanker, char*> : public dipshit_base<wanker,bore>
{
void jerk() { /* char* ver */ }
};

526 :デフォルトの名無しさん:05/02/08 22:22:06
>>525
うん、そーだよな・・・・thx

527 :デフォルトの名無しさん:05/02/08 22:22:55
部分特殊化は class からせよってことだよな

528 :デフォルトの名無しさん:05/02/09 01:05:10
>514
ありがとうございます.Cとの後方互換性ということをすっかり失念してました.
そこにある2番目の理由はいまいちピンと来ないですが.

529 :デフォルトの名無しさん:05/02/11 15:21:38
MyFacet* facet = new MyFacet;
std::locale loc( std::locale::classic(), facet );

この場合 *facet を削除するのは loc になりますが、loc の生成時に例外が発生した
場合は誰が *facet を削除しなければいけないのでしょうか?

530 :デフォルトの名無しさん:05/02/11 15:42:27
>>529 std::auto_ptr

531 :デフォルトの名無しさん:05/02/11 16:00:20
boost::shared_ptr のデストラクタ時にユーザーが指定した関数
を実行するやつって auto_ptr 版ないの?
デストラクタで勝手に呼び出すためだけにshared_ptr使うのは
必要以上に重いから使いたくないんだけど

532 :ヽ(´ー`)ノ ◆.ogCuANUcE :05/02/11 16:27:58
> boost::shared_ptr のデストラクタ時にユーザーが指定した関数
> を実行するやつって auto_ptr 版ないの?
何言ってるか分からん……。

> デストラクタで勝手に呼び出すためだけにshared_ptr
??(´Д`)

boost::scoped_ptr のことか?


533 :デフォルトの名無しさん:05/02/11 16:40:38
>>532
ttp://www.boost.org/libs/smart_ptr/sp_techniques.html#encapsulation
こういうのだろ。
 shared_ptr<X> px(CreateX(), DestroyX);


534 :デフォルトの名無しさん:05/02/11 17:48:39
>>531
>boost::shared_ptr のデストラクタ時にユーザーが指定した関数を実行する
削除子(deleter)ってやつですね.auto_ptr版は無いですよ.なので自分で作るしかないと思います.
設計・実装に際してはboostに提案されているmove_ptrが参考になるかと思います.

http://home.comcast.net/~jturkanis/move_ptr/

ドキュメントも非常に良くまとまっていて,静的削除子と
動的削除子(shared_ptrが採用している方)の双方を考慮しています.
あと,より汎用な,デストラクタの呼び出しにファンクタをhookする機構というのがあって
スコープガード(scope guard)と呼ばれています.

http://www.cuj.com/documents/s=8000/cujcexp1812alexandr/

これも参考になるかと思います.boostでもmulti_index等が採用しているので
boostのフォルダ漁れば実装が掘り出せると思います.

535 :デフォルトの名無しさん:05/02/11 18:14:34
>>534
サンクスコ
さっそく見てみます

536 :デフォルトの名無しさん:05/02/11 18:43:40
>> 529
VC++ 7.1 のソースを見ると std::locale のコンストラクタで例外が起きたときは
ファセットを削除する処理をしていないようなので

std::auto_ptr<MyFacet> facet(new MyFacet);
std::locale loc( std::locale::classic(), facet.get() );
facet.release(); // このメソッドは例外が発生しない

でメモリリークは起きないと思います。

537 :532:05/02/11 19:10:13
>>534
ドキュメントと実装を見る限り、どうやらこの move_ptr で
目的を達成できそうです。感謝。

しかしなんでこれが boost にまだ入ってないんだろう…便利なのに

538 :デフォルトの名無しさん:05/02/11 20:08:17
class Sprite{...};
typedef std::multimap<float,Sprite*> SPRITES;
typedef std::vector<SPRITES> LAYER;
class SpriteManager{
LAYER m_Layers;
void DrawSprites();
...};
として描画をやっているのですけど、スプライトが3000個位あると
30FPS位になってしまいます。
一応クリッピングしてるのですが、重い・・・
std::multimapやstd::vectorは繰り返し処理に耐えられない位
重いものなのでしょうか?
newあるいはmallocにした方が速いんでしょうか?
質問が2つになってしまって済みません。

539 :デフォルトの名無しさん:05/02/11 21:05:00
>>538
float を double にするだけで多少は早くならない?
C/C++ 上での float はウンコだよ。

540 :デフォルトの名無しさん:05/02/11 21:10:58
確かに float は無駄なだけ

541 :538:05/02/11 21:13:42
>>539
DirectXでFLOAT多用しているから速いものだと思ってました・・・
書き損じましたが、typedef std::multimap<float,Sprite*> SPRITESの
floatはZオーダーというかdepth値です。
depthをキーとしてレイヤー1個を描画したら次のレイヤーを上書きする
という感じでやっています。

542 :538:05/02/11 21:15:27
・・・depthをキーとして[スプライトを順番に描画して]レイヤー1個を・・・

543 :デフォルトの名無しさん:05/02/11 21:16:59
で、そのZオーダーは小数である必然があるの?

544 :538:05/02/11 21:18:47
>>543
あ、!それだ。有難うございます。
何で思いつかなかったのかと小一時間説教して・・・

545 :デフォルトの名無しさん:05/02/11 21:42:38
Zオーダーの範囲が0〜255とか〜1023ぐらいならlistの配列が最速だけどな

546 :538:05/02/11 22:04:51
コンソールでキーをfloatとintの奴を2つ作って試してみたけど
insertのソートに時間を大幅に食って
参照自体の時間はあまり変わりませんでした。

547 :デフォルトの名無しさん:05/02/11 22:13:18
>>546 まさか最適化してないとかじゃないだろうな。

548 :デフォルトの名無しさん:05/02/11 22:16:06
>>539-540
環境やプログラムによるだろ。一概には言えない。

549 :デフォルトの名無しさん:05/02/11 22:17:31
たかだか要素3000個でmultimapがどうにかなるとも思えないんだけど。
DirectXでしょ? まずは描画方面から疑ってみれ。他スレで。


550 :デフォルトの名無しさん:05/02/13 09:22:43
今簡単なライブラリ作ってるんですが、
こういうのって include するだけで使えるように
実装を全てヘッダファイルに書いた方が良いのでしょうか?

551 :デフォルトの名無しさん:05/02/13 09:57:30
ケースバイケース

552 :デフォルトの名無しさん:05/02/13 09:58:04
自分だけで使うならご自由に、
他人も使うなら定石に従って作る

553 :デフォルトの名無しさん:05/02/13 10:07:21
定石って?

554 :デフォルトの名無しさん:05/02/13 11:40:10
ヘッダファイルincludeするだけって出来るの?
全部inlineにするとか?

555 :デフォルトの名無しさん:05/02/13 12:53:39
>>554
それだと static データメンバがどーしよーもなくなる
こんな理由で使うのを勧めたくはないが、使うなら template だな

556 :デフォルトの名無しさん:05/02/13 13:01:00
>>555
int f() {}
f();
とかは
template <int> f() {}
f<0>();
とか?激しく汚いな…

boost とかはこの辺どうなってんだろ

557 :デフォルトの名無しさん:05/02/13 13:23:39
>>556
そのテクニックはstlportで使われてた。
template <int __Inst = 0> class...
みたいに。
ちなみにその例は、f<0>をラップするinline非template関数を使えば
それなりに使えるようになると思う。

>boost とかはこの辺どうなってんだろ
boostの大部分は最初からtemplateだから問題ない。
そうじゃないところは普通のライブラリ(配布はソースで)。

558 :デフォルトの名無しさん:05/02/13 13:32:30
>ちなみにその例は、f<0>をラップするinline非template関数を使えば
>それなりに使えるようになると思う。

あーホントだ。頭が固いせいか思いつかなかった。
確かにinlineでラップすりゃ全然問題ないですね。

stlportで使われてるってことは結構有名なのかな?
何にせよすごい勉強になった。トンクス

559 :デフォルトの名無しさん:05/02/13 14:16:12
struct a
{
//static float b;
static float& b() { static float c; return c; }
};


560 :& ◆leAf1aNbyo :05/02/15 00:05:09
くだ質で申し訳ないです

std::vector のシーケンシャルアクセスを行う場合
iterator による走査と添字による走査とではどちらかが速度的に有利になるんでしょうか?

添字の方がソース書く上では楽だけど,若干不利な気がしてます…

561 :デフォルトの名無しさん:05/02/15 00:10:38
ヽ(;´Д`)ノぁゎゎ…
化けた文字列が名前欄に残ってたせいでトリップができちゃった

562 :デフォルトの名無しさん:05/02/15 00:34:15
>>560
最適化によっては全く同じコードになることもある。
それを気にするよりも、他に気を遣うべきかと。

563 :デフォルトの名無しさん:05/02/15 00:34:36
自分でループを書くならどっちも変わらないんじゃないかな。

for_eachを使うと内部実装に適した走査が行われる、かもしれない、
てなことがどっかに書いてあった気がする。
どっちみちvecotorなら関係ないかも。

564 :デフォルトの名無しさん:05/02/15 00:42:36
>>562-563
dx 気にせず状況に合わせて書いていきます(`・ω・´)

565 :デフォルトの名無しさん:05/02/15 00:42:48
ループに必要な変数を考える。
iterator の場合は current,end のふたつ。
添え字の場合は top,index,num のみっつ。
というわけで iterator のほうが有利といえるだろう。

極端な例じゃないと実際に差は出ないだろうけどな。

566 :デフォルトの名無しさん:05/02/15 00:46:05
>>563 ヴェコター ワロス

567 :デフォルトの名無しさん:05/02/15 16:45:50
ローカルクラスなファンクタって STL 等の関数に渡せないんですか?
例えば
int func()
{
struct Sorter : std::...{
bool operator()(..., ...) const { ... }
};

std::sort(.begin(), .end(), Sorter());
}
ってやるとエラーが出るんですが…(VC7.1)
何かいい方法はないでしょうか?(boost::lambda以外で)


568 :デフォルトの名無しさん:05/02/15 16:50:25
できないからlambdaがあるんです!

569 :デフォルトの名無しさん:05/02/15 17:21:59
>>567
できませんよ。

570 :デフォルトの名無しさん:05/02/15 21:28:14
だせえよな

571 :デフォルトの名無しさん:05/02/15 23:09:24
>>567
ttp://www.tietew.jp/cppll/archive/11286
微妙に違うけど参考に汁。

572 :デフォルトの名無しさん:05/02/17 12:59:16
C++のメモリ確保の方法について質問です。
例えば、UNICODEの文字列を格納するクラスustringを以下のように作ったとします。

class ustring{
wchar_t string;
public:
toSjis();
};

sjisを吐くときに、
ustring str=L"日本語";
cout << str.toSjis();
といった書き方をしたいのですが、

1)toSjis()内でchar*ポインタをmallocで確保して返値にしてもtoSjis()メソッドが終了後は値は保証されませんよね?
2)char* mbcsというフィールドを作って、mallocすればオブジェクトがある限りはメモリは確保されますが、
 呼び出し後、必要なくなってもメモリは確保されたままですよね?
 メモリを解放するstr.freeMbcs()メソッドも作って、str.toSjis()の後に呼び出すとかするのでしょうか?

JAVAだとオブジェクトをnewして返値にすればよかったのですが、C++ではどう書くのが定石なんでしょう?

573 :デフォルトの名無しさん:05/02/17 13:03:22
>>572
C++ならnew/deleteを使うか、std::wstringを使うかしてください。

574 :デフォルトの名無しさん:05/02/17 13:04:17
>>572
一番のオススメはstd::wstringかな。

575 :デフォルトの名無しさん:05/02/17 13:45:11
>>572
std::auto_ptrに入れて返してoperator<<をオーバーロードすればいいんじゃない?

576 :デフォルトの名無しさん:05/02/17 14:19:30
まったく関係ないけど、wstring 関係で質問。

任意のエンコーディングの文字列を wstring や wchar_t * に変換するのって
どうやればできる?


577 :デフォルトの名無しさん:05/02/17 14:24:36
>>576
キーワード

std::locale::global(std::locale("japanese"))
std::wstring wstr
std::wcin << wstr
wstr.c_str()

std::string
narrow(const std::wstring& input) {
char* buffer = new char[input.size() * MB_CUR_MAX + 1];
wcstombs(buffer, input.c_str(), input.size() * MB_CUR_MAX);
std::string result = buffer;
delete[] buffer;
return result;
}

std::wstring
widen(const std::string& input) {
wchar_t* buffer = new wchar_t[input.size() + 1];
mbstowcs(buffer, input.c_str(), input.size());
std::wstring result = buffer;
delete[] buffer;
return result;
}


578 :デフォルトの名無しさん:05/02/17 14:24:59
たとえば、'A'0x41 なら 0x0041にすればASCIIからウニコードになる。
規則性があるならそれに従うだろ。

579 :デフォルトの名無しさん:05/02/17 14:25:58
http://www.tietew.jp/cppll/archive/4783

580 :デフォルトの名無しさん:05/02/17 14:31:42
ttp://hw001.gate01.com/eggplant/tcf/cpp/wchar_t_trap.html
ここかな

581 :デフォルトの名無しさん:05/02/17 14:58:08
静的メンバ関数を複数のクラスで継承した場合、継承したクラス毎にstatic関数が用意されるの?
それも何回継承してもstatic関数は一つだけ?

582 :576:05/02/17 15:01:48
いや、そうじゃなくて……。

たとえば、LC_ALL=ja_JP.eucJP の時に、Shift_JIS の char 配列を
wstring に変換するにはどうすればいいのかな?と。


583 :デフォルトの名無しさん:05/02/17 15:06:37
あるclass Aのインスタンスを生成するとき、

A a; // デフォルトコンストラクタがある場合
A a(10); // デフォルトコンストラクタがない場合
A *a = new A; delete a;

等としますが、このうち最後のようにnew演算子を使用しなければならないのは
どういう条件のときですか?


584 :デフォルトの名無しさん:05/02/17 15:06:48
>>581 staticはstaticだ

585 :デフォルトの名無しさん:05/02/17 15:07:49
>>582
http://tricklib.com/cxx/ex/babel/

586 :デフォルトの名無しさん:05/02/17 15:10:15
>>582
wchar_tを使うのであれば、文字列を扱うときは始めから一貫してwchar_tを使うようにしないと無駄な処理をしなくてはいけなくなる。

587 :デフォルトの名無しさん:05/02/17 15:15:09
>>583
コンストラクタがpublicでないとき。

588 :576:05/02/17 15:39:41
>>586
内部的には wchar_t で良いのだけれど、入力や出力の時にね…。
char 配列で持って、iconv しかないのかな。

589 :デフォルトの名無しさん:05/02/17 16:14:07
>>587
ウソを書くな

590 :v(^・^)v:05/02/17 16:31:12
ウソじゃないよ

591 :デフォルトの名無しさん:05/02/17 16:38:59
唐突にいまさらなんだが
その昔、
http://www.kuzbass.ru/docs/isocpp/
を探してきてテンプレに加えたのは俺なんだが
これはそもそも有料なのでまずいよな

592 :デフォルトの名無しさん:05/02/17 16:42:41
>>583
その場でインスタンスを作りたくないとか、自分では作りたくなくて、
ポインタとして保持したいとき。
コンストラクタがどうとかは一切関係ない。

593 :デフォルトの名無しさん:05/02/17 16:47:24
>>592
コンストラクタがpublicでないけどoperator newがpublicになっているクラスのことも考えてみろ。

594 :デフォルトの名無しさん:05/02/17 16:50:41
>>591
FINAL *DRAFT* だからイイんじゃないの?

595 :デフォルトの名無しさん:05/02/17 16:54:54
>>593
コンストラクタがpublicじゃないとnewできないよ

596 :デフォルトの名無しさん:05/02/17 16:57:42
これはロシア人?
もう何年も公開しっぱなしだよな
漢だ
ISOはケチだな

597 :デフォルトの名無しさん:05/02/17 17:04:10
んなこたーない。

class hoge
{
    hoge(){}
    friend hoge* moge();
};

hoge* moge(){return new hoge;}


598 :デフォルトの名無しさん:05/02/17 17:06:53
>>595
new 限定で生成させるときの常套手段なんだが、知らないの?

599 :583:05/02/17 17:22:30
newで生成したインスタンスの場合は、どこかでdeleteしなければならない。
newで生成していない場合は、スコープが外れた後適度なタイミングでデストラクタが呼ばれる。

{
 A a;
 ...
} // OK, インスタンスaのデストラクタは自動で呼ばれる

{
 A *p = new A;
 ...
} // NG, pが指すインスタンスは消滅しないので、delete p;が必要

■new使用したいとき
1. その場でインスタンスを作りたくない
2. ポリモルフィズムを利用したい
3. スコープ外でもインスタンスを残したい

という感じですか?

>>598
new限定で生成させなければならないようなケースってどういうときですか?


600 :デフォルトの名無しさん:05/02/17 17:23:12
>>598
>>583の3つ目みたいに直接newしてないだろ。

601 :デフォルトの名無しさん:05/02/17 17:41:57
4. C++BuilderでVCL等Delphi型クラスを生成するとき

602 :デフォルトの名無しさん:05/02/17 17:42:09
MMO製作企画を立ち上げました。協力できる人はこちら
http://www112.sakura.ne.jp/~kaientai-project/creategame.htm

2chスレ
http://game10.2ch.net/test/read.cgi/mmominor/1108379282/l50

ただ今職人(プログラマ、グラフィッカー)はげしく募集中!
あなたの力を思う存分発揮してください。

603 :デフォルトの名無しさん:05/02/17 17:46:40
http://comic6.2ch.net/test/read.cgi/2chbook/1107268998/3-5

604 :デフォルトの名無しさん:05/02/17 18:01:56
>>597
friend 使ったら、private もなにも関係ないじゃん。

605 :デフォルトの名無しさん:05/02/17 18:06:10
>>593
placement new じゃない new も OK なの?知らなかった。

606 :デフォルトの名無しさん:05/02/17 18:11:15
解決しました
不親切なアドバイスに感謝します

607 :593:05/02/17 18:14:20
>>605
ごめん、それ勘違いだった。

608 :デフォルトの名無しさん:05/02/19 07:12:32
C++ Primer 4thが出てるな。
http://www.amazon.com/exec/obidos/tg/detail/-/0201721481/

まあ3あればいらないか。入門書の決定版であることは変わりないのかな?

609 :デフォルトの名無しさん:05/02/19 09:40:33
C++ Primer読んだ人いますか?
俺は買ったものの、でかすぎて読んでない orz

610 :デフォルトの名無しさん:05/02/19 13:08:07
>>609
3を買ったけど同じくあんまり読んでないorz
C++ Primerのいいところは細かいところまで書いてある辞書的なところだが
悪いところは辞書的なくせに章毎の最初から読まないとサンプルソースがわかりにくいところだと思う。

ところでEffective C++を読んでて
AWOV=Abstract w/o Virtualsってのがでてきたんだけど、w/oって何ですか?

240 KB
★スマホ版★ 掲示板に戻る 全部 前100 次100 最新50

read.cgi ver 05.04.00 2017/10/04 Walang Kapalit ★
FOX ★ DSO(Dynamic Shared Object)