【C++】template 統合スレ -- Part3

このエントリーをはてなブックマークに追加
946デフォルトの名無しさん:04/05/01 00:49
ついに>>945は知能障害を起こしますた。

いいから例を出せってw
変なのが一匹いるみたいだが放置で。
>>946
ん?>>945=>>943=>>948ですよ。
>>942が早く例を出してくれるのを待ってるんですが。
バカっぽいな。
>>946=>>949恥ずかしいのかな?失敗は誰にもあるよ。気にすんな。
&の意味も知らずに可哀想。
お前ら、もちつけ。
釣られるやつも釣る奴と同レベルだぞ。
荒らしに脊髄反射してるのも荒らしと大して変わらんことに気づけ。
&は山椒
鰻丼に山椒かける?
かけるよ

template/* ここスペース入れる?俺は入れるんだけど */<...>
956デフォルトの名無しさん:04/05/01 04:15
>>954
で、鰻以外の何に山椒かける?
>>956
麦茶に混ぜると美味しいよ。
958デフォルトの名無しさん:04/05/01 12:19
>>955
そこに入れるということは、
int main (int argc, char *argv[]);
とか書くのか?やめてくれ....orz
>955
俺はスペース一個入れる

>958
誤爆?勘違い?
テンプレートクラス/関数を書く時のスタイルの話だよ?
>>955
俺は入れないなあ。
理由聞かれても困るけど、少なくとも>>958みたいなことは全然考えてないよ。
templateと<の間に空白があるってのは、
属性として密接に関連付いた記号なのに分離されてる感じで違和感が・・
>>958もそうだし、あと配列変数名と [ の間が開いたときも同じように気になりそう。
んじゃ、
for/* ここにはスペース入れる? */(;;)
if/*ここはどうよ?*/()

漏れは、
template< typename HOGE > class AGE {};
for ( ; ; ) {}
if () {}
963デフォルトの名無しさん:04/05/01 14:52
俺はこう

template<typename HOGE>
class AGE
{
};

for (i=0; i<10; ++i)
{
}

if (hoge > fuga)
{
}
吾亦紅
965955(いいだしっぺ):04/05/01 16:33
俺はこう

template <typename HOGE>
class AGE {
  ...
public:
  ...
};

for (i = 0; i < 10; ++i) {
  ...
}

if (hoge > fuge) {
  ...
}

int* piyo(const char* foo, double baz)
{
  ...
}
966デフォルトの名無しさん:04/05/01 17:03
俺はこう
template<typename HOGE>
class AGE{
・・・
}
;

for(
  i=0;
  i<10;
  ++i
){
・・・
}

if(
  hoge > fuga
){
・・・
}
967デフォルトの名無しさん:04/05/01 17:31
そんなことよりBoost本キタ━━━━━(゚∀゚)━━━━━!!
ttp://www.kmonos.net/wlog/38.php#_1245040501
Let's boostの人?
>>968
んだ。

Boostのバージョンはいくつかな?
970
>>970
どーでもいいが、痛いことやってると思う。
>>967
K.INABA氏GJ!
973デフォルトの名無しさん:04/05/02 02:15
c++相談スレから誘導されました
template<typename T>struct A
{
  char c;

  A(char arg): c(arg){}

  void test()
  {
    cout << c << endl;
  }
};

int main()
{
  A<int> a('1');

  A<string>* p = (A<string>*)(&a);

  p->test();
}
 
のようにクラス内でテンプレート引数を使用しないとして
テンプレート的に違う型のポインタにキャストするのって
動作は保証されてますか?
>>973
キャスト演算子をstatic_castにすると通らなくなる所から、
コンパイラ内部では別個の種類のオブジェクトのポインタ
と見なされているようだ。で、reinterpret_castにすると通る
が、移植性がないし保証がないだろう。(仕様書ではどの
当たりに出ているかな?)
975973:04/05/02 02:24
>>974
そうですか... 残念です
ありがとうございました
>>973
されない。
templateかどうかは関係なく、別クラスの同じ名前のメソッドを呼べるかという問題だね。
>>976の回答が微妙にズレてるような気がするのは俺だけ?
>>975
>>974さんも言ってるけど、C++使いなら、できるだけC型の古い
キャスト演算子の使い方はやめた方がいいよ。その方がバグが
出にくくなるから。

static_cast
const_cast
dynamic_cast
reinterpret_cast

面倒でも使い分けよう。boostにも他にいくつかcastがある。
>>977
そうだろうな。
>>973
恐らくそれがだめなのは、後からうっかりクラス内にTを使った
構文を導入してしまう事が多々あるからだろう。

それまで動いていたのに途端にだめになるのはおかしい。それ
なら初めから別の種類のクラスだと見なしておけという事では
ないだろうか。

vector<double>* vp;
vector<int>* p = (vector<int>*)&vp; とやったらだめなのは
直感的にわかるが、後からちょこっとクラス内を変更して、
全く別の所(クラステンプレートのポインタの相互変換)で
エラーが出てきたのでは、発見も遅れそうだ。
>>973>>980
class A() { void test(); }
class B() { void test(); }
つーことだtてば。
>>981
あぁ、何書いてんだろ…orz
A()とかの()はいらん。
>>973
class templateからinstantiationされて出来た各々のクラスは,
あらゆる意味で別の型(クラス)です.
従って,973さんがやろうとしていることはまったく関連の無い違う型への
キャストと同義であり,973さんが期待している動作の保証はまったくありません.

>>974
14.4あたりですかね?

それと976さんの表現で私は良いと思うのですが・・・どうなんでしょうか?
回りくどい書き方なので分かりにくいかもしれんが
>976の書いてる内容が真理をついてる
逆に言えば、一般のクラスと同様
クラステンプレートが共通のインターフェイス
class Testable {
virtual void test() = 0;
};
を継承するようにすれば望みどおりのことはできるってこったね。

しかしテンプレートと継承の使い分けで混乱する人は多いようだねぇ
とりあえず >973 がなぜそんなことをしようとしたのか、やりたいことはなんなのかを
書いた方がより有益なアドバイスが得られるんじゃないかと思う。
987デフォルトの名無しさん:04/05/03 01:20
誰か次スレ立てろな
俺はやらないから
俺 はやらないから
次スレ立てたよ。
【C++】template 統合スレ -- Part4
http://pc5.2ch.net/test/read.cgi/tech/1083550483/
>989
ご苦労!!
991デフォルトの名無しさん:04/05/03 18:33
http://boost.cppll.jp/HEAD/libs/mpl/doc/paper/html/intro.html#intro.whymetaprog
の、"1.3. Why metaprogramming?"で、突然にyaccの話が出てくるんですが、そこの意味/意図が掴めません。

どなたか簡単に補足説明ねがえませんでしょうか
>>992
1. Introductionの段階でYACCは出てきますが…。2行目の頭。
993デフォルトの名無しさん:04/05/03 20:43
>>992
ですね・・。すみません、質問を変えます。
1. We could write programs to interpret the metadata directly.
の、metadataってここでは具体的に何を指しているんでしょうか?
>>993
それも1のIntroductionに書いてある。太字で。
英語は苦手なんだが、このYACCの例ではEBNFでは無いだろうか。
テンプレート自体とは関係ない気がする。
995デフォルトの名無しさん
>>994
> 英語は苦手なんだが、このYACCの例ではEBNFでは無いだろうか。
ですね。

自分の知りたいことがうまく伝えられなくて本当に申し訳ないんですが、
えーと・・"1.3. Why metaprogramming?"の1.の例では、メタプログラミング
をしない場合にYACCでどう書けって言っているんでしょうか?

私の感覚ではall_permutations関数のシグネチャを適当に変えてnew[]
すりゃ終わりなんですが(遅さは別としてyaccなんていらない)。