C++相談室 part62at TECH
C++相談室 part62 - 暇つぶし2ch577:デフォルトの名無しさん
08/07/02 00:12:46
>>574
単にスワップメモリで足りただけじゃね?

578:デフォルトの名無しさん
08/07/02 00:24:19
>>576
典型的にはいらないページをスワップアウトしにいく

>>577
確保だけならスワップは発生せずに即終了する

579:デフォルトの名無しさん
08/07/02 00:35:06
「スワップに充分な領域が必要」な環境もあるし
「スワップに余裕があるか判断しない」環境もある。
後者だと、アクセスした途端にシステム全体でのメモリが不足することになる。
URLリンク(www.linux.or.jp)
>>578の世界はLinuxだけで出来ている模様。

あと、どうしても失敗したければ
new char[2 << (sizeof(void *) * CHAR_BIT - 1) - 1]; を2回もやれば十分だろうが
この2を2Lにしないとオーバーフローする環境もあるし
逆にlong引数のnewを認めない環境もあるんだろうな。

580:デフォルトの名無しさん
08/07/02 01:31:51
> new char[2 << (sizeof(void *) * CHAR_BIT - 1) - 1]; を2回もやれば十分だろうが

だから、何でそうなる

581:578
08/07/02 01:42:20
>>579
ん? なんで自分がバカにされているのか全然理解できないんだけど
いろいろな環境があることを頭に置いているからこそ578では
「典型的には」と頭につけたんだけどな

あとそのコード変だよ
少なくともビットシフトされる方は 2 じゃなくて 1 じゃないとおかしいし
そういうことやりたいなら
new char[std::numeric_limits<size_t>::max()] で十分じゃないかな
# ちなみにこういう最大限のメモリ確保は常識的な環境ならば1回ですぐに失敗するはず
# なぜなら、普通はスタックのためのアドレス空間やカーネルアドレス空間が同居しているから

582:デフォルトの名無しさん
08/07/02 12:26:21
> new char[std::numeric_limits<size_t>::max()] で十分じゃないかな

やっと出てきたw
が途中UNIXが出てきたり、やっと出てきたこれもmay beな言い方なので合格点はやれんな

583:デフォルトの名無しさん
08/07/02 12:35:24
std::size_t

584:デフォルトの名無しさん
08/07/02 12:36:06
SIZE_MAX

585:デフォルトの名無しさん
08/07/02 16:03:07
VC++のスレから来ました。相談させてください。

以下の710の質問をしました。
711の回答をもらいました。
それはそうだ、と納得しました。

---
710 :デフォルトの名無しさん [↓] :2008/07/02(水) 15:02:13
templateの使い方を教えてください
class parent;
class child : parent;
の2つのクラスがあって、
void hogeFunc(vector<shared_ptr<parent> > & param)
を呼び出したいとき、
vector<shared_ptr<parent> > vp;
は渡せるけど、
vector<shared_ptr<child> > vc;
が渡せないのはなんでかわからないです。
お分かりの方、理由を教えていただけないですか。
ちゃんと、pとcは親子関係にあるので問題ないと思っています。

711 :デフォルトの名無しさん [↓] :2008/07/02(水) 15:07:53
vector<shared_ptr<child> >& から vector<shared_ptr<parent> >& に変換できないから。
---

で、解決方法について相談させてください。以下は正しいですか?
・ void hogeFunc(vector<shared_ptr<parent> > & param)
 のように、多態をvectorでやろうとしてるのが根本的に間違っている。
間違っているならこういったコンテナの要素を多態で扱いたいときは、
どのようにコーディングされているのか教えてください。

586:デフォルトの名無しさん
08/07/02 16:27:04
template<typename T> void hogeFunc(vector<shared_ptr<T> > & param){
   struct check{ void f(){ T* a=NULL; parent* b = a; } };

   ...
}

587:デフォルトの名無しさん
08/07/02 17:29:52
樹木型(IPアドレスのような)のクラスを作成するにはどのようにしたらいいですか?

588:デフォルトの名無しさん
08/07/02 17:34:46
class Tree {
Tree[] subtrees;
}

589:デフォルトの名無しさん
08/07/02 17:36:01
ここC++だったorz
こんなのでいいんじゃない
class Tree {
std::vector<Tree*> subtrees;
};

590:デフォルトの名無しさん
08/07/02 17:55:38
template<typename T> struct node<T> {
  T value;
  node* prev;
  node* next;
  node* parent;
  node* first_child;

  static node* tree_next(node* n){
    if(n==NULL){ return NULL; }
    if(n->first_child!=NULL){ return n->first_child; }
    return tree_next_no_child(n);
  }
  static node* tree_next_no_child(node* n){
    if(n==NULL){ return NULL; }
    if(n->next!=NULL){ return n->next; }
    if(n->parent==NULL){ return NULL; }
    return tree_next_no_child(n->parent);
  }
};

for(node* it=n; it!=NULL; it=node::tree_next(it)){
  
}

591:デフォルトの名無しさん
08/07/02 18:27:09
>>587
C++を使う
できない人は他のスレで聞く

592:デフォルトの名無しさん
08/07/02 18:47:12
>>591
ここってC++スレじゃないのか??

593:デフォルトの名無しさん
08/07/02 20:33:00
>>592
そうだけど、あの聞き方ではhello worldから教える必要があるだろ

594:デフォルトの名無しさん
08/07/02 20:53:29
俺も興味あるんだが多階層にクラスを定義した場合下みたいな使いかたってできる?
Aclass.Bclass.element = NULL
昔クラスのpublic下にクラスを定義し派生用の関数で増やせるようなものを作ろうとしたんだがうまくいかなかった記憶があるもんで…

595:デフォルトの名無しさん
08/07/02 21:03:01
class Hoge {
const char msg="nullpo";
}

これだとエラー出ますが、こういうことをconst付けてやるにはクラス外に書くか
クラス.cppの方に書くか、もしくは使用する関数の中で書くしか無いのでしょうか。

596:デフォルトの名無しさん
08/07/02 21:03:35
大体型がおかしいだろ。
staticつけとけ

597:デフォルトの名無しさん
08/07/02 21:22:21
よーだょ。
ただしbool/char/short/int/long系に限りできる。floatは×

598:デフォルトの名無しさん
08/07/02 21:23:55
どうも、static付けてみます

599:デフォルトの名無しさん
08/07/02 21:40:22
enumが便利だよ

600:デフォルトの名無しさん
08/07/02 21:45:09
あ、なるほど。すっかり忘れてました。

601:デフォルトの名無しさん
08/07/03 00:45:52
C++0x出たら、ハゲはプログラミング言語C++の改訂版だすのかな?
なんか第3版の次の版が洋書では出てたけど、日本語版はスルーなのかな。
まぁこのタイミングでだしてもしょうがないし、できればC++0x反映させた
版を出して欲しいけどね。

602:デフォルトの名無しさん
08/07/03 01:10:26
const 定数のみのクラスってどうやってかけばいいのですか?
あとこういうエラー用の定数クラスは1枚のファイルに1こずつ
定義するのが流儀?

603:デフォルトの名無しさん
08/07/03 01:14:11
Javaじゃあるまいし

604:デフォルトの名無しさん
08/07/03 01:29:34
>>602
なんでクラスの中に定義する必要があるの
せいぜいネームスペースでいいじゃん

605:デフォルトの名無しさん
08/07/03 01:34:25
シングルトンですけど、boostに入ってないですよね?
Lokiぐらいしかないんでしょうか?

606:デフォルトの名無しさん
08/07/03 01:45:21
すみません、素朴な疑問なのですが
C++ではハードあるいはOSレベルの例外(例えば零による除算)は
通常どのように扱うののでしょうか?

もう少し具体的に言うと、例えばVC++なら_ _try, __except という
構造化例外のための機能が提供されていますが、
gccなどの他のコンパイラではこれと同様な機能を実現する手段は
ないのでしょうか。

windows, linux 双方で稼動させる必要のあるシステムを作るとしたら、
例外処理をどのようにするべきなのか非常に疑問です。

607:606
08/07/03 01:47:54
うーん・・・

URLリンク(msdn.microsoft.com)(VS.71).aspx
>C++ でプログラミングしたり、コードに移植性を持たせたい場合は、
>可能な限り標準 C++ の例外を使うことを強くお勧めします。

URLリンク(developer.mozilla.org)
>例外は、幅広くは実装されていない C++ の次なる一例です。
>そのため、それらの使用は C++ の移植性を低下させます。
>例外を使ってはいけません。運悪く、同じような機能をもったよい代替案はありません。

例外についての注意勧告がされていますが、では実際にどうするかという
代替案はないということなのか・・?

608:デフォルトの名無しさん
08/07/03 01:55:31
>>605
URLリンク(209.85.175.104)

609:デフォルトの名無しさん
08/07/03 01:56:59
鼻から悪魔という言葉があってな

610:デフォルトの名無しさん
08/07/03 02:05:31
>>607
俺はWinCE用のソースとかでは
std::auto_ptr<std::exception> を戻り値にしてる。
コンストラクタで失敗したものは fail() で返す。
で、毎回戻り値などのチェック。

パフォーマンス悪そうだし面倒なので全部そうしてるわけじゃないけど。

611:デフォルトの名無しさん
08/07/03 02:09:18
>>607
VC++の話をすると、/EH系のオプションがあって最適化やパフォーマンスの関係で使い分ける。
 オプションなしの場合C++例外は一切使わない。
 /EHs(c) 同期例外だけをキャッチする。c で extern "C"関数は例外を発生させないと仮定する。
 /EHa  同期と非同期例外をc++例外としてキャッチする。
で /EHaの場合は stack overflowを除くほとんどのハード系の例外をキャッチ出来る。
もちろんゼロ除算も。

612:デフォルトの名無しさん
08/07/03 02:09:23
>>608
どうもです。
detailsの中にあることにはあるんですね。
とりあえずkろえを使っておきます。

613:デフォルトの名無しさん
08/07/03 02:26:36
>>610-611
ありがとうございます。

VC++の場合はわかるのですが、
gccなどでは同じような処理を行えないのでしょうか?
メモリの不正アクセスにしろ零除算にしろ、いくらでも
起こりうる例外だと思うのですが、Javaのように
統一的にcatchできないものかと悩んでいます・・・。

実際、至るところで零除算の起こりうる数値解析の
ようなシステムを作ったとして、いざシステムを起動
したら零除算で処理が中断したが、どこで起こったかは
わからない、なんてことは有り得ないですよね・・?

614:デフォルトの名無しさん
08/07/03 03:24:19
gccというよりunix系だとそういうのはsignalではないかな。
ゼロ除算ぐらいなら例外ではなくてプログラムで事前にチェックすべきもので、
メモリの不正アクセスはデバッグ時に潰すべきもので、
例外でキャッチしてリカバリーをかける類のものじゃない。


615:デフォルトの名無しさん
08/07/03 05:55:32
>>585
最初から vector<shared_ptr<parent> > だけ使ってればいいんじゃね?

616:デフォルトの名無しさん
08/07/03 05:59:33
>>594
struct { struct { void* element; } Bclass; } Aclass;
よくわからんが、これでやりたいことができたことになるの?

617:デフォルトの名無しさん
08/07/03 06:33:36
>>607
どこまでの移植性が必要かで判断すればいい。
Windowsだけなら構造化例外を使ってもいいだろうし。、gccあたりを含めるならくらいなら例外は使えるだろうし。


618:デフォルトの名無しさん
08/07/03 09:30:37
>>607
mozilla のページ、情報がえらく古いな
もっとも古いというだけでは済まされない記述も散見されるが

619:585
08/07/03 10:09:51
>>586
目からうろこがぼろぼろでた気分です。
ありがとうございました。

620:デフォルトの名無しさん
08/07/03 12:12:50
shared_ptrをメンバとして持つクラスで、そのメンバを取得したいとき、
getBBB1, getBBB2, getBBB3の実装をした場合、状況によるんでしょうが、適切なのはどれか教えてもらえないですか。
それぞれのメリット、デメリットがはっきりとわかっていません。
class AAA {
private:
  shared_ptr<BBB> bbbptr;
public:
  AAA() {
    bbbptr = new BBB;
  }
  shared_ptr<BBB> getBBB1() {
    return bbbptr;
  }
  shared_ptr<BBB>& getBBB2() {
    return bbbptr;
  }
  BBB* getBBB3() {
    return bbbptr;
  }
};


621:デフォルトの名無しさん
08/07/03 12:55:48
状況による面もあるけど、
基本的にBBB1以外は間違った使い方だと思っていい。

622:デフォルトの名無しさん
08/07/03 13:00:22
#include <stdio.h>

int main(void)
{
float f;

for(f=1.0; (int) f<=5; f=f + 0.1)
printf("%f \n", f);

return 0;
}

このプログラム実行したら

2.600000
2.700000
2.799999
2.899999
2.999999
3.099999
3.199999
3.299999
3.399999
3.499999

と2.7から普通に計算できなくなりました
2.700000
2.800000
2.900000
と計算するようにしたいのですがどればいいですか?


623:デフォルトの名無しさん
08/07/03 13:07:39
>>622
float -> double
もしくは
二進化十進表現でgoogle

624:デフォルトの名無しさん
08/07/03 13:16:32
>>623
できました><
floatって精度かなり悪いみたいですね・・・

625:デフォルトの名無しさん
08/07/03 13:40:07
>>622
つうか思いっきりC言語じゃね?

626:デフォルトの名無しさん
08/07/03 13:48:35
Cで利用されることが推奨されているDLLがあって、そのヘッダファイルがC用に提供されていて、
それをC++で利用できない場合って、どういう理由が考えられますか?

できない場合があるとしたら、回避方法は、自分でヘッダを修正するってことでしょうか?

627:デフォルトの名無しさん
08/07/03 13:57:25
マングリング
extern "C"

628:デフォルトの名無しさん
08/07/03 16:25:02
>>626
#ifdef __cplusplus
#error C++ is not supported
#endif
とか書かれてるなら諦めるしかないだろ。

629:デフォルトの名無しさん
08/07/03 17:52:58
誰か教えてください。。。

現在プログラムでマウスクリックをさせるものを作っていて、
ボタンのクリックなどはできるようになったのですが、
タブ(TabControl)の切り替えができません。

だれかご存知の方がいましたらご教授いただけると助かります。。

以下プログラム抜粋----------------------------------
POINT pt = {任意の座標X , 任意の座標Y};
HWND hWnd = ::WindowFormPoint(pt.x , pt.y);

// マウスを任意の位置に移動
SetCursorPos(pt.x , pt.y);
// クリック (Down -> UP)
::SendMessage(hWnd , WM_LBUTTONDOWN , 0 , MAKELPARAM(pt.x , pt.y));
::SendMessage(hWnd , WM_LBUTTONUP , 0 , MAKELPARAM(pt.x , pt.y));

よろしくお願いします。

630:デフォルトの名無しさん
08/07/03 18:03:14
スレ違い、Win32APIスレで聞いたら

631:デフォルトの名無しさん
08/07/03 18:18:18
>>620
BB1は安全。戻り値最適化が期待できるので速度も十分
BB2は参照が生きているうちにAAAが削除される場合に問題が発生するが、それに気をつければ高速に使える。
BB3は危険。別のshared_ptrに戻りを代入するミスを誘発しそう。

632:デフォルトの名無しさん
08/07/03 23:49:12
BBB2も代入できるだろ

633:デフォルトの名無しさん
08/07/05 21:52:38
C99では
if (...)
statement...;
else
statement...;
などのstatementがそれぞれ{}で囲まれたように扱われるようですが
これはC++から来たものなのですか?

634:デフォルトの名無しさん
08/07/05 21:54:36
元から (C89から) そうでは?

635:デフォルトの名無しさん
08/07/05 21:59:52
C99よく知らないんだけど、
囲まれたように扱われる場合と
囲まれたように扱われない場合って何が違うの?

636:デフォルトの名無しさん
08/07/05 22:08:27
変数のスコープのこといってるんじゃね?

637:デフォルトの名無しさん
08/07/05 22:11:41
>>636
そもそも{}で囲まないと変数は定義できないだろう。

638:デフォルトの名無しさん
08/07/05 22:14:32
もともとif文の構文は
if (expr) statement [ else statement ]

expr ; の形の単文はstatementだから{}で囲む必要は無い
複文はstatementではないから、{}で囲んでstatementにしなければならない

そんだけのことだ
C99とかは関係ないだろ

639:デフォルトの名無しさん
08/07/05 23:36:13
URLリンク(seclan.dll.jp)
「選択文と反復文のブロック化」のことだな。
C++にもあるぞ、X3014:2003「6.4 選択文」の1, 2節目などなどに規定がある。

そこではこういう例が載せられている。
if (x)
  int i;
このルールによって、if文を抜けたらiはもう使えないという具合。

>>637
C++だと、ブロック内の宣言は文だから、できるんだなこれが。
C99だと(なぜかC++と違って)文ではないから、お前の言うとおり出来ないけどな。

640:デフォルトの名無しさん
08/07/06 04:17:21
>>639
そんなVC6の時代の知識で語られても。

641:デフォルトの名無しさん
08/07/06 04:23:29
VC6でお世話になったマクロの意味がわかる
#define for if (0); else for


642:デフォルトの名無しさん
08/07/06 13:09:27
#define 定義は極力使わない方がいい、と、セキュアプログラミング系の本に書いてあったが

643:デフォルトの名無しさん
08/07/06 13:13:43
>>642
それは生兵法というもの

644:デフォルトの名無しさん
08/07/06 13:30:48
#define SubclassWindowみたいなマクロは死ねばいいと思う
使うならせめて大文字ですよね

645:デフォルトの名無しさん
08/07/06 13:51:36
>>642
OpenSSL脂肪wwwwwwwww

646:デフォルトの名無しさん
08/07/06 14:42:59
あとで#undefで即死されるマクロはいつもasdfだとかzxcvだとかに命名してる

647:デフォルトの名無しさん
08/07/06 16:56:32
>>646のコードはメンテしたくない。

648:デフォルトの名無しさん
08/07/06 20:25:50
同じく

649:デフォルトの名無しさん
08/07/07 08:09:21
hogehogeマクロ内でboost.pp.repeatとかつかってて子マクロが必要なら、
hogehoge_iとかhogehoge_iiにしてる。
後で#undefで即死されるのは同じだが。

650:デフォルトの名無しさん
08/07/08 00:13:06
while(1)中のswtch文で特定のcaseの場合whileから抜けたいのですが2重の構造をbreakさせる方法はありませんか?
gotoで抜ける手も考えましたがあまりスマートな方法じゃないのでできれば避けたいです

651:デフォルトの名無しさん
08/07/08 00:13:48
while(1)をやめる

652:デフォルトの名無しさん
08/07/08 00:19:50
whileの代わりにgotoをつかえばいい

653:デフォルトの名無しさん
08/07/08 00:26:15
>>650
フラグかgotoのどちらかを選ぶんだ。

654:デフォルトの名無しさん
08/07/08 00:29:06
>>650
そのwhileブロックは、breakをreturnに変えて
何らかの意味のある名前を付けられるくらいの処理ではありませんか?

655:650
08/07/08 00:40:53
whileを続行するかどうかのフラグ判定式に変更しwhileを抜ける場合はFALSEにセットしてからcontinueすればいい

656:650
08/07/08 00:42:49
ということに気づき自己解決しました。
レスありがとうございました
(うっかりEnterと一緒にShiftを押してしまい途中で書き込んでしまいました…)

657:デフォルトの名無しさん
08/07/08 05:41:19
あくまで自己解決と言い張るならもう質問すんなよ

658:デフォルトの名無しさん
08/07/08 06:09:44
何怒ってんだよw

659:デフォルトの名無しさん
08/07/08 06:25:05
657は別に怒ってないと思うが、658はなんでちょっぴり興奮してるんだろ、とは思う

660:デフォルトの名無しさん
08/07/08 09:38:38
>>653 でフラグ使えと書いてるのに、そんなレスみるまでもなく自分で解決したよ
と言うからだろうw

661:デフォルトの名無しさん
08/07/08 09:56:40
時間を鑑みるに、おっきしてるのを鎮めてる最中だったんだよきっと

662:デフォルトの名無しさん
08/07/08 11:15:01
自分のレスの後、同じような内容で
自己解決したと書かれたくらいで、もう質問すんなとか、
もうちょっと心に余裕を持った方が良いかと。

663:デフォルトの名無しさん
08/07/08 11:20:05
良いなぁこの馬鹿をかばう気持ち悪い空気

664:デフォルトの名無しさん
08/07/08 11:23:10
相当頭に来てる御様子ですね。

665:デフォルトの名無しさん
08/07/08 11:27:14
自己解決と書くのは、質問者が「お前ら役立たず」と言ってるようなもんだからなw

666:デフォルトの名無しさん
08/07/08 11:35:03
>>664
ていうか、こう書けば誰を馬鹿と思ってるのかがわかると思ったんで。

なるほどね。

667:デフォルトの名無しさん
08/07/08 11:46:23
>>666
>>662の後に>>663なら、普通は
>>650(馬鹿)をかばう気持ち悪い空気」と捉えるでしょう?
そこでこう書けばというのは、それこそ馬鹿丸(ry

668:デフォルトの名無しさん
08/07/08 11:48:25
もう質問者にとって、このスレは用済みだからこねえよ

669:デフォルトの名無しさん
08/07/08 12:42:48
>>667
うん、こう書けば、無駄に食い下がるかどうかで痛い人かどうかがわかると思ったんで。

なるほどね。

670:デフォルトの名無しさん
08/07/08 12:49:02
オレには悔しいから一歩引いた視点の第3者を装って「なるほどね」と書いてるように見える。

671:デフォルトの名無しさん
08/07/08 12:50:18
>>669
それは自虐ギャグですか?

672:デフォルトの名無しさん
08/07/08 16:19:05
unique_ptrって本当にC++0xに入ってくれるんだろうか

673:デフォルトの名無しさん
08/07/08 16:47:35
ばかばっか

674:デフォルトの名無しさん
08/07/08 17:18:49
>>673
お前がな

675:デフォルトの名無しさん
08/07/08 17:26:45
>>674
オマエモナー

676:デフォルトの名無しさん
08/07/08 17:27:46
いってよし?

677:デフォルトの名無しさん
08/07/08 18:06:30
逝ってよし

678:デフォルトの名無しさん
08/07/08 22:11:51
>>650
なぜスマートな方法ではないと思うのかを誤魔化さずきちんと述べよ

679:デフォルトの名無しさん
08/07/08 22:13:35
gotoは悪って(事実かどうかは別にしても)よく言われてるからだろ。
多分。

680:デフォルトの名無しさん
08/07/08 22:38:18
初心者スレと分けてる意味が無いように思う

681:デフォルトの名無しさん
08/07/09 00:33:06
初心者スレってVC++しかなくね?

682:デフォルトの名無しさん
08/07/09 00:33:08
newで動的確保をする際の質問なのですが
Base* foo = new Base(int bar);
この書き方だとBaseの引数付きコンストラクタが呼ばれる事はわかるのですが
動的に配列を確保する場合に引数付きコンストラクタを呼ぶ事は可能なのでしょうか?

イメージ的には↓のようなことをしたいです
Base* foo = new Base[3] {Base(int bar), Base(int bar), Base(int bar), };

683:デフォルトの名無しさん
08/07/09 00:37:08
出来ません

684:デフォルトの名無しさん
08/07/09 00:37:54
>>683
ありがとうございます

685:デフォルトの名無しさん
08/07/09 07:03:55
一度配列か何かを確保しておいて、そこにforで引数付きコンストラクタをnewして回せば解決する。
デストラクタに注意

686:デフォルトの名無しさん
08/07/09 12:38:32
まずメモリに連続した領域内に生成したいものが、ほんとうに
クラスのインスタンスじゃないとダメなのか再考してみたら?

687:デフォルトの名無しさん
08/07/09 12:41:11
引き数つきのnewか…これはわりと難しいので、
あとで初期化用メソッドを呼ぶかポインタの配列にしたほうがらくちん。


688:デフォルトの名無しさん
08/07/09 19:09:17
VC6以前のVS持っている人はいませんか?
DDE spyを分けて欲しいのですが・・・

689:デフォルトの名無しさん
08/07/09 19:18:31
2.0のなら転がってるPCのHDDあされば出てくるかもだが・・・

690:デフォルトの名無しさん
08/07/09 19:56:05
>>688
それってダメなんじゃないの?

691:デフォルトの名無しさん
08/07/09 20:48:29
>>682
vectorじゃだめなのかい?

692:デフォルトの名無しさん
08/07/10 06:15:03
最新のVC++コンパイラって、C99に対する完全な上位互換を持っていると
思っていいの?

693:デフォルトの名無しさん
08/07/10 07:29:57
C99はまだスルーされてる

694:デフォルトの名無しさん
08/07/10 11:04:51
まだどころか多分永遠にスルーされる
今の所C99に準拠しているのはIntel C++程度

695:デフォルトの名無しさん
08/07/10 11:05:45
C99なんて有ったの… とか

696:デフォルトの名無しさん
08/07/10 12:30:01
対応させるメリットないしな

697:デフォルトの名無しさん
08/07/10 14:39:59
一行コメントと関数途中やfor初期化部での変数宣言に対応してくれればあとはいいや

698:デフォルトの名無しさん
08/07/10 15:25:18
たしかVC++チームのブログのコメント欄だかで、C99対応してくれってユーザの声はほとんど無いって言っていたような。
C99のいくつかの有用な機能、一行コメントだとか、restrictだとかは取り入れたが、C99全部入れても、誰も使わないしなぁ。
Variable-length arrayなんて、いまどき誰が使うんだ。

699:デフォルトの名無しさん
08/07/10 15:51:39
C++があるからねえ・・・

700:デフォルトの名無しさん
08/07/10 16:16:02
gccでは可変長配列に対応してたりするけどな

701:デフォルトの名無しさん
08/07/10 17:36:42
C99欲しい人は何が目当てなの?

702:デフォルトの名無しさん
08/07/10 17:39:47
>>698
歴史的経緯でalloca()が実装されてないから、可変長配列はあれば便利だぞ。

703:デフォルトの名無しさん
08/07/10 18:04:05
>歴史的経緯でalloca()が実装されてない
どこのはなし?

704:デフォルトの名無しさん
08/07/10 18:53:10
stdint.hが欲しいんだ。


705:デフォルトの名無しさん
08/07/10 19:07:41
よろしい

706:デフォルトの名無しさん
08/07/10 19:49:43
そもそもallocaはC89、C99の規格の中には存在しない。
ありゃPOSIX規格のモンだ。
このスレ的にはWin32 APIと同等に扱われるべき環境依存の関数。

なんだけど、itoaとかと同じで、事実上無視できない存在ではあるね。
とはいえ、90年代ならまだしも、
今日び、スタックからわずかなメモリを確保できたところで、それほど利点も無いだろ。
現代なら定数時間でメモリを確保解放できるメモリプールで良いじゃん。

707:デフォルトの名無しさん
08/07/10 20:24:39
C99を策定していた委員会の連中もC++98がこれだけ
広く使われるようになるとは夢にも思ってなかったろう。

でないとあれだけ緻密なC99の規格、しかもC89と互換性を
犠牲にしてわざわざ新しい規格を作るはずがない。

708:デフォルトの名無しさん
08/07/10 20:42:07
>>706
>702は、POSIXにはあるallocaがWin32にはないから、代わりに使いたいと言ってるんじゃないかと。
確かに、freeする必要がないメモリを好きに取れるのは楽かもしれんね。
それこそ、今時スタックサイズをけちることもないんだし。

709:デフォルトの名無しさん
08/07/10 20:50:59
ケチる必要は無いかもしれんが多用するのはバカのやることだぞ。
例えば、VCのリンカのデフォルトのスタックサイズは1MBだ。
何GBもメモリがある時代にたったの1MBだぞ。
*unixのことはよく知らんが、そう変わらんだろうよ。
現状の32bitコードで、スタックサイズが大きすぎると、
スレッドを数十個作っただけで、無駄にアドレス空間が浪費される。
だからスタックのサイズは小さいんだよ。

710:デフォルトの名無しさん
08/07/10 21:06:44
>>708
_alloca()ならVC++でも普通に使えるよ

711:デフォルトの名無しさん
08/07/10 21:50:21
こんなこともallocaと
って一度言ってみたいです

712:デフォルトの名無しさん
08/07/10 22:03:10

         |:;:;:;:;:;:;:;:;:;:;:;:;:;:i;:;:;:;:;:;:;:;:;:;:;:;:;|
           |;:;:_:;:_:;:_:;:_;:;_:;:l:;_;:_:;:_:;:_:;:_;:_;|
        |______|_____|
        | 三|  _     _   |三 !
        | 三|  三シ   ヾ三  |三 |
        | 三′  .._     _,,..  i三 |
        ト、ニ| <でiンヽ  ;'i"ィでiン |三.|
        ', iヽ!  、 ‐' /  !、 ーシ |シ,イ
         i,ヽリ    ,' :  !.     |f ノ
         ヾ!    i ,、 ,..、ヽ   lノ
          |      _ _    イ l       malloca
            l    ,ィチ‐-‐ヽ  i /、
             ゙i、   ゝ、二フ′ ノ/'"\
              | \  ー一 / /   _,ン'゙\
          ,ィ|、  \     /_,、-'" _,.-''´ `丶、__
       _, イ  | ヽ_ 二=''" _,. -''´  """""´´  ``ー



713:デフォルトの名無しさん
08/07/10 22:19:03
alloca は gcc の configure でもチェックあるよな

714:デフォルトの名無しさん
08/07/10 22:20:10
> バカのやることだぞ

まだそんなカキコしてるんですか? にっぽんのドクターさん

715:デフォルトの名無しさん
08/07/10 23:11:49
プログラム=PCアプリだと思ってる連中は気楽でいいのう・・

716:デフォルトの名無しさん
08/07/10 23:15:46
どう気楽なのかキッチリ説明してもらおう。  (と言ってみる

717:デフォルトの名無しさん
08/07/11 00:06:24
C99は無かったことにならないかな。下手にこんなのがあると、コンパイラ
ベンダーが、C99実装しかねない。

718:デフォルトの名無しさん
08/07/11 00:13:54
たいていのコンパイラベンダはC++を優先するだろ

sizeofがコンパイル時定数にならないとか悪夢過ぎるだろ

719:デフォルトの名無しさん
08/07/11 00:51:13
・conio.hを何とかして欲しい。
・stdint.hの声が何故大きくない?

720:デフォルトの名無しさん
08/07/11 00:58:56
それにしてもC++自体が変態化してきて誰にも使われなくなりそうな気がするのは俺だけだろうか

721:デフォルトの名無しさん
08/07/11 01:06:43
おれのVC++のソース、alloca普通に便利に使ってる

722:デフォルトの名無しさん
08/07/11 01:26:23
C++はいろいろ変な部分があるが、
代わりになるいい言語がないのも事実
web限定とかだとPerl系に軍配が上がるが

723:デフォルトの名無しさん
08/07/11 01:40:53
C++0xはC99みたいな立場になるだろうな
そして代わりに○○が台頭する

○○にはお好きな言語をどうぞ

724:デフォルトの名無しさん
08/07/11 01:55:57
Obj-C

725:デフォルトの名無しさん
08/07/11 01:58:45
アプリケーション(ダイアログ)に表示された文字を外のアプリケーションから取得する方法ご存知のかたいませんか?


726:デフォルトの名無しさん
08/07/11 02:01:16
D言語がいつか主流になる・・・
そんな風に考えていた時期がありました・・・

727:デフォルトの名無しさん
08/07/11 02:20:56
>>725
君がすれ違いだということだけは、はっきりわかる。
プラットフォームすら記載されてないので、どのすれが適当かはしらん。

728:デフォルトの名無しさん
08/07/11 03:03:54
>>726
今ひとつ流行らんよなアレ

729:デフォルトの名無しさん
08/07/11 04:15:06
>>728
だってDは、「言語仕様が確定=開発終了」だもん。
D1の仕様は決まったけど、D2のほうが進歩してるのに誰がつかうよ。

730:デフォルトの名無しさん
08/07/11 12:54:57
仕様と同時に実装が下りてくるってのもエキサイティングだとは思うがね
なんにせよ俺は指をくわえて見てるだけ

731:デフォルトの名無しさん
08/07/12 02:55:05
無名namespaceについて教えてください。

名前のある名前空間の場合、
namespace hoge{
void f();
}
というように宣言して、後で
void hoge::f(){}
のように定義できますが、名前無しの場合
namespace{
void f();
}
として後で定義を書く場合、??::f()というような形式では定義できないのでしょうか?
もちろん定義のときも
namespace{
}で囲ってやればいいのでしょうが、関数定義のような長いものをブラケットで
囲むというのも、邪魔くさいなぁと思い。


732:デフォルトの名無しさん
08/07/12 03:05:35
確かに邪魔くさいが、
だからこそそんなもの使わないですむようしておけって話じゃね?

733:デフォルトの名無しさん
08/07/12 03:08:33
>>731
>として後で定義を書く場合、??::f()というような形式では定義できないのでしょうか?
こういう参照が出来ないからこそ役に立つんだと思う

734:731
08/07/12 03:15:56
レスどうもです。

基本的に、C++では翻訳単位内でのみ使用する変数や関数は、C言語のような
staticを付けるのではなく、無名名前空間を推奨しているようですが、
そうなると関数の定義は
namespace{
void f() { }
}
のようにするということでしょうか。みんなそうしてるのかな。

735:732
08/07/12 03:27:22
ごめん。 もっとくだらない理由だと思ってた。

"翻訳単位内でしか使わない"っていうことを明示したいなら、
その邪魔くさいnamespaseが(目立つから)役に立つだろうし、
邪魔くさいnamespaseを使いたくないってことは、
"翻訳単位内でしか使わない"っていうことを明示しなくてかまわない
と、俺は思うけど。

本当に邪魔だと思うなら、翻訳単位内でしか使わないとか、あきらめなよ。

736:731
08/07/12 03:51:39
外部リンケージを持たせたくない変数や関数の宣言だけを
namespace{}に収めるところまでは、目立たせる意味でも
一覧という意味でも非常にスッキリしてると思うんですよね。
ただ、ここに関数のボディまで書いてしまうと、一望しづらくなるので
別途書くことになるのですが、関数定義をブラケットで囲むということに
少し拒否反応がでてしまった次第です。ただ、これしか方法がないなら
そうするしかないですね。邪魔だから使わないというわけにもいかない
機能ですし。あとは、関数定義1つ1つをnamespace{]で囲むのか、複数の
関数定義をまとめてnamespace[]で囲むのか、こだわれるところとしたら
そのくらいですか。



737:デフォルトの名無しさん
08/07/12 04:02:32
すごい余談だけど、目立たせなくてはいけないのは、関数本体だと思うんだ。
関数本体をメンテナンスするとき、どの関数に使用されているかが問題になるので。

宣言が目立たないと、間違って呼び出そうとしてリンクエラーでるじゃん? それもいやじゃん?
ていわれりゃそうなんだけどさ。

738:デフォルトの名無しさん
08/07/12 08:09:05
templateで、doubleとfloatだけしか使えないようにするには、
何か書き方があるのでしょうか。教えてください。
template<typename T> void hoge(T arg);

739:デフォルトの名無しさん
08/07/12 08:30:51
template<typename T> void hoge(T arg){return;}
void hoge(double arg);
void hoge(float arg);

740:デフォルトの名無しさん
08/07/12 08:33:12
>>738
template<typename T> struct hoge_chk{hoge_chk(){ use_float_or_double(); }};
template<> struct hoge_chk<float>{};
template<> struct hoge_chk<double>{};

template<typename T> void hoge(T arg){
   hoge_chk<T>();
   ...
}

741:740
08/07/12 08:35:10
use_float_or_double()は定義されていない前提ね。
コンパイルエラーにさせるため。

742:デフォルトの名無しさん
08/07/12 08:39:49
template<typename T> void hoge(T arg);
template<> void hoge(float arg) { }
template<> void hoge(double arg) { }

でいいじゃん。

743:デフォルトの名無しさん
08/07/12 08:44:11
>>739 >>742
それだと
void hoge(float arg) {}
void hoge(double arg) {}
と同じだし、それぞれ実装書かないといけないから
テンプレート関数にする意味無いだろw

744:デフォルトの名無しさん
08/07/12 08:45:47
template<typename T> void hoge_impl(T arg) {}

template<typename T> void hoge(T arg);
template<> void hoge(float arg) { hoge_impl(arg); }
template<> void hoge(double arg) { hoge_impl(arg); }

745:デフォルトの名無しさん
08/07/12 08:52:53
>>743
同じじゃねーよ。そのコードでhoge("hogehoge")はエラーだけど>>739>>742はエラーじゃない。
テンプレートにする意味がないっていうのは質問者に言えって。

746:デフォルトの名無しさん
08/07/12 08:55:57
>>745
いや、hoge("hogehoge")で>>742はエラーになるよ。

747:デフォルトの名無しさん
08/07/12 08:56:00
>>744
だから下のテンプレート関数は意味無いってw
それでやるならこうだろ
template<typename T> void hoge_impl(T arg) {}
inline void hoge(float arg) { hoge_impl(arg); }
inline void hoge(double arg) { hoge_impl(arg); }

748:デフォルトの名無しさん
08/07/12 08:59:00
質問者がdoubleとfloatだけしか使えないように、と言ってるので
使えてしまう>>739も駄目だな

749:デフォルトの名無しさん
08/07/12 09:04:54
>>745
>テンプレートにする意味がないっていうのは質問者に言えって。
>>740>>747はテンプレートにする意味あると思うけど。

750:デフォルトの名無しさん
08/07/12 09:16:21
>>747
テンプレートの特殊化は関数の多重定義に優先するから
意味が違う

751:デフォルトの名無しさん
08/07/12 09:21:25
>>750
意味分かって言ってる?
それで困る「まともな状況」書いてみ

752:デフォルトの名無しさん
08/07/12 09:22:41
テンプレートの特殊化と関数の多重定義を二つかくと
関数の多重定義の方が無視されるだろ

753:デフォルトの名無しさん
08/07/12 09:25:48
>>752
>テンプレートの特殊化と関数の多重定義を二つかくと
それがまともな状況じゃないって言ってるんだよw

754:デフォルトの名無しさん
08/07/12 09:26:34
>>753
メンテナンスの程度次第ではいくらでもあり得る。
まともかまともな状況じゃないかはお前が判断する事じゃない。

755:デフォルトの名無しさん
08/07/12 09:27:36
>テンプレートの特殊化と関数の多重定義を二つかくと
>関数の多重定義の方が無視されるだろ

これ逆だよ。関数の多重定義の方が優先される。
だからテンプレートの特殊化と関数の多重定義は混ぜて
書くべきじゃない。

756:デフォルトの名無しさん
08/07/12 09:31:38
>>754
ワロタwどんな糞メンテナンスだよw

757:デフォルトの名無しさん
08/07/12 12:06:44
あれ?オーバーロードの方が特殊化より優先するよな?

758:デフォルトの名無しさん
08/07/12 12:52:15
>>757
>>755

759:デフォルトの名無しさん
08/07/13 12:38:07
boostスレ過疎ってんな・・・w

760:デフォルトの名無しさん
08/07/13 13:14:51
このスレ過疎ってるのでしょうか?
この話題↓で盛り上げてください!

やねう企画代表者やねうらお(本名・磯崎元洋)が
・ソフトウェアの不正コピーを行っていた
・労働契約上の違反をしていた
・他は不正コピーしていないことを証明しようとしてエロゲーのパッケージを発見し、
 写真に撮ってアップロードしようとした。
URLリンク(d.hatena.ne.jp)
やねう企画の裏側(競馬の詐欺ソフトの製作現場)
URLリンク(d.hatena.ne.jp)
URLリンク(d.hatena.ne.jp)
URLリンク(d.hatena.ne.jp)
有限会社やねう企画(所在地・大阪府八尾市末広町2-1-2)が計画倒産
URLリンク(www.sia.go.jp)

やねうらおプロフィール
性格:友達から「チンピラ」「ヤクザ」と呼ばれている。前世で殺人鬼だった宿業を背負っているという妄想(自覚)あり。
最終学歴:専門学校卒
主な職歴:有限会社センキ(凌辱系アダルトゲームの製作会社)を経て独立、有限会社やねう企画を設立、2006年に計画倒産
代表作:『夜這いマニア』『盗撮マニア』『お楽しみCDシリーズ』『競馬詐欺ソフト』『BM98』

やねうらお語録
>「ワシのほうが潔癖やと思うんやけどな。
>絶対に違法コピーのソフトしか使わんし。
>たとえば強盗に入ったときに、ちょっとかわいそうになって
>十万円だけ残してったら、おかしいやろ?
>自分の『強盗する』という意思に対して矛盾やろ?
>だからワシは、一個も買ったソフトを使ったことがない!!」


761:デフォルトの名無しさん
08/07/13 13:18:26
759 :デフォルトの名無しさん [sage] :2008/07/13(日) 12:38:07
  boostスレ過疎ってんな・・・w

760 :デフォルトの名無しさん [sage] :2008/07/13(日) 13:14:51
  このスレ過疎ってるのでしょうか?


日本語が不自由のようだなw

762:デフォルトの名無しさん
08/07/13 14:27:07
キーワードによる自動コピペ

763:デフォルトの名無しさん
08/07/13 14:49:07
memset や memcpy の動作について質問です。

memset(buff, 0, 0); や memcpy(buff, work, 0);

764:763
08/07/13 14:50:35
すみません、途中で送信してしまいました。


memset(buff, 0, 0); や memcpy(buff, work, 0); のように
サイズが 0 の場合、何も行われないという認識で合っていますか?
MSDN では分らなかったです。

765:デフォルトの名無しさん
08/07/13 15:06:56
サイズ 0 ならガッされないなんて知ってても役に立たんだろ

766:デフォルトの名無しさん
08/07/13 15:09:41
>>764
そういう場合、不安だったらmy_memsetかなんか一個かましておけ

767:デフォルトの名無しさん
08/07/13 15:12:29
>>765
関数の呼び出し元にバッファ領域のポインタと領域サイズを渡させる場合に役に立ちます
memset や memcpy にサイズ 0 を渡しても大丈夫ということであれば、
領域サイズに 0 が指定された場合のエラーチェックをせずに済むケースがあるからです

768:デフォルトの名無しさん
08/07/13 15:25:06
規格書にはn文字ほげほげするとだけしか書かれてなかった希ガス。
詳しく知りたければJISのサイトでX3010を検索。

769:デフォルトの名無しさん
08/07/13 15:25:19
>Where an argument declared as size_t n specifies the length of the array for a
>function, n can have the value zero on a call to that function. Unless explicitly stated
>otherwise in the description of a particular function in this subclause, pointer arguments
>on such a call shall still have valid values, as described in 7.1.4. On such a call, a
>function that locates a character finds no occurrence, a function that compares two
>character sequences returns zero, and a function that copies characters copies zero
>characters.

0を渡すことはできるが、その場合でもNULLはダメらしい

770:デフォルトの名無しさん
08/07/13 15:44:01
>>766
なるほど、それは確かに賢いやり方ですね。
ちょっと考えてみます。

>>768
調べてみます。

>>769
NULL チェックだけは避けられないということですね。
やはり、エラーをチェックする自作関数をかました方が良いのかもしれないですね。

771:デフォルトの名無しさん
08/07/13 18:18:24
宣言と定義が別々になってるコンストラクタで、初期化リスト使う場合って
宣言と定義両方に初期化リストつけなきゃいけないんだっけ?

772:デフォルトの名無しさん
08/07/13 18:20:42
定義の方だけ
class A {
int a;
A();
};
A::A():a(0){}

773:771
08/07/13 18:25:33
ありがとう。

774:デフォルトの名無しさん
08/07/14 05:20:26
=== hoge.h ===
class hoge {
public:
 template<typename T> T func(T a) const;
};
=== hoge.cxx ===
#include "hoge.h"
template<typename T>
T hoge::func(T a) const {
 return a;
}
=== main.cxx ===
#include "hoge.h"
int main() {
 hoge h;
 int a;
 h.func(a);
 return 0;
}

775:774
08/07/14 05:22:22
GCC 4.0.1で、
$ g++ -c hoge.cxx -o hoge.o
$ g++ -c main.cxx -o main.o
$ g++ main.o hoge.o -o main
Undefined symbols:
"int hoge::func<int>(int) const", referenced from:
_main in main.o
ld: symbol(s) not found
collect2: ld returned 1 exit status

となってしまいます。
templateのメンバ関数というのは、これではまずいですか?


776:デフォルトの名無しさん
08/07/14 05:41:04
まずいです。
h.func(a); を書いたソースから hoge::func の実装が見えるようにして下さい。
ようするに hoge.h に実装を書いてください。

777:デフォルトの名無しさん
08/07/14 05:50:17
>>775
exportキーワードをサポートしてないC++処理系では無理

778:774
08/07/14 06:14:12
>>776-777
まじですか。なんともめんどくさい。
設計からやり直さないと。
ありがとうございました。

779:デフォルトの名無しさん
08/07/14 20:11:37
VC++ 2008はもうexportをサポートしてる?

780:デフォルトの名無しさん
08/07/14 20:14:37
ネイティブコードなんてシロモノはOSぐらいしか使わないような世界になったなら、
exportもサポートされるかもな。

781:デフォルトの名無しさん
08/07/14 20:19:25
じゃあ2008でも未サポート?

782:デフォルトの名無しさん
08/07/14 20:57:28
>>780
なんで?

783:デフォルトの名無しさん
08/07/14 23:23:50
今やオブジェクト間最適化が当然の如く行なわれている。
export実装がそんなに困難であるはずがない。

784:デフォルトの名無しさん
08/07/14 23:29:47
コードレベルで保持しないとダメだから難しいでしょ。

D言語はうまいことやってるけど。

785:デフォルトの名無しさん
08/07/14 23:31:36
そろそろVC++2008でexportが実装されてるか教えてくれてもいいだろう

786:デフォルトの名無しさん
08/07/14 23:33:17
>>785
それがないんだな。

787:デフォルトの名無しさん
08/07/14 23:39:11
うそ~ん

788:デフォルトの名無しさん
08/07/14 23:49:19
exportが実装されるまでvcはスルー確定だな

789:デフォルトの名無しさん
08/07/15 01:19:30
じゃ、どのコンパイラ使う気?

790:デフォルトの名無しさん
08/07/15 01:23:38
Cマガってもう再開しないのかな。

791:デフォルトの名無しさん
08/07/15 01:25:14
exportはおまえらが想像する程素敵じゃないのよとEffectiveC++3版にかいてあるよ

792:デフォルトの名無しさん
08/07/15 01:28:06
Comeau

793:デフォルトの名無しさん
08/07/15 08:20:16
ところでMore Effective C++が第2版になっても訳が最悪で読みづらいらしいが
実際どうなの?読む価値ナッシングぅ?

794:デフォルトの名無しさん
08/07/15 21:27:54
>>793
読解可能なら原書を。
そうでないなら、項目を中心に辞書的に活用。

読む本としては厳しい。


795:デフォルトの名無しさん
08/07/15 22:33:14
「訳が最悪」という論評は原著が熟読できていて初めて可能
そうでなければ他人の論評の受け売り

796:デフォルトの名無しさん
08/07/15 22:36:38
日本語版しか読んでないけど、読みにくいのは確か

797:デフォルトの名無しさん
08/07/15 22:47:18
2つの補い合う16ビット整数について学べる本だと聞いたのだが本当かな?

798:デフォルトの名無しさん
08/07/15 23:37:13
原著が糞かどうかは見えていないわけか

799:デフォルトの名無しさん
08/07/16 02:18:51
>>793
新訂版は知らんが、旧版についてなら>>794でFAだと思う。
はっきり誤訳とわかる箇所が散見される
(例:p.139 コンストラクターメンバ関数 → 例示コードでconstメンバ関数とわかる)、
一般的な訳語を使わない(例:省略時コンストラクター)などの問題がある。
訳者まえがきに「翻訳を急いだ」と書いてあるが、そういう問題かなという感じ。

URLリンク(www.pej-hed.jp) に新訂版の目次があるけど、
少なくとも訳語の問題はあまり変わっていないようす。
訳者は旧版の3人+新任1人なので、自分は読み直す気にはならない。


800:デフォルトの名無しさん
08/07/16 02:39:21
800ならC++滅亡

801:デフォルトの名無しさん
08/07/16 02:56:32
>訳者は旧版の3人+新任1人なので
懲りてないな。
トールキンで言うと戸田&山本の最凶タッグが成立するようなもんか。

802:デフォルトの名無しさん
08/07/16 14:34:49
省略時ナントカは JIS X3014 の術語だからなんとも言えないけど
const → コンストラクタ は酷いな… orz
C++使わない人が訳したんだろうね。

803:デフォルトの名無しさん
08/07/16 21:09:25
テンプレートを用いる際、引数として与えられた型があるコンセプトを満たすかどうかによって、
異なるテンプレートを用いることはできるでしょうか?

例えば、
template<typename T>
class foo
{
 //Tがコンテナの要件を満たしてなければこの実装
};
template<typename T>
class foo
{
 //Tがコンテナの要件を満たしていればこの実装
};
という感じのコードを書きたいと思っていますが、
やはりredefinition of 'class foo<T>'と怒られます。
上手く解決する方法はありますか?

804:803
08/07/16 21:17:36
ちなみに、解決方法は多少技巧的になっても構いません。

805:デフォルトの名無しさん
08/07/16 21:38:26
>>803
特殊化すればよろし

template< typename T, bool is_container >
class foo
{ /* コンテナ以外 */ };

template< typename T >
class foo< T, true >
{ /* コンテナの場合 */ };

is_container を自動的に判定するにはメタ関数を作る必要がある


806:デフォルトの名無しさん
08/07/16 21:41:40
CLIで関数ポインタ配列の宣言がどうしても通らないんです。
よかったら教えてください。

public ref class Form1 : public System::Windows::Forms::Form
{
public:
...
int fn1(int,int);
int fn2(int,int);
int fn3(int,int);
int (*fp[])(int,int){
fn1,
fn2,
fn3
};
...


関数ポインタの配列が作りたいのですが、error C4368がでます。

807:デフォルトの名無しさん
08/07/16 21:43:35
>>806
C++/CLIは最早別の言語なので、専用スレへどうぞ。

808:デフォルトの名無しさん
08/07/16 21:45:11
>>803
これくらいなら出来る

#include <boost/mpl/if.hpp>
#include <boost/type_traits/is_integral.hpp>

using namespace boost;

template<class T>
struct Y {};

template<class T>
struct Z {};

template<class T>
struct X {
typedef mpl::if_<is_integral<T>, Y<T>, Z<T> >::type type;
};


809:デフォルトの名無しさん
08/07/16 21:46:08
>>805
ありがとうございます。
そのメタ関数の作り方を教えていただけないでしょうか?
あるいは、そのようなテンプレートプログラミングについて解説してあるサイトを紹介してくださると助かります。

810:デフォルトの名無しさん
08/07/16 21:46:10
>807
すみません。移動します。

811:デフォルトの名無しさん
08/07/16 21:57:08
>>808
boost::MPLにはあまり詳しくないのですが、
Xが整数型なら X<T>::type == Y<T> 、そうでなければ X<T>::type == Z<T> ということでしょうか。
組み込み型か否かというような判断ではなく、
例えば「Tがメンバにbegin()とend()を持つか否か」や「Tがメンバにoperator()を持つか否か」で、
使うテンプレートを分岐させたいのですが、解決方法があれば幸いです。

812:デフォルトの名無しさん
08/07/16 22:27:34
>>811
任意の型について
>「Tがメンバにbegin()とend()を持つか否か」や「Tがメンバにoperator()を持つか否か
を判定することは出来ないと思います

x.begin()

と呼ぶのではなく

begin(x)

などと呼んで型ごとにオーバーロードを用意するとかではダメですか?
Boost.Range がこの方法を採用して begin を持つ型にひ持たない型にも対応しています
私もたまにそうします

813:デフォルトの名無しさん
08/07/16 22:38:50
>>812
うーん、やはり無理ですか。

コンテナに対するオペレータのオーバーロードを考えていて、
コンテナが高階か1階かによって適用させる関数を変えたいと考えていたのですが、
どうもそういう発想に基づかない実装が必要なようですね。

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


814:デフォルトの名無しさん
08/07/16 22:45:39
>>799, >>802
だーかーらー、原著者がかましたボケかどうか確認しろつーの

815:デフォルトの名無しさん
08/07/16 23:03:42
>>813
役に立たないかもしれないけど、要件はクリア?
#include <iostream>

template<class T> struct Y { T m; };
struct Z {};

template<template<class T> class C>
struct X
{
template<class A>
static void f(C<A> x)
{
std::cout << "f(C<A>)" << std::endl;
f(x.m);
}

template<class B>
static void f(B x)
{
std::cout << "f(B)" << std::endl;
}
};

int main()
{
Y<Y<Z> > y;
X<Y>::f(y);
return 0;
}


816:デフォルトの名無しさん
08/07/17 00:17:58
>>815
この方法だと、型を1つ引数に取るテンプレートクラスか否かで分岐させているということでしょうか。
できればそれに限らないコンテナ(boost::arrayとか)も一括して扱いたいのですが、
確かにvectorやdeque, listに関してはこれで扱えそうですね。

教えてくださってありがとうございます。


817:デフォルトの名無しさん
08/07/17 22:37:21
テンプレートクラスのインスタンス化についての質問で、
以下のようなことがしたいのです。
※以下の全ての例は当然コンパイルはできません。


// 動的にテンプレートの型
list* getList(int n) {
if(1 == n) {
// int型のリストをreturn
}

if(2 == n) {
// double型のリストをreturn
}
}

int main() {

// 型情報を持たないlistクラスの変数を用意(したい)
list* x;

int num;
std::cin>>num;

// キーボードで入力した値によって型を変える
x = getList(num);

}

このような処理を行いたいのですが、どうにかならないでしょうか…
JavaにおけるObjectクラスのようなクラスがあればいいのですが。

818:817
08/07/17 22:37:52
私が考えてみたのは

(1)typedefを使う
(2)マクロを使う

で、どちらも上手くいきません。

(1)については、

// typedef の前方宣言(をしたい)
typdef typ_t;

// 動的に型情報を決定(これだとスコープ的にダメ?)
if(1 == n) {
typedef int type_t
}

if(2 == n) {
typedef double type_t
}

// 動的に定まった型を用いてインスタンス化
list<type_t> x;

こんな感じにできないかと思ったのですが、
宣言がの方法がわかりませんでした。(できない?)

819:デフォルトの名無しさん
08/07/17 22:38:30
(2)については

// とりあえず何か型を設定
#define TYPE_T int

// 動的に型情報を決定
if(1 == n) {
#undef TYPE_T
#define TYPE_T double
}

if(2 == n) {
#undef TYPE_T
#define TYPE_T char
}

// 動的に定まった型を用いてインスタンス化
list<TYPE_T> x;

これは n の値によらず最後に #defile された値
が常に適用されてしまい、ダメでした。
(今の場合でしたら常に list<char> が生成されてしまう。)

もう本当にお手上げ状態でして、みなさんのお知恵を
お借りしたいと思っている次第でございます;;

何卒よろしくお願いします

820:デフォルトの名無しさん
08/07/17 22:39:41
>>818最後の行

×宣言がの方法が
○前方宣言の方法が

821:デフォルトの名無しさん
08/07/17 22:57:57
>>819
テンプレートクラスを使わずに普通のクラスで対処したらいけないの?

class list { /* listの定義 */ };;
class IntegerList : public list { /* IntegerListの定義 */ };
class DoubleList : public list { /* DoubleListの定義 */ };

list* getList(int n) {
    if ( n == 1 ) { return new IntegerList(); }
    if ( n == 2 ) { return new DoubleList(); }
}

822:デフォルトの名無しさん
08/07/17 23:15:06
インスタンス化クラスの型はコンパイル時に解決するから、実行時の多態性を実現する目的には向かない。

823:デフォルトの名無しさん
08/07/17 23:20:01
テンプレートはコンパイル時の問題を解決するための道具です
実行時には役立ちません

実行時の問題は実行時用の道具で対処したほうが良いでしょう

824:デフォルトの名無しさん
08/07/17 23:29:17
>>821
元々の目的が
「テンプレートクラスの型指定を実行時に動的に行いたい」
ということですので、それだと本来の目的に合わないのです。

が、>>822 >>823 さんの仰るように、そもそも本来の目的の
方向性が良くなかったようで…。
一度構成を考え直してみたいと思います。

みなさん、どうもありがとうございました。

825:デフォルトの名無しさん
08/07/17 23:53:05
boost.variantじゃ駄目なのか

826:デフォルトの名無しさん
08/07/18 04:24:38
今、とある解説書でC++の例外を勉強しているのだが、投げられた例外を
受け取る例外ハンドラがない場合、terminage()が呼ばれabort()が呼ばれると。
abort()は何の後処理もせずプログラムを終了させるから具合が悪いという
ことが書かれているのだが、プログラムが終了すればすべてメモリは解放
されるのと違うの?プログラムが終了してまで、何か禍根が残るなんてこと
あるの?

827:826
08/07/18 04:25:20
ミス
terminage() → terminate()

828:デフォルトの名無しさん
08/07/18 04:33:50
>>826
ファイルシステムとかデータベースとか。

mkdir() を使ったロックなんかがわかりやすいかな?

829:826
08/07/18 04:39:16
レスどうも。
つまりプログラムとは独立したなんらかのリソースを操作する場合に
影響が残るということか…

830:デフォルトの名無しさん
08/07/18 04:54:12
VC++2008で
void f() throw( hoge1, hoge2, hoge3);
みたいな例外指定ってサポートされてないんだね。
標準C++勉強してると、意外と最近のコンパイラが標準準拠していない
ことに気づく。

831:デフォルトの名無しさん
08/07/18 07:57:37
むしろ準拠しなくてもOSが「問題ないぜ!掛かって来い冷害!」

832:デフォルトの名無しさん
08/07/18 13:08:34
初心者で申し訳ないのですが、
googleのsparse_hash_mapを使おうとして、マニュアル通り
#include <iostream>
#include <google/sparse_hash_map>
using namespace std;
using google::sparse_hash_map;
..
int main () {
sparse_hash_map<const char *, int, hash<const char *>, eqstr> months;
とすると、
'hash' was not declared in this scope
と、hash<const char *> すら定義されていないと言って怒られてしまいます。
hash_mapの場合も同じだったのですが、どうするといいでしょうか。
環境は g++ (GCC) 4.1.1 20070105, Linux FC6です。
よろしくお願いします。

833:デフォルトの名無しさん
08/07/18 13:25:34
#include <ext/hash_fun.h>
を追加してみてはいかがでしょう。

834:デフォルトの名無しさん
08/07/18 14:28:03
>>833
ありがとうございます。
もう一度追加してみたのですが、エラーメッセージは同じのようでした。
ちなみに using __gnu_cxx; したり、__gnu_cxx::hash<const char *>と
すると、もの凄いエラーメッセージが出ます。。

835:832
08/07/18 18:20:56
すみません、自己解決しました。
上のコードの struct eqstr の持つ比較関数
bool operator() (const char *a, const char *b) const
で、最後の const が抜けていたのが原因のようでした。
using namespace __gnu_cxx; で const を加えると、問題なく通りました。
# たったそれだけで長大なエラーメッセージが表示されるとは、
C++、恐ろしい子・・・!!

836:デフォルトの名無しさん
08/07/18 18:31:34
最初の方の数個のエラーだけ見て推測すりゃ良いだろ。
コンパイル時間と長大なエラーメッセージに怖気づくなよ。

837:デフォルトの名無しさん
08/07/18 23:32:51
>>830
VCはずっとサポートされないままだね。(他は知らないけど)
やっぱ難しいんかな。

838:デフォルトの名無しさん
08/07/18 23:45:04
          ζ
         / ̄ ̄ ̄ ̄\
       /         |
       | ⌒  ⌒   /|
       | (・)  (・)   |||||||
       | ⊂⌒◯-----∂)___   ___
       | ||||||||_     /     ゙Y"     \
         \ヽ_/ \/              \
         \    /                 \
          / ̄ ̄ ̄ ̄)        *      ( ̄ ̄ ̄ ̄)
         |    ─<         |\      >─   (
         |      )     /  (|ミ;\    (      )
         ヽ    ̄ ̄)    /(___人|,iミ'=;\  (  ̄ ̄   )
         /" ̄ ̄ ̄ ̄   /    《v厂リiy\  ̄ ̄ ̄ ̄\
         /        /        ゙|,/'' v:,,、.¨)z,_       \
        /       /         ミ/ .-─ .゙》z、      \
        /      /           〔」″ノ‐ 、u ¨\      )
       (      /             ゙|, ..冫 .rー    ̄\_    |
        |      〔              ミ./′   ..r-ー __,,ア┐  |
        |      |              {. .,,,,   .′  .´′ .¨\|
        |       |              ∨   ノ冖′ =vvvvvv¨\
        |     /               ミ.   ,i'           .゙\_
        |     /                .{.  ノ  ,r¬″       .¨\

839:デフォルトの名無しさん
08/07/18 23:49:41
>837
実装するだけなら全く難しくないと思うが
関数に try, catch 差し込んで unexpected 呼ぶだけでしょ

840:デフォルトの名無しさん
08/07/19 00:32:21
例外指定なんて誰も使わないから別にいい

841:デフォルトの名無しさん
08/07/19 16:56:54
Javaは例外指定必須だけどうっぜえ割に大してバグが減るわけでもない
はっきり言って全くいらない機能

842:デフォルトの名無しさん
08/07/19 23:51:23
同意。C#の設計者もアレあんまし意味無いだろって言ってる品。
URLリンク(www.artima.com)

843:デフォルトの名無しさん
08/07/20 07:52:16
>>838
これって遠近法で描かれたウンコなのかドリルなのか気になる

844:デフォルトの名無しさん
08/07/20 09:28:32
激突
アナル vs ドリル

845:デフォルトの名無しさん
08/07/20 10:54:04
new/delete演算子をオーバーライドしたいのですが、
これらの中からもとのnew/deleteを呼ぶにはどうしたらよいですか?


846:デフォルトの名無しさん
08/07/20 14:57:11
置かれている状況が分からないから何とも言えないけど、
::operator newと::operator deleteでどうよ。

847:デフォルトの名無しさん
08/07/20 17:09:26
operator newをオーバーライドしたなら、必要なのはメモリの固まりなわけで、
mallocでも呼んどきゃいいんでね?

848:デフォルトの名無しさん
08/07/20 17:58:46
>>847
コンストラクタを呼びたいんじゃね?

849:デフォルトの名無しさん
08/07/20 18:09:06
「new演算子のオーバーライド」で、どのコンストラクタを呼びたくなるわけ?

ひょっとしてたとえば、メモリ管理クラスがあって、operator new()で
そのメモリ管理クラスをインスタンス化するためにnewしたくなったけど、
メモリ管理クラスのメモリはどうするんだってな話?

850:デフォルトの名無しさん
08/07/21 04:35:49
クラスのメンバ関数が、自分自身をdeleteする処理を行っても
安全なのでしょうか?
つまりdelete this;ってことになるかな。
自分自身が解体された後にメンバ関数からリターンするって何か変ですよねぇ。
しかもdelete this;の後にも処理が続いてたらやばいですよね。

851:デフォルトの名無しさん
08/07/21 06:40:13
>>850
安全。ただしもちろん、それやったあとにそのインスタンスを使っちゃいけない。

たとえばboost::intrusive_ptrみたいに、値に自身の参照カウンタを持たせるスマートポインタの場合、
値となる型に
void Release() { if (!--refCount_) delete this; }
みたいなメンバ関数を用意することになる。

852:デフォルトの名無しさん
08/07/21 06:41:32
規格上どうなってるかは知らないけど、そういうことをやってるライブラリは知ってる。
他のメンバーにアクセスせずにリターンするだけなら問題はないような。

実際どっちのデザインがいいのだろ。
A a = A::createInstance();
a.Free();
A::Free(a);


853:850
08/07/21 06:50:27
レスありがとうございます。
deleteした後に余計なことしなければ、いけるってことですね。

854:デフォルトの名無しさん
08/07/21 16:09:12
現在ublasを使っていて少しつまづいてしまったので教えていただきたいことがあるのですけど
教えていただけないでしょうか?

ある行列を多くの行列演算の和として計算したいのですが、
代入を繰り返すことでおそくなってしまいます。
例えば以下のような例です。
for(i=0;i<100;i++){
MAT1+=some_matrix;
}
some_matrixには毎回べつの行列が計算されてはいります。

expression template でこれを高速可できるということですが、
for文の中で毎回代入していまうとその時点で式が評価されてしまうので遅くなってしまうようです。
式そのものを変数として保持しておくような事はできるのでしょうか?

初歩的な質問ですみませんがどなたかお願いします。

855:デフォルトの名無しさん
08/07/21 16:15:30
autoやdecltypeがあればいいんだがなぁ。

856:デフォルトの名無しさん
08/07/21 16:36:33
draw_mark = rand() % 4 + 1;
draw_digit = rand() % 13 + 1;

if(h) {
printf("%sの%s\n", mark[draw_mark-1], digit[draw_digit-1]);
}
r = total[draw_digit-1];
この文の+1と-1はあってもなくても結果は同じですよね? 気になったので教えてください

857:デフォルトの名無しさん
08/07/21 16:46:49
他の場所で使ってなければ同じ。

858:デフォルトの名無しさん
08/07/21 18:23:52
結果は同じでも、可読性が違う。
乱数の結果が+1してあれば「乱数値を1オリジンに変換している」というニュアンスが伝わるし、
配列のインデックスが-1してあれば「カード番号を0オリジンに変換している」というニュアンスが伝わる。

859:デフォルトの名無しさん
08/07/21 18:34:07
一方、ロシアは0オリジンで乱数値を扱った。

860:デフォルトの名無しさん
08/07/21 18:39:15
>>859
そういう無意味な書き込みして楽しい?
そうかぁ、寂しい青春送っているんだね。

861:デフォルトの名無しさん
08/07/21 18:49:41
>>860
>>860


最新レス表示
レスジャンプ
類似スレ一覧
スレッドの検索
話題のニュース
おまかせリスト
オプション
しおりを挟む
スレッドに書込
スレッドの一覧
暇つぶし2ch