トップページ⇒tech
1001コメント355KB

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

■ このスレッドは過去ログ倉庫に格納されています
0001デフォルトの名無しさんNGNG
C++ のジェネリックプログラミングの話をしましょう。
以下のスレッドを統合するスレです。

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デフォルトの名無しさんNGNG
>>231の解説キボンヌ。特に2行目。
0233デフォルトの名無しさんNGNG
helperがテンプレートの特殊化を使って型判別し、
型が異なればchar、同じならばchar[2]を返す、
したがってそのsizeofは前者は 1 後者は 2 になるってことでしょう。
sizeofとマクロを使わずに改良できないかな
0234デフォルトの名無しさんNGNG
皆さんにお聞きしたいのですが, 例えば Expression Template を使って
実装した行列クラスのテストをする場合, どういう風にやるのがいいのでしょうか ?
テンプレートを使うとすべてのコード (というか状況) をテストすることが非常に困難だと
思うのですが.
0235デフォルトの名無しさんNGNG
template<typename T1, typename T2>
struct 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
>>235
そんなことするぐらいなら

template<typename T1, typename T2> int is_override(T1,T2) {return 1;}
template<typename T> int is_override(T,T) {return 0;}

の方がマシなのでは?
0237236NGNG
>>235
>>236の発言は
>>231の
> コンパイル時バージョンにしてみた。
を受けたもの。
0238235NGNG
>>236
それはコンパイル時に評価されないだろ。と思って
自分のも試してみたら両方ともダメだった_| ̄|○
鬱氏

sizeofとマクロを使わずに出来ますか?お願いエロイ人。
0239デフォルトの名無しさんNGNG
>>233
ああ、関数のプロトタイプなのね。ありが�d
0240デフォルトの名無しさんNGNG
template<typename T1, typename T2>
bool 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
>>240
既出
0242デフォルトの名無しさんNGNG
要するに>>231が一番ゴミを増やさずに一番良い方法だね
0243デフォルトの名無しさんNGNG
んだんだ。
0244デフォルトの名無しさんNGNG
cout << is_override((&OtherClass::otherMethod),(&Base::func)) << endl;
0245デフォルトの名無しさんNGNG
>>244
#include >>231
#define is_differently_defined is_override
で。
0246デフォルトの名無しさんNGNG
少し前にC++スレで話題になってた上限つきvectorを
実装してみたんだが、激しく面倒だな。
単純なコンテナのはずなんだが。
ライブラリ書いてるヤシらはいつもこんなことやってるのか…
それとも俺のレベルが低いのかな。
0247デフォルトの名無しさんNGNG
>>246
どのレベルまでC++標準のコンテナ要求仕様を実装するのかにもよりそうだが・・
0248デフォルトの名無しさんNGNG
>>247
俺は規格書を持ってないから、禿3版のvectorの項を見ながら、
載ってるメンバ関数の内意味を為さないもの(reserveとか)を除いて
書いてみた。標準の定めるコンテナの定義には適わないんじゃないかな。
0249デフォルトの名無しさんNGNG
>>248
公開キボン
0250デフォルトの名無しさんNGNG
template< typename T , std::size_t N >
class 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デフォルトの名無しさんNGNG
何で継承なんだ?しかもプライベート
0252デフォルトの名無しさんNGNG
vectorのデストラクタは仮想関数じゃなかったような気がする。
0253デフォルトの名無しさんNGNG
>>252
privateでアクセスが禁止されているので大丈夫

その前にvectorの上限ぐらい簡単に記述できるんだから
その場所場所のところでチェックしろよって思う
0254デフォルトの名無しさんNGNG
仮想デストラクタはもちろん
resizeやreserveも提供しないしpush_backの振る舞いも変えてしまうんだから
実装のみを受け継ぐprivate継承は適切だと思うが。

それより俺はアロケータのサポートがない方が気になる。
0255デフォルトの名無しさんNGNG
確かにsize_t Nとcapacity()の部分は冗長だな。
まあそういう部分まで切りつめたけりゃ結局一から作れってことになるんだが
0256デフォルトの名無しさんNGNG
queueやstackみたいにコンテナアダプタで作るのが妥当って気もするが。
0257デフォルトの名無しさんNGNG
boost:arrayを抱え込んだ方が楽じゃないか?
0258デフォルトの名無しさんNGNG
>>257
サイズが変えらんないから無理。
0259デフォルトの名無しさんNGNG
>>249
http://do.sakura.ne.jp/~junkroom/cgi-bin/megabbs/readres.cgi?bo=lounge&vi=999294620&res=117
一応テストはしたが、あまり信頼しないでくれ。

誰か、holderのまともな奴を考えてくれないかな。
0260デフォルトの名無しさんNGNG
>>258
上限付きだからいいと思ったんだが……上限は可変なのか……じゃ確かに無理だな。
0261デフォルトの名無しさんNGNG
上限とサイズは違うんじゃないか?
0262デフォルトの名無しさんNGNG
>>259
boost::aligned_storage
と思ったけど、まだリリースには含まれてないのか。
0263デフォルトの名無しさんNGNG
>>259
private継承しててもreinterpret_castや(std::vector<T>*)とか使って
キャストされてしまったらいけないから素直にメンバにvectorを抱え込ませた
ほうがいいと思う。
0264デフォルトの名無しさんNGNG
>>263
>>259のどこにprivate継承がある?
0265デフォルトの名無しさんNGNG
reinterpret_castは他にもひどいこといろいろできるからいまさら
心配しなくてもよし
0266デフォルトの名無しさんNGNG
>>262
ありがとう。感動したよ。
mpl読めないから微妙だけど、やっぱりunionに
いろんな型を放り込むのが基本みたいだな。
0267263NGNG
>>264
250みたいにしてるのかとDLせずに勝手に思い込んでた
0268デフォルトの名無しさんNGNG
明けまして、おめでとうございます。
0269デフォルトの名無しさんNGNG
interfaceでtemplateの特集してたけど
あんまり反響無いな。
0270デフォルトの名無しさんNGNG
interfaceでなぜにtemplateなんだろう。
0271デフォルトの名無しさんNGNG
>>269
俺もだいぶ前に見たけど10P足らずで表面なぞるだけだったんで
いまさらここで話題にするまでもないと思った。
無理に boost まで出さない方が身のある記事になったんじゃないのって感じ。
0272デフォルトの名無しさんNGNG
STLの記事はまあまあだったと思う。
0273名無しさん@Vim%ChaliceNGNG
>>271
ハゲ同。boostの記事なんか薄っぺらいだけの無意味なページ稼ぎにしか見えなかった。
0274デフォルトの名無しさんNGNG
>>272
STLの記事の著者は CINT の人だよね。

C言語の記事で、リストについては侵入的なコンテナの方が
いい場合もあるんだって書いてあったけど、STLだと侵入的
リストってないよね。boostにはあるんだっけ?
0275デフォルトの名無しさんNGNG
>>274
boost は intrusive_ptr ですな
0276デフォルトの名無しさんNGNG
>>274
> 侵入的リスト
面白そうだなあ。boost::iterator_adaptor 使って
侵入的イテレータまでなら作れるかも。

>>275
それは侵入的スマートポインタであって、コンテナには関係ないと思う…。
0277274NGNG
>>275

むむ素早い。どうも。
でも intrusive_ptr には、記事に書かれてる侵入的リストの
利点 (iterator ではなくオブジェクトへのポインタを元に O(1)
でリストから erase できる) は、ないように思えるんだけど
気のせい?
0278デフォルトの名無しさんNGNG
確かに、
STLコンテナのメンバ関数が
アルゴリズムと同じほど豊富な機能を提供してくれるわけじゃないから
イテレータを高機能にしていくつかの処理をグローバル関数から呼べたらって思うことはあるなあ。
list は安定ソートは持ってても nth_element や partion に当たるものはないし。
メンバ関数は概して xxx_if 系とか集合的な演算とか関数オブジェクトと組み合わせる処理は特に弱いし。

#list を使うときは途中で切ったり入れ替えたりマージしたりって
 結構明確な目的があることが多いと思うけど。
0279sageNGNG
list に nth_element がないのは、むしろ STL の
美しいところだと思うが…
0280デフォルトの名無しさんNGNG
class T3 を typename T3 にするとコンパイルは通らないのですが、
class 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
>>280
テンプレートパラメータはclass,typenameどっちでもいいけど、
テンプレートパラメータのテンプレートパラメータはclassじゃないとダメ。

>T3を指定せずにコンパイルできてしまうのですが、こういうものなのでしょうか?
コンパイラなに使ってますか?
0282デフォルトの名無しさんNGNG
>>281
その根拠は?
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;
}
0283280NGNG
>>281,282
ありがとうございます。
VC7.1、VC6、GCC3.3.1で確認しました。(実行結果はバラバラでした)
これからはtemplateのデフォルトの型を指定するときには
型がちゃんと確定するように気をつけようと思います。
0284デフォルトの名無しさんNGNG
ttp://lists.boost.org/MailArchives/boost/msg34791.php
Boost 1.31.0 もうすぐ。
0285名無しさん@Vim%ChaliceNGNG
Let's boost で見付けただけなんだが、
ttp://tinytl.sourceforge.net/
なかなかいい感じだ。確かにサンプルのコンパイルはboostの三倍ぐらい早いな。
ただコードが複雑になって来るとインクルードの時間の割合いは減ってくるからどこまで効果あるかは微妙だけど。
まぁソース読むのにはこっちのが良さ気なだけでも十分面白くてありがたいけど。
0286デフォルトの名無しさんNGNG
>>285 って何なの?英語が分からんよ。教えてエロい人.
0287デフォルトの名無しさんNGNG
overviewくらい読めよ。
Boost と置き換えられる軽くて実際に使えるテンプレートライブラリ、らしい。
0288デフォルトの名無しさんNGNG
こういうのは感心しないね。サブセット作って
コンパイルも軽いですとかいうの。boostは
ハードウェア業界からの要請でわざと重くて重厚な
ライブラリを作ってるっていうのに。
0289デフォルトの名無しさんNGNG
やっぱりハード売るためにboostはわざとコンパイルも動作速度も糞重くしてたのか。
0290デフォルトの名無しさんNGNG
         ナ ゝ   ナ ゝ /    十_"    ー;=‐         |! |!
          cト    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デフォルトの名無しさんNGNG
>>289
gccにpch機能が内蔵されれば糞重いboostもきっと軽くなるから
それまでの辛抱。それまでVC7.1でも使っていよう。
0292デフォルトの名無しさんNGNG
今時PCも買えないような貧乏人がプログラミングしてるんですか?
0293デフォルトの名無しさんNGNG
P4EE使いでつが何か?
0294デフォルトの名無しさんNGNG
>>292
君の書いた1万行程度のプログラムだったらPC換えれば早くなるけどねえ。
そんなしょぼいプログラムじゃないのよ。
0295デフォルトの名無しさんNGNG
>>294
金があるなら、マシンを 10 台ぐらい並べて分散コンパイルしとけ。
0296デフォルトの名無しさんNGNG
スレ違いうざいよ
0297デフォルトの名無しさんNGNG
だからP4 3GOver使ってもBoostは重いっつってんだろ(゚Д゚)ゴルァ!!
0298デフォルトの名無しさんNGNG
〜(・∀・)〜
0299デフォルトの名無しさんNGNG
今時P4かよw
0300デフォルトの名無しさんNGNG
だから C3PO 使ってもBoostは重いっつってんだろ(゚Д゚)ゴルァ!!
0301デフォルトの名無しさんNGNG
>>299
あー言っとくけどx86-64は死ぬよ。
0302デフォルトの名無しさんNGNG
>>295
君の書いた1万行程度のプログラムだったらPC換えれば早くなるけどねえ。
そんなしょぼいプログラムじゃないのよ。
0303デフォルトの名無しさんNGNG
>>302
1万行以上のソースを 1 ファイルに書いてるのか? それは設計腐ってるとしか……。

ファイルを適切なサイズで分割してあれば、複数のマシンで分割コンパイルすることで、
ほぼマシン数に反比例した時間でコンパイル終わるようになるぞ。分散コンパイルを
サポートするソフトも何社かから出てるから、金で解決しとけ。
0304デフォルトの名無しさんNGNG
>>303
レスちゃんと嫁。おまいの妄想だけで話を進めんな。
あとスレ違いだ。氏ね。
0305デフォルトの名無しさんNGNG
>>301
Intelもx86-64に参入すると言われているのに、どうやったらそんな話になるんだか。
0306デフォルトの名無しさんNGNG
>>304
> レスちゃんと嫁
どれを読めと。縦読み?
0307デフォルトの名無しさんNGNG
C++テンプレートはexportキーワードがサポートされていないコンパイラ(ほとんど)だと
ヘッダ中に全ての処理を書かなければいけない。
プリコンパイルヘッダを使っていなければ
ソースファイル1つにつき数百のヘッダが少なくともパースされる。

という事では。
どうでもいいけどexportをサポートしてるコンパイラって、
リンク時にコード生成もするのか?
0308デフォルトの名無しさんNGNG
Comeuのドキュメントとか見てるとそんな感じっぽいな。
使う側は宣言だけだからリンク時にインスタンス化するほかない。
分割コンパイルする場合はコンパイル時に--exportオプションとかいるみたいだし。
0309デフォルトの名無しさんNGNG
>>307
それと >294 の
> 君の書いた1万行程度のプログラムだったらPC換えれば早くなるけどねえ。
このつながり謎だ。

CPU 速くすればコンパイル時間は短くなるし、翻訳単位ごとにプリプロセスとコンパイル作業を
複数マシンに分散させれば、やっぱりコンパイル時間短くなるぞ。
0310デフォルトの名無しさんNGNG
>>309
テンプレートをバリバリ使ったC++ソースのコンパイルで
ちゃんと効果が出るような分散コンパイルができる環境ってあるの?
プリコンパイルヘッダの更新のタイミングが重要だと思うけど。
0311デフォルトの名無しさんNGNG
なんだかJava厨が湧いてきたみたいだな。
template知らんのだろうか
0312デフォルトの名無しさんNGNG
>>309
頭おかしいんだろ。
放置しておけ。
0313デフォルトの名無しさんNGNG
>>311
たぶん、知っていても今までexportが必要じゃなかった。
そして、これからも。そんなレベルの方々なのでしょう。
0314デフォルトの名無しさんNGNG
>>311
確かに標準C++のexportキーワードは無理目の仕様。C++の
type safe linkage だって既存のリンカがそのまま使えるように
との配慮だったのに、exportをまともに実現しようとしたらリンカ
に大改造を施さなければならない。

まあ前者はC++が早急に広まるようにという意図かもしれなかっ
たから、C++が十分に拡散した今、exportをまともにサポートして
もいい時期に差し掛かっているのかも。
0315デフォルトの名無しさんNGNG
2つの文字列を入力し、数値化したものを比較、勝敗を表示する。但し文字列と数値データは構造体で扱う。又、文字列、→数値変換はmoji_ten()関数を処理する。準備するもの�@構造体定義より
{文字列列用・・・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デフォルトの名無しさんNGNG
なんで template なの〜
0317デフォルトの名無しさんNGNG
>>315
マルチポスト
0318デフォルトの名無しさんNGNG
>>315
マジうけたぞーーーーーー。
ああ〜泪がちょちょぎれる
0319デフォルトの名無しさんNGNG
そろそろboost内でもテンプレートライブラリネタが尽きたかんじ?
0320デフォルトの名無しさんNGNG
>>319
まだまだ。ここ数ヶ月に出たネタだけでも、Notusにfusionにpqsに
indexed_setにxpressiveにNamedParamsにTaggedTypeに・・・
0321デフォルトの名無しさんNGNG
むしろもうなにやってんだかさっぱりわかんない。>Boost
0322デフォルトの名無しさんNGNG
NamedParamsはもう大分だつような
0323デフォルトの名無しさんNGNG
Boost初心者の漏れにC++erとしてたしなみといえる
クラスを列挙してくれ。
0324デフォルトの名無しさんNGNG
boost::regex あたりから入るのはどうかね?
0325デフォルトの名無しさんNGNG
標準の補完としての functional と compose
それ以外なら format, smart_ptr だな。
何を作るにしても役に立つ
0326デフォルトの名無しさんNGNG
俺的よく使うもの
shared_ptr, scoped_ptr,
lexical_cast ,
function, bind ,
array,
optional( てか、これって内部でオブジェクトのコピーしてるのね。重いやつにこれ使うのよくない?)
timer( アルゴリズムのテストするときとかに便利)
thread( dll作成しないといけないのがあれなんで、一部変更してstaticリンクしてみたり。)
0327デフォルトの名無しさんNGNG
>>325
composeはbindにまとめられるので死亡予定です。
0328デフォルトの名無しさんNGNG
とりあえずnoncopyable
0329デフォルトの名無しさんNGNG
boost::threadとかregexとか、あそこらへん
staticリンクで使えるようにならんかな・・・。
バージョンアップするたびにDLL作るのめんどい。

ところで、vc6でb-jam使ってビルドした場合、bad_alloc投げるようになっているんでしょうか?
0330デフォルトの名無しさんNGNG
>>329
いや、boost::regexは普通にスタティックリンクライブラリ使えるだろ。
0331329NGNG
すまん、regexはできたな、スタティックリンクも・・・。
■ このスレッドは過去ログ倉庫に格納されています