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


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

C++相談室 part78



1 名前:v(^・^)v mailto:sage [2010/02/13(土) 23:18:03 ]
C++に関する質問やら話題やらはこちらへどうぞ。
ただし質問の前にはFAQに一通り目を通してください。
IDE (VC++など)などの使い方の質問はその開発環境のスレに
お願いします。

前スレ
C++相談室 part77
pc12.2ch.net/test/read.cgi/tech/1263556932/

577 名前:デフォルトの名無しさん mailto:sage [2010/03/05(金) 20:20:28 ]
最後の一つ前までやればいいだけにみえる

578 名前:デフォルトの名無しさん mailto:sage [2010/03/05(金) 20:34:14 ]
>>577
--vec.end()
なんて怖すぎます!
・・・ブルブル。

579 名前:デフォルトの名無しさん mailto:sage [2010/03/05(金) 20:37:18 ]
ランダムアクセスイテレータならcontainer.end() - 1でいいだろ

580 名前:デフォルトの名無しさん mailto:sage [2010/03/05(金) 20:37:49 ]
怖くねーよカス

581 名前:デフォルトの名無しさん mailto:sage [2010/03/05(金) 20:42:41 ]
あれ、空のときに困ると思ったんだけど、
やってみたら大丈夫だった・・・?!

582 名前:デフォルトの名無しさん mailto:sage [2010/03/05(金) 20:44:05 ]
あ、わかった。
要素が一個だけのとき、何も出力されなくなる。

583 名前:デフォルトの名無しさん mailto:sage [2010/03/05(金) 20:46:19 ]
>たいてい欲しいものだと思います

いや別に。
上手いやり方か知らんが、自分で適当に
↓みたいな反復子を作るのは駄目なのか?
codepad.org/o3QbtQyC

584 名前:デフォルトの名無しさん mailto:sage [2010/03/05(金) 20:47:03 ]
いや、そもそもぜんぜんダメだ。
v=[3,4]
のとき、出力が
3#
ですよ。。。

585 名前:デフォルトの名無しさん mailto:sage [2010/03/05(金) 20:51:56 ]
>>583
やっぱそっちですか。
イテレータとかすぐに書けないけど・・・。
ありがとうございます。



586 名前:デフォルトの名無しさん mailto:sage [2010/03/05(金) 21:46:35 ]
>>585
楽してイテレーター書くならこんなのどうかな。
www.kmonos.net/alang/boost/classes/iterators.html


587 名前:デフォルトの名無しさん mailto:sage [2010/03/05(金) 21:59:38 ]
boostはホント何でもありますね・・・。
なるべく依存したくないけど。

>>583
理解できたので、ほとんどそのまま使いまわせそうです。
たいへん助かりました。

588 名前:デフォルトの名無しさん mailto:sage [2010/03/05(金) 22:04:19 ]
>>587
boostでテクニック勉強したら、自分でサブセットなライブラリを作れば依存しなくてすむんじゃないかな。


589 名前:デフォルトの名無しさん mailto:sage [2010/03/06(土) 00:54:10 ]
>>575 何のこと?

590 名前:デフォルトの名無しさん mailto:sage [2010/03/06(土) 07:16:34 ]
Hoge Hoge::getObj( ){
 return *this;
}

Hoge& Hoge::getObj( ){
 return *this;
}

return *this はそのままで戻り値の書き方次第(Hoge& or Hoge)で
参照返しとオブジェクトのコピー返しと変わってしまうというのに違和感を感じる。
上の2通りの違いを *this の部分でも書き示す方(例:参照返し→ @*this )が良かったのに、と思ってしまうのですが
どうですか?
(どうですか?、って言っても仕様だからどうかなる話ではないのですが)


591 名前:デフォルトの名無しさん mailto:sage [2010/03/06(土) 07:42:38 ]
それが気になる人は、それ以上に、関数を呼び出すほうも気になるだろうね。
int func1(const Hoge& h);
int func2(Hoge h);
Hoge hoge;
func1(hoge);
func2(hoge); // 同じ書き方

関数定義を書いている時は、すぐそこに戻り値の扱いが見えてる安心感があってまだいいけど、
関数呼び出しを書いている時は、関数の宣言or定義がよその何処かに書かれてる。
エディタ支援があるとはいえ、「遠くの何かを知ってなきゃいけない」感じがあって、より落ち着かないのでは。

592 名前:デフォルトの名無しさん mailto:sage [2010/03/06(土) 08:48:31 ]
constなら区別して呼び出せるけどね

void foo(int& a);
void foo(const int& a);

int a; //constではない
foo(const_cast<const int&>(a)); //ここはconst版を呼びたい


593 名前:デフォルトの名無しさん mailto:sage [2010/03/06(土) 10:22:01 ]
関数宣言見ただけじゃ参照かどうかわからなくて困るだろ
と思ったけど
int &a = @b;
みたいにしてほしいってことなのかな

594 名前:デフォルトの名無しさん mailto:sage [2010/03/06(土) 11:19:24 ]
constにするときはstatic_castでいいんじゃないか

595 名前:デフォルトの名無しさん mailto:sage [2010/03/06(土) 11:30:14 ]
そんなことよりint @sp = spnew int [10]; int $wp = wpnew sp;を組み込んでくれ



596 名前:デフォルトの名無しさん mailto:sage [2010/03/06(土) 11:31:26 ]
シンタックスシュガーは
もっと多くてもいい

597 名前:デフォルトの名無しさん mailto:sage [2010/03/06(土) 11:42:32 ]
オレサマプリプロセッサ作って好きに構文創作しれ

598 名前:デフォルトの名無しさん mailto:sage [2010/03/06(土) 13:55:16 ]
>>597
#define amigo friend;

愛用してます

599 名前:デフォルトの名無しさん mailto:sage [2010/03/06(土) 15:28:31 ]
フレンド程度に内面を洗いざらいさらしていいのか?

600 名前:デフォルトの名無しさん mailto:sage [2010/03/06(土) 15:34:29 ]
>>597
#define foreach BOOST_FOREACH


601 名前:デフォルトの名無しさん mailto:sage [2010/03/06(土) 15:37:34 ]
>>599
friendのおかげで、余計なpublicを作らずprivateで済ませられるんじゃないのか。


602 名前:デフォルトの名無しさん mailto:sage [2010/03/06(土) 15:40:05 ]
#define buddy friend;
じゃないの?

603 名前:デフォルトの名無しさん mailto:sage [2010/03/06(土) 15:42:12 ]
friendはクラステンプレート中にテンプレート関数を定義したい
時に、暗黙の型変換ができるように使っている。

Effective C++で紹介されていた内容。


604 名前:デフォルトの名無しさん mailto:sage [2010/03/06(土) 15:56:22 ]
>>598
ほらみろよく判って無い奴が調子に乗って暴れ出したじゃないか

605 名前:デフォルトの名無しさん mailto:sage [2010/03/06(土) 15:59:18 ]
そこは指摘せずにそっとしておく所だろ



606 名前:デフォルトの名無しさん mailto:sage [2010/03/06(土) 16:54:52 ]
abort() if (!p);

みたいに書けるようにはならんのか。


607 名前:デフォルトの名無しさん mailto:sage [2010/03/06(土) 17:25:45 ]
if (!p) abort() ; 

608 名前:デフォルトの名無しさん mailto:sage [2010/03/06(土) 17:35:50 ]
>>606
C++などのほかの言語なんかに手を出さず、一生perlを使い続けるべきだと思います。

609 名前:デフォルトの名無しさん mailto:sage [2010/03/06(土) 17:42:02 ]
perlではif文を後に書くのか?

610 名前:デフォルトの名無しさん mailto:sage [2010/03/06(土) 17:56:39 ]
>>596
言語の文法は最小限でライブラリで拡張できるほうがいい。

611 名前:598 mailto:sage [2010/03/06(土) 18:17:05 ]
すいません嘘です

612 名前:デフォルトの名無しさん mailto:sage [2010/03/06(土) 19:54:49 ]
abort() if(!p) else exit();
とか普通に書きたいんじゃないの?

613 名前:デフォルトの名無しさん mailto:sage [2010/03/06(土) 19:55:27 ]
>609
文修飾子という扱いで後ろにも置ける。

if(e) { func(); }
func() if e;

は OK だけど、

if(e) func();
{ func() } if e;

はできない。

614 名前:デフォルトの名無しさん [2010/03/06(土) 20:00:36 ]
>>613
2種類の書き方があるっていうか、そういうのって分りにくくないのかな?
後に書くということは
func(すっげー長い式なんたらかんたらどうのこうの) if e;
だと読むときifを読み落としそうだなあ。


615 名前:デフォルトの名無しさん mailto:sage [2010/03/06(土) 20:01:35 ]
ワケ分からんw

C++だと、func() ;も{ func() ; }も、ひとつのstatementなので、ものすごい違和感があるな。
{ func() ; } if e ;
ができないというのは、ものすごく違和感があるな。



616 名前:デフォルトの名無しさん mailto:sage [2010/03/06(土) 20:06:35 ]
struct A;
struct B{ B( A& ); }
A a(); // これとか
B b( A() ); //これが
関数宣言にみなされない書き方ないの?
A a;
B b( a );
とかじゃない方法で。

617 名前:デフォルトの名無しさん mailto:sage [2010/03/06(土) 20:09:39 ]
>>615
思うに。
{
すげーー長い文
なんたらかんたら
だらだらだらだら
}
if e;
って読むのに困るよね。
do{}while()でも読みにくいのね。

618 名前:デフォルトの名無しさん mailto:sage [2010/03/06(土) 20:22:06 ]
do... whileは、まだ、先頭にdoがあるから、「あ、これはdo... while文の始まりだな」と分かるわけで、
それほど読みにくいってほどでもないんじゃないかな。

619 名前:デフォルトの名無しさん mailto:sage [2010/03/06(土) 20:23:29 ]
>>616 ないよ。

620 名前:デフォルトの名無しさん mailto:sage [2010/03/06(土) 20:31:05 ]
func() if e; はシンタックスシュガーの一例か?

混乱の割にメリットは感じられない。


621 名前:デフォルトの名無しさん mailto:sage [2010/03/06(土) 20:51:51 ]
ループの先頭などで、
break if foo
continue if bar
とかするのは気持ちいい。

622 名前:デフォルトの名無しさん mailto:sage [2010/03/06(土) 21:14:57 ]
だから、perl以外の言語は触らずに
perlだけ使ってなよ。

623 名前:デフォルトの名無しさん mailto:sage [2010/03/06(土) 21:25:16 ]
        ハ,,ハ
       (*゚ω゚ )  >>622お断りします。Rubyも使います。
.       (=====)
      _(_⌒) )
    /\  `J  ̄ ̄\
     ̄ ̄ ̄ ̄| | ̄ ̄ ̄
            |
          / \
             ̄ ̄

624 名前:デフォルトの名無しさん mailto:sage [2010/03/06(土) 22:07:59 ]
perlで俺シンタックスシュガープリプロセッサ作ればいいんじゃね?


625 名前:デフォルトの名無しさん mailto:sage [2010/03/06(土) 22:18:21 ]
foreach(int x, std::make_pair(v.begin(), it))
みたいにカンマが含まれても大丈夫なマクロが欲しいです



626 名前:デフォルトの名無しさん mailto:sage [2010/03/06(土) 22:57:30 ]
>614
Perl には TMTOWTDI(There's More Than One Way To Do It:やり方は一つじゃない)という
スローガンがあってな。

>615
Perl では { } は block であって文じゃないんだ。

>620
if (e) func(); ができなくていちいち block 書くのが面倒という事なんだと思う。

627 名前:デフォルトの名無しさん mailto:sage [2010/03/06(土) 22:57:49 ]
>616
ttp://www.parashift.com/c++-faq-lite/ctors.html#faq-10.19

628 名前:デフォルトの名無しさん mailto:sage [2010/03/06(土) 23:36:34 ]
あの、ひとついいですか?
僕は現在高校2年生です。そんなぼくにもC++はマスター
できます?

629 名前:デフォルトの名無しさん mailto:sage [2010/03/06(土) 23:40:22 ]
それなりのことはできるようになりますがマスターはそう簡単にはできません

630 名前:デフォルトの名無しさん mailto:sage [2010/03/06(土) 23:46:51 ]
>>628
それはお前次第やろ

631 名前:デフォルトの名無しさん mailto:sage [2010/03/06(土) 23:55:49 ]
>>625
C99の__VA_ARGS__が、C++0xに入る。

632 名前:デフォルトの名無しさん mailto:sage [2010/03/07(日) 01:23:57 ]
double* darray = new double[0];
delete [] darray;

のようなことがプログラム中で起こるのですが、問題ありますか?

633 名前:デフォルトの名無しさん mailto:sage [2010/03/07(日) 01:25:45 ]
>>632 いいえ。何が心配?

634 名前:デフォルトの名無しさん mailto:sage [2010/03/07(日) 01:35:02 ]
サイズ0だと続けて次に確保したときに、おんなじ場所を確保しちゃうような気がする
ダミーで1byteぐらい確保されんのかな

635 名前:デフォルトの名無しさん mailto:sage [2010/03/07(日) 01:37:05 ]
>>634
ヌルを返したり他のオブジェクトと同じアドレスを返したりしちゃいけないことになってるから、
だいたいの実装がそんな感じ。



636 名前:デフォルトの名無しさん mailto:sage [2010/03/07(日) 02:15:18 ]
0バイトのオブジェクトは存在できないから標準に従えば1バイト以上確保することになる
だがdarray[0]にアクセスすると未定義動作
変なの

637 名前:デフォルトの名無しさん mailto:sage [2010/03/07(日) 02:27:16 ]
void *operator new (std::size_t size)
{
if(size == 0) throw std::bad_alloc("Fack you!"); return std::malloc(size);
}

638 名前:デフォルトの名無しさん mailto:sage [2010/03/07(日) 02:35:06 ]
error: no matching function for call to 'std::bad_alloc::bad_alloc(const char [10])'

639 名前:デフォルトの名無しさん mailto:sage [2010/03/07(日) 07:00:01 ]
"C++"で、依存関係を解決するためにインターフェイス指向な設計に取り入れるってこと多いかなぁ?
テンプレートではなく、仮想関数を使う方法で。

640 名前:デフォルトの名無しさん mailto:sage [2010/03/07(日) 07:00:33 ]
s/設計に/設計を/

641 名前:デフォルトの名無しさん mailto:sage [2010/03/07(日) 07:09:36 ]
>>639
あると思うよ。
今の時代だとクリティカルな部分さえ最適化できればいいから動的型付けに対してそんなに神経質になる必要も無い。
ソフトウェア工学から見たある程度の規模からの開発のし易さや動的な依存関係の解決には仮想関数が向いているし
テンプレートを用いた静的な型レベルの解決なら実行速度に対する最適化が向いている。
臨機応変に適材適所できるからC++が選ばれる、何てこともあるね。
強い動的型付けな言語(Rubyとか)になっちゃうと融通が利かないし。
でもRubyとかを採用する現場では速度低下の弊害より人材のコスト考えてる場合ばおおいね

642 名前:デフォルトの名無しさん mailto:sage [2010/03/07(日) 08:52:23 ]
>>639
俺はよく使ってる。
継承を使う時は、純粋仮想関数のみで構成されたクラスの継承がほとんど。

テンプレートを依存関係を解決するために使うのは、本当にテンプレートが効果的かよく考えてやった方がいいと思う。

643 名前:デフォルトの名無しさん mailto:sage [2010/03/07(日) 09:44:55 ]
>>634
コンストラクタで malloc() を呼ぶと
malloc(0) でも8バイトぐらいは確保される。

ここらへんは Cライブラリの実装次第だが、
あとで realloc()/free() に渡す可能性があるポインタということを
考えると0バイトであってもユニークなポインタが返されるべき。


644 名前:デフォルトの名無しさん mailto:sage [2010/03/07(日) 10:48:18 ]
templateを使った依存関係の解決ってどういうの?

645 名前:デフォルトの名無しさん mailto:sage [2010/03/07(日) 12:20:35 ]
>>644
class Hoge {
void foo() { fuga_.(this); }
Fuga<Hoge> fuga_;
}
俺はこんなのを想像した。これは相互参照か?

単に特定のクラスに依存したら拡張性がなくなるから、テンプレート引数で指定できるようにしたいという事かもしれない。



646 名前:645 mailto:sage [2010/03/07(日) 12:22:14 ]
2行目訂正
void foo() { fuga_.bar(this); }

647 名前:デフォルトの名無しさん mailto:sage [2010/03/07(日) 12:30:42 ]
こういうのを相互参照って言うんじゃないか
class b;

class a
{
b* bb;
};

class b
{
a* aa;
};


648 名前:デフォルトの名無しさん mailto:sage [2010/03/07(日) 12:59:32 ]
多態性を持ちつつどこかに保存しなければならない場合にはインターフェース(か、型消去)を使うかな
でも保存する必要が無い関数の引数とかだったらテンプレートの方がいいと思う
例えば標準のアルゴリズムをテンプレートじゃなくてインターフェースで解決しようとしたら結構めんどくさいだろう
std::random_access_iterator_interfaceみたいなのが沢山作られて、それを適切に継承してないイテレータは対応アルゴリズムが使えない
みたいな感じで、行儀はいいんだけど、すごいめんどくさくなる

649 名前:デフォルトの名無しさん mailto:sage [2010/03/07(日) 16:00:23 ]
理想的には継承と多相は独立した概念なんでしょうね。
要求される振る舞いが出来ることを保証する仕組みの一つが
継承であるだけで。

650 名前:デフォルトの名無しさん mailto:sage [2010/03/07(日) 16:10:37 ]
いわゆるダックタイピング

651 名前:デフォルトの名無しさん mailto:sage [2010/03/07(日) 16:40:10 ]
>>649
多相を実現する手段の一つが継承


652 名前:デフォルトの名無しさん mailto:sage [2010/03/07(日) 18:35:47 ]
ダックタイピングはコンセプトがあればなぁ

653 名前:デフォルトの名無しさん mailto:sage [2010/03/07(日) 18:50:34 ]
せめてコンパイラのエラーメッセージがわかりやすくなれば

654 名前:デフォルトの名無しさん mailto:sage [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); // 禁止されてる
}

655 名前:デフォルトの名無しさん mailto:sage [2010/03/08(月) 00:10:08 ]
>>654 std::move するんだよ。



656 名前:デフォルトの名無しさん mailto:sage [2010/03/08(月) 03:22:13 ]
>>654
C++0xなら、rvalue referenceが使える。

それ以前のC++では、一応、auto_ptrを実装できるぐらいの方法はあるが、
そのテクニックを学ぶことは、精神衛生上よろしくないので、おすすめしない。

657 名前:デフォルトの名無しさん [2010/03/08(月) 04:21:56 ]
>>654
コピー代入を封じるなら無理。
キャストは、元オブジェクトからキャスト先オブジェクトという作るという点では、複製に等しいため。

それこそ>>655の言うように所有権の移動を許可する方向でやるしかない。
(もちろん所有権が移る以上、本来のキャストとは若干異なるセマンティクスになる)

658 名前:デフォルトの名無しさん mailto:sage [2010/03/08(月) 07:36:01 ]
const_cast ってconstはずしだから <> の中に型書くの無駄だなぁって思ってしまう。
const int* からconstとったら int* に決まってんじゃん、と。

659 名前:デフォルトの名無しさん mailto:sage [2010/03/08(月) 08:09:18 ]
>>658
const_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) ;



660 名前:デフォルトの名無しさん mailto:sage [2010/03/08(月) 11:12:58 ]
template<class vtype>
class Test
{
 public:
  Test( ){ }
  void func( );
};

のようなクラスのとき、
vtype が P と Test<P> (Pはプリミティブ型) とで呼び出す func( ) を変える方法はありますか?

661 名前:デフォルトの名無しさん mailto:sage [2010/03/08(月) 11:33:00 ]
特殊化すればいいよ

662 名前:660 mailto:sage [2010/03/08(月) 12:15:01 ]
>>661
このようにしたのですが、うまく行きません。。。

template<class vtype>
void Test<vtype>::func( )
{
 cout << "aaa" << endl;
}

template<class vtype>
void Test<Test<vtype> >::func( )
{
 cout << "bbb" << endl;
}


663 名前:デフォルトの名無しさん mailto:sage [2010/03/08(月) 12:22:01 ]
>>662
codepad.org/isjE5LKn

664 名前:660 mailto:sage [2010/03/08(月) 12:39:43 ]
>>663
ありがとうございます。
クラスレベルで特殊化してしまうと、メンバ関数が沢山ある場合
同じようなコードが沢山生まれてしまうので
関数部分だけ特殊化できれば、と思ったのですが
クラスのところで特殊化しなきゃダメなのですね。



665 名前:デフォルトの名無しさん mailto:sage [2010/03/08(月) 12:40:57 ]
>>664
codepad.org/QzjNzjhA



666 名前:660 mailto:sage [2010/03/08(月) 12:52:05 ]
>>665
テンプレートと継承の組み合わせというのは考えられませんでした。
ありがとうございます。


667 名前:デフォルトの名無しさん mailto:sage [2010/03/08(月) 13:41:10 ]
>>655-657
サンクスです
キャスト≒複製って知りませんでした
時期標準のソースをチラ見したところ標準もキャストはサポートされてなかったので、uniqueの方はキャスト諦めることにしました

668 名前:デフォルトの名無しさん mailto:sage [2010/03/08(月) 15:54:42 ]
構造体のメンバ変数を一括で代入する方法ってないんですか?
例えば構造体Aの変数のメンバ変数を全て0にするとか…

669 名前:デフォルトの名無しさん mailto:sage [2010/03/08(月) 16:26:02 ]
struct S { int a, b, c; double x, y, z; static S empty; };
S S::empty = { 0 };

S var;
var = S::empty;

670 名前:デフォルトの名無しさん mailto:sage [2010/03/08(月) 17:44:32 ]
サンクス。クラス使わないとダメなんすか?

671 名前:デフォルトの名無しさん mailto:sage [2010/03/08(月) 18:03:45 ]
pod作る関数を作ればいい。テンプレートで

672 名前:デフォルトの名無しさん mailto:sage [2010/03/08(月) 18:05:33 ]
struct S { int a, b, c; double x, y, z;};
S a={0};
これで事足りるんじゃ

673 名前:デフォルトの名無しさん mailto:sage [2010/03/08(月) 18:14:12 ]
>>672 それは代入じゃない。

674 名前:デフォルトの名無しさん mailto:sage [2010/03/08(月) 18:17:26 ]
あーざっす

675 名前:デフォルトの名無しさん mailto:sage [2010/03/08(月) 18:17:34 ]
初期化だ(キリッ



676 名前:デフォルトの名無しさん mailto:sage [2010/03/08(月) 19:48:52 ]
>>659
const_cast<int *>(p)だろ
他のconstが必要なら後で付ければいい
何があかんのですか

677 名前:デフォルトの名無しさん mailto:sage [2010/03/08(月) 20:22:05 ]
const const_iterator* it;
const_cast(it)

これはどうなるんだ?
const_iteratorはポインタかもしれないしクラスかもしれない

678 名前:デフォルトの名無しさん mailto:sage [2010/03/08(月) 20:35:48 ]
const_iteratorがconst Type*だった場合、
itの型はconst Type *constでconst_castするとconst Type*になる。
そうでない場合、const_castするとconst_iteratorになる。ただそれだけの話。

679 名前:デフォルトの名無しさん mailto:sage [2010/03/08(月) 20:43:53 ]
>>676
void const * const * const cpcpc = 0;
void ** pp = const_cast<void**>(cpcpc);
void const ** cpp = const_cast<void const**>(pp); // このcastはどうすんの?


680 名前:デフォルトの名無しさん mailto:sage [2010/03/08(月) 20:54:34 ]
>>678
>itの型はconst Type *constでconst_castするとconst Type*になる。
なんでType*じゃないんだ?>>676と矛盾しない?

681 名前:デフォルトの名無しさん mailto:sage [2010/03/08(月) 22:11:07 ]
std::complexのconj( )って何でメンバ関数ではなくグローバル関数なのですか?

682 名前:デフォルトの名無しさん mailto:sage [2010/03/08(月) 22:15:54 ]
無闇にメンバ関数にするとprivateにアクセス出来てしまうから、
privateにアクセスする必要のない関数は
メンバでもfriendでもない関数にするのが良いって
偉い人が言ってた

683 名前:681 mailto:sage [2010/03/08(月) 22:28:24 ]
>>682
ありがとうございます。

もし自分がcomplex作ったら、conj( )をメンバ関数にして
privateなデータを変更してしまうように実装しそうなのですが
これは良くないんですかね?

684 名前:デフォルトの名無しさん mailto:sage [2010/03/08(月) 22:34:42 ]
そもそも変更することがおかしいんじゃないかい。
メンバ変数にするにしてもconstにするべきだと思う。
共役複素数を求めるだけだよね?

685 名前:デフォルトの名無しさん mailto:sage [2010/03/08(月) 22:42:05 ]
むしろその程度の軽い型なら不変型にしちゃった方が



686 名前:681 mailto:sage [2010/03/08(月) 23:02:53 ]
>>684
イメージ的にはこんな感じです。

myComplex<double> mc0(2,2); // 2+2i
mc0.conj( ); // 2-2i

グローバル関数にするとコピーが発生してしまうので
良くないのかなぁ、と思ったのですが。

687 名前:デフォルトの名無しさん mailto:sage [2010/03/08(月) 23:14:08 ]
実測した訳じゃないが、
あまり効果なさそうな気はする。
コードを見やすくしたほうがいいんじゃないだろうか。

688 名前:デフォルトの名無しさん mailto:sage [2010/03/08(月) 23:28:29 ]
なんで配列はイニシャライザリストで初期化出来ないんですか?

689 名前:デフォルトの名無しさん mailto:sage [2010/03/08(月) 23:50:50 ]
C++0xにご期待ください

690 名前:デフォルトの名無しさん mailto:sage [2010/03/09(火) 01:16:28 ]
>>679
const増やすのはstatic_castでもreinterpret_castでも出来る
お好きな方で

691 名前:デフォルトの名無しさん mailto:sage [2010/03/09(火) 01:19:23 ]
>>690 キャスト無しで通っちゃうよ。

692 名前:デフォルトの名無しさん mailto:sage [2010/03/09(火) 01:28:37 ]
>>676
void f(void const* a[]); // const 一個付け忘れてるけど変更できない外部ライブラリ
void f(void* a[]); // 同上、ただし非 const データを対象とするオーバーロード

// ここから自前のコード
void g(void const* const a[])
{
f(const_cast(a)); // 上のオーバーロードに渡したいのに下のほうにいっちゃう
}

こわくね?

693 名前:デフォルトの名無しさん mailto:sage [2010/03/09(火) 02:23:22 ]
まあconst_cast使うなってのが基本だから
それを書きやすくするうえに他のキャストと違う形になる
省略記法なんて認められないと思われる

694 名前:デフォルトの名無しさん mailto:sage [2010/03/09(火) 07:04:10 ]
>>690-691
うちのVC++2008EEではconst_castかC style castでないと通らないんだけど、
なんかおかしいのかな。

695 名前:デフォルトの名無しさん mailto:sage [2010/03/09(火) 07:21:42 ]
どうせ<>書いてないとか



696 名前:デフォルトの名無しさん mailto:sage [2010/03/09(火) 07:26:55 ]
通らない
ttp://codepad.org/d4Wo3ozT

697 名前:デフォルトの名無しさん mailto:sage [2010/03/09(火) 07:48:53 ]
void ** const cpp = static_cast<void **>(pp);
えっ?

698 名前:デフォルトの名無しさん mailto:sage [2010/03/09(火) 07:49:47 ]
>>696
それは、規格の文面によって、明示的に禁止されている。
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なオブジェクトを参照することが可能になってしまう。

699 名前:デフォルトの名無しさん mailto:sage [2010/03/09(火) 07:57:03 ]
>>698
規格の参照までしていただいて、ありがとうございます。
参考になります。

ということで、これを踏まえて改めて>>679

700 名前:デフォルトの名無しさん mailto:sage [2010/03/09(火) 07:57:31 ]
ubuntu の gcc version 4.4.1 (Ubuntu 4.4.1-4ubuntu9)
環境で例外クラスの実装を見ようと思ったのですが
/usr/include/c++/4.4/stdexcept
に logic_error などの宣言はあるのに実装が書いてありません。
どのファイルを見たら良いでしょうか?

701 名前:デフォルトの名無しさん mailto:sage [2010/03/09(火) 08:07:03 ]
const_castの話してるやつはコテ着けるか
婉曲表現と皮肉をやめて直接主張しろ
何人かいて訳が分からない

702 名前:デフォルトの名無しさん mailto:sage [2010/03/09(火) 08:40:34 ]
はがす時は全はがしが楽じゃね?ってことが基点となっていると思うので

void 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); // 一部はがしのときもこれまで同様書ける

というのを望んでんのかも

703 名前:デフォルトの名無しさん mailto:sage [2010/03/09(火) 09:06:33 ]
がんばれ
658 :デフォルトの名無しさん :2010/03/08(月) 07:36:01
const_cast ってconstはずしだから <> の中に型書くの無駄だなぁって思ってしまう。
const int* からconstとったら int* に決まってんじゃん、と。

704 名前:デフォルトの名無しさん mailto:sage [2010/03/09(火) 14:09:06 ]
constの話で盛り上ってるからついでに聞きたいんだけど

struct X {
int *p;

void test(int x) const
{
*p = x;
}
};

こう書くとconst指定してるのにオブジェクトの内容が変化してる
これって合法なの?


705 名前:デフォルトの名無しさん mailto:sage [2010/03/09(火) 14:14:13 ]
>>704
Xのオブジェクトはpであることを思い出せ。
pはint*型だから「int型の値のあるメモリの位置」を指している。
*p = xは「pの指している先のint型の値に対する副作用」であって「pに対する副作用」ではない。



706 名前:デフォルトの名無しさん mailto:sage [2010/03/09(火) 15:34:24 ]
pは宝の地図
*pは宝の中身
Xのメンバはpつまり宝の地図
だからtest(int x) constとは宝の地図を書き換えちゃいけないってこと
*p = xは宝の中身を入れ替えているだけ

707 名前:デフォルトの名無しさん mailto:sage [2010/03/09(火) 15:39:05 ]
中々面白い例え方をするな。

708 名前:デフォルトの名無しさん mailto:sage [2010/03/09(火) 15:54:36 ]
**pは宝の地図の在り処を書いた地図か。判りやすいね。

709 名前:デフォルトの名無しさん mailto:sage [2010/03/09(火) 15:57:01 ]
ゲームのお使いクエストだな。
そのお宝の例えは俺は結構好きだな。

710 名前:デフォルトの名無しさん mailto:sage [2010/03/09(火) 16:19:18 ]
へー、いい表現じゃん

711 名前:デフォルトの名無しさん mailto:sage [2010/03/09(火) 16:23:11 ]
サンクス
正常な動作だったのね

712 名前:デフォルトの名無しさん mailto:sage [2010/03/09(火) 17:43:29 ]
new intは新しく宝を作るが、この式自体は新しく作られた宝のありかを示す地図を返す。
new int*は宝の地図を新しく作りその地図のありかを返す式だが、新しく作られた宝の地図には宝のありかは書いてない。
難しいな。

713 名前:デフォルトの名無しさん mailto:sage [2010/03/09(火) 19:38:02 ]
new int*なんてあんの? あるなら知らなかった。

714 名前:デフォルトの名無しさん mailto:sage [2010/03/09(火) 19:44:58 ]
型なら何でもnew出来るだろ

715 名前:デフォルトの名無しさん mailto:sage [2010/03/09(火) 19:46:35 ]
関数型もできるっけ?
関数ポインタじゃなくて。



716 名前:706 mailto:sage [2010/03/09(火) 21:01:33 ]
何の気無しに書いたんで、反応あって驚いてる。
>>706は、一番最初にポインタを勉強する時に俺が(たまたま)イメージしたもので、
今にして思うと、地図という「質量を持った物体」でポインタを喩えたのが好都合だった気がする。
たまたまそういうイメージをしたお陰で、ポインタもまた「そういう値」である、って所で
まったく混乱せずに済んだ。>>708が言うように、ポインタのポインタも
「勇者は宝箱を開けた。なんと宝の地図を見つけた!」ということだと考えれば楽だったし。

717 名前:デフォルトの名無しさん mailto:sage [2010/03/09(火) 22:24:46 ]
C++は勉強するほど自信がなくなっていくな・・・boostマジキチ

718 名前:デフォルトの名無しさん mailto:sage [2010/03/09(火) 23:10:15 ]
>>716
初心者には分かりやすい言い例えだね。
俺もそれ使わせてもらいます。


719 名前:デフォルトの名無しさん mailto:sage [2010/03/09(火) 23:24:34 ]
住所とか例えるより絶対わかりやすい。

720 名前:デフォルトの名無しさん mailto:sage [2010/03/09(火) 23:30:25 ]
>「勇者は宝箱を開けた。なんと宝の地図を見つけた!」

あるあるw

721 名前:デフォルトの名無しさん [2010/03/09(火) 23:38:31 ]
ポインタを宝箱に例えるなら、中身の種類は開ける前から判っているんだが

722 名前:デフォルトの名無しさん [2010/03/09(火) 23:38:54 ]
s/宝箱/宝箱の地図/

723 名前:デフォルトの名無しさん mailto:sage [2010/03/10(水) 00:06:18 ]
で?

724 名前:デフォルトの名無しさん mailto:sage [2010/03/10(水) 00:35:08 ]
ヌルポインタはミミックだな
開けると死ぬ

725 名前:デフォルトの名無しさん mailto:sage [2010/03/10(水) 01:44:47 ]
住所にたとえるのと変わらんと思うがね



726 名前:デフォルトの名無しさん mailto:sage [2010/03/10(水) 01:46:21 ]
ていうか別に喩えなくても分かるから

727 名前:デフォルトの名無しさん [2010/03/10(水) 01:46:56 ]
ミミックは固定ボスだから、地図が読めない奴が初見殺しされるだけだろ

728 名前:デフォルトの名無しさん mailto:sage [2010/03/10(水) 04:46:42 ]
minorという変数がプログラム中にありますが、
cstdlibをインクルードしたら以下のようなエラーが出るようになりました。

error: macro "minor" passed 2 arguments, but takes just 1

これは単純に、minorという変数名を使うな、という解釈でよいでしょうか?

729 名前:デフォルトの名無しさん mailto:sage [2010/03/10(水) 04:58:04 ]
>>728
どう読んだらそんな解釈になるんだよ。

そのエラーが再現する最小ソースを作ってみれ。

730 名前:728 mailto:sage [2010/03/10(水) 05:25:53 ]
>>729
言葉足らずでした。

上記のエラーは、
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;
}


731 名前:デフォルトの名無しさん mailto:sage [2010/03/10(水) 05:36:58 ]
>>730
別に言葉足らずじゃない。>>729が寝ぼけてるだけ。
環境によってはsys/types.hにminorマクロがあるので使わない方がいい。

732 名前:デフォルトの名無しさん mailto:sage [2010/03/10(水) 05:43:19 ]
>>731
ありがとうございます。

733 名前:デフォルトの名無しさん mailto:sage [2010/03/10(水) 05:56:50 ]
>>730
手元の Cygwin g++ 4.3.4 では何事もなくコンパイルが通ったよ。

ちなみに >728 の環境(OS、コンパイラ、そのバージョン)は何?

734 名前:デフォルトの名無しさん mailto:sage [2010/03/10(水) 06:01:57 ]
>>731
cstdlib のインクルードでユーザーが使える名前がマクロ定義されてるのは
コンパイラのバグ(標準違反)だと言ってしまっていいと思うんだけど、そういう
予防しとかないといけないものなの?どっかの環境での常識?

735 名前:728 mailto:sage [2010/03/10(水) 06:04:13 ]
>>733
Ubuntu 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)



736 名前:デフォルトの名無しさん mailto:sage [2010/03/10(水) 06:14:04 ]
-std=c++98 とかすれば逃げれたりするんじゃないかなー。
まぁ #undef すりゃいいんだけどね。

737 名前:728 mailto:sage [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出ませんでした。

738 名前:デフォルトの名無しさん mailto:sage [2010/03/10(水) 09:54:54 ]
functionってすげいな
ソース眺めるだけで勉強になる

739 名前:デフォルトの名無しさん mailto:sage [2010/03/10(水) 17:43:07 ]
struct A;
struct B{A a;};
struct A{int a;};
int main(){return 0;}

前方宣言したら、後で定義してれば
使えると思ってたんですが
これがエラーになります
Bの中をA* aにするとエラーが消えるのですが
その辺に理由があるんでしょうか?

740 名前:デフォルトの名無しさん mailto:sage [2010/03/10(水) 17:53:13 ]
ちょっと実験してみたところ、前方宣言って思ったほど強くない?んですね
Aのデータは定義されるまでは全く参照出来ないのか

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;}

741 名前:デフォルトの名無しさん mailto:sage [2010/03/10(水) 18:01:37 ]
サイズがわかってるかどうかで判断できるよ

742 名前:デフォルトの名無しさん mailto:sage [2010/03/10(水) 19:10:29 ]
なるほど、セーフなのはアドレスですもんね
ありがとうございました

743 名前:デフォルトの名無しさん mailto:sage [2010/03/10(水) 22:23:35 ]
>>738
しかしそんなソースを仕事で書いたら
同僚に白い目で見られそうだww

744 名前:デフォルトの名無しさん mailto:sage [2010/03/10(水) 22:40:04 ]
すみません
vectorのresizeでサイズを大きくした時に
拡張した結果メモリの再配置が起こったとすると
resizeする前のデータはコピーされるのでしょうか?

745 名前:デフォルトの名無しさん mailto:sage [2010/03/10(水) 22:42:12 ]
ざれます



746 名前:デフォルトの名無しさん mailto:sage [2010/03/10(水) 22:43:10 ]
>>744
www.fides.dti.ne.jp/~oka-t/cpplab-vector-new.html

747 名前:デフォルトの名無しさん mailto:sage [2010/03/10(水) 22:43:18 ]
ありがとうございます><.

748 名前:デフォルトの名無しさん mailto:sage [2010/03/11(木) 00:56:34 ]
クラスを使ってプログラミングする場合、main関数はどのように使用すればいいのでしょうか?

749 名前:デフォルトの名無しさん mailto:sage [2010/03/11(木) 00:59:17 ]
普通に使用すればいいです

Javaみたいにどっかのクラスのstatic関数にする必要はなし、というか無理

750 名前:デフォルトの名無しさん mailto:sage [2010/03/11(木) 01:51:16 ]
オペレータオーバーロードの ->* って、どう定義してどう使うんですか?
ググール先生に聞こうと思ったんだけど記号検索できませんでした

751 名前:デフォルトの名無しさん mailto:sage [2010/03/11(木) 01:55:22 ]
ttp://homepage2.nifty.com/well/Operator.html#arrow_ast

752 名前:デフォルトの名無しさん mailto:sage [2010/03/11(木) 02:06:36 ]
結合力最強の二項演算子なので
マクロとかで細工するときに便利なこともあります

753 名前:デフォルトの名無しさん mailto:sage [2010/03/11(木) 02:24:57 ]
>>751
どうもです
しかしなんだこれって感じですね
ポインタエミュレートのために
(myp_hoge->*(&MyPtr<hoge>::Func))(a, b, c);
といった形で使いたいんですが、定義の仕方が分からないです(->なら簡単なんですが・・・)

>>752
そういう特殊な使い方ってよく思いつくもんですよね

754 名前:デフォルトの名無しさん mailto:sage [2010/03/11(木) 03:03:47 ]
>>748
徹底したクラス指向で行くならこの程度のものになる。
int main()
{
 MainClass m;
 return m.main();
}

755 名前:デフォルトの名無しさん mailto:sage [2010/03/11(木) 04:20:39 ]
int main()
{
 return MainClass()();
}
徹底するならこうだろーと思った俺はそろそろ寝るべきか



756 名前:デフォルトの名無しさん mailto:sage [2010/03/11(木) 04:51:32 ]
operator RESULT(); //用意するだろ普通

757 名前:デフォルトの名無しさん mailto:sage [2010/03/11(木) 16:29:37 ]
throwでint投げると問題があるようなことを聞いたのですが、
どんな問題があるんでしょうか?
ポインタでキャッチしてしまうとか?

758 名前:デフォルトの名無しさん mailto:sage [2010/03/11(木) 16:33:36 ]
受け取る方はみんなstd::exceptionを継承してて欲しいなーって思ってるから

759 名前:デフォルトの名無しさん mailto:sage [2010/03/11(木) 16:44:47 ]
なるほど。よくわかりました。

760 名前:デフォルトの名無しさん mailto:sage [2010/03/11(木) 17:01:56 ]
istringstream の putback って何回でも呼んでおk?

761 名前:デフォルトの名無しさん mailto:sage [2010/03/11(木) 21:28:31 ]
boost::functionとstd::functionって混在しても問題ありませんか?
それともどちらか一方にすべきでしょうか?

762 名前:デフォルトの名無しさん mailto:sage [2010/03/11(木) 21:54:55 ]
混在させたこと無いからわからんけど、大丈夫じゃね?
どっちも最終的にはただの関数オブジェクトになるわけだから
boostのほうにstdのfunctionを代入することも逆もできるはず
名前は名前空間があるからかぶるわけないし

763 名前:デフォルトの名無しさん mailto:sage [2010/03/11(木) 22:54:37 ]
ABI互換性は?

764 名前:デフォルトの名無しさん mailto:sage [2010/03/11(木) 23:03:33 ]
混在といっても、ひとつのコンパイラでコンパイルするんだからABI関係なくね?


765 名前:デフォルトの名無しさん mailto:sage [2010/03/11(木) 23:15:46 ]
namespace boost = std ;



766 名前:デフォルトの名無しさん mailto:sage [2010/03/11(木) 23:28:03 ]
ありがとうございます。
今のところはboostが使えるならboostが無難かと
思うのでboostにします。


767 名前:デフォルトの名無しさん mailto:sage [2010/03/11(木) 23:34:01 ]
>>766
えぇーーー
普通は逆でしょ
標準で済むなら標準を使うのが筋でしょ

768 名前:デフォルトの名無しさん mailto:sage [2010/03/11(木) 23:38:24 ]
>>767 std::function はまだ標準じゃないでしょ。

769 名前:767 mailto:sage [2010/03/11(木) 23:40:20 ]
>>768
そりゃそうだ
boost と std だけ見て function を見てなかったよ

770 名前:デフォルトの名無しさん mailto:sage [2010/03/11(木) 23:48:14 ]
>>766も「今のところは」って言ってるしな。


771 名前:デフォルトの名無しさん mailto:sage [2010/03/12(金) 01:27:32 ]
placement newを使わずに、任意のメモリ領域にコンストラクタを呼ぶことは不可能?

772 名前:デフォルトの名無しさん mailto:sage [2010/03/12(金) 01:30:56 ]
>>771
何がしたいのかわからないけど、コピーでいいなら std::allocator::construct() とか
std::uninitialized_copy() とかが使えるんじゃない?

773 名前:デフォルトの名無しさん mailto:sage [2010/03/12(金) 10:16:48 ]
template <class T> void Caller( T &f ){ f(); }
に対して、
void Callee();
があり、
Caller( Callee ); // これだとコンパイルが通るのに、
Caller( &Callee ); // こっちは通らない
のはなぜですか?

774 名前:デフォルトの名無しさん mailto:sage [2010/03/12(金) 10:40:58 ]
codepad.org/WzrQ1BNa
それはポインタだからさ

775 名前:デフォルトの名無しさん mailto:sage [2010/03/12(金) 20:32:25 ]
関数の引数に配列の参照を渡したいんですが、どうすればいいですか



776 名前:デフォルトの名無しさん mailto:sage [2010/03/12(金) 20:54:16 ]
>>774
サンクスです。
T &fは「関数の参照型」と言えばいいんでしょうか?
また、関数ポインタを呼ぶ際は、
(*f)(); //デリファレンスあり
f();//なし
2通りで呼べますが、これはシンタックスシュガー的なものですか?
どっち使ってもOKですか?

777 名前:デフォルトの名無しさん mailto:sage [2010/03/12(金) 20:54:42 ]
template<typename T, size_t N> void func(T (&x)[N])

778 名前:デフォルトの名無しさん mailto:sage [2010/03/13(土) 00:39:50 ]
typedef std::deque<int>::iterator iterator;
iterator tekitou;
//...
tekitou == iterator(); //tekitouに代入処理がなかったらtrue
を期待して組んでたら例外が発生してパソコンが爆発したんですけど
tekitouがデフォルトコンストラクタ走ったまま何も触られて無いかどうかを判定する方法はありませんか?

779 名前:デフォルトの名無しさん mailto:sage [2010/03/13(土) 00:52:18 ]
>>778
パソコンが爆発するプログラムを作っているんだったら
いますぐやめなさい。

780 名前:デフォルトの名無しさん mailto:sage [2010/03/13(土) 00:53:54 ]
パソコンが爆発するプログラムを作っているのではありません。
パソコンが爆発するのを防ぐプログラムを作っているのです。

781 名前:デフォルトの名無しさん [2010/03/13(土) 01:15:50 ]
爆発させるプログラムにも実に巧妙なメカニズムがあってだな・・・

782 名前:デフォルトの名無しさん mailto:sage [2010/03/13(土) 01:17:30 ]
兎に角、例外が発生してプログラムが正常に動作しないと爆発を防ぐ事ができないのです。
ご教示いただけないでしょうか?

783 名前:デフォルトの名無しさん mailto:sage [2010/03/13(土) 01:20:26 ]
判定する方法は無い
ポインタと違ってイテレータにはNULL入れられないからねぇ
int *ptr = 0;

784 名前:デフォルトの名無しさん mailto:sage [2010/03/13(土) 01:21:45 ]
本当に爆発するというなら、
本題なんてどーでもよくて、爆発させる方法を知りたい気すらする。

785 名前:デフォルトの名無しさん mailto:sage [2010/03/13(土) 01:22:35 ]
bool変数でも使って対処しとけ



786 名前:デフォルトの名無しさん mailto:sage [2010/03/13(土) 01:24:23 ]
std::pair<iterator, param>ってしてたけどSTLがクソ過ぎてstd::pair<std::pair<iterator, bool>, param>って書かなきゃいけなくなったわ・・・

787 名前:デフォルトの名無しさん mailto:sage [2010/03/13(土) 01:25:48 ]
こういうときは boost::optional だっけ?

788 名前:デフォルトの名無しさん mailto:sage [2010/03/13(土) 01:26:47 ]
つtuple

789 名前:デフォルトの名無しさん mailto:sage [2010/03/13(土) 01:30:12 ]
end()をNULL代わりにしたらあかんの?

790 名前:デフォルトの名無しさん mailto:sage [2010/03/13(土) 01:32:49 ]
今回もそうでしたが、コンテナを特定できないとそれは使えません。

791 名前:デフォルトの名無しさん mailto:sage [2010/03/13(土) 01:55:44 ]
じゃあNULL用の適当なコンテナ作ればいいじゃん

792 名前:デフォルトの名無しさん mailto:sage [2010/03/13(土) 01:58:30 ]
std::pair<iterator, param>ってしてたけどSTLがクソ過ぎてstd::pair<std::pair<iterator, dummy_container>, param>って書かなきゃいけなくなったわ・・・

793 名前:デフォルトの名無しさん mailto:sage [2010/03/13(土) 01:59:08 ]
nil使えよ

794 名前:デフォルトの名無しさん mailto:sage [2010/03/13(土) 02:06:15 ]
iteratorがコンテナと関連付けられてるかチェックしたいってことなのかな?
わざわざややこしいことやってるように見えるけど

795 名前:デフォルトの名無しさん mailto:sage [2010/03/13(土) 02:43:02 ]
namespace boost {
namespace detail { struct none_helper{}; }
typedef int detail::none_helper::*none_t ;
} // namespace boost
namespace boost {
none_t const none = ((none_t)0) ;
} // namespace boost

このコードはいったい何をしようとしてるわけ?



796 名前:デフォルトの名無しさん mailto:sage [2010/03/13(土) 02:55:22 ]
ググった?

797 名前:デフォルトの名無しさん mailto:sage [2010/03/13(土) 04:11:26 ]
>>795
他のどんな型からも自動変換されないし、
他のどんな型へも自動変換されないような変数を定義してるんじゃね?


798 名前:デフォルトの名無しさん mailto:sage [2010/03/13(土) 06:23:39 ]
>>468といい>>778といい、最近のPCは爆発しすぎだな

799 名前:デフォルトの名無しさん mailto:sage [2010/03/13(土) 06:27:14 ]
俺のPCは蒸着するぜ0.05秒で。

800 名前:デフォルトの名無しさん mailto:sage [2010/03/13(土) 06:52:58 ]
手荷物どころかそのうち航空貨物での取り扱いも断られる

801 名前:デフォルトの名無しさん mailto:sage [2010/03/13(土) 07:31:03 ]
そして単純所持禁止へ

802 名前:デフォルトの名無しさん mailto:sage [2010/03/13(土) 07:33:53 ]
コンピュータが爆発するって
昔の映画や漫画によくあったな

803 名前:デフォルトの名無しさん mailto:sage [2010/03/13(土) 07:52:27 ]
「映画の中のコンピュータ」って
ジョークがあったな

804 名前:デフォルトの名無しさん mailto:sage [2010/03/13(土) 08:20:38 ]
「なお、このPCは自動的に消滅する」

805 名前:デフォルトの名無しさん mailto:sage [2010/03/13(土) 10:22:54 ]
>>799
あれってさリュック背負ってたりするとセムシ形状に成ったりするん?



806 名前:デフォルトの名無しさん mailto:sage [2010/03/13(土) 12:27:14 ]
>>795
なんだこれ超ムズイじゃねぇか。


807 名前:デフォルトの名無しさん mailto:sage [2010/03/13(土) 13:03:28 ]
pointer to memberって使ったことあんましないからわからんけど
ほかのpointer to memberじゃないとキャストできない(void *にreinterしても変換できなかった)から他の型と比較できない
なおかつメンバが空だからnullしか入れるものがない
したがってただひとつの状態を持てるってことかな
C++ってこういう気持ち悪いバッドノウハウ多すぎるよね
すなおに仕様でnil型導入すればいいのに

808 名前:デフォルトの名無しさん mailto:sage [2010/03/13(土) 13:26:04 ]
一般的な実装上の都合からいうと、
メンバへのポインターは、単なるオフセットに過ぎない。

809 名前:デフォルトの名無しさん mailto:sage [2010/03/13(土) 13:30:01 ]
null_ptrをお待ちください

810 名前:デフォルトの名無しさん mailto:sage [2010/03/13(土) 17:15:12 ]
>>807
実装上の都合を言語ユーザに押し付けてる感はあるな

811 名前:デフォルトの名無しさん mailto:sage [2010/03/13(土) 19:14:16 ]
>>810


812 名前:デフォルトの名無しさん mailto:sage [2010/03/13(土) 19:16:22 ]
ごめん、途中で送信してしまった。

>>810
他の言語はともかく、
余計なオーバーヘッドを嫌うC++なら、こういう制限も許される(むしろ歓迎される?)よね。

813 名前:デフォルトの名無しさん mailto:sage [2010/03/13(土) 19:38:24 ]
>>810
型変換については妥当な話だと思うし、 nil の不在は実装上の都合ではないだろうし、
何のことを言ってるの?

814 名前:デフォルトの名無しさん mailto:sage [2010/03/13(土) 21:11:09 ]
void Test(int *array) {
// ごにょごにょ(配列の長さについては考えないとする)
}

みたいな関数があったとき、
int array[3] = {0,0,0};
Test(array);
はコンパイルできるのに、
Test({0,0,0});
はコンパイルできない。
配列に付ける名前が不足しちゃうのでなんとか名前を付けずにやりたいんだけど、
良い手段ない?
それともなんでもいいからとりあえず名前を付けざるを得ないんだろうか。

815 名前:デフォルトの名無しさん mailto:sage [2010/03/13(土) 21:18:13 ]
名前付けないと可読性下がりそう



816 名前:デフォルトの名無しさん mailto:sage [2010/03/13(土) 21:21:19 ]
>>814
C++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});
}

817 名前:デフォルトの名無しさん mailto:sage [2010/03/13(土) 21:26:22 ]
可変長引数マクロ関数使えるのか

818 名前:デフォルトの名無しさん mailto:sage [2010/03/13(土) 21:26:36 ]
>>814
ヘルパー関数を使って、
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");
などの悪手しか思いつかない。

819 名前:デフォルトの名無しさん mailto:sage [2010/03/13(土) 21:26:59 ]
配列リテラルとかLL出身者っぽい要望だなぁ

820 名前:デフォルトの名無しさん mailto:sage [2010/03/13(土) 21:31:05 ]
>>816
レスありがとうございます。
> 名前が不足するというのがよくわからん
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__くっつける方法で行きたいと思います。ありがとうございました。

821 名前:デフォルトの名無しさん mailto:sage [2010/03/13(土) 21:31:50 ]
>>820
なんかTestの引数が全部array1になっちゃってますが、
2回目はarray2、3回目はarray3です・・・。

822 名前:デフォルトの名無しさん mailto:sage [2010/03/13(土) 21:36:44 ]
C99にはズバリの機能(複合リテラル)があるのだが、C++0xに入るとは聞いていない。
Test((int[]){0,0,0});

823 名前:デフォルトの名無しさん mailto:sage [2010/03/13(土) 21:37:24 ]
二次元配列にすればいいだけなんじゃない
int 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]);
}

824 名前:デフォルトの名無しさん mailto:sage [2010/03/13(土) 21:40:22 ]
>>822
std::initializer_listが入る

825 名前:814 mailto:sage [2010/03/13(土) 21:41:00 ]
>>823
>>820でちょこっと書きましたが、実際には配列のデータはもっとぐしゃぐしゃで、
必ずしも
arys[i][0]=0;
arys[i][1]=0;
arys[i][2]=i;
となるわけではないのです。
質問のために簡略化しているので・・・すみません。



826 名前:デフォルトの名無しさん mailto:sage [2010/03/13(土) 21:44:44 ]
それなら読み込めばいいんでは?
int arys[100][3];
for(int i=0;i<100;++i){
cin >> arys[i][0] >> arys[i][1] >> arys[i][2];
test(arys[i]);
}
これは標準入力だけど、別にファイルからでもいいし

827 名前:814 mailto:sage [2010/03/13(土) 21:50:09 ]
>>826
そうした方がいいでしょうかね・・・大量のデータをソースコードにべた書きするのは
よくないかなぁと思ったんですが、
データをあまり見られたくないんですよ。
それで、別ファイルにするよりはソースコードに埋め込んだほうがどちらかというと
見られにくいかなぁと思ったので。
別にソースに埋め込んでも見ようとすれば見れるのでなんてことはないんですが。

828 名前:デフォルトの名無しさん mailto:sage [2010/03/13(土) 21:54:44 ]
慣れたLLでコードジェネレートしればいいじゃない

829 名前:814 mailto:sage [2010/03/13(土) 21:57:51 ]
>>828
なるほど、考えてみます。ありがとうございます。

830 名前:デフォルトの名無しさん mailto:sage [2010/03/13(土) 21:58:14 ]
>>827
__VA_ARGS__ は使えんのか? >>816 にあるやつ。

831 名前:814 mailto:sage [2010/03/13(土) 22:02:11 ]
>>830
Visual C++ 2008なので使えると思います。
考えてみます。

832 名前:デフォルトの名無しさん mailto:sage [2010/03/13(土) 22:04:48 ]
>>820
int *arrays[] = {
{ 0,0,0 },
{ 0,0,1 },
{ 0,0,2 }
};

みたいなのじゃダメなの?
argv と同じやりかた。


833 名前:デフォルトの名無しさん mailto:sage [2010/03/13(土) 22:07:18 ]
>>832 コンパイルしてみてから言おうな。

834 名前:デフォルトの名無しさん mailto:sage [2010/03/13(土) 22:14:19 ]
めんどくせw


835 名前:デフォルトの名無しさん mailto:sage [2010/03/13(土) 22:19:38 ]
>>816
__LINE__とくっつけたとして、どうやって参照するの?同じ行が前提?



836 名前:デフォルトの名無しさん mailto:sage [2010/03/13(土) 22:50:27 ]
>>835
同じ行に書くか、ひとつのマクロ内であれば問題なく使えるでしょ。

この場合は単にスコープ分けるだけでも済みそうだし、
__VA_ARGS__ が使えるなら >816 のやつがいいと思う。

837 名前:デフォルトの名無しさん mailto:sage [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]);

こんな感じに書くのが基本に忠実な答え
まずはデータ形式から見直そう

838 名前:デフォルトの名無しさん mailto:sage [2010/03/13(土) 23:08:15 ]
>>837
int の配列って言ってるだろ。十分なデータ構造じゃないか。
規則性がなくてぐしゃぐしゃなのは配列の中の値だろ。

839 名前:デフォルトの名無しさん mailto:sage [2010/03/13(土) 23:20:29 ]
(データ長+データ実体)*nを1次元配列で持つとか

840 名前:デフォルトの名無しさん mailto:sage [2010/03/13(土) 23:24:19 ]
質問のために簡略化してるって構造のことじゃなくて値のことだったのか?
だったら二次元配列を使おう、でおしまいだね。いったい何を悩んでるんだろう

841 名前:814 mailto:sage [2010/03/13(土) 23:52:42 ]
Visual C++ 2008ってC99は未だっぽいようです・・・
つまり複合リテラル>>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などの値と離れて記述する
ことになります。できればインスタンス毎にまとめておきたいのですが・・・

842 名前:デフォルトの名無しさん mailto:sage [2010/03/14(日) 00:07:58 ]
実際にどう記述してるのか分からん

843 名前:814 mailto:sage [2010/03/14(日) 00:09:58 ]
一応締切?とさせていただきます。
レスを頂いた皆さま、大変参考になりました。ありがとうございました。

844 名前:デフォルトの名無しさん mailto:sage [2010/03/14(日) 00:14:23 ]
>>841
じゃあ

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}}
};

では?

845 名前:814 mailto:sage [2010/03/14(日) 00:24:12 ]
>>844
メンバ変数のうち、Id、Name、Hp_max、Attack、Speedは親クラスから継承しているメンバなのです。
親クラスが存在するクラスではそういう書き方はできなかったかと・・・



846 名前:844 mailto:sage [2010/03/14(日) 00:28:37 ]
>>845
初期化用データの格納用に >>844 の X のような構造体を定義すれば
初期化データをすっきり記述できるんじゃないかってこと

847 名前:デフォルトの名無しさん mailto:sage [2010/03/14(日) 00:28:58 ]
データ部分は関係ないだろ

848 名前:デフォルトの名無しさん mailto:sage [2010/03/14(日) 00:30:13 ]
>>827
どれくらい見られたくないのかにもよるけど、別ファイルにしてスクランブルかけた方が見られにくいよ

849 名前:デフォルトの名無しさん mailto:sage [2010/03/14(日) 00:35:39 ]
>>841
ひでぇ。最初っからそう聞けよ。 >814 みたいにしたせいで無駄なレスがあんなに。

850 名前:デフォルトの名無しさん mailto:sage [2010/03/14(日) 00:35:49 ]
コンストラクタを一つ増やせってことじゃない?

851 名前:デフォルトの名無しさん mailto:sage [2010/03/14(日) 00:37:51 ]
>>845
CTest::CTest(const X &init) : m_id(init.id), ・・・
{
}

852 名前:814 mailto:sage [2010/03/14(日) 00:38:12 ]
>>849
すみません。私の聞き方が悪かったせいで、これ以上続けても私が質問したいことを上手く書けるか分かりませんので、
これで終わりにさせてください。
乱暴なようで申し訳ないのですが、以後レスは致しません。

853 名前:デフォルトの名無しさん mailto:sage [2010/03/14(日) 00:38:22 ]
warota

854 名前:デフォルトの名無しさん [2010/03/14(日) 00:39:42 ]
                 ┌─┐
                 |も.|
                 |う |
                 │来│
                 │ね│
                 │え .|
                 │よ .|
      バカ    ゴルァ  │ !!.│
                 └─┤    プンプン
    ヽ(`Д´)ノ ヽ(`Д´)ノ  (`Д´)ノ    ( `Д)
    | ̄ ̄ ̄|─| ̄ ̄ ̄|─| ̄ ̄ ̄|─□( ヽ┐U
〜 〜  ̄◎ ̄  . ̄◎ ̄   ̄◎ ̄   ◎−>┘◎

855 名前:デフォルトの名無しさん mailto:sage [2010/03/14(日) 00:41:22 ]
gccのC99拡張機能を有り難がって使ってんじゃねーぞ
聞く方が混乱するだけだ



856 名前:デフォルトの名無しさん mailto:sage [2010/03/14(日) 00:42:56 ]
えっ

857 名前:デフォルトの名無しさん mailto:sage [2010/03/14(日) 01:15:29 ]
template <int num_of_args> class hoge
{
void operator () (int a1, int a2, ...);
};

num_of_argsに対応してoperator ()の引数の数を変動させたいのですが、特殊化をジェネレートするほかにいい方法は無いですかね?

858 名前:デフォルトの名無しさん mailto:sage [2010/03/14(日) 01:22:48 ]
>>857
「ジェネレート」がコンパイル以外のプロセスを指しているのなら、 Boost.Preprocessor が
いくらかマシな手段となるかもしれない。

859 名前:デフォルトの名無しさん mailto:sage [2010/03/14(日) 01:23:52 ]
>>857
これじゃダメっすか

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); }
};

860 名前:デフォルトの名無しさん mailto:sage [2010/03/14(日) 01:26:06 ]
>>857
C++0xを、首を長くして待て。

861 名前:デフォルトの名無しさん mailto:sage [2010/03/14(日) 01:28:23 ]
きりんさんになっちゃいそうです><

862 名前:デフォルトの名無しさん mailto:sage [2010/03/14(日) 01:38:21 ]
>>857
num_of_argsが要らなくない?無いほうがすっきりしないか?

863 名前:デフォルトの名無しさん mailto:sage [2010/03/14(日) 01:55:12 ]
俺もそう思う。
どうせ特殊化で生成するなら、オーバーロードでいいんじゃね?

864 名前:デフォルトの名無しさん mailto:sage [2010/03/14(日) 02:07:19 ]
>>858
boostはよく知らないんですが後でちょっと探ってきます

>>589
これは面白いですね
コード生成は避けられんませんが、ちょっとシンプルになりました

>>860
待ちきれません

>>862,863
array<3> a(10, 15, 20);
a(1, 5, 3) = 100;
こんな感じで使おうと思ってるんで、num_of_argsは欲しいです

865 名前:デフォルトの名無しさん mailto:sage [2010/03/14(日) 02:10:31 ]
俺も要らないと思うわ



866 名前:デフォルトの名無しさん mailto:sage [2010/03/14(日) 02:13:28 ]
なぜ[a,b,c]という演算子がないのかっていう有意義な疑問に帰着するわけね。


867 名前:デフォルトの名無しさん mailto:sage [2010/03/14(日) 02:14:53 ]
>>866
x[Index(a, b, c)] で代用できるから

868 名前:デフォルトの名無しさん mailto:sage [2010/03/14(日) 02:27:47 ]
1次元の配列が作れる。n次元の配列に[a]演算子を適用するとn+1次元の配列が作れるならば、数学的帰納法で無限の次元の配列が作れることが証明できる。
早い話がvector<vector<vector<int>>>だね。

869 名前:デフォルトの名無しさん mailto:sage [2010/03/14(日) 02:39:36 ]
>>860
g++ 4.4ではもう使える。

870 名前:デフォルトの名無しさん mailto:sage [2010/03/14(日) 02:40:37 ]
ここ数日の質問って何をしたいのか見えてこないのが多いな

871 名前:デフォルトの名無しさん mailto:sage [2010/03/14(日) 03:10:09 ]
c++の文法書ってありますか?
書店に行ってもプログラミングの入門書ばかりで
言語仕様の解説書が見つからなくて困ってる

組み込みやる事になってgcc、GNUARM使う事になったんだが
文法がまるで分からん(K&R〜ANSIの頃のCは随分使ったんだが)

872 名前:デフォルトの名無しさん mailto:sage [2010/03/14(日) 03:11:27 ]
仕様書読めばいいじゃない

873 名前:デフォルトの名無しさん mailto:sage [2010/03/14(日) 03:13:49 ]
>>871
JIS規格ならJISのサイトや取り扱ってる書店で発注すれば購入できたり無料で見たりできるお!!!!!!

874 名前:デフォルトの名無しさん mailto:sage [2010/03/14(日) 03:16:24 ]
>>871 ja.lmgtfy.com/?q=C%2B%2B

875 名前:デフォルトの名無しさん mailto:sage [2010/03/14(日) 03:19:23 ]
文法がまるでわからないのなら
むしろ入門書のほうがいいんじゃないのかw
ってか組み込みならそんなに難しい文法の知識いらないし、
むしろ環境構築の方が面倒な気がするけどね



876 名前:デフォルトの名無しさん mailto:sage [2010/03/14(日) 03:22:54 ]
>>871
単にCの延長でいいなら入門書読めば事足りるはず。
C++らしいコードが書きたいなら
Effective C++とかMore Effective C++でも読んどけば?という感じ。
厳密な文法が知りたければISO/IEC 14882:2003が言語仕様書ということになってるが、
これを読んで特定の目的を達成するコードが書けるとは思えんなあ。

877 名前:デフォルトの名無しさん mailto:sage [2010/03/14(日) 03:26:22 ]
まぁ気持ちは分かる
入門書だとオペレーターオーバーロードとかnamespaceとかそんなん吹き飛ばして
いきなりstd::coutとか使い出すし

878 名前:デフォルトの名無しさん mailto:sage [2010/03/14(日) 03:30:29 ]
>>877
しかも、その場合、ADLまで絡んでくるしな。

879 名前:デフォルトの名無しさん mailto:sage [2010/03/14(日) 03:34:03 ]
俺も昔厳密な仕様が知りたいけど
仕様書とかダルイっていう舐めた態度の時にこの本買った
www.hir-net.com/book/book14/index.html
>>877
な感じで詰まってるなら入門書と並行してこういう本買ってもいいかもね
最近は色々種類あるだろうし翻訳物もあるだろうから本屋行って選ぶよろし

880 名前:デフォルトの名無しさん mailto:sage [2010/03/14(日) 04:04:01 ]
組み込みなら組み込みのスレで尋ねた方がいいと思うぜ
C++の一般論が必ずしも当てはまるとは限らんから

881 名前:デフォルトの名無しさん mailto:sage [2010/03/14(日) 12:59:49 ]
>>871
組み込みなら C 使えよ。
お前みたいなのが C++ 使うとバグが増える。

とりあえずヘッダ自動生成とかのツール類で
勉強してからにしろ。


882 名前:デフォルトの名無しさん mailto:sage [2010/03/14(日) 13:03:01 ]
デストラクタもないCにいわれてもな


883 名前:デフォルトの名無しさん mailto:sage [2010/03/14(日) 13:06:49 ]
>>881
> とりあえずヘッダ自動生成とかのツール類で
> 勉強してからにしろ。
何を言っているんだw

884 名前:デフォルトの名無しさん mailto:sage [2010/03/14(日) 13:13:53 ]
というか、強い静的型付けもないCなんかで書いたら、誰でもバグが増えるわ。

885 名前:デフォルトの名無しさん mailto:sage [2010/03/14(日) 13:58:08 ]
>>882-884
組み込みは製品になるとスタックダンプとレジスタぐらいしか
なくてアセンブラだけで解析すんの大変なんだぜ。

お前らみたいな糞コードのバグ解析がこっちに
回ってきて迷惑なんだよ。




886 名前:デフォルトの名無しさん mailto:sage [2010/03/14(日) 14:04:43 ]
そういうクソを調教するためにMISRA-Cとかがあります

887 名前:デフォルトの名無しさん mailto:sage [2010/03/14(日) 14:29:06 ]
>>885
組み込みつったって規模があるだろう
それこそメモリが数kbしかないものもあれば、OSが載っているようなシステムだってある
少し極論じゃないのか

888 名前:デフォルトの名無しさん mailto:sage [2010/03/14(日) 14:40:51 ]
Cでバグが減る根拠を挙げてもらおうか

889 名前:デフォルトの名無しさん mailto:sage [2010/03/14(日) 14:46:53 ]
誰もそんな事言ってないから

890 名前:デフォルトの名無しさん [2010/03/14(日) 18:41:27 ]
 template<typename T>
 void 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);の一方だけが必ず実行され
他方は必ず実行されないことになります。

こういった場合は、テンプレートメタプログラミングを使って
一方だけのコードが実行バイナリファイルに含まれるようにすべきなのでしょうか。
それともコンパイラの最適化を期待して上記のコードのままでも良いのでしょうか。

よろしくお願い申し上げます。



891 名前:デフォルトの名無しさん mailto:sage [2010/03/14(日) 19:09:38 ]
コンパイラの機嫌しだい

892 名前:デフォルトの名無しさん mailto:sage [2010/03/14(日) 19:10:12 ]
>>890
最適化に期待すれば十分だと思うよ。
実測してその部分がパフォーマンスに影響することが分かってから改良しても遅くないよ。

893 名前:デフォルトの名無しさん mailto:sage [2010/03/14(日) 19:20:20 ]
そういう場合テンプレートメタプログラミングを理解できないコンパイラだったら
困る・・・か?そんなバカコンパイラは想定しない方が良いか。



894 名前:デフォルトの名無しさん mailto:sage [2010/03/14(日) 19:20:28 ]
struct when_true{ inline static void func(arg_t); }; struct when_false { (ry };
if_<flag, when_true, when_false>::type::func(arg);

確実性を考えると↑のように関数化しないといけない
結局のところオーバーヘッドは避けられないからif elseのままでいいよ

895 名前:デフォルトの名無しさん mailto:sage [2010/03/14(日) 19:25:09 ]
たとえば、
template<bool N>
void func();
でN値による特殊化なんかできるのかな



896 名前:デフォルトの名無しさん mailto:sage [2010/03/14(日) 19:32:55 ]
こんなので切り替えれられるとおも浮けど、わざわざ属性を示すクラスが下からあればいいけど、わざわざ作るなら、ifのほうが分りやすいかもな。
class 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);
}


897 名前:デフォルトの名無しさん mailto:sage [2010/03/14(日) 20:07:40 ]
if文の削除なんてあまりにも可読性が低くなってる場合しかオレはやらないな
速度やコードサイズの最適化なんてたかがしれてるだろ

>>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だけで
他にクラスや関数を用意する必要はないはず

まあこんなことしなきゃならないほどカツカツなら
他に検討すべき箇所があるんじゃないのかね

898 名前:デフォルトの名無しさん mailto:sage [2010/03/14(日) 20:08:46 ]
>>895
できるっしょ。
 template<bool b>
 void func(){〜};
 template<>
 void func<true>(〜);

これでおkでは?


899 名前:デフォルトの名無しさん mailto:sage [2010/03/14(日) 20:44:03 ]
もう面倒だからboolじゃなくて関数ポインタででも持たせとけよ。

900 名前:デフォルトの名無しさん mailto:sage [2010/03/14(日) 20:50:27 ]
関数ポインタは最適化の障害で(ry


901 名前:デフォルトの名無しさん mailto:sage [2010/03/14(日) 20:55:24 ]
コストとコードサイズ小さくしたいのにカンポはねーよ・・・

902 名前:デフォルトの名無しさん mailto:sage [2010/03/14(日) 20:57:24 ]
結局ifelse書いて最適化に期待するのに落ち着きそうだな
関数化するまでも無い分岐の場合は特にそうだろう

903 名前:デフォルトの名無しさん mailto:sage [2010/03/14(日) 20:59:40 ]
この状況で関数ポインタ持たせたら
逆効果じゃねぇかwwwww


904 名前:デフォルトの名無しさん mailto:sage [2010/03/14(日) 21:00:55 ]
コンパイル時に定まるif elseで絶対に実行されないことが
分かる場合、それでも最適化できないバカコンパイラって
知っている?

それを最適化できないとなるともっと重大な所でも
最適化できなさそうな気がするが。


905 名前:デフォルトの名無しさん mailto:sage [2010/03/14(日) 21:19:48 ]
codepad.org/3HNtsPNZ
なんでこれが期待どおりに動いてるのかよく分からない



906 名前:デフォルトの名無しさん mailto:sage [2010/03/14(日) 21:47:54 ]
Conceptさん・・・Conceptさんを呼べ!!


907 名前:デフォルトの名無しさん mailto:sage [2010/03/14(日) 21:51:07 ]
templateの部分特殊化とSFINAE。
メンバT::swapが存在し、かつvoid (T::*)(T &)が&T::swapに置き換え可能ならば
(その場合のみ)has_swap_implの部分特殊化が選択される。

908 名前:デフォルトの名無しさん mailto:sage [2010/03/14(日) 21:55:48 ]
カードゲームの効果解説かと思った。

909 名前:デフォルトの名無しさん mailto:sage [2010/03/14(日) 22:40:36 ]
>>888
>>871 は C はそれなりに書けるようだが、
解説書見ながら C++ で書いてより高品質なソフトが
書ける理由がないだろ。

どうせ new[] したのを delete するようなコード
書いて地雷仕込むのがオチ。


910 名前:デフォルトの名無しさん mailto:sage [2010/03/14(日) 23:18:09 ]
>>905
まず、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 にすればいい)

911 名前:デフォルトの名無しさん mailto:sage [2010/03/14(日) 23:20:30 ]
っていうオーバーロード解決に至るまでの経過を出力してくれるコンパイラないかなぁ
特殊化とかADLとか絡んでついていけない時がままある

912 名前:デフォルトの名無しさん mailto:sage [2010/03/14(日) 23:25:19 ]
言い出しっぺの法則発動

913 名前:デフォルトの名無しさん mailto:sage [2010/03/14(日) 23:33:42 ]
あ、>>910間違えてた。
誤) ・void T::swap(T&)が存在しないならば、適合するhas_swap_helperは「存在しない」。
正) ・void T::swap(T&)が存在しないならば、has_swap_helperのテンプレート引数が確定しない。

914 名前:デフォルトの名無しさん mailto:sage [2010/03/14(日) 23:34:08 ]
#include <stdio.h>
#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;
}


915 名前:デフォルトの名無しさん mailto:sage [2010/03/14(日) 23:35:40 ]
アンカー消えた。
>>914>>852

これくらいしか思いつかん。




916 名前:デフォルトの名無しさん mailto:sage [2010/03/14(日) 23:57:05 ]
>>907,910
どうもありがとう、なんとなくわかってきた
なるべく特殊化が強いのを優先的にリストアップして最初に合致したやつを使うということですね

917 名前:デフォルトの名無しさん mailto:sage [2010/03/15(月) 00:03:50 ]
C++使ってちょうど2年半の者です。

テンプレートメタプログラミングって
とても難解そうで ほとんど学んでいないのですが、
例えば>>890さんの場合ですとどうすればいいことになるのでしょうか。

どなたかコードを(boost::mplのような出来合いのライブラリを
使用せずに)書いてくださいませんでしょうか。

よろしくお願いします。


918 名前:デフォルトの名無しさん mailto:sage [2010/03/15(月) 00:19:42 ]
>>917
最近、C++を勉強し始めたからテンプレートを勉強していないんだけど
こんな難しそうなのを「みんな出きるのか〜」とビビってたぜ

あぁ〜安心した

919 名前:デフォルトの名無しさん mailto:sage [2010/03/15(月) 00:24:32 ]
メタプロはライブラリ作者のためのものと言い切っても過言ではない
知ってても使う場面は実はそれほど多くない(なくても実装できることが多い)し
使える場面だとしてもすでにできの良いライブラリがあるからそっちを使うことになる

920 名前:デフォルトの名無しさん mailto:sage [2010/03/15(月) 00:24:39 ]
これは静的(コンパイル時)なのか動的(実行時)なのか
とかを意識すると多少理解が楽になる

921 名前:デフォルトの名無しさん mailto:sage [2010/03/15(月) 00:35:15 ]
>>917
boost::mplを使えるようになれば自然と覚えられるよ。


922 名前:デフォルトの名無しさん mailto:sage [2010/03/15(月) 01:13:45 ]
こういうこと言うと否定されるのかもしれないけど
TMPって出来合いのライブラリを使うプログラミングだと思う
自分でメタ関数やシーケンスをフル実装してる奴とかいるのかね

そういやTMPの本が出版されたんだっけ?

923 名前:デフォルトの名無しさん mailto:sage [2010/03/15(月) 01:19:46 ]
templateでメタプログラミングするのが嫌なら別の方法でメタプログラミングすればいいよ。
template使ってる人は型レベルとの相性が良い(というか型レベルそのものだ)から好きで使ってるだけ。

924 名前:デフォルトの名無しさん mailto:sage [2010/03/15(月) 05:19:50 ]
>>917
自信ないけどこんなんでどうか
ttp://codepad.org/jyhjFg0S

ところで、こういうのって、boolでやるのと
struct true_tag {};
struct false_tag {};
とかを定義してやるのと、どっちがいいんだろ?

925 名前:デフォルトの名無しさん mailto:sage [2010/03/15(月) 06:57:33 ]
>>917
これでいいっしょ。
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なんて必要性が感じられなければ無理に使うような物でもないと思うよ。
付け焼刃の知識では早々使えるコードが出てくることもない。
何に使えるのかわかってからでも使い始めるのは遅くない。
まずは既存のコードでどう使われているのか観察することだな。



926 名前:917 mailto:sage [2010/03/15(月) 10:53:59 ]
みなさんありがとうございます。

C++0xではテンプレートメタプログラミングをサポートするためだけにあるような
機能が増えると伺っておりましたので、そろそろ勉強し始めるときが
来たような気がしています。


927 名前:デフォルトの名無しさん mailto:sage [2010/03/15(月) 12:28:21 ]
>>922
そうだとおもう。テンプレートは作るのは地獄だけど、使うのは楽になるように作るように心がけてる。

関数テンプレートなんか型推論で殆ど型引数を書かなくてすむのに正しいコードが出るんだから、丁寧に作った関数テンプレートは使う側にとって大きなメリットがあると思う。

928 名前:デフォルトの名無しさん mailto:sage [2010/03/15(月) 13:17:19 ]
>>927
お前はテンプレートメタプログラミングってなんだか理解しているのか?

> 関数テンプレートなんか型推論で殆ど型引数を書かなくてすむのに
> 正しいコードが出るんだから、丁寧に作った関数テンプレートは
> 使う側にとって大きなメリットがあると思う。
>>922もみんなもテンプレートメタプログラミングの話をしているんだけど。。。


929 名前:928 mailto:sage [2010/03/15(月) 13:18:35 ]
ああ、分かった。

>>927はTMPがTeMPlateの略だと思ってた訳か。
これで文脈が繋がった。


930 名前:デフォルトの名無しさん mailto:sage [2010/03/15(月) 15:19:03 ]
ネットの画像のURLから隠しフォルダ「Temporary Internet Files\Content.IE5」以下に検索をかけてファイルを見つけようとしています。
ファイルは見つかるんですが、a.com/aa.jpgからだとファイル名はaa[1].jpgになっています。

zzzzzz.com/aa.jpg とではファイル名の区別がつきません。Temporary Internet Filesのファイルをプロパディで
見るとURLの情報が解るのですが、この情報を参照できるような関数や方法ってありませんか?

931 名前:デフォルトの名無しさん mailto:sage [2010/03/15(月) 17:08:24 ]
環境依存OKなスレで聞きなよ

932 名前:930 mailto:sage [2010/03/15(月) 17:21:02 ]
>>931
もしかして自分だけですかね?Temporary Internet Filesの特性かと思っていました。

933 名前:デフォルトの名無しさん mailto:sage [2010/03/15(月) 17:31:05 ]
それで?C++という言語の何を訊きたいの?

934 名前:デフォルトの名無しさん mailto:sage [2010/03/15(月) 17:35:21 ]
return static_cast<931::環境依存>(930の悩み); //invalid static_cast form type "932.オレだけ?" to type "世界平和"

935 名前:930 mailto:sage [2010/03/15(月) 17:52:06 ]
C++で作って詰まって短絡的に聞いてしまいました、すみません。
D:\Temporary Internet Files\Content.IE5を見たところindex.datがあるので、ここでファイルとアドレスを関連付けて
\Temporary Internet Filesに表示させてる? datをC++で読み込んで目当てのファイルを見つけることは可能でしょうか?




936 名前:デフォルトの名無しさん mailto:sage [2010/03/15(月) 18:01:30 ]
     _,,_
     /´o ヽ
   ,.ィゝ     l   
    ̄ヽ     l
       l     ヽ___
     /  ,,...---`ニニニ==、,,__
     l  / ヽ ヽ ヽ ヽ ヽ ヽ ヽ l三三三>
      |  iヽ ヽ ヽ ヽ ヽ ヽ ヽ/三三/''ー- 、
     ヽ. ヽ、ヽ ヽ ヽ ヽ ヽ.∠三=‐''´>‐--‐'
       ヽ、`'''ー‐---‐'''´_,,...--‐'''´
         `''ーッ--t_,r'''´
        _/._/

937 名前:デフォルトの名無しさん mailto:sage [2010/03/15(月) 18:33:35 ]
>>935
そうでなくて、Windowsという環境依存なプログラムについては「環境依存OKなスレで聞きなよ」ってことでしょ

938 名前:デフォルトの名無しさん mailto:sage [2010/03/15(月) 18:56:25 ]
>>930

【初心者歓迎】C/C++室 Ver.71【環境依存OK】
pc12.2ch.net/test/read.cgi/tech/1264774545/l50


939 名前:930 mailto:sage [2010/03/15(月) 19:00:08 ]
スレチですね。見当違いですみません…

940 名前:デフォルトの名無しさん mailto:sage [2010/03/15(月) 20:13:17 ]
>>925
二つ目のfoo_impl()はコンパイルエラー起こすだろ
関数テンプレートで部分的特殊化は無理

941 名前:デフォルトの名無しさん mailto:sage [2010/03/15(月) 21:25:05 ]
STLのvecterの配列に対してクイックソートを組んだんですが動きません

ソース : codepad.org/YM2RidkL
47、48行目の再帰処理のあたりが原因だと思うのですが、誰か助けてください

942 名前:デフォルトの名無しさん mailto:sage [2010/03/15(月) 21:55:20 ]
勘だけど 43、44行目あたりかな

943 名前:デフォルトの名無しさん mailto:sage [2010/03/15(月) 22:01:47 ]
見た感じだと44行目か36行目のどっちかだな

944 名前:デフォルトの名無しさん mailto:sage [2010/03/15(月) 22:10:03 ]
見てないけど44行目かな

945 名前:デフォルトの名無しさん mailto:sage [2010/03/15(月) 22:14:34 ]
どうみても44が--



946 名前:デフォルトの名無しさん mailto:sage [2010/03/15(月) 22:45:42 ]
>>944
> 見てないけど
おいw


947 名前:デフォルトの名無しさん mailto:sage [2010/03/15(月) 23:16:01 ]
>>871です
>>876
ありがとうございます、一番参考になりました
近日中に都会に出かけるのでwあったら立ち読み&購入検討してきます

何度かパーサを書く仕事をしたので、どうしてもライブラリより構文に目が行ってしまいます
最近はそういうの流行らないみたいですね

もはやIBM流の構文チャート?やBNFで定義できるような言語じゃないとは
噂で聞いてはおりますが…

948 名前:デフォルトの名無しさん mailto:sage [2010/03/16(火) 00:23:47 ]
>>941
添え字10のアクセス違反って出てるじゃん
m_array[9]に値入れた後にjをインクリメントしてるんだろ

>>947は組み込み自体やった事なさそうな感じ

949 名前:デフォルトの名無しさん mailto:sage [2010/03/16(火) 02:36:50 ]
class hoge
{
const fuga &f;
public:
hoge() : f(fuga_sub())
{
}
};

const参照はテンポラリオブジェクトを束縛すると聞いたんですが、↑のようにするとバグります。なぜなんでしょうか?

950 名前:デフォルトの名無しさん mailto:sage [2010/03/16(火) 02:37:50 ]
fはhogeのコンストラクタスコープでしか生きてないインスタンスをさしてるから

951 名前:デフォルトの名無しさん mailto:sage [2010/03/16(火) 05:58:00 ]
>>948
ええ、組み込みは初めてです
使ってもいいライブラリはサンプル等あるんで問題ないんですが
コンストラクタの初期化リストなんて初めて見ました

トッパンのC++の本なら昔買いましたが、今更役に立ちませんよねw

952 名前:デフォルトの名無しさん mailto:sage [2010/03/16(火) 07:58:42 ]
>>949
初期化リストで使った場合、コンストラクタの終わりまでしか延命されない。
規格の 12.2 p5 より。
> ... A temporary bound to a reference member in a constructor's ctor-initializer
> persists until the constructor exits. ...

その特別ルールが役に立つのはほぼ自動変数だけ。






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

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

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