■過去ログ置き場に戻る■ 1- 前250 次250 最新50


[memo] "9999999999_00.html#R20" という感じで、URLの最後に "#RレスNo" を追加すると幸せになれます。

C++相談室 part49
751 名前:デフォルトの名無しさん :2006/05/21(日) 23:12:36
>>749
後半はまったく意味を成していない件について

752 名前:デフォルトの名無しさん :2006/05/22(月) 00:03:39
こんなことはできない?
template<typename T> type
{
  typedef T type;
};

template<typename T>
inline type<void (*)(T)>::type select_f {return f;}

753 名前:デフォルトの名無しさん :2006/05/22(月) 00:22:44
>>752
できるだろうな。そのままじゃコンパイルできないけど。

754 名前:デフォルトの名無しさん :2006/05/22(月) 01:18:59
struct つければいいだけか。いいね。

755 名前:デフォルトの名無しさん :2006/05/22(月) 01:21:54
うんにゃ typename も要る

756 名前:デフォルトの名無しさん :2006/05/22(月) 01:27:56
ああ、そうか。そうだな。

757 名前:デフォルトの名無しさん :2006/05/22(月) 01:53:08
template <typename T>
struct identity
{
  typedef T type ;
} ;


template <typename T>
inline
identity<void (*)(T)>::typename
  type select_f()
{
  return f ;
}


VC7.1ではコンパイルが通らない。
何かおかしいのかな。

758 名前:デフォルトの名無しさん :2006/05/22(月) 02:00:18
typename identity<void (*)(T)>::type select_f()

だろ?
VC7.1で試してはいないが。

759 名前:757 :2006/05/22(月) 02:04:37
そうだったOrz

760 名前:757 :2006/05/22(月) 02:07:32
template <typename T>
struct make_type
{
  typedef void (*type)(T) ;
} ;

template <typename T>
inline
typename make_type<T>::type
  make_f()
{
  return &f ;
}

こうしたほうがわかりやすいかな。

761 名前:デフォルトの名無しさん :2006/05/22(月) 02:17:08
>>760
return &f;←このfはどこから?

762 名前:デフォルトの名無しさん :2006/05/22(月) 02:20:07
>>761 >>704,729 から

763 名前:デフォルトの名無しさん :2006/05/22(月) 06:21:18
>>750
ここで喧嘩売るあんたこそ一番の荒らしだよ

764 名前:デフォルトの名無しさん :2006/05/22(月) 06:24:15
売ってもいない喧嘩を売ってると言い張るパターンは、
あらゆる難癖の中でも「自分がキレイなつもりでいる」分悪質だな。

765 名前:デフォルトの名無しさん :2006/05/22(月) 06:26:44
と、メール欄で罵倒しておいて喧嘩売るつもりじゃなかったと言い張る腑抜けが申しております

766 名前:デフォルトの名無しさん :2006/05/22(月) 06:27:12
そんなにここで暴れたいか

767 名前:デフォルトの名無しさん :2006/05/22(月) 06:31:50
template<class T>
void f(T);

template<>void f<int>(int){....}
template<>void f<float>(float){...}


768 名前:デフォルトの名無しさん :2006/05/22(月) 07:08:37
>>765
ほら、喧嘩したいのは他ならぬ自分なのが丸わかり。

769 名前:デフォルトの名無しさん :2006/05/22(月) 07:10:30
整合性が2ターン保たない人ってたまにいるんだよね :-)

770 名前:デフォルトの名無しさん :2006/05/22(月) 11:24:04
>>704 の場合、f は g に対する visitor なので、
そのまま visitor として実装すればいいだけだろうと思うが。
function_traits でいちいち型を調べる必要も無い。

// STL のアルゴリズムに渡すためには、
// result_type を定義しないといけないので、
// とりあえず static_visitor から派生させておく
struct fx : public ::boost::static_visitor<void> {
 template< typename T > void operator()( T val ) const {
  // すでにある関数 f の呼び出し
  f( val );
 }
};

g(fx());



771 名前:デフォルトの名無しさん :2006/05/22(月) 11:44:35
>>770 それって >>724 と同じことだよね?

772 名前:デフォルトの名無しさん :2006/05/22(月) 20:54:20
>>768
あんたが煽る限りいくらでもやり返すぜ
最後まで何か言う気なら結果は1つだ

773 名前:デフォルトの名無しさん :2006/05/22(月) 21:36:52
std::auto_ptr<ChanStatus> TChanStatusPtr;
この様に宣言されているスマートポインタをノーマルポインタに宣言し直すにはどうのようにすればいいのでしょうか?



774 名前:デフォルトの名無しさん :2006/05/22(月) 21:39:22
ChanStatus *TChanStatusPtr;
じゃないの?

775 名前:デフォルトの名無しさん :2006/05/22(月) 22:06:06
>>774
即レス感謝です。ありがとうございました

776 名前:デフォルトの名無しさん :2006/05/22(月) 23:35:57
>>772
ほんとに血の気が多いね。頭が悪いのに。
あ、ズバリ書くとまた煽られちゃうかもー(コワイコワイ

777 名前:デフォルトの名無しさん :2006/05/23(火) 21:55:45
本当に他所でやってくれよ
質問しづらいだろ

778 名前:デフォルトの名無しさん :2006/05/24(水) 00:29:06
ある本のC++のサンプルを見ていたら、
{
if(なんちゃら)
if(なんちゃら)
if(なんちゃら)
}
ってあったんだけど、
{
}
↑これなに?
カッコだけでくくると何か特別な意味あるのかな?
ただ、見やすくするため?

779 名前:デフォルトの名無しさん :2006/05/24(水) 00:37:55
>>778
それだけ見るとあんまり意味は無い。
変数の定義があれば、スコープがひとつできることになる。

780 名前:デフォルトの名無しさん :2006/05/24(水) 00:56:22
変数なくてもスコープになるんじゃないの?
意味ないのは変わりないと思うけど。

781 名前:デフォルトの名無しさん :2006/05/24(水) 01:01:47
変数なくてスコープという意味が分からん。

782 名前:779 :2006/05/24(水) 01:05:49
>>780
あーそうだな。書き直そう。
- 変数の定義があれば、スコープがひとつできることになる。
+ スコープがひとつできるので、変数の定義があれば何か意味があるかも。

783 名前:デフォルトの名無しさん :2006/05/24(水) 01:09:55
スコープとは変数に対して使うもんだと思っていた
ブロックの事を言っている?

784 名前:782 :2006/05/24(水) 01:16:31
>>783
今確認した。そのとおりだ。

785 名前:779 :2006/05/24(水) 01:30:04
>>783 などをふまえて、さらに書き直そう。
- 変数の定義があれば、スコープがひとつできることになる。
+ ブロックができるので、変数などの宣言があればそこでスコープが切れることになる。

786 名前:デフォルトの名無しさん :2006/05/24(水) 01:46:04
中で何も変数は宣言していない。
ただ
if(ほにゃらら) return FALSE;
が3列ならんでるだけですね。
見やすくするだけなのか?あまり意味はなさそうですね。

787 名前:デフォルトの名無しさん :2006/05/24(水) 01:57:54
while()

}
とかだったりしてな。

788 名前:デフォルトの名無しさん :2006/05/24(水) 04:07:24
説明のために一部分切り出したとか、誤植で1行目だけ飛んでるとかもありそう。
正直、778のレス内容だけでは何とも言いがたい。

789 名前:デフォルトの名無しさん :2006/05/24(水) 07:29:49
{
if(なんちゃら) { T x = XXX; …
if(なんちゃら)
if(なんちゃら)
}

ってのがあれば、デストラクタ呼び出しが}で行われる。Cとの違い。


790 名前:デフォルトの名無しさん :2006/05/24(水) 08:53:38
>>789
その例だと外側のBracesは要らない。
無い知恵絞った積もりなのだろうけど、その点に関してはCと違わない。

791 名前:デフォルトの名無しさん :2006/05/24(水) 13:41:38
そんな深い理由じゃなくて、>>787 の言うとおり、

if( どーたら )
{
 if(なんちゃら)
 ...
}

とあったのが、何らかの理由で「if( どーたら )」
だけ削ったんじゃねーの?

792 名前:デフォルトの名無しさん :2006/05/24(水) 14:57:21
>>790
>無い知恵絞った積もりなのだろうけど
やめろってば

793 名前:デフォルトの名無しさん :2006/05/24(水) 14:58:35
>>789
> {
> if(なんちゃら) T x = XXX;

だとどうなの?


794 名前:デフォルトの名無しさん :2006/05/24(水) 16:06:29
>>793
Cだと(C99でも)エラー。
C++だとスコープがif () の後の一文に限定される。
#だったと思う。

795 名前:デフォルトの名無しさん :2006/05/24(水) 16:28:09
for (int i = 0; i < N; i++) {
  …
}
のiのscopeは結局どうなったの?

if (i == N) { // not found

はまずい仕様になった?

796 名前:デフォルトの名無しさん :2006/05/24(水) 16:30:27
for (int i = 0; i < N; i++) {
  //iはここで使える。
}
//VC6のような腐ったコンパイラだと、何故かここで使える。

797 名前:デフォルトの名無しさん :2006/05/24(水) 16:58:26
VC6を叩いて優越感にひたる奴が急に増えたな
時代背景も知らずに

798 名前:デフォルトの名無しさん :2006/05/24(水) 17:01:26
>>797
時代背景→歴史的経緯


799 名前:デフォルトの名無しさん :2006/05/24(水) 17:06:58
>>798
どっちでもいいがなw

800 名前:デフォルトの名無しさん :2006/05/24(水) 17:08:55
>>797
知ってても今となっては(今さら使うなら)腐ってるといえる
でもまあ今VC6を使ってるとかいう話なわけでもないのに
唐突にVC6のことを書くのは余分だな
VCとしては7以降でちゃんとその後の規格に合わせて対応してるし

>>795
規格としては >>796 でいうVC6で採用されていたスコープルールとは
異なるものが採用された

801 名前:デフォルトの名無しさん :2006/05/25(木) 02:13:36
class A
{
bool F(){ delete this; retrun true; }
};
--
A *a = new A;
a->F();

これあり?

802 名前:デフォルトの名無しさん :2006/05/25(木) 02:24:35
>>801
古典的
ttp://www.parashift.com/c++-faq-lite/freestore-mgmt.html#faq-16.15

1.オブジェクトは100パーセント絶対確実にnewによって作られていなければならない。
new[]やPlacement newだとダメ。ローカル、静的なオブジェクトもNG

2.これ以降、そのオブジェクトは使えない。

3.delete thisをしたあとは、メンバ関数はそのオブジェクトに属するメンバを使ってはならない。

4.クラスの外部でも操作不可。



とりえず、100パーセント絶対確実に、自信を持って出来るならば、やればいいんじゃない。

803 名前:デフォルトの名無しさん :2006/05/25(木) 02:52:39
標準ライブラリでもfacetとか、標準から離れればIUnknownの実装なんかで、
delete this;は当たり前のように使われている。

804 名前:デフォルトの名無しさん :2006/05/25(木) 06:12:39
boost::intrusive_ptrなんか、我々がその辺を自前で用意するもんな。

805 名前:デフォルトの名無しさん :2006/05/25(木) 11:24:54
tr1::shared_ptrには削除子があるのに、何故auto_ptrにはそれがないのでしょうか?

806 名前:デフォルトの名無しさん :2006/05/25(木) 13:32:22

type_info::operator =
type_info::before
による型チェックを行ってるのですが、何故か照合できない型があります。
そして、別の型名なのに true になってしまう事もあります。

type_info による型チェックは信頼性が低いのでしょうか?


807 名前:デフォルトの名無しさん :2006/05/25(木) 13:44:43
>>806
問題を再現する最低限のソースを貼ってみましょ


808 名前:デフォルトの名無しさん :2006/05/25(木) 14:19:11
class FixObj : public Obj {
  contents...
};
class Block : public FixObj {
  contents...
};
class Step : public FixObj {
  contents...
};
こういうクラス構造で・・・

bool test (const type_info& TYPE, Obj* OBJ) {
  return typeid(OBJ) == TYPE || typeid(OBJ).before(TYPE);
}
こういう型判定メソッドがあり・・・

Obj* obj = new Block;
test(typeid(Block*), obj);
こうしても結果がfalseになってしまいます。
しかし、dynamic_cast<Block*>(obj)では、NULLになりません。
何故なんでしょうか?

ただ、Stepインスタンスはちゃんと照合できるのです。
環境はVisualC++です。何故なんでしょうか?
type_info による型照合は信頼性が低いのでしょうか?


809 名前:デフォルトの名無しさん :2006/05/25(木) 14:27:29
Objに仮想関数ないだろ

810 名前:デフォルトの名無しさん :2006/05/25(木) 14:37:37
ポインタ渡しによるスライシングが起きている。
参照渡しにすれば問題なし。

811 名前:デフォルトの名無しさん :2006/05/25(木) 15:18:36
>>810
おお、どうもです。しかし・・・・

bool test (const type_info& TYPE, Obj& OBJ) {
  return typeid(OBJ) == TYPE || typeid(OBJ).before(TYPE);
}
として、参照渡しにして
Obj* obj = new Block;
test(typeid(Block), *obj);

としたら、照合はされたのですが、今度は
typeid(Step)でもtrueになってしまいます・・・・
しかも、ポインタ型だとどんなものでもtypeid(string*)でも、trueに
なってしまうのです・・・・

内部で勝手に、何かが共有(スライシング)されてるのでしょうか?
もうイライラして死にそうです・・・

812 名前:デフォルトの名無しさん :2006/05/25(木) 15:28:30
>>811
うちはちゃんと動いてるようだけどなぁ
$ cat test.cpp && c++ -o test test.cpp && ./test
#include <iostream>
using namespace std;
struct Obj {virtual ~Obj () {}};
class FixObj : public Obj {};
class Block : public FixObj {};
class Step : public FixObj {};
bool test (const type_info& TYPE, const Obj& OBJ) {
// return typeid(OBJ) == TYPE || typeid(OBJ).before(TYPE);
return typeid(OBJ) == TYPE;
}
int main () {
{
Obj* obj = new Block;
cout << test(typeid(Block), *obj);
cout << test(typeid(Step), *obj);
}
{
Obj* obj = new Step;
cout << test(typeid(Block), *obj);
cout << test(typeid(Step), *obj);
}
cout << endl;
return 0;
}
1001


813 名前:デフォルトの名無しさん :2006/05/25(木) 16:30:03
>>812
すみません。説明不足でした・・・・

実際のプログラム中では、「Obj*」データはコレクションクラスに格納されており、
Objを仮想基本クラスにした様々なインターフェースを、それぞれが実装してるのです。

その格納庫の中から任意のインターフェースを実装してるObj*データを
随時取り出して処理を行わせる流れにしてるのですが、そのインターフェースの
型チェックで上記のtest関数が上手くいかないのです・・・・

コレクションから取り出したObj*は、dynamic_castだと正確に照合できますが
typidチェックだと照合できなかったり、他の型でもtrueになったりしてしまうのです・・・
もうどうすればいいのか・・・

814 名前:デフォルトの名無しさん :2006/05/25(木) 16:56:32
>>813
testに渡す前とtestの中で
type_info::nameを見てみれば?


815 名前:デフォルトの名無しさん :2006/05/25(木) 17:04:15
>>814
それが「class Block」となってるんです・・・・
しかし、そのObj*データは、ポインタ型だとどんなものであっても

typeid(obj) == typeid(string*) || typeid(obj).before(typeid(string*))

これで true になってしまうのです・・・・

816 名前:デフォルトの名無しさん :2006/05/25(木) 17:15:51
/GRオプションは?

817 名前:デフォルトの名無しさん :2006/05/25(木) 17:26:19
画面上にある図形を与えられた座標を中心に円運動させるにはどうしたらいいのか
どなたか知恵をかしてください。
ヒントは"三角関数をつかう"なんですけど...

式の立て方がわからないです

818 名前:デフォルトの名無しさん :2006/05/25(木) 17:29:21
/GRはつけてます・・・・
まとめると
Obj* pobj; として、それにBlockインスタンスを代入して

typeid(pobj)だと、その「Block*」との照合が false となり、
typeid(*pobj)だと、「Block」だけなく同じ仮想基本クラスを持つ型(Step)と、
更に全ポインタ型(string*)との照合でも true になってしまうのです・・・
何がなんだか・・・orz

819 名前:デフォルトの名無しさん :2006/05/25(木) 17:36:09
>>817
座標(cx, cy)を半径rで回るとすると
int i = 0;
while (true) {
  i = (i + 1) % 360;
double rad = (double) i * 3,14 / 180;
double x = cos(rad) * r;
double y = sin(rad) * r;
drawImage(cx + x, cy + y);
}

820 名前:デフォルトの名無しさん :2006/05/25(木) 17:39:19
>>818
これの出力をコピペしてみて(文章による報告じゃなくて)
#include <iostream>
using namespace std;
struct Obj {virtual ~Obj () {}};
class FixObj : public Obj {};
class Block : public FixObj {};
class Step : public FixObj {};
bool test (const type_info& TYPE, const Obj& OBJ) {
cout << typeid(OBJ).name () << ' ' << TYPE.name ()
<< ' ' << typeid (string *).name ()
<< ' ' << typeid (int *).name () << endl;
return typeid(OBJ) == TYPE;
}
int main () {
Obj* obj = new Block;
cout << typeid (*obj).name () << endl;
cout << typeid (Obj).name () << ' ' << typeid (Block).name ()
<< ' ' << typeid (Step).name () << endl;
cout << test(typeid(Block), *obj) << endl;
cout << test(typeid(Step), *obj) << endl;
return 0;
}


821 名前:デフォルトの名無しさん :2006/05/25(木) 17:49:30
>>819

アドバイスありがとうございますY(>_<、)Y


今からさっそく実行してみます!!

822 名前:デフォルトの名無しさん :2006/05/25(木) 17:49:56
>>813
dynamic_castが使えるならdynamic_castでいいだろ。

823 名前:デフォルトの名無しさん :2006/05/25(木) 17:55:00
>>820
わざわざどうもです。

class Block
struct Obj class Block class Step
class Block class Block class std::basic_string<char,struct std::char_traits<char>,class std::allocator<char> > * int *
1
class Block class Step class std::basic_string<char,struct std::char_traits<char>,class std::allocator<char> > * int *
0

結果は正確なのですが、上でも述べましたが
Obj* obj = への代入は、実際のプログラムの中ではコレクションクラスから
取り出したObj*データ(Blockインスタンスなど)なのです・・・

824 名前:デフォルトの名無しさん :2006/05/25(木) 18:05:37
>>822
一つの希望クラスを指定してのtest関数だけなら、そうするのですが
実は、複数のtype_infoオブジェクトをvectorで渡して、その複数タイプの内
どれか一つを実装してるインスタンスを判別する為のmultiTest関数もあり
そっちがメインなのです。
ですから、何とかtype_infoで型チェックを行いたいのです。

825 名前:デフォルトの名無しさん :2006/05/25(木) 18:07:51
trueになるのはbefore()のせいじゃないの? >>815
beforeが判定するのはクラス継承関係じゃないよ(わかってたらごめん)

826 名前:デフォルトの名無しさん :2006/05/25(木) 18:08:01
>>823
実行結果最後の行の0は

>>818
>typeid(*pobj)だと、「Block」だけなく同じ仮想基本クラスを持つ型(Step)
><中略>との照合でも true になってしまうのです・・・
の報告と矛盾してるようだけど


827 名前:デフォルトの名無しさん :2006/05/25(木) 18:12:42
>>824
>>実は、複数のtype_infoオブジェクトをvectorで渡して、その複数タイプの内
type_infoオブジェクトはコンテナに入れてはいけないよ
Loki::TypeInfoなどを使いましょう


828 名前:デフォルトの名無しさん :2006/05/25(木) 18:13:31
>>825
自分の認識ではbeforeは、そのインスタンスの全スーパークラス「だけ」との
照合で true になると思ってるのですが・・・・
違うのですか?

>>826
単純に、Obj* obj = new Block と代入するなら正確な結果になるのですが
実際のプログラムの中では、obj = iterator->second などと
コレクションクラスから代入してるのです。

829 名前:デフォルトの名無しさん :2006/05/25(木) 18:19:31
>>827
正確には、type_info のアドレスをvectorに入れてるのですが
これでもまずいのですか?

830 名前:825 :2006/05/25(木) 18:19:32
>>828
単にtypeidの配列をソートしたい場合とかに使う順序関係であって、
クラス継承とは無関係だと思ったけど…。
いざ探そうと思うとドキュメントが見つからない

831 名前:デフォルトの名無しさん :2006/05/25(木) 18:22:44
int main(){
  int i = 0;
  i = i++;
  printf("%d\n", i);
}

このようなコードを書いた際、C/C++では1が表示されますが
C#で同じコードを書くと0が返ってきます。
演算子の優先順位を確認するとC#のほうが正しいような気がするのですが、正しいのはどっちでしょうか。
気になって夜も眠れません。

832 名前:デフォルトの名無しさん :2006/05/25(木) 18:23:51
>>830
げー!!!
じゃあC++の標準ではスーパークラスをチェックする方法はないんですか?
MFCみたいに、クラス毎にマクロを記述するのはどうしても避けたいのですが・・・
インターフェースが多すぎて

833 名前:831 :2006/05/25(木) 18:24:45
すみません。忘れてましたorz
C/C++のコンパイラはVisual C++ 2005とgcc4.0.3で確認しました。
C#のコンパイラはVisualC# 2005で確認しました。

834 名前:デフォルトの名無しさん :2006/05/25(木) 18:30:02
>>832
>18.5.1
>1. The class type_info describes type information generated by the
>implementation. Objects of this class effectively store a pointer to
>a name for the type, and an encoded value suitable for comparing two
>types for equality or collating order. The names, encoding rule, and
>collating sequence for types are all unspecified and may differ
>between programs.
>
>bool before(const type_info& rhs) const;
>
>5. Effects: Compares the current object with rhs.
>6. Returns: true if *this precedes rhs in the implementation’s collation order.


835 名前:デフォルトの名無しさん :2006/05/25(木) 18:31:53
>>831
これは演算子の優先順位でなく、コンパイラの解釈上の問題のような。
シンプルに考えると1の方が正しい。iへの後置演算をキャンセルした
♯のアセンブルが正しいかどうかは、人によって意見が分かれると思う。

836 名前:デフォルトの名無しさん :2006/05/25(木) 18:36:46
>>831
少なくともC/C++ではそれがどうなるかは未定義。
2つの副作用完了点の間に、2度も同一のオブジェクトに書き込むことになるから。

837 名前:デフォルトの名無しさん :2006/05/25(木) 18:40:18
>>832
dynamic_cast<>すればいいだろ。

838 名前:デフォルトの名無しさん :2006/05/25(木) 18:42:05
>>831
gcc3.3.5は-Wallで警告が出るね


839 名前:831 :2006/05/25(木) 18:44:56
int main(){
  int i = 0;
  i = (i++);
  printf("%d\n", i);
}

ちなみにこのように括弧をつけても共に同じ挙動を示します。

840 名前:831 :2006/05/25(木) 19:06:25
さらに追加です。以下のコードで実行した場合の出力を書きます。
<C++>
int main(){
 int h = 0;
 int i = 0;
 int j = 0;
 int k;
 printf("%d ", h++);
 printf("%d ", i = i++);
 printf("%d ", k = j++);
 printf("%d\n", i);
 return 0;
}
<C#>
static void Main(string[] args)
{
 int h = 0;
 int i = 0;
 int j = 0;
 int k;
 Console.Write("{0} ", h++);
 Console.Write("{0} ", i = i++);
 Console.Write("{0} ", k = j++);
 Console.WriteLine("{0}", i);
}
出力
<C++>
0 0 0 1
<C#>
0 0 0 0

841 名前:デフォルトの名無しさん :2006/05/25(木) 19:19:05
>>831
だから未定義って言ってるだろ。
コンパイラによっても違うかもしれないし、
最適化オプションによっても違うかもしれないし、
鼻から悪魔が出るかもしれないし、
そんなコードは書いちゃいかん。

842 名前:デフォルトの名無しさん :2006/05/25(木) 19:51:08
>>802
ありがとうございますー

843 名前:デフォルトの名無しさん :2006/05/26(金) 02:04:44
>>839->>840
副作用完了点って意味ワカンなかったらググれよ、屑。



844 名前:デフォルトの名無しさん :2006/05/26(金) 02:18:12
なんかWin32APIスレにも同じような流れが

845 名前:デフォルトの名無しさん :2006/05/26(金) 02:19:10
まちがえたスレ立てるまでもないだったw

846 名前:デフォルトの名無しさん :2006/05/26(金) 16:31:29
日本語でおk

847 名前:デフォルトの名無しさん :2006/05/26(金) 19:45:02
>>846
スレ一覧を見ろ

848 名前:デフォルトの名無しさん :2006/05/26(金) 20:59:45
どこかのサイトに
「mainより先に処理を呼ぶ方法がある」
と書いてあって、
方法としては確か
mainの書いてあるファイルと
同じファイルに無名namespaceで囲んだクラスを定義して・・・

以下どうだったか忘れました

・詳しくはどうやるんだっけ?
・どうしてそうなるのか

の二点が疑問なんですが、どなたかご存知の方いらっしゃいますか

849 名前:デフォルトの名無しさん :2006/05/26(金) 21:20:27
>>848
>同じファイルに無名namespaceで囲んだクラスを定義して・・・
その後で無名namespaceでインスタンスをつくるとかかなぁ


850 名前:デフォルトの名無しさん :2006/05/26(金) 21:53:13
>>848
・適当なクラスのコンストラクタにmainより前で実行させたい処理を書く。
・そのクラスのインスタンスを静的変数として定義

全ての静的変数の初期化はmainより前で行われるのでmainの前で処理が行える。
ついでに言うと静的変数のデストラクタはmainの終了後に行われる。


851 名前:848 :2006/05/26(金) 21:59:20
>>849
>>850
なるほど!
静的変数の初期化を利用するんでしたか

という事は
・mainより先に処理したいクラス定義はmainの書いてあるファイルと
別ファイルにしてはいけない
・mainより先に処理したいクラス定義は複数書くと順番は保障されない

という認識になるんですかね
あとは調べながら試してみます

ありがとうございました

852 名前:848 :2006/05/26(金) 22:13:55
>>851
>・mainより先に処理したいクラス定義は複数書くと順番は保障されない
同一ファイル内なら書いた順番みたいですね

853 名前:デフォルトの名無しさん :2006/05/26(金) 22:22:39
>>831
演算子の優先順位を確認するとC#のほうが正しいような気がするのですが

int main(){
  int i = 0;
int n;
  n = i++;
  printf("%d\n", n);
}

これでどうなる? 0 がでるだろ、演算子の優先順位処理は正しく行われている。
もとの式
i=i++;
左のiにゼロが代入される
その後i++でiがインクリメントされて、printfに渡される、何が問題なのか不明だなw


854 名前:デフォルトの名無しさん :2006/05/26(金) 22:53:36
グローバル変数とか静的変数のコンストラクタ/デストラクタに処理書くのって
なんかメリットあるのか?正直デメリットしか思いつかないんだが。

855 名前:デフォルトの名無しさん :2006/05/26(金) 23:07:55
>>854
cout の初期化を明示的に書かずに済むことくらいか
・・・これも怪しいが

856 名前:デフォルトの名無しさん :2006/05/26(金) 23:58:29
>>854
Singleton系
allocatorの初期化

857 名前:デフォルトの名無しさん :2006/05/27(土) 00:40:37
C++でthread-specific strageをやってくれるスレッドライブラリはないでしょうか?

858 名前:デフォルトの名無しさん :2006/05/27(土) 00:47:27
boostにthread_specific_ptrとかあったような気がする

859 名前:デフォルトの名無しさん :2006/05/27(土) 00:53:06
>>857
g++ならinfoみて
__pthreadとか

860 名前:デフォルトの名無しさん :2006/05/27(土) 07:07:42
コードのある範囲内で、グローバル名関数へのアクセスを禁止したいのですが・・・

#include <stdio.h>

namespace x
{

fread(...) { ... }

xmain()
{
  fread(...);
  fwrite(...);
}

}

main()
{
  fread(...);
}

上のxmain()内でのfread()の呼び出しはx::fread()ですが、fwrite()の呼び出し先を::fwrite()でなく、エラーにしたいのです。何かいい方法はありますか?

861 名前:デフォルトの名無しさん :2006/05/27(土) 07:12:07
>>860
名前の隠蔽を利用して、宣言だけをx名前空間の中に置いておけばいいんじゃまいか?

namespace x {
fread(...) { ... }
size_t fwrite(...);

xmain() {
 fread(...); // x::fread
 fwrite(...); // エラー:x::fwriteは定義がない
}
}

862 名前:デフォルトの名無しさん :2006/05/27(土) 13:14:43
>>860
#define fwrite do_not_call

863 名前:デフォルトの名無しさん :2006/05/27(土) 17:34:56
C++って初心者向きではないですよね?

864 名前:デフォルトの名無しさん :2006/05/27(土) 17:55:13
>>863
わざわざそんな質問をするような暇人向けではない。

865 名前:デフォルトの名無しさん :2006/05/27(土) 18:12:11
いや暇人向けかも
将来使う予定があるなら暇なときに習得するべし


866 名前:デフォルトの名無しさん :2006/05/27(土) 18:17:43
ある意味じゃ初心者向けかもな
線形リストもコーディングできないような奴とか
配列の境界チェック怠ってBOF起こさせる奴とか

867 名前:デフォルトの名無しさん :2006/05/28(日) 06:33:42
確かに STL の存在は大きいだろうね。

868 名前:デフォルトの名無しさん :2006/05/28(日) 13:57:27
http://www.uploda.org/uporg402552.zip.html

このコードなのですが、コンパイルできないので知恵をおかしください。
多分35行目の

OSStatus err = FSRefMakePath(&appBundleRef,mPathString, PATH_MAX);

のmPathStringに問題があると思うのですが、どこを変更すればいいのか分かりません。

869 名前:デフォルトの名無しさん :2006/05/28(日) 14:17:36
エラーメッセージも張らない莫迦はお断りだし環境依存スレに池。

870 名前:デフォルトの名無しさん :2006/05/28(日) 23:25:59
テンプレートメタプログラミングについて
お母さんの様にやさしく教えてくれるサイト・本等あったら教えてください

boost,Lokiのソースを見てみましたが
「何の処理をしているか」はなんとなく分かるんですが
「なぜそうしているのか」かがいまいち汲み取れてないのが現状です

871 名前:デフォルトの名無しさん :2006/05/28(日) 23:26:02
STLの本を探してたら、中古 \298,000 の本を見つけた
誤表記ですよね、定価 \6,000 だし・・・
ttp://www.amazon.co.jp/gp/product/4756137156/250-9284646-5949012?v=glance&n=465392

872 名前:デフォルトの名無しさん :2006/05/28(日) 23:29:38
>>870 http://www.boost.org/libs/mpl/doc/

873 名前:870 :2006/05/28(日) 23:34:04
>>872
なるほどソース読むよりまずはドキュメントを熟読せよと

英語なのでお母さんの様にやさしいかは不明ですが、
ますはチュートリアルから頑張って読んで見ます。

874 名前:デフォルトの名無しさん :2006/05/28(日) 23:41:35
>>871
29800だろ?それが高いのはかなり前から推薦図書スレで既出
良書の上、絶版になったので高騰してる

875 名前:デフォルトの名無しさん :2006/05/29(月) 00:35:53
>>870
Modern C++ Design(邦訳あり)
C++ Templates
C++ Template Metaprogramming



876 名前:デフォルトの名無しさん :2006/05/29(月) 01:29:16
時々std::tr1
という名前空間をみかけますが、
TR1の名前空間は暫定的なものなんでしょうか

C++0xになったらstdに格上げされるとか?

877 名前:デフォルトの名無しさん :2006/05/29(月) 01:51:50
互換性の問題から、std名前空間になることはないと、思うんだけどね。
だいぶ仕様が変わっているから、そのままだと既存のコードが動かないし。

878 名前:デフォルトの名無しさん :2006/05/29(月) 01:55:10
>>876
↓これ見たらわかるかも。
http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2005/n1836.pdf

879 名前:デフォルトの名無しさん :2006/05/29(月) 07:41:15
>>877
互換性のため、std::tr1を維持するのは構わないけど、(そのための'1'なんだから)
標準に入ったら、stdにも加わるに決まってるだろ。

880 名前:デフォルトの名無しさん :2006/05/29(月) 23:29:00
>>871
ttp://www.amazon.co.jp/exec/obidos/ASIN/0201379260/qid=1148912665/sr=1-1/ref=sr_1_2_1/249-9107367-7476308
訳書じゃないなら、日本のアマゾンで8300円少々で買える
ま、29万はありえんが2万9800円も異常な値段だな


881 名前:デフォルトの名無しさん :2006/05/30(火) 06:31:53
private継承、protected継承について詳しく解説している書籍・ページはありますか?
ExceptionalC++等で断片的な知識は得た物の、
言語仕様上の違いがいまいちハッキリ分からずに悩んでおります。

882 名前:デフォルトの名無しさん :2006/05/30(火) 06:40:54
>>881
規格票

883 名前:デフォルトの名無しさん :2006/05/30(火) 06:44:49
>>882
おkおk、書店で売っている大量の、
自称C++入門書とやらは、全部詐欺本だな。
規格票ひとつあれば、あんなものいらねーもんな。

アルゴリズムや特定のアーキテクチャ、ライブラリの解説書以外は不要だよな。


884 名前:デフォルトの名無しさん :2006/05/30(火) 06:53:15
>>883
まあ必要かどうかということならそうだね。
教科書だけあれば参考書は必要ではない
だがあれば理解の助けになるので、意義はあるけどな

885 名前:デフォルトの名無しさん :2006/05/30(火) 08:47:03
>>881
継承関係なしに private と protected の違いさえわかればいいと思うんだが。

886 名前:デフォルトの名無しさん :2006/05/30(火) 09:34:02
>>885
例えばDerivedがBaseをprivate継承していたら
BaseのポインタにDerivedのポインタを代入できなかったりと
クラス内のアクセス制御とはちょっと違う制約があるからな

887 名前:デフォルトの名無しさん :2006/05/30(火) 09:37:48
>>886
それも継承関係が private であることの結果でしょ?何が違うとも思わないな。

888 名前:デフォルトの名無しさん :2006/05/30(火) 09:40:50
>>887
「クラス内からのみアクセスできる」と「ポインタが代入不可」にどうして違いがないのか理解できない

889 名前:デフォルトの名無しさん :2006/05/30(火) 09:56:06
>>888
「クラス内からのみアクセスできる」ことによって
「クラス内からのみポインタが変換(代入)できる」ことになる。
前者が private の効果。後者はその結果の一つ。

890 名前:デフォルトの名無しさん :2006/05/30(火) 14:16:34
エディットからコンパイルまで備えたフリーのエディタってありますか?

891 名前:デフォルトの名無しさん :2006/05/30(火) 14:18:35
VC++2005EE

892 名前:デフォルトの名無しさん :2006/05/30(火) 14:27:44
フリーなの?

893 名前:デフォルトの名無しさん :2006/05/30(火) 14:55:10
フリーだよ

894 名前:デフォルトの名無しさん :2006/05/30(火) 15:13:57
d。
ダウンロードしてみます。

895 名前:デフォルトの名無しさん :2006/05/30(火) 17:59:15
d。
ダウンロードしてみます。

896 名前:デフォルトの名無しさん :2006/05/30(火) 19:08:10
d。 
ダウンロードしています。 

897 名前:デフォルトの名無しさん :2006/05/30(火) 19:17:23
d。
ダウンドードしています。

898 名前:デフォルトの名無しさん :2006/05/30(火) 19:19:10
d。
ダウンロードしてきます。

899 名前:デフォルトの名無しさん :2006/05/30(火) 19:25:52
>>890
emacs


900 名前:ホアキン :2006/05/30(火) 22:34:33
ある2つのクラスを用意して、相互にもう一方のクラスをメンバとすることはできますか?
要するにこうしたいのです↓

class ClassA{
 ClassB b;
};

class ClassB{
 ClassA a;
};

よろしくお願いします。

901 名前:デフォルトの名無しさん :2006/05/30(火) 22:36:12
そんな金太郎飴みたいなこと出来るわけねーだろアホが

902 名前:デフォルトの名無しさん :2006/05/30(火) 22:40:44
>>900
どちらか一方或いは両方がポインタや参照などを持つようにするならば可能。

903 名前:デフォルトの名無しさん :2006/05/31(水) 00:50:11
class a{
protected b{
any function()
....
}

}

インナークラスBのインスタンスをクラスAで宣言する場合の記述方法を教えてください

const a::b _b&;
こんな感じだっけ?

904 名前:デフォルトの名無しさん :2006/05/31(水) 01:08:02
>>903
インナークラス=ネストされたクラス
クラスAで宣言=クラスAのメンバとして宣言
として、
class A { class B {}; B b; };
こんな感じ。

905 名前:ホアキン :2006/05/31(水) 01:15:24
>>902
サンクス

906 名前:デフォルトの名無しさん :2006/05/31(水) 01:18:58
B b;やるとg++4.1だとエラー出るんですよ
新しいg++だとダメみたいで正確な書式知りたいんだけど
どなたか知りませんか?

907 名前:デフォルトの名無しさん :2006/05/31(水) 02:25:12
>>906
エラーメッセージも貼らずに聞かれちゃぁ、エスパー募集するしかないねぇ。

908 名前:デフォルトの名無しさん :2006/05/31(水) 03:42:13
class A { class B{ ... }; B &b; };
だったら出来るんじゃないの?


909 名前:デフォルトの名無しさん :2006/05/31(水) 04:50:37
>>906
問題ないよ。4.1.1 20060511

>>908
おいおい

910 名前:デフォルトの名無しさん :2006/05/31(水) 22:07:21
>>900
ちょっと興味深いコードだね。
しかし>>900のようにしてしまうとコンパイル時にサイズが決定できなくなる
っつーか無限大になっちまうから、ポインタや参照にする必要がある。

911 名前:デフォルトの名無しさん :2006/05/31(水) 22:34:12
class B;

class A{
    B* b;
public:
    A();
};

class B{
    A* a;
public:
    B()
    {
        a = new A;
    }
};

A::A()
{
    b = new B;
}

いくらコンパイル通るからってこういうことするなよ

912 名前:デフォルトの名無しさん :2006/05/31(水) 22:40:15
>>910
参照を理解してないなw

913 名前:デフォルトの名無しさん :2006/05/31(水) 22:54:54
イテレータには、ランダムアクセスや双方向アクセスなど5種類あるそうですが
プログラマーが明示的に区別しなくても
vector<int>::iterator p;
の様に書くだけで、後はコンパイラが適切なものを自動で選んでくれるのでしょうか?

914 名前:デフォルトの名無しさん :2006/05/31(水) 22:55:46
何かを大きく勘違いしちゃってるな

915 名前:デフォルトの名無しさん :2006/05/31(水) 23:21:38
>>913
vectorの場合はランダムアクセスイテレータ。
そういう風にコンテナによって必然的に決まる。

コンテナとは関係ないイテレータでも、その目的によってやはり必然的に決まる。

916 名前:デフォルトの名無しさん :2006/05/31(水) 23:24:49
template<typename T>
class Hoge
{
  friend T;
};

こういうことをしたいのですが、VC++ 7.1ではこれでコンパイルできたのですが、
GCC 3.4.4ではコンパイルエラーになりました。試しにfriend class T;としてもだめでした。

もしかしてこんなことを標準C++ではやれないのですか?

917 名前:デフォルトの名無しさん :2006/05/31(水) 23:28:29
型を返す関数ないかな

vector<int> a;
iterator(a) i = a.begin();

みたいな

918 名前:デフォルトの名無しさん :2006/05/31(水) 23:52:16
>>916
C++標準 7.1.5.3 の 2
>《詳述型指定子》中の《識別子》は,名前検索によってその表すものを見つけ出す
>(これを,名前検索が解決するという。)。名前検索の処理は,3.4.4に規定する。
>《識別子》が《クラス名》 又は 《列挙体名》 と解決された場合,《単純型指定子》が
>その型名を導入するのと同じように,《詳述型指定子》は,その《識別子》をその
>宣言に導入する。
>《識別子》が《型定義名》 又はテンプレート《型仮引数》と解決された場合,その
>《詳述型指定子》は不適格とする。
>
>参考 したがって,《型仮引数》Tというテンプレートをもつクラステンプレートの中では,
>次の宣言は,不適格となる。
>  friend class T;


919 名前:デフォルトの名無しさん :2006/05/31(水) 23:53:13
>>917
auto i = a.begin();
ってのが標準化されるかも。

920 名前:デフォルトの名無しさん :2006/05/31(水) 23:54:28
型推論ってやつ?
C#に搭載されるという

921 名前:デフォルトの名無しさん :2006/06/01(木) 00:00:02
>>919
C++0xに入ってるみたいだけど
まだ正式な規格になってないから「かも」レベルではあるか

922 名前:デフォルトの名無しさん :2006/06/01(木) 00:01:22
そのautoってのはイテレータだけ?

923 名前:デフォルトの名無しさん :2006/06/01(木) 00:05:09
>>919
それはすごいな
初期化子からオブジェクト自体の型を推論か・・・

いやふつーに a.iterator i = a.begin(); でもいいんだけどさ
たまーにコンパイラがアフォすぎって感じることあるんだよ

別に :: と . と -> の使い分けとかポインタの存在なんかそのままでいいんだけど
そういうところを受け入れたうえでもコンパイラのロジック自体の直交的に見えないところを整理して欲しい今日この頃でさ

924 名前:デフォルトの名無しさん :2006/06/01(木) 00:06:08
初期化子から、型を確定できるものはなんでも。
http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2005/n1894.pdf

925 名前:デフォルトの名無しさん :2006/06/01(木) 00:08:45
>>917
typedef使っとけばいいじゃん

926 名前:デフォルトの名無しさん :2006/06/01(木) 00:09:02
>>923
まあ今でも関数templateの実引数から型を決定すること自体はやってるわけでさ。

927 名前:デフォルトの名無しさん :2006/06/01(木) 00:10:11
>>923
関数テンプレートの型パラメータの省略だけじゃなくて、
クラステンプレートのコンストラクタの型パラメータの省略とか、
改善して欲しい所はたくさんあるね。


928 名前:デフォルトの名無しさん :2006/06/01(木) 00:16:45
>>924
面白そうだな
じっくり読んでみるよ
thx!!

929 名前:デフォルトの名無しさん :2006/06/01(木) 00:17:46
C++初心書のためのお勧めの本を教えてくださいm(_ _)m

930 名前:デフォルトの名無しさん :2006/06/01(木) 00:21:17
しらんがな

他の言語は何かマスターしてるのか?
アドバイスが欲しかったらちゃんと自分の状況を書け

931 名前:デフォルトの名無しさん :2006/06/01(木) 00:25:37
C言語は初級〜中級レベルです。
わかりやすく解説してる良書、お勧め書はありますか?

932 名前:デフォルトの名無しさん :2006/06/01(木) 00:29:40
B言語以来の予約語autoがついにリンケージ指定子の立場を追われるのか。
既存の予約語を使いまわす辺りがC直系らしいと思うが
なんとまあ都合いい予約語が余ってたもんだなw auto。

933 名前:デフォルトの名無しさん :2006/06/01(木) 00:31:44
省略不可になるだけで意味が変わるわけじゃあるまい

934 名前:デフォルトの名無しさん :2006/06/01(木) 00:42:38
>>931
憂鬱なプログラマのためのオブジェクト指向開発講座

935 名前:デフォルトの名無しさん :2006/06/01(木) 00:57:07
>>933
auto i = 1.0; が

Cでは、int i = 1;のこと。(BCPL以来のint(WORD型)の省略可能)
>>924が規格に入ったC++ではfloat i = 1.0;になるんじゃないかな。

936 名前:デフォルトの名無しさん :2006/06/01(木) 01:25:39
>>935 double だよ。

937 名前:デフォルトの名無しさん :2006/06/01(木) 01:43:59
auto の仕様が変わった所で
誰も困りそうにないのが凄いな。

938 名前:デフォルトの名無しさん :2006/06/01(木) 01:46:47
%cat auto.cpp
int main(){
auto i = 0;
return i;
}
%g++ -Wall auto.cpp
auto.cpp: In function `int main()':
auto.cpp:2: error: ISO C++ forbids declaration of `i' with no type

939 名前:デフォルトの名無しさん :2006/06/01(木) 01:49:13
autoの仕様変わるの?
auto i = 0; // type-specifier
auto int i = 0; // storage-class-specifier type-specifier
auto auto i = 0; // storage-class-specifier type-specifier
名前に意味ダブらすの得意だし>C++

940 名前:デフォルトの名無しさん :2006/06/01(木) 02:00:08
だから、そもそも3番目はエラーだってば。
>cl auto.cpp
Microsoft(R) 32-bit C/C++ Optimizing Compiler Version 14.00.50727.42 for 80x86
auto.cpp(2) : error C4430: 型指定子がありません - int と仮定しました。メモ: C++
は int を既定値としてサポートしていません

941 名前:デフォルトの名無しさん :2006/06/01(木) 03:37:44
autoは初期化しようとした型にあわせて自動的に型が決定されるようになるんじゃなかったか?
for (auto it = v.begin(); it != v.end(); ++it) { ... }
規格が確定するのが2008年頃としても、コンパイラがサポートするにはあと3,4年かかりそうだなぁ…

942 名前:デフォルトの名無しさん :2006/06/01(木) 05:28:52
でもautoってださいよなww

943 名前:デフォルトの名無しさん :2006/06/01(木) 06:52:03
autoの仕様が変更されたら、>>939の例はどうなるんだろう。
autoキーワードそのものが>>941の目的に特化されて、
>>939の2、3番目はエラーになるのかな。

944 名前:デフォルトの名無しさん :2006/06/01(木) 08:37:00
>>941
型推論はいくつかの関数型言語ですでに実装されてる機能だし
実装自体にもそれほど難しい点はないので3、4年ってことはないと思われ

というか、初期化子だけで型が決まるんだから関数型言語の型推論よりよっぽど簡単

>>943
禿のことだから必死に互換性を保つだろう、その点は大丈夫そうだ
# 3番目はそもそもエラーらしいけどナ (規格に当たってないから本当かどうかは知らん)

945 名前:デフォルトの名無しさん :2006/06/01(木) 10:18:29
auto 単独なら型推論するけど、
auto の他に型を書いていたら
その型になるとかいう仕様になるんじゃね?

946 名前:デフォルトの名無しさん :2006/06/01(木) 10:57:05
どちらにせよauto autoの扱いが気になるな

947 名前:デフォルトの名無しさん :2006/06/01(木) 11:00:19
static auto i = v.begin();
なんてのはちゃんと解釈されるの?

948 名前:デフォルトの名無しさん :2006/06/01(木) 11:02:11
>>917のようなのは、g++だと、今のところ、

vector<int> a;
typeof(a.begin()) i = a.begin();

で何とかなります。
>>927のコンストラクタ呼び出しの冗長化で悩ましいので、typeof使ったマクロで処理してます。
まあ標準外れちゃうんだけど。>typeof



949 名前:デフォルトの名無しさん :2006/06/01(木) 11:02:57
されるんじゃね?要は右辺値の型を見ればいいだけだから
コンパイル時に決定できれば何でも大丈夫かと

950 名前:デフォルトの名無しさん :2006/06/01(木) 11:03:34
>>924のn1894.pdfによれば、
storage class 'auto'は廃止の提案です。

951 名前:950 :2006/06/01(木) 11:05:22
間違えました。
storage class 'auto'の廃止じゃなくて、
storage class specifier 'auto'の廃止です。
「3.Proposed wording」のところ。

もちろん暗黙に指定した'auto' storage classはなくなりません。

952 名前:デフォルトの名無しさん :2006/06/01(木) 11:06:47
もともと互換性のために残されてたようなもんだしな

953 名前:デフォルトの名無しさん :2006/06/01(木) 12:35:33
このスレに、誰か auto の仕様変わったら困るって人いる?

954 名前:デフォルトの名無しさん :2006/06/01(木) 13:13:29 ?#
あるとすれば組み込み系とか?
デフォルトでregisterなのを明示的にautoにしたいとか。

955 名前:デフォルトの名無しさん :2006/06/01(木) 13:35:51
そんなコンパイラあるの?

956 名前:デフォルトの名無しさん :2006/06/01(木) 13:56:39
autoじゃ最適化の抑止にはならんだろ。。


957 名前:デフォルトの名無しさん :2006/06/01(木) 14:32:27 ?#
>>955
昔、組込用コンパイラでそんなのがあった。OptimizeC-86だったかな。

>>956
最適化を抑止というか、レジスタを別の用途(インラインアセンブラとか)に使いたいからとか。

958 名前:デフォルトの名無しさん :2006/06/01(木) 16:16:17
そういうのは、処理系依存の利用方法だから、
規格からautoがなくなっても、今まで通りの処理系使うだけだな。
そもそもC++じゃなくてCっぽいし。

959 名前:デフォルトの名無しさん :2006/06/01(木) 19:05:29
弊害も結構ありそうだと思うのは俺だけか?
いやautoが無くなる事じゃなくて型推論が追加される事に関してだが。

960 名前:デフォルトの名無しさん :2006/06/01(木) 19:36:23
>>959
例えば?

961 名前:デフォルトの名無しさん :2006/06/01(木) 20:54:51
const auto n = 4;
const auto a = 6.3;
const auto m = n * sizeof(a);
auto a[m];

こんな奇怪なコーディングが可能になる、とかか?
すまんあまり良い例(悪い例?)が思いつかない。

962 名前:デフォルトの名無しさん :2006/06/01(木) 21:05:59
>>961
一番下の式は初期化式がないからアウトだな。

963 名前:デフォルトの名無しさん :2006/06/01(木) 21:10:47
普通の型推論じゃなくて、
あくまで初期化式と同じ型にするだけなのね。

964 名前:デフォルトの名無しさん :2006/06/01(木) 21:31:38
確かにイレテータとか書くのめんどいもんな
vector<int>::itrator it = v.begin();
とか

965 名前:デフォルトの名無しさん :2006/06/01(木) 21:38:52
大抵は typedef するけど、名前考えるのが面倒い。

966 名前:デフォルトの名無しさん :2006/06/01(木) 21:41:50
boost::any
ほぼどんな型でも格納できる

967 名前:デフォルトの名無しさん :2006/06/01(木) 21:57:58
この手の関数オブジェクトをauto無しで書くと死ねる。

auto is_test = not1(bind2nd(std::ptr_fun(strcmp),"test"));
std::cout << is_test("Test") << " " << is_test("test");

まぁ、多少の非効率を無視してboost::functionで誤魔化してもいいけどね。

968 名前:デフォルトの名無しさん :2006/06/01(木) 22:27:29
autoなしで書くとどうなるのそれ?

969 名前:デフォルトの名無しさん :2006/06/01(木) 22:33:48
>>968
std::unary_negate<std::binder2nd<std::pointer_to_binary_function<const char*, const char*, int> > >

boost::lambdaを使うともっと、ありえない型になるw
using namespace boost::lambda;
auto is_test = ! bind(strcmp,_1,"test");
と書いたとして実際の型は
using namespace boost::lambda;
using namespace boost::tuples;
const lambda_functor<lambda_functor_base<logical_action<not_action>,
    tuple<lambda_functor<lambda_functor_base<action<3,function_action<3> >,
    tuple<int (&)(const char*, const char*),const lambda_functor<placeholder<1> >,
    const char (&)[5]> > > > > >


970 名前:デフォルトの名無しさん :2006/06/02(金) 00:06:43
>>969
boostのlambdaをそんな風に使うコードなんて、autoがあったとしても読みたくない。

971 名前:デフォルトの名無しさん :2006/06/02(金) 00:48:59
autoがあれば、今よりずっと手の込んだコードが書けるから大歓迎。
できれば新しい予約語にして欲しかったけどね。
// けどそっちの方が互換性に問題が出やすいかな。

972 名前:デフォルトの名無しさん :2006/06/02(金) 05:33:09
autoは仮引数には使えないのかね?

void func(auto n)
{ ... }

templateとバッティングするから恐らく不可だろうなぁ…

973 名前:デフォルトの名無しさん :2006/06/02(金) 06:04:15
>>972
新しいtemplateの表記法として採用されなくはないんじゃないのか?

974 名前:デフォルトの名無しさん :2006/06/02(金) 06:12:21
これが採用されれば、生まれて初めてC++のコーディングで
autoって打つことになりそうだw

975 名前:デフォルトの名無しさん :2006/06/02(金) 06:16:34
でも結構前から予約語なんだな

976 名前:デフォルトの名無しさん :2006/06/02(金) 07:02:30
C時代からautoには意味があったからな
今回の提案で意味が変わりそうってだけで

977 名前:デフォルトの名無しさん :2006/06/02(金) 10:26:14
>>974
そういや C ではとりあえず auto を使ってみた事はあるけど、
C++ では使った事無いな。

978 名前:デフォルトの名無しさん :2006/06/03(土) 14:57:38
bitwise copyってどういうコピーですか?

979 名前:デフォルトの名無しさん :2006/06/03(土) 15:04:13
>>978
memcpyのようなコピー。単に全ビットの並びが複写されるだけ。

980 名前:978 :2006/06/03(土) 15:42:29
>>979
理解できました。ありがとうございました。

981 名前:デフォルトの名無しさん :2006/06/04(日) 13:11:07
恥ずかしながらはじめて聞いた
シャロウコピーなら聞いた事あるけど

982 名前:デフォルトの名無しさん :2006/06/04(日) 13:50:44
単純なコピーなのにwiseなのな

983 名前:デフォルトの名無しさん :2006/06/04(日) 13:56:55
◆-wise
《名詞の語尾につけて》〜のように、〜の方向に、〜の点で、〜に関しては、〜的に、〜風に、〜の観点で

984 名前:デフォルトの名無しさん :2006/06/04(日) 14:22:14
type-safeの意味について確認したいんですが、
int型にstring型を入れようとするとコンパイルエラーになる
というのをtype-safeという、という理解で合っていますか?

985 名前:デフォルトの名無しさん :2006/06/04(日) 14:23:58
#includeディレクティブについてなんですが

#include <hoge>
という書き方の他に
#include "hoge"
という書き方もあるようなのですがどこか違いがあるのですか?

986 名前:デフォルトの名無しさん :2006/06/04(日) 14:35:46
>>984 http://en.wikipedia.org/wiki/Type_safety

987 名前:デフォルトの名無しさん :2006/06/04(日) 14:36:38
>>985
検索方法がちがう。実際の検索方法はコンパイラ依存。

988 名前:デフォルトの名無しさん :2006/06/04(日) 15:12:33
>>985
適当に説明する。
<>はシステム側からフォルダ探す。
""はユーザー側からフォルダ探す。
だいたいの""は分割コンパイルするときの関数定義やらグローバル変数
を入れとくヘッダー。要は自作ヘッダー。
ま、言っても、色んなコンパイラ使ったことあるわけじゃないから
詳しくはしらね。


989 名前:デフォルトの名無しさん :2006/06/04(日) 16:45:11
「 :: 」と「 -> 」の意味が分かりません
教えてください

990 名前:デフォルトの名無しさん :2006/06/04(日) 16:50:02
本に書いてある通り。

991 名前:デフォルトの名無しさん :2006/06/04(日) 17:52:49
>>989
JavaとかC#の人?
::はスコープ解決、主に名前空間の中の名前にアクセスしたり、静的メンバにアクセスしたり。
->はポインタからの間接参照、p->xは(*p).xに等しい。

992 名前:985 :2006/06/04(日) 17:53:58
>>988
ありがとうございます
ということは<>はSystem32フォルダとかから
ヘッダファイル探索するけど
""だとプログラムのカレントディレクトリから
探索を始めるということですね

993 名前:デフォルトの名無しさん :2006/06/04(日) 18:04:09
>>992 違う。 >>987 が正解。コンパイラのマニュアル見ろ。

994 名前:デフォルトの名無しさん :2006/06/04(日) 18:23:41
まぁ「「だいたいは」」<>がライブラリのヘッダで""が自分で作ったヘッダだな

995 名前:デフォルトの名無しさん :2006/06/04(日) 18:47:56
>>992
システムにもいろいろなシステムがある。

996 名前:デフォルトの名無しさん :2006/06/04(日) 20:21:32
コピーコンストラクタみたいに
オブジェクトのセマンティクスを考えて行うコピーとの対照で良く、
bitwise copyと言われる。

例えば、参照カウンタを持つオブジェクトへのポインタは、
bitwise copyするとオブジェクトの整合性を壊してしまう。

997 名前:デフォルトの名無しさん :2006/06/04(日) 21:10:51
それよりも誰か次スレ立てろ

998 名前:デフォルトの名無しさん :2006/06/04(日) 21:50:53
立ててみる

999 名前:996 :2006/06/04(日) 21:51:57
>>997
それよりとはなんだズサー

1000 名前:デフォルトの名無しさん :2006/06/04(日) 21:52:40
ごめん。無理だった。

↓に避難。
【初心者歓迎】C/C++室 Ver.27【環境依存OK】
http://pc8.2ch.net/test/read.cgi/tech/1147183708/


■過去ログ置き場に戻る■ 1- 前250 次250 最新50
DAT2HTML 0.33f Converted.