【C++】template 統合スレ -- Part3
■ このスレッドは過去ログ倉庫に格納されています
0001デフォルトの名無しさん
NGNG以下のスレッドを統合するスレです。
STLスレッド
Part1 http://pc.2ch.net/tech/kako/1004/10042/1004287394.html
Part2 http://pc3.2ch.net/tech/kako/1026/10267/1026793823.html
【C++】Boost使い集まれ!
http://pc3.2ch.net/test/read.cgi/tech/1033830935/ (html化待ち?)
Generic Programming with C++ Template
http://pc.2ch.net/tech/kako/1008/10085/1008593126.html
【C++】template 統合スレ -- STL/Boost/Loki, etc.
http://pc2.2ch.net/test/read.cgi/tech/1037795348/
【C++】template 統合スレ -- Part2
http://pc2.2ch.net/test/read.cgi/tech/1047978546/ (html化待ち)
関連スレ、その他リンクは >>2-5 あたりに。
0232デフォルトの名無しさん
NGNG0233デフォルトの名無しさん
NGNG型が異なればchar、同じならばchar[2]を返す、
したがってそのsizeofは前者は 1 後者は 2 になるってことでしょう。
sizeofとマクロを使わずに改良できないかな
0234デフォルトの名無しさん
NGNG実装した行列クラスのテストをする場合, どういう風にやるのがいいのでしょうか ?
テンプレートを使うとすべてのコード (というか状況) をテストすることが非常に困難だと
思うのですが.
0235デフォルトの名無しさん
NGNGstruct is_overridden_ {
enum { value = 1 };
};
template<typename T>
struct is_overridden_<T,T> {
enum { value = 0 };
};
template<typename T1, typename T2>
is_overridden_<T1, T2> is_overridden(T1, T2) { return is_overridden_<T1, T2>(); }
is_overridden(&MyClass1::func, &Base::func).value
こんなのは没ですか? 最後の.valueが激しくカコワルイ。
0236デフォルトの名無しさん
NGNGそんなことするぐらいなら
template<typename T1, typename T2> int is_override(T1,T2) {return 1;}
template<typename T> int is_override(T,T) {return 0;}
の方がマシなのでは?
0239デフォルトの名無しさん
NGNGああ、関数のプロトタイプなのね。ありが�d
0240デフォルトの名無しさん
NGNGbool is_override(T1,T2) {return true;}
template<typename T>
bool is_override(T,T) {return false;}
int main(){
cout << is_override((&Base::func) ,(&Base::func)) << endl;
cout << is_override((&MyClass1::func),(&Base::func)) << endl;
cout << is_override((&MyClass2::func),(&Base::func)) << endl;
return 0;
}
結果
0
0
1
これが一番スマートだ。問題ないような気がするけど・・・
0241デフォルトの名無しさん
NGNG既出
0242デフォルトの名無しさん
NGNG0243デフォルトの名無しさん
NGNG0244デフォルトの名無しさん
NGNG0245デフォルトの名無しさん
NGNG#include >>231
#define is_differently_defined is_override
で。
0246デフォルトの名無しさん
NGNG実装してみたんだが、激しく面倒だな。
単純なコンテナのはずなんだが。
ライブラリ書いてるヤシらはいつもこんなことやってるのか…
それとも俺のレベルが低いのかな。
0247デフォルトの名無しさん
NGNGどのレベルまでC++標準のコンテナ要求仕様を実装するのかにもよりそうだが・・
0248デフォルトの名無しさん
NGNG俺は規格書を持ってないから、禿3版のvectorの項を見ながら、
載ってるメンバ関数の内意味を為さないもの(reserveとか)を除いて
書いてみた。標準の定めるコンテナの定義には適わないんじゃないかな。
0249デフォルトの名無しさん
NGNG公開キボン
0250デフォルトの名無しさん
NGNGclass limited_vector : private std::vector< T >
{
typedef std::vector< T > base_type;
public:
limited_vector() { reserve( N ); }
void push_back( T const& x ) { if( size() < N ) push_back( x ); else throw std::bad_alloc(); }
...
こんな方針で行けば楽勝かと思ったけど、
必要なインターフェースを提供するだけでもめんどくさいな。
0251デフォルトの名無しさん
NGNG0252デフォルトの名無しさん
NGNG0253デフォルトの名無しさん
NGNGprivateでアクセスが禁止されているので大丈夫
その前にvectorの上限ぐらい簡単に記述できるんだから
その場所場所のところでチェックしろよって思う
0254デフォルトの名無しさん
NGNGresizeやreserveも提供しないしpush_backの振る舞いも変えてしまうんだから
実装のみを受け継ぐprivate継承は適切だと思うが。
それより俺はアロケータのサポートがない方が気になる。
0255デフォルトの名無しさん
NGNGまあそういう部分まで切りつめたけりゃ結局一から作れってことになるんだが
0256デフォルトの名無しさん
NGNG0257デフォルトの名無しさん
NGNG0258デフォルトの名無しさん
NGNGサイズが変えらんないから無理。
0259デフォルトの名無しさん
NGNGhttp://do.sakura.ne.jp/~junkroom/cgi-bin/megabbs/readres.cgi?bo=lounge&vi=999294620&res=117
一応テストはしたが、あまり信頼しないでくれ。
誰か、holderのまともな奴を考えてくれないかな。
0260デフォルトの名無しさん
NGNG上限付きだからいいと思ったんだが……上限は可変なのか……じゃ確かに無理だな。
0261デフォルトの名無しさん
NGNG0262デフォルトの名無しさん
NGNGboost::aligned_storage
と思ったけど、まだリリースには含まれてないのか。
0263デフォルトの名無しさん
NGNGprivate継承しててもreinterpret_castや(std::vector<T>*)とか使って
キャストされてしまったらいけないから素直にメンバにvectorを抱え込ませた
ほうがいいと思う。
0264デフォルトの名無しさん
NGNG>>259のどこにprivate継承がある?
0265デフォルトの名無しさん
NGNG心配しなくてもよし
0266デフォルトの名無しさん
NGNGありがとう。感動したよ。
mpl読めないから微妙だけど、やっぱりunionに
いろんな型を放り込むのが基本みたいだな。
0268デフォルトの名無しさん
NGNG0269デフォルトの名無しさん
NGNGあんまり反響無いな。
0270デフォルトの名無しさん
NGNG0271デフォルトの名無しさん
NGNG俺もだいぶ前に見たけど10P足らずで表面なぞるだけだったんで
いまさらここで話題にするまでもないと思った。
無理に boost まで出さない方が身のある記事になったんじゃないのって感じ。
0272デフォルトの名無しさん
NGNG0273名無しさん@Vim%Chalice
NGNGハゲ同。boostの記事なんか薄っぺらいだけの無意味なページ稼ぎにしか見えなかった。
0274デフォルトの名無しさん
NGNGSTLの記事の著者は CINT の人だよね。
C言語の記事で、リストについては侵入的なコンテナの方が
いい場合もあるんだって書いてあったけど、STLだと侵入的
リストってないよね。boostにはあるんだっけ?
0275デフォルトの名無しさん
NGNGboost は intrusive_ptr ですな
0276デフォルトの名無しさん
NGNG> 侵入的リスト
面白そうだなあ。boost::iterator_adaptor 使って
侵入的イテレータまでなら作れるかも。
>>275
それは侵入的スマートポインタであって、コンテナには関係ないと思う…。
0277274
NGNGむむ素早い。どうも。
でも intrusive_ptr には、記事に書かれてる侵入的リストの
利点 (iterator ではなくオブジェクトへのポインタを元に O(1)
でリストから erase できる) は、ないように思えるんだけど
気のせい?
0278デフォルトの名無しさん
NGNGSTLコンテナのメンバ関数が
アルゴリズムと同じほど豊富な機能を提供してくれるわけじゃないから
イテレータを高機能にしていくつかの処理をグローバル関数から呼べたらって思うことはあるなあ。
list は安定ソートは持ってても nth_element や partion に当たるものはないし。
メンバ関数は概して xxx_if 系とか集合的な演算とか関数オブジェクトと組み合わせる処理は特に弱いし。
#list を使うときは途中で切ったり入れ替えたりマージしたりって
結構明確な目的があることが多いと思うけど。
0279sage
NGNG美しいところだと思うが…
0280デフォルトの名無しさん
NGNGclass T3 だと今度は
T3を指定せずにコンパイルできてしまうのですが、こういうものなのでしょうか?
template <typename T1,typename T2> struct Q1{};
template <typename T1,typename T2 = Q1<T1,class T3> > struct B
{ typedef T2 type; };
#include<typeinfo>
#include<iostream>
int main()
{ std::cout << typeid(B<int>::type).name() << std::endl; }
0281デフォルトの名無しさん
NGNGテンプレートパラメータはclass,typenameどっちでもいいけど、
テンプレートパラメータのテンプレートパラメータはclassじゃないとダメ。
>T3を指定せずにコンパイルできてしまうのですが、こういうものなのでしょうか?
コンパイラなに使ってますか?
0282デフォルトの名無しさん
NGNGその根拠は?
vc7.1動作確認済み。
template <typename T1,typename T2> struct Q1
{
typedef T2 type2;
};
template<class T=class _1,class U=class _2,template<typename,typename>class TQ = Q1>
struct test
{
typedef typename TQ<T,U>::type2 type;
};
#include <iostream>
#include <typeinfo>
int main()
{
test<> t;
std::cout<<typeid(t).name()<<std::endl;
return 0;
}
0283280
NGNGありがとうございます。
VC7.1、VC6、GCC3.3.1で確認しました。(実行結果はバラバラでした)
これからはtemplateのデフォルトの型を指定するときには
型がちゃんと確定するように気をつけようと思います。
0284デフォルトの名無しさん
NGNGBoost 1.31.0 もうすぐ。
0285名無しさん@Vim%Chalice
NGNGttp://tinytl.sourceforge.net/
なかなかいい感じだ。確かにサンプルのコンパイルはboostの三倍ぐらい早いな。
ただコードが複雑になって来るとインクルードの時間の割合いは減ってくるからどこまで効果あるかは微妙だけど。
まぁソース読むのにはこっちのが良さ気なだけでも十分面白くてありがたいけど。
0286デフォルトの名無しさん
NGNG0287デフォルトの名無しさん
NGNGBoost と置き換えられる軽くて実際に使えるテンプレートライブラリ、らしい。
0288デフォルトの名無しさん
NGNGコンパイルも軽いですとかいうの。boostは
ハードウェア業界からの要請でわざと重くて重厚な
ライブラリを作ってるっていうのに。
0289デフォルトの名無しさん
NGNG0290デフォルトの名無しさん
NGNGcト cト /^、_ノ | 、.__ つ (.__  ̄ ̄ ̄ ̄ ・ ・
ミミ:::;,! u `゙"~´ ヾ彡::l/VvVw、 ,yvヾNヽ ゞヾ ,. ,. ,. 、、ヾゝヽr=ヾ
ミ::::;/  ゙̄`ー-.、 u ;,,; j ヾk'! ' l / 'レ ^ヽヘ\ ,r゙ゞ゙-"、ノ / l! !ヽ 、、 |
ミ/ J ゙`ー、 " ;, ;;; ,;; ゙ u ヾi ,,./ , ,、ヾヾ | '-- 、..,,ヽ j ! | Nヾ|
'" _,,.. -─ゝ.、 ;, " ;; _,,..._ゞイ__//〃 i.! ilヾゞヽ | 、 .r. ヾ-、;;ノ,.:-一'"i
j / ,.- 、 ヾヽ、 ;; ;; _,-< //_,,\' "' !| :l ゙i !_,,ヽ.l `ー─-- エィ' (. 7 /
: ' ・丿  ̄≠Ξイ´,-、 ヽ /イ´ r. `ー-'メ ,.-´、 i u ヾ``ー' イ
\_ _,,......:: ´゙i、 `¨ / i ヽ.__,,... ' u ゙l´.i・j.冫,イ゙l / ``-、..- ノ :u l
u  ̄ ̄ 彡" 、ヾ ̄``ミ::.l u j i、`ー' .i / /、._ `'y /
u `ヽ ゙:l ,.::- 、,, ,. ノ ゙ u ! /_  ̄ ー/ u /
_,,..,,_ ,.ィ、 / | /__ ``- 、_ l l ``ーt、_ / /
゙ u ,./´ " ``- 、_J r'´ u 丿 .l,... `ー一''/ ノ ト 、,,_____ ゙/ /
./__ ー7 /、 l '゙ ヽ/ ,. '" \`ー--- ",.::く、
/;;;''"  ̄ ̄ ───/ ゙ ,::' \ヾニ==='"/ `- 、 ゙ー┬ '´ / \..,,__
、 .i:⌒`─-、_,.... l / `ー┬一' ヽ :l / , ' `ソヽ
ヾヽ l ` `ヽ、 l ./ ヽ l ) ,; / ,' '^i
0291デフォルトの名無しさん
NGNGgccにpch機能が内蔵されれば糞重いboostもきっと軽くなるから
それまでの辛抱。それまでVC7.1でも使っていよう。
0292デフォルトの名無しさん
NGNG0293デフォルトの名無しさん
NGNG0294デフォルトの名無しさん
NGNG君の書いた1万行程度のプログラムだったらPC換えれば早くなるけどねえ。
そんなしょぼいプログラムじゃないのよ。
0295デフォルトの名無しさん
NGNG金があるなら、マシンを 10 台ぐらい並べて分散コンパイルしとけ。
0296デフォルトの名無しさん
NGNG0297デフォルトの名無しさん
NGNG0298デフォルトの名無しさん
NGNG0299デフォルトの名無しさん
NGNG0300デフォルトの名無しさん
NGNG0301デフォルトの名無しさん
NGNGあー言っとくけどx86-64は死ぬよ。
0302デフォルトの名無しさん
NGNG君の書いた1万行程度のプログラムだったらPC換えれば早くなるけどねえ。
そんなしょぼいプログラムじゃないのよ。
0303デフォルトの名無しさん
NGNG1万行以上のソースを 1 ファイルに書いてるのか? それは設計腐ってるとしか……。
ファイルを適切なサイズで分割してあれば、複数のマシンで分割コンパイルすることで、
ほぼマシン数に反比例した時間でコンパイル終わるようになるぞ。分散コンパイルを
サポートするソフトも何社かから出てるから、金で解決しとけ。
0304デフォルトの名無しさん
NGNGレスちゃんと嫁。おまいの妄想だけで話を進めんな。
あとスレ違いだ。氏ね。
0305デフォルトの名無しさん
NGNGIntelもx86-64に参入すると言われているのに、どうやったらそんな話になるんだか。
0306デフォルトの名無しさん
NGNG> レスちゃんと嫁
どれを読めと。縦読み?
0307デフォルトの名無しさん
NGNGヘッダ中に全ての処理を書かなければいけない。
プリコンパイルヘッダを使っていなければ
ソースファイル1つにつき数百のヘッダが少なくともパースされる。
という事では。
どうでもいいけどexportをサポートしてるコンパイラって、
リンク時にコード生成もするのか?
0308デフォルトの名無しさん
NGNG使う側は宣言だけだからリンク時にインスタンス化するほかない。
分割コンパイルする場合はコンパイル時に--exportオプションとかいるみたいだし。
0309デフォルトの名無しさん
NGNGそれと >294 の
> 君の書いた1万行程度のプログラムだったらPC換えれば早くなるけどねえ。
このつながり謎だ。
CPU 速くすればコンパイル時間は短くなるし、翻訳単位ごとにプリプロセスとコンパイル作業を
複数マシンに分散させれば、やっぱりコンパイル時間短くなるぞ。
0310デフォルトの名無しさん
NGNGテンプレートをバリバリ使ったC++ソースのコンパイルで
ちゃんと効果が出るような分散コンパイルができる環境ってあるの?
プリコンパイルヘッダの更新のタイミングが重要だと思うけど。
0311デフォルトの名無しさん
NGNGtemplate知らんのだろうか
0312デフォルトの名無しさん
NGNG頭おかしいんだろ。
放置しておけ。
0313デフォルトの名無しさん
NGNGたぶん、知っていても今までexportが必要じゃなかった。
そして、これからも。そんなレベルの方々なのでしょう。
0314デフォルトの名無しさん
NGNG確かに標準C++のexportキーワードは無理目の仕様。C++の
type safe linkage だって既存のリンカがそのまま使えるように
との配慮だったのに、exportをまともに実現しようとしたらリンカ
に大改造を施さなければならない。
まあ前者はC++が早急に広まるようにという意図かもしれなかっ
たから、C++が十分に拡散した今、exportをまともにサポートして
もいい時期に差し掛かっているのかも。
0315デフォルトの名無しさん
NGNG{文字列列用・・・char型(20バイト以上)
{点数用......int型�A数値変換はmoji_ten関数を使用する。名前を入力させ攻撃用文字列と防御用文字列と体力など攻撃力と防御力設定する。
画面のイメージ↓
/////////////////////////////
/player1の名前を入力して下さい→
/player2の名前を入力して下さい→
/player1の武器を選んでください→
/player2の武器を選んでください→
/player1の防具を選んで下さい→
/player2の防具を選んでください→
/ 戦闘開始
/ player1体力500player2体力500
/ 1ターン目player1に100のダメージplayer2に200のダメージ
/ 2ターン目player1400のダメージplayer2に300のダメージ
/ 引き分けです。
///////////////////////////////////////////
こんな感じで表示させたいです。player1かplayer2のダメージはランダムであと引き分けありで
表示させたです。
最初のこんなしかわりません。w
#include
struct BATTLER
{
char name[20]
int ten
};
void moji_ten(struct BATTLER *);
void main(void)
{
次からよくわりません教えてください。文字列バトラーの応用です。お願いします。
0316デフォルトの名無しさん
NGNG0317デフォルトの名無しさん
NGNGマルチポスト
0318デフォルトの名無しさん
NGNGマジうけたぞーーーーーー。
ああ〜泪がちょちょぎれる
0319デフォルトの名無しさん
NGNG0320デフォルトの名無しさん
NGNGまだまだ。ここ数ヶ月に出たネタだけでも、Notusにfusionにpqsに
indexed_setにxpressiveにNamedParamsにTaggedTypeに・・・
0321デフォルトの名無しさん
NGNG0322デフォルトの名無しさん
NGNG0323デフォルトの名無しさん
NGNGクラスを列挙してくれ。
0324デフォルトの名無しさん
NGNG0325デフォルトの名無しさん
NGNGそれ以外なら format, smart_ptr だな。
何を作るにしても役に立つ
0326デフォルトの名無しさん
NGNGshared_ptr, scoped_ptr,
lexical_cast ,
function, bind ,
array,
optional( てか、これって内部でオブジェクトのコピーしてるのね。重いやつにこれ使うのよくない?)
timer( アルゴリズムのテストするときとかに便利)
thread( dll作成しないといけないのがあれなんで、一部変更してstaticリンクしてみたり。)
0327デフォルトの名無しさん
NGNGcomposeはbindにまとめられるので死亡予定です。
0328デフォルトの名無しさん
NGNG0329デフォルトの名無しさん
NGNGstaticリンクで使えるようにならんかな・・・。
バージョンアップするたびにDLL作るのめんどい。
ところで、vc6でb-jam使ってビルドした場合、bad_alloc投げるようになっているんでしょうか?
0330デフォルトの名無しさん
NGNGいや、boost::regexは普通にスタティックリンクライブラリ使えるだろ。
0331329
NGNG■ このスレッドは過去ログ倉庫に格納されています