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


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

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



1 名前:デフォルトの名無しさん mailto:sage [04/11/25 21:11:32]
C++ のジェネリックプログラミングの話をしましょう。
以下のスレッドを統合するスレです。
STLスレッド
Part1 pc.2ch.net/tech/kako/1004/10042/1004287394.html
Part2 pc3.2ch.net/tech/kako/1026/10267/1026793823.html

【C++】Boost使い集まれ!
pc3.2ch.net/test/read.cgi/tech/1033830935/ (html化待ち?)

Generic Programming with C++ Template
pc.2ch.net/tech/kako/1008/10085/1008593126.html
【C++】template 統合スレ -- STL/Boost/Loki, etc.
pc2.2ch.net/tech/kako/1037/10377/1037795348.html
【C++】template 統合スレ -- Part2
pc2.2ch.net/test/read.cgi/tech/1047978546/ (html化待ち)
【C++】template 統合スレ -- Part3
pc5.2ch.net/test/read.cgi/tech/1066493064/ (html化待ち)
【C++】template 統合スレ -- Part4
pc5.2ch.net/test/read.cgi/tech/1083550483/ (html化待ち)
【C++】template 統合スレ -- Part5
pc5.2ch.net/test/read.cgi/tech/1091522597/
関連スレ、その他リンクは >>2-5 あたりに。


52 名前:デフォルトの名無しさん mailto:sage [04/12/02 10:36:13]
>>51 VC6か?

53 名前:デフォルトの名無しさん mailto:sage [04/12/02 10:43:27]
>>52
そうです

54 名前:デフォルトの名無しさん mailto:sage [04/12/02 10:46:17]
捨てるしか

55 名前:デフォルトの名無しさん mailto:sage [04/12/02 11:08:46]
>>54
そうですか。2005まで粘ろうかなぁ。なんて。あははhっは

56 名前:デフォルトの名無しさん mailto:sage [04/12/02 11:18:16]
2005 までは Toolkit とか 2005 Beta とか 2005 Express 使ってりゃいいじゃん
VC6 はさっさと捨てろ

57 名前:デフォルトの名無しさん mailto:sage [04/12/02 12:29:27]
貧乏人は死ね

58 名前:デフォルトの名無しさん mailto:sage [04/12/02 12:58:30]
優越感に浸りたいお年頃

59 名前:デフォルトの名無しさん mailto:sage [04/12/02 13:44:50]
うちは金持ちだけど6.0

60 名前:デフォルトの名無しさん mailto:sage [04/12/02 13:52:18]
ダメじゃん。



61 名前:デフォルトの名無しさん mailto:sage [04/12/03 03:22:13]
>>59
金持ちだけど技術なし?

62 名前:デフォルトの名無しさん [04/12/09 01:13:37]
下がりすぎage

63 名前:デフォルトの名無しさん mailto:sage [04/12/09 01:36:48]
template=天ぷらって?


64 名前:デフォルトの名無しさん mailto:sage [04/12/09 01:39:31]
>>63
10点

65 名前:デフォルトの名無しさん mailto:sage [04/12/09 02:31:21]
10点ならいいじゃん。
オリンピックだって10点満点で評価してるしな。

66 名前:デフォルトの名無しさん mailto:sage [04/12/09 02:37:49]
違う。1000点満点中の10点だ。よく覚えとけ。

67 名前:デフォルトの名無しさん mailto:sage [04/12/09 18:13:18]
boostの質問はここでいいのでしょうか?
以下のようにboost::bindを二重に使うと上手くキャストできません。
二回目のBase&を渡すところで内部でコピーされてスライスされているのでしょうか。
ポインタで渡せば問題ないのですが、参照で保持してくれるようにはできませんか?

struct Base { virtual ~Base() {} };
struct Hoge : public Base { };

void bar ( Base& b ){
  if ( Hoge *p = dynamic_cast<Hoge*>(&b) )
    std::cout << "bar ok" ; //ここへはこない
}

void foo ( Base& b ){
  if ( Hoge *p = dynamic_cast<Hoge*>(&b) )
    std::cout << "foo ok" ;

  boost::bind ( &bar, b )();
}

int main(){
  Hoge hoge;
  boost::bind ( &foo, hoge )();
  return 0;
}


68 名前:デフォルトの名無しさん mailto:sage [04/12/09 18:19:54]
boost::bind ( &foo, boost::ref( hoge ) )();

69 名前:デフォルトの名無しさん mailto:sage [04/12/09 18:26:04]
間違えた
-boost::bind ( &bar, b )();
+boost::bind ( &bar, boost::ref ( b ) )();
-boost::bind ( &foo, hoge )();
+boost::bind ( &foo, boost::ref ( hoge ) )();


70 名前:デフォルトの名無しさん mailto:sage [04/12/09 18:28:55]
bindが引数の型を推論するときにBase &のtop-level referenceを剥いじゃうんですよね・・・



71 名前:デフォルトの名無しさん mailto:sage [04/12/09 18:30:22]
>>69
67の例だとhogeをラップする必要はないですよ.

72 名前:デフォルトの名無しさん mailto:sage [04/12/09 18:36:09]
即答ありがとうございます。上手くキャストされました

73 名前:デフォルトの名無しさん mailto:sage [04/12/12 14:38:59]
listのメンバであるsort関数についてお尋ねしたいのですが、
これの引数であるCompare compというのはどういう物なのでしょうか。

関数オブジェクトやfunctionalの物かと思って色々試してみたのですが、どうにも上手くいきません。

74 名前:デフォルトの名無しさん mailto:sage [04/12/12 14:51:30]
普通に二項の関数オブジェクト

75 名前:73 mailto:sage [04/12/12 15:19:55]
すいません、functionalでもgreaterだけは通りました。
lessやless_equal、greater_equalでは駄目みたいです。

>>74
レスありがとうございます。では私の何かやり方がまずいっぽいです。
どうか添削して頂けないでしょうか。

#include <iostream>
#include <list>
using namespace std;

struct func_object{
bool operator()( const int& lhs, const int& rhs ){
return lhs < rhs;
}
};

int main(){
list<int> list_hage;
list_hage.push_back( 5 );
list_hage.push_back( 1 );
list_hage.push_back( 3 );

list_hage.sort( func_object() ); //error: struct func_objectから、struct std::greater<int>に変換できません(VC6)

//確認用
for( list<int>::iterator it = list_hage.begin(); it != list_hage.end(); ++it ){ cout << (*it) << endl; }
return 0;
}

76 名前:デフォルトの名無しさん mailto:sage [04/12/12 15:41:31]
>>75
コンパイラがまずいんじゃないの?gcc3.4.2では普通に通るぞ。

#include <iostream>
#include <list>

struct func_object {
bool operator()(const int& lhs, const int& rhs) const {
return lhs < rhs;
}
};

int main()
{
std::list<int> list_hage;

list_hage.push_back(5);
list_hage.push_back(1);
list_hage.push_back(3);

list_hage.sort(func_object());

//確認用
for (std::list<int>::const_iterator it = list_hage.begin(); it != list_hage.end(); ++it)
std::cout << *it << std::endl;
}

77 名前:うすげ mailto:sage [04/12/12 15:43:16]
hogeの代わりにhageを使うヤツは嫌い。

78 名前:デフォルトの名無しさん mailto:sage [04/12/12 15:54:32]
だからVC6じゃC++は使えないんだって何度言えば

79 名前:デフォルトの名無しさん mailto:sage [04/12/12 15:56:45]
>>76
確認ありがとうございます。おかげですっきりしました。
勉強中の身ですし、頭からコンパイラのせいだ!とは言いづらく…。

>>77
私も眉毛と生え際の間がフォーフィンガーでして、自嘲の意味で良く使うのですが、配慮が足りずすいません。

80 名前:つる mailto:sage [04/12/12 16:03:40]
>>うすげ
気にするな
個性だ




81 名前:デフォルトの名無しさん mailto:sage [04/12/12 21:56:38]
こんどからusageの替わりにusugeを使おう。

82 名前:デフォルトの名無しさん mailto:sage [04/12/14 23:42:13]
偉大なるstroustrupに敬意を示すため
我々C++プログラマは、むしろ積極的にhageを使っていくべきじゃなかろうか

83 名前:Addicted to C++ ◆nrBjarne.g mailto:sage [04/12/14 23:44:30]
むしろ積極的にトリップにBjarneを入れていくべきではないだろうか。

84 名前:デフォルトの名無しさん mailto:sage [04/12/16 16:49:49]
>>78
意味不明。

85 名前:デフォルトの名無しさん mailto:sage [04/12/16 17:28:50]
つまり
VC++6使ってる奴は貧乏人
っていうことですよ

86 名前:デフォルトの名無しさん mailto:sage [04/12/16 17:38:24]
決して割れに手を出さない分、高貴とも言える

87 名前:デフォルトの名無しさん mailto:sage [04/12/16 18:12:58]
金が無いならvc2005 betaでも使えば良いだろ。

88 名前:デフォルトの名無しさん mailto:sage [04/12/16 19:35:46]
金が無いならVCTKでも使えば良いだろ。

89 名前:デフォルトの名無しさん mailto:sage [04/12/16 21:13:44]
金がないならハンドコンパイルすればよいだろ。

90 名前:デフォルトの名無しさん [04/12/17 11:45:57]
Boost.Spirit見てて思ったんだが、
同じようにSQLクエリをC++で記述できないもんかな。

sql.select( Person.name, Person.sex ).from( Person ).where( Person.age>=20 );

ってな感じで。



91 名前:デフォルトの名無しさん mailto:sage [04/12/17 12:40:12]
>>90
わらった。変態すぎ。

92 名前:デフォルトの名無しさん mailto:sage [04/12/17 13:36:33]
>>90
ちょっと面白そう

93 名前:デフォルトの名無しさん mailto:sage [04/12/17 23:54:26]
>>90
今作ってるオリジナル言語のコンパイラが完成したら
開発に着手する気でいたw

94 名前:デフォルトの名無しさん mailto:sage [04/12/18 13:24:58]
>>90
ttp://www.tietew.jp/cppll/archive/330

95 名前:デフォルトの名無しさん [04/12/25 14:39:04]
T1 と T2 が整数型という前提で sizeof(T1) > sizeof(T2) の時に
T2型の整数をゼロ拡張してT1型の整数に変換するテンプレート関数
はどのように書けばよいでしょうか?

template<class T1, class T2>
T1 zero_ext( const T2& x );


96 名前:デフォルトの名無しさん mailto:sage [04/12/25 16:34:01]
ゼロ拡張?
意味不明。
俺用語を使うな。

97 名前:デフォルトの名無しさん mailto:sage [04/12/25 16:34:07]
>>95
template<class T1, class T2>
T1 zero_ext(const T2& x)
{
return static_cast<unsigned T1>(x);
}


98 名前:デフォルトの名無しさん mailto:sage [04/12/25 17:05:50]
>>96 (´゚c_,゚` ) プッ
www.google.co.jp/search?sourceid=navclient&hl=ja&ie=UTF-8&rls=GGLD,GGLD:2004-32,GGLD:ja&q=%E3%82%BC%E3%83%AD%E6%8B%A1%E5%BC%B5

99 名前:デフォルトの名無しさん mailto:sage [04/12/25 17:47:33]
ISO C++の4.7.2にあるunsignedのintegral conversionの事でしょうね。
zero expansionってのはアセンブラの世界では良く使うね。

100 名前:デフォルトの名無しさん mailto:sage [04/12/25 17:51:47]
>>97
それだと、T2が符号付きのときに符号拡張されちゃうんじゃないか?



101 名前:デフォルトの名無しさん mailto:sage [04/12/25 18:05:04]
じゃあこうか?
template<class T1, class T2>
T1 zero_ext(const T2& x)
{
return static_cast<unsigned T1>(static_cast<unsigned T2>(x));
}



102 名前:デフォルトの名無しさん mailto:sage [04/12/25 18:06:37]
そもそもunsigned T1とかできるのかな?

103 名前:デフォルトの名無しさん mailto:sage [04/12/25 18:15:08]
よく知らんが、boost::numeric_convertionってそういう目的のライブラリじゃないのかな?

104 名前:デフォルトの名無しさん [04/12/25 19:10:36]
template<typename T, typename Container = std::map<Key, T>, typename Key = std::size_t> class Tree { };
こういう順番にテンプレート引数を取りたいのですが、どうしたらいいでしょうか?
Tree<int, std::vector<T> >としたときKeyは当然不要なので省略できるようにしたいのです。

105 名前:デフォルトの名無しさん mailto:sage [04/12/25 19:13:29]
テンプレートのデフォルト引数は一つまでだYO

106 名前:デフォルトの名無しさん mailto:sage [04/12/25 19:15:55]
無理じゃね?

107 名前:デフォルトの名無しさん mailto:sage [04/12/25 19:21:17]
Tree<std::vector<int> > としたときTは当然不要なので

108 名前:デフォルトの名無しさん mailto:sage [04/12/25 19:47:26]
struct use_default{};

template <typename T, typename Container = use_default, typename Key = use_default>
class Tree{/* がんばって情報を取り出す */};

boost::iterator_adapterの実装が参考になるかも試練。

109 名前:デフォルトの名無しさん mailto:sage [04/12/25 19:57:26]
おまえらぶーすとに踊らされすぎだぶー

110 名前:デフォルトの名無しさん mailto:sage [04/12/25 20:02:46]
boostは一緒に踊ってくれる数少ない仲間なんだよ。



111 名前:デフォルトの名無しさん mailto:sage [04/12/25 20:04:43]
踊る阿呆に見る阿呆、同じ阿呆なら踊らにゃソンソン

112 名前:デフォルトの名無しさん mailto:sage [04/12/25 21:42:20]
踊らにゃシャンソン

113 名前:デフォルトの名無しさん mailto:sage [04/12/25 22:01:15]
>>111
必ずどちらかの阿呆であるという無理な前提で人を煽るその言葉は大嫌いだ。

114 名前:デフォルトの名無しさん mailto:sage [04/12/25 22:24:27]
2択でもなく決め付けだしな
詭弁だ

115 名前:デフォルトの名無しさん mailto:sage [04/12/25 22:27:59]
なんで踊るよりも見る方が損なのかがわからん。
踊ったら疲れるだけなのに。

116 名前:デフォルトの名無しさん mailto:sage [04/12/25 22:47:49]
理論(見る)より実践(踊れ)てこと

117 名前:デフォルトの名無しさん mailto:sage [04/12/25 22:51:29]
>>115
踊ることが楽しいと言いたいのだろう。

118 名前:デフォルトの名無しさん [04/12/25 23:20:36]
>>101
VC++ 7.1 だと unsigned T1 のような書き方は構文エラーになりました。


119 名前:デフォルトの名無しさん mailto:sage [04/12/26 00:16:22]
C++Templateの便利な機能のうち
Javaでは実現できないことってなんなのかを
教えてください。

120 名前:デフォルトの名無しさん mailto:sage [04/12/26 00:17:25]
特殊化



121 名前:デフォルトの名無しさん mailto:sage [04/12/26 00:18:39]
ていうかほぼ全部?

122 名前:デフォルトの名無しさん mailto:sage [04/12/26 01:13:48]
>>119
使ってすぐ分かるのは、コンテナから取り出すときにナローイング変換しなくていいこと。

123 名前:120 mailto:sage [04/12/26 01:16:18]
あれ?
Java Genericsかと思ったけど、Javaか…


124 名前:デフォルトの名無しさん mailto:sage [04/12/26 04:53:50]
JavaのGenericsってただの自動キャストでそ?
C++のtemplateとは比較にならないのでは・・・

125 名前:デフォルトの名無しさん mailto:sage [04/12/26 08:56:50]
.NETのgenerics、試みは面白い。

126 名前:デフォルトの名無しさん [04/12/26 13:31:14]
で、結局具体的にどんなことがJavaにできなくて
C++で出切るんですか?
C++ではこんなに簡単に書けるのに
Javaで書くとこんな風になっちゃうって例を
出していただけると助かります。
いろいろ考えたんですが、特別優れた使い方ってのが
思いつかなかったので。
もしかして、ないのかな・・・

127 名前:デフォルトの名無しさん mailto:sage [04/12/26 20:01:11]
クマー

128 名前:デフォルトの名無しさん mailto:sage [04/12/26 20:13:40]
               .|   |  | |   |    |  | |
               .|   |  | レ  |    |  | |
    ∩___∩    |   |  |     J    |  | |
    | ノ\   ,_ ヽ  .|   レ |      |  レ|
   /  ●゛  ● |   .J      し         |     |
   | ∪  ( _●_) ミ             .|    し
   彡、   |∪|   |              .J
 /     ∩ノ ⊃  ヽ
 (  \ / _ノ |  |  
  \  "  /  | |  Javaしらね。覚える気もねえし
   \ / ̄ ̄ ̄ /

129 名前:デフォルトの名無しさん mailto:sage [04/12/26 20:56:55]
>>126
Java Genericsは分かるの?

130 名前:デフォルトの名無しさん mailto:sage [04/12/28 00:49:18]
>>126
「オブジェクト指向をベース」にプログラムを書いた場合
JavaのGenericsで全てが事足りる。



131 名前:デフォルトの名無しさん mailto:sage [04/12/28 01:22:25]
速度以外はな。

132 名前:デフォルトの名無しさん mailto:sage [04/12/28 05:44:30]
素人が首突っ込んで申し訳ないが
Javaには専用プラットフォーム必須なんだよね?


要はエミュレータ?

133 名前:デフォルトの名無しさん mailto:sage [04/12/28 08:33:23]
>>132
プラットフォームの意味わかってんのか?

134 名前:デフォルトの名無しさん mailto:sage [04/12/28 12:28:32]
>>126
Lokiのような変態的なライブラリは無理じゃないの?Generics知らんけど。

135 名前:デフォルトの名無しさん mailto:sage [04/12/28 13:19:32]
その変態なLokiなんですけど、TYPELISTって動作遅くしないですか?
継承によって、多義性をサポートさせるのはよい。
コンパイル時にその多義性を作り出すのも良い。

けど、継承って、実行速度おそくなりませんか?


136 名前:デフォルトの名無しさん mailto:sage [04/12/28 13:24:09]
>>134
あれはオブジェクト指向を捨ててるからな。
オブジェクト指向で書き直せばもっときれいなのが作れるよ。

137 名前:デフォルトの名無しさん mailto:sage [04/12/28 13:38:33]
>>135
Modern C++ Designを読めば分かるけど、
LokiのPolicyは仮想関数を使ってないから…

138 名前:デフォルトの名無しさん mailto:sage [04/12/28 13:42:22]
>>135
TYPELISTはコンパイル時のみ。

継承なしで巨大ライブラリを作れる人、使える人はそうしたら良かろう。
Cで書いてあるgtk+みたいなのでも継承しているけどね。

139 名前:デフォルトの名無しさん mailto:sage [04/12/28 13:42:58]
大抵は問題にならん

140 名前:デフォルトの名無しさん mailto:sage [04/12/28 14:51:39]
lokiはデザパタではなくてboost::mplに似ているわけか。



141 名前:デフォルトの名無しさん mailto:sage [04/12/28 15:23:42]
たくさんのレスに感謝。
>137
Modernは読んでます。内容を完全に理解したとは言いがたいですが。
けれども、Efficient読んでるとvirtual使わない継承でも動作遅くなるよ〜。
と書いてあるもので。
「本質的な問題ではない。」が結論なんですけどね。

>138
その通りです。
継承無しでライブラリの作成…作ったことありませんがゾッとします。

>139
>大抵は問題にならん。
継承しまくったオブジェクトを生成&削除しまくるプロジェクトとか
(サーバー用途?)ではどうでしょうか?

ModernのTYPELISTの継承構造見ていると、継承の無駄が多い気がして。
p237のクラス階層とかってつまりは。
class AbstractEnemyFactory :public AbstractFactoryUnit<Soldier>,
      public AbstractFactoryUnit<Monster>, public AbstractFactoryUnit<SuperMonster>

なわけで。

実際に巨大プロジェクトの現場を経験したことのない人間の戯言ですが。


142 名前:デフォルトの名無しさん mailto:sage [04/12/28 15:27:43]
>実際に巨大プロジェクトの現場を経験したことのない人間の戯言ですが。

自覚しているんなら黙れ。っーつか氏ね。

143 名前:デフォルトの名無しさん mailto:sage [04/12/28 15:28:43]
>>142
お前こそ黙っとけよ。

144 名前:デフォルトの名無しさん mailto:sage [04/12/28 15:31:01]
>>143
バーカ

145 名前:デフォルトの名無しさん mailto:sage [04/12/28 15:38:54]
>っーつか氏ね。
OK。発音してみよう。

146 名前:デフォルトの名無しさん mailto:sage [04/12/28 15:48:24]
>>141
それ、TYPELISTなしで書いた方が可読性悪いでしょ。
TYPELISTは実行時に負担ないしね。コンパイル時にやるから。
typeid listじゃないから。

147 名前:デフォルトの名無しさん mailto:sage [04/12/28 15:51:47]
>継承しまくったオブジェクトを生成&削除しまくるプロジェクトとか
>(サーバー用途?)ではどうでしょうか?
メモリ確保&解放は一瞬。メモリに書き込むことは多少重いけど。
ただ、ゲームなんかのメモリ資源が超少ない環境では
メモリのフラグメントなんかが起こって、メモリが足りなくなることはある。


148 名前:デフォルトの名無しさん mailto:sage [04/12/28 16:01:22]
いや、new/deleteは重いけど、
継承しているしていないに関係ない。

継承して複雑な部分を作り出す構造だと、
一つのオブジェクトの中にまとめられるから、
利用するメモリチャンクの数が減ることも考えられる。

Cでやると、ポインタの嵐になって別々の構造体になるから、
malloc/freeを寄り頻繁にする必要がある(事が多い)。

とりあえず、135は、
・templeteが、compile時のみ働くものであること
・詳解C++(いわゆるAnnotated)を読んで、継承のメモリ利用
を勉強しろ。

分からない奴はいつまでたっても設計ができない。

149 名前:デフォルトの名無しさん mailto:sage [04/12/28 16:03:14]
>>148
> Cでやると、

「継承しないでやると、」の方がいいかな。

compositionとinheritanceの違いはAnnotated読んで。

150 名前:デフォルトの名無しさん mailto:sage [04/12/28 16:58:14]
みんなRubyのこと嫌いなの?



151 名前:135 mailto:sage [04/12/28 18:54:45]

自分でTYPELISTでAbstractFactoryを組んで、それをいじくりまわしてみました。
結果:変わらないですね…
なんか狐につままれた感じのするのは私だけでしょうか。

>・詳解C++(いわゆるAnnotated)を読んで、継承のメモリ利用
を勉強しろ

多分これが今の私に必要なんでしょうね。

はい。いろいろとがんばってみます。

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

152 名前:151 mailto:sage [04/12/28 22:14:45]
>結果:変わらないですね… 
コンパイル時間が変わっていると思うけど……






[ 続きを読む ] / [ 携帯版 ]

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

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