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


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

C++相談室 part60



1 名前:デフォルトの名無しさん mailto:sage [2008/01/11(金) 18:43:34 ]
C++に関する質問やら話題やらはこちらへどうぞ。
ただし質問の前にはFAQに一通り目を通してください。
IDE (VC++など)などの使い方の質問はその開発環境のスレに
お願いします。

288 名前:デフォルトの名無しさん mailto:sage [2008/01/29(火) 22:49:25 ]
>>264
俺はそういう時、
template <class T1, class T2>
class A { ... public: typedef A<T1, T2> this_t; };
として、バインドするクラスは
template<class T1>
class AInt : public typedef A<T1, int>{};
のようにpublicで継承する。

そしてクラスを記述する時はどんなものにしろ必ず
A::this_t;
AInt::this_t;
と最後に::this_tとつける気持ち悪い習慣を身に着けている。

もしくは、 #define hogehoge(class) class::this_t のようなマクロを使うとか、いろいろ手はあるけど
結局どれもいたちごっこかうへへへへへへへへへh

289 名前:デフォルトの名無しさん mailto:sage [2008/01/29(火) 22:55:38 ]
>>287
こんなのでどう
template <typename A, typename B> struct max_size { enum{ value = sizeof(A) > sizeof(B) ? sizeof(A) : sizeof(B) }; };
template <typename A, typename B> struct max_size_chain { enum{ value = A::value > sizeof(B) ? A::value : sizeof(B) }; };
template <typename A, typename B, typename C> struct max_size3: max_size_chain<max_size<A, B>, C>{};
template <typename A, typename B, typename C, typename D> struct max_size4: max_size_chain<max_size3<A, B, C>, D>{};
template <typename A, typename B, typename C, typename D, typename E> struct max_size5: max_size_chain<max_size4<A, B, C, D>, E>{};

char buf[max_size5<char, int, short, long, void*>::value];

290 名前:デフォルトの名無しさん mailto:sage [2008/01/29(火) 22:57:36 ]
boost mpl if_cとかとsizeof使えばいい

291 名前:デフォルトの名無しさん mailto:sage [2008/01/29(火) 22:57:48 ]
template <size_t x, size_t y> struct size_t_max {
static const size_t value = x > y ? x : y;
}
struct AllocUnit {
static const size_t size = size_t_max<sizeof Derived1, sizeof Derived2>::value;
char buf[size];
}

基底クラスより派生クラスの方がサイズ大きいの分かってるから
2つの比較だけでいいべ。

292 名前:デフォルトの名無しさん mailto:sage [2008/01/29(火) 22:58:38 ]
ミスって途中送信してる・・・。
こっちが本物。

#include <iostream>

struct Base { int x; };
struct Derived1 : public Base { int n; };
struct Derived2 : public Base { int n, m; };

template <size_t x, size_t y> struct size_t_max {
static const size_t value = x > y ? x : y;
};
struct AllocUnit {
static const size_t size = size_t_max<sizeof (Derived1), sizeof (Derived2)>::value;
char buf[size];
};

int main(){
std::cout << AllocUnit::size << std::endl;
}

基底クラスより派生クラスの方がサイズ大きいの分かってるから
2つの比較だけでいいべ。

293 名前:244 mailto:sage [2008/01/29(火) 23:09:34 ]
皆さんどうもありがとうございます。
なるほど、テンプレートの特殊化を利用って感じですか? こんな風に使えるんですね。

が、しかし、
>>285
>「ポインタで与えられる」、しかし共通のベースクラスがあるわけではないってことは、void *型で渡すんだろうか。

ビンゴでございます。テンプレートの場合変数の型で挙動が変化してるわけですよね。
自分は Objective-C も使うことがあるので今回のような疑問を持ったのですが。

>しかし、既存のコードはいじりたくないので、共通のベースクラスに純粋仮想関数は使えないというのなら、

とりあえず多重継承で共通のベースクラスを足すことをを検討しています。

>例えばBoost.Anyに使われているType Erasureのテクニックが使えるかもしれない。

そうですか、参照してみます。

294 名前:244 mailto:sage [2008/01/29(火) 23:15:51 ]
あ、あれ、でもvoid *で渡さなくてもいいかな? ちょっと考えてみます。
でもやっぱ多重継承の方が自然かなあ。

295 名前:287 mailto:sage [2008/01/29(火) 23:16:19 ]
>>289
ありがとうございます。参考にします
>>292
なるほど。確かにsizeof(Base)<=sizeof(Derived)ですもんね

よく考えたらgreater<T1,T2>的なモノを用意して、それを連ねていくだけでよかったんですね

しかし派生クラスの数が増えるたびにmax_sizeの引数増加版を定義するのが面倒・・
可変引数のtemplateがあればなぁ・・・

296 名前:デフォルトの名無しさん mailto:sage [2008/01/29(火) 23:20:40 ]
>>287
template<typename T1, typename T2, typename T3>
struct MaxSize {
typedef typename if_c<(sizeof(T1) > sizeof(T2)),
typename if_c<(sizeof(T1) > sizeof(T3)),T1, typename if_c<(sizeof(T2) > sizeof(T3)),T2,T3>::type>::type,
typename if_c<(sizeof(T2) > sizeof(T3)), T2, T3>::type >::type SizeT;
static const size_t sz = sizeof(SizeT);
};



297 名前:デフォルトの名無しさん mailto:sage [2008/01/29(火) 23:27:59 ]
マクロをゴニョゴニョすれば
DEFINE_MAX_SIZE(3, 100);
で max_size3〜max_size100 まで定義、みたいなこともできそうだが、
実用的には生成プログラム書いた方が楽だと思う。

298 名前:デフォルトの名無しさん [2008/01/30(水) 14:46:54 ]
C++で継続(continuation)、あるいはそれっぽいことができるライブラリや、
C++で継続に関するページがあれば教えてください。


299 名前:デフォルトの名無しさん mailto:sage [2008/01/30(水) 15:44:42 ]
まずお前の継続に関する経験について聞こうか?

全くC/C++以外の経験が無いとかいうレベルだとかなり大変だぞ。

300 名前:デフォルトの名無しさん [2008/01/30(水) 16:21:20 ]
>>299
rubyでcallccを知り、その関連ページで勉強した程度しか知識がありません。
やりたいことは、まさにrubyのcallccで実行できるようなことです。

301 名前:デフォルトの名無しさん mailto:sage [2008/01/30(水) 16:34:55 ]
「なんでも継続」は読んだ?
(Cの)setjmp/longjmpは理解してる?

302 名前:298 [2008/01/30(水) 16:40:15 ]
>>301
「なんでも継続」のページ、良さそうですね。
まずここから始めてみます。
setjmp/longjmpは、Unix C上がりなので知ってます。使った記憶は1回しかありませんが…。

303 名前:デフォルトの名無しさん mailto:sage [2008/01/30(水) 18:00:53 ]
>>298
Boost.Coroutine
Hamigaki C++ Libraries

304 名前:デフォルトの名無しさん mailto:sage [2008/01/31(木) 00:14:39 ]
Hamigakiってなんかのギャグかと思って調べたらほんとにあるんだな…。

305 名前:デフォルトの名無しさん mailto:sage [2008/01/31(木) 00:17:48 ]
なんか最近はスーパーマリオみたいなのつくってなかったっけ


306 名前:デフォルトの名無しさん mailto:sage [2008/01/31(木) 07:01:14 ]
BoostにLokiのタイプリストみたいなものってありありますか?



307 名前:デフォルトの名無しさん mailto:sage [2008/01/31(木) 08:16:40 ]
cons list?

308 名前:デフォルトの名無しさん mailto:sage [2008/01/31(木) 14:59:51 ]
>>306
Boost.MPLのmpl::vector等

309 名前:デフォルトの名無しさん mailto:sage [2008/01/31(木) 18:29:56 ]
>>308
は?

310 名前:デフォルトの名無しさん mailto:sage [2008/01/31(木) 21:06:00 ]
>>309
へ?

311 名前:デフォルトの名無しさん mailto:sage [2008/01/31(木) 21:18:01 ]
>>310
ん?

312 名前:デフォルトの名無しさん mailto:sage [2008/01/31(木) 22:17:13 ]
>>311
え?

313 名前:デフォルトの名無しさん mailto:sage [2008/01/31(木) 22:18:19 ]
>>312
ろ?

314 名前:デフォルトの名無しさん mailto:sage [2008/02/01(金) 00:43:26 ]
>>313
す?

315 名前:デフォルトの名無しさん mailto:sage [2008/02/01(金) 00:49:58 ]
>>314
け?

316 名前:デフォルトの名無しさん mailto:sage [2008/02/01(金) 01:17:15 ]
やめんか



317 名前:デフォルトの名無しさん mailto:sage [2008/02/01(金) 05:30:19 ]
C++的に配列はどんなものでも<vector>ライブラリを使うべきなんでしょうか?

318 名前:デフォルトの名無しさん mailto:sage [2008/02/01(金) 05:43:56 ]
>>317
そんなことはないけど、 ruby や python みたいな言語を触ってる人から見て
配列といって当てはまるのは std::vector でしょうね。組み込みの配列はいろいろ
歴史的な問題も残ったままだし。

319 名前:デフォルトの名無しさん mailto:sage [2008/02/01(金) 07:29:58 ]
>>317
サイズが完全に決まってるなら
巨大でさえなければ、
組み込みの配列を使った方が効率がいい。

320 名前:デフォルトの名無しさん [2008/02/01(金) 07:53:11 ]
tr1::array早く来い来い。

321 名前:デフォルトの名無しさん mailto:sage [2008/02/01(金) 12:08:03 ]
普通の配列ならスタックに蓄えられるとか、newすればヒープから領域を取ってくるとか、
配列を扱うならそこら辺の知識もあってほしいな。

322 名前:デフォルトの名無しさん mailto:sage [2008/02/01(金) 14:50:07 ]
alloca()

323 名前:デフォルトの名無しさん mailto:sage [2008/02/01(金) 21:09:38 ]
まぁ、スタックに蓄えられるとか、newすればヒープから領域を取ってくるとか
規格には書いてないけどな

324 名前:デフォルトの名無しさん mailto:sage [2008/02/01(金) 21:12:53 ]
new はフリーストアから領域を取ってくるんです!

325 名前:デフォルトの名無しさん mailto:sage [2008/02/01(金) 21:18:22 ]
mallocはヒープから領域を取ってくるんです!

326 名前:デフォルトの名無しさん mailto:sage [2008/02/02(土) 02:37:39 ]
stroustrupはどこから毛を取ってくるんです!?



327 名前:デフォルトの名無しさん mailto:sage [2008/02/02(土) 03:14:27 ]
>>326
お前らがnewするたび、stroustrupから領域を割り当てられているのに
ちゃんとdeleteしない奴が多いから…。
そろそろstd::bad_allocが飛んでくるぞ。

328 名前:デフォルトの名無しさん mailto:sage [2008/02/02(土) 12:39:36 ]
stroustrup「virtual hair hair() = 0 はただのインタフェース!
       実際のインスタンスはもっとふさふさなの!
       バヤには見えないんだよーだバーヤバーヤ!」

329 名前:デフォルトの名無しさん mailto:sage [2008/02/02(土) 13:50:24 ]
散々ネタに去れてるのにstroustrupのAAってなんでないんだろう。
俺が作ってやる。

330 名前:デフォルトの名無しさん mailto:sage [2008/02/02(土) 21:17:56 ]
ttp://www.raw-paradise.com/

331 名前:デフォルトの名無しさん mailto:sage [2008/02/04(月) 12:00:17 ]
毛量保存の法則
頭髪の少い場合、顎髭や胸毛、ギャランドゥなどで補い、最終的な毛量は一定

332 名前:デフォルトの名無しさん mailto:sage [2008/02/04(月) 12:15:26 ]
ハゲで体毛も薄い人間は
代わりに心臓に毛が生えまくってるとか

333 名前:デフォルトの名無しさん [2008/02/06(水) 04:31:06 ]
www.research.att.com/~bs/bs_faq2.html#delete-zero
> C++ explicitly allows an implementation of delete to zero out an lvalue operand

これ訳すと
「C++ は delete の実装が左辺値である対象をゼロにすることを明示的に許している」
ってことだよね?

int* p = new int;
delete p;

delete した時点で p == 0 になるような実装もアリってこと?
規格見てもそんなことしていいなんて記述は見当たらなかった。
それとも、ただの読み違い?

334 名前:デフォルトの名無しさん mailto:sage [2008/02/06(水) 06:32:38 ]
そうだよ。
auto_ptrあたりなんかはそれを頼りに実装してる

335 名前:デフォルトの名無しさん mailto:sage [2008/02/06(水) 07:40:08 ]
食い違ってるような

336 名前:デフォルトの名無しさん mailto:sage [2008/02/06(水) 07:52:37 ]
許しているだけなのにそれを頼りにしちゃいかんのでは。



337 名前:デフォルトの名無しさん mailto:sage [2008/02/06(水) 08:26:25 ]
便利のようでそうでもないかな。変な副作用はなさそうだから気にしないでおこう。






[ 新着レスの取得/表示 (agate) ] / [ 携帯版 ]

前100 次100 最新50 [ このスレをブックマーク! 携帯に送る ] 2chのread.cgiへ
[+板 最近立ったスレ&熱いスレ一覧 : +板 最近立ったスレ/記者別一覧](*・∀・)<95KB

read.cgi ver5.27 [feat.BBS2 +1.6] / e.0.2 (02/09/03) / eucaly.net products.
担当:undef