トップページtech
985コメント328KB

Generic Programming with C++ Template

レス数が950を超えています。1000を超えると書き込みができなくなります。
0001デフォルトの名無しさんNGNG
C++ による Generic Programming の話をしよう。

参考図書:
Modern C++ Design
Andrei Alexandrescu, Addison-Wesley, ISBN:0-201-70431-5
(訳書: ピアソン・エデュケーション, ISBN:4-89471-435-3)
http://cseng.aw.com/book/0,,0201704315,00.html

Generic Programming - STL による汎用プログラミング
Matthew H. Austern, ASCII, ISBN:4-7561-3441-6

関連スレッド:
C++相談室 Part3
http://pc.2ch.net/test/read.cgi/tech/1003832761/

STL スレッド
http://pc.2ch.net/test/read.cgi/tech/1004287394/
0002デフォルトの名無しさんNGNG
じぇねりっく
0003デフォルトの名無しさんNGNG
とりあえずネタふり。

1で挙げた Modern… は、3章まで読んだ。いままでのところ、ムズいと
感じたのは 1章かな。ポリシーというのになじみがなかったもので。
正直、ポリシーと特性 (traits) の違いがよくわかっていない。

3章はテクニックの話なので、むしろ分かりやすかった。LISP という
よりは prolog とかの単一化のイメージに近いね。こんなことが
template でできるということには驚いたが。でも、タイプリスト
なるものの使い方については、まだ、まったくわからん。
0004デフォルトの名無しさんNGNG
何ができるのか具体的に書いてくれよ。
0005デフォルトの名無しさんNGNG
一個のタイプミスで百行ぐらいエラーを出せる。
0006デフォルトの名無しさんNGNG
>>3
> でも、タイプリストなるものの使い方については、まだ、まったくわからん。
型によってコンパイル時に関数を選択させる場合に使える。STL で似たようなことをやってるのは、
iterator によってアルゴリズムを選択してるヤツかな。たとえば advance() は

  randome access iterator なら iter += n
  forward iterator なら ++iter を n 回

で処理するようになってる。(あれの魔法の種は iterator_traits なんで、ちょっと違うけど)
0007デフォルトの名無しさんNGNG
具体例: 1の本の「推薦の言葉」から。

// コンパイル時にチェックできる assert
template<bool> struct CTAssert;
template<> struct CTAssert<true> {};

で、たとえば CTAssert<sizeof(int) == 0> とかやるとコンパイルエラーを
出してくれる。ぜんぜん generic ってな感じはしないけどね。
0008デフォルトの名無しさんNGNG
STLスレでやれよ。
0009デフォルトの名無しさんNGNG
>>8
意味わかってる?
Generic Programingとは違う。
この本に載っている技法は「Generative Programming」生成的プログラミング
といわれるだぜ?

俺は「Generative Programming」萌えだ。
C++のtemplate特性を逆手に、とった巧妙な技法だ

ちなみにC++に依存してるわけじゃない。
たぶんPerlでもASPでもできる。
0010デフォルトの名無しさんNGNG
漏れも Modern ... 読んでる YO!
楽しい NE!

デモチョトボクニハムズカシイヨ…
0011高校生NGNG
いったいどういうものなんですかね?>Generative Programming
いわゆるGoFのPrototypeパターンとは別物?
それともLISPのマクロみたいに実行時にクラスを
生成するのか?(C++では絶対無理だと思うが。。。)

#例外が実装される前は良く使ったけどなぁ>C++
0012デフォルトの名無しさんNGNG
>>11
>それともLISPのマクロみたいに実行時にクラスを
>生成するのか?(C++では絶対無理だと思うが。。。)

もちろんLISPのようなクラスを生成というのは無理だ。
ある意味、LISPの様にC++でも生成できる様にしている。
templateを使いクラスを生成するためパーツを作ってるんだ。
0013高校生NGNG
なんか面白そうだなぁ。。。GoFの23パターンとは
違う新手のアーキテクチャーなんだろうか?
訳書で4800円か。。。まずは立ち読みから(;;
001412NGNG
上のものは誤解を招きそうなので補足する。
(まあ俺は消防だから話半分ぐらいで聞いてくれ)

Generative Programmingとオブジェクト指向は直行している
Generative ProgrammingとSTLを使うとHaskell的プログラミングができそうだ。

「Modern C++ Design」のHP
ttp://cseng.aw.com/book/0,,0201704315,00.html
にLokiといライブラリが公開されている。
見てみてはどうかな?
(サンプルコードが無いから本を読まないと使えんか)
0015デフォルトの名無しさんNGNG
>>11
Generative じゃなくて Generic の方だが、俺は次のように理解している。

手続き型のプログラミングでは「手続き」を定義することで、
オブジェクト指向プログラミングでは「インターフェース」を定義することで、
ソフトウェアの抽象化を進めた。

それでも抽象化できてないものの一つに「ループ」なんてのがある。たとえば整数の配列や
文字列をコピーするコードは、効率を考えなければどれも

for (i = 最初; i < 最後; ++i)
  dst[i] = src[i];
みたいなものだが、これは手続き型でも OO でも、汎用的には書けないわけだ。コピーする
「手続き」、たとえば memcpy とかあるだろと反論するかもしれないが、あれは

 特定の型やデータ構造に縛られる

という点で、汎用的ではない。たとえば C++ のオブジェクトなんかは、単純にメモリをコピー
して済ますわけには行かない。参照カウンタつきのクラスなんかは、そんなことしたら確実
に壊れるし。

そこで「一連の要件」を定義することで、汎用的で再利用可能なアルゴリズムを定義できる
ようにしたのが Generic プログラミング(C++ の規格書読んでると Assinable Type とか出
てくるけど、あれが要件)。ただ「一連の要件」というのが曲者で、手続きや型と比べると把
握しづらいんだよな。

C++ でうまくテンプレートを使ったコードを読むと「このループ何」みたいなことが少ない。
ループや比較に名前がついていて、コードを読んで意図が汲みやすいようになってる。
いまどき変数を使わずアドレス直書きなプログラムなんざ

 「たとえ正しく動いていようが、こんなプログラムメンテナンスできん」

と思うように、将来は名前の無いループや比較演算を直接埋めたプログラムは

 「読めるか、こんな抽象度の低いコード」

とか言われるのかも知れず。
0016デフォルトの名無しさんNGNG
直行ってなんですかー?
0017デフォルトの名無しさんNGNG
情報提供:三省堂
■[直行]の大辞林第二版からの検索結果 

ちょっこう ちよくかう 【直行】

(名)スル

(1)途中どこにも寄らず、目的地へまっすぐ行くこと。「出張先から会社に―する」
(2)人の思惑などを考えず思うとおりに行うこと。「直言―」「―の士」
(3)正しいおこない。
0018デフォルトの名無しさんNGNG
>>16
まじれす
各概念が独立していること
単独でも使えるし、組み合わせることも可

(元ねた、XYグラフはX軸とY軸は直行している)
0019高校生NGNG
>>15
一種のTemplate methodと考えるのはまずいですかね?
>>18
一次結合のヴェクトルが一次独立なら「直交」が正しいと思う。
0020デフォルトの名無しさんNGNG
>>18
ちゃいます。
正直、ム・マ板では「直交」はNGワードですな(藁

>>19
正解(漢字が)
0021デフォルトの名無しさんNGNG
>>19
> 一種のTemplate methodと考えるのはまずいですかね?
それはあくまで「手法」の一つであって、背景にある「概念」とは異なると思う。オブジェクト指向って
関数ポインタですよね、というのと同じぐらいには外してると思うぞ。

(Generic プログラミングをサポートするのは C++ に限らないわけだし)
0022デフォルトの名無しさんNGNG
age
0023デフォルトの名無しさんNGNG
Builderつかってるんだけど、
テンプレート使ってると時々コンパイラがFatalErrorを吐く。
自分が間違っているのか、コンパイラの問題なのか分からなくて悩む。
ま、VC6よりはましだけど。

#とりあえずage
0024デフォルトの名無しさんNGNG
>>23
Templateだけ展開するコマンド無かったっけ?
0025デフォルトの名無しさんNGNG
>>23
どんなコードでFatalErrorになるの?

ちなみにBCC5.5はANSI C++には対応していません。
うそ書くなBorland
0026デフォルトの名無しさんNGNG
>>25
23 じゃないけど、たとえばこんなコード。

vector<vector<int> > vv;
for_each(vv.begin(), vv.end(), boost::bind(&vector<int>::resize, _1, 1));

致命的エラー F1004 vv.cpp 14: コンパイラ内部のエラー(関数 main() )
002723NGNG
たしかね、
template <template class<> class C, typename T>
C<T> function() {return C<T>();}
みたいなの。
コードの方が間違ってる気もするんだけど…。
BCC5.5はISO C++と違う部分もいくつかあるけど
(temlate <typename T> friend function<T>();がだめなのは参ったけど)
まあ比較的頑張ってるんじゃないかな。
Windows用コンパイラでもっといいのある?
0028デフォルトの名無しさんNGNG
>>27
Modern C++ Design の著者は、サンプルコードを

 Comeau C++ 4.2.38
 CodeWarrier Pro 6.0

で動作確認した、と書いてある。あとは gcc 3.x 系列じゃないかな。

(妥協して VC7 ってのも現実的な選択肢だと思うけど)
0029デフォルトの名無しさんNGNG
>28
Loki の readme.txt に
> Also, Loki has been ported to gcc 2.95.3 by Nick Thurn.
ってあるよ.
0030デフォルトの名無しさんNGNG
generic programmingというのは、
objectを中心とするような王道OOとは違って、
generic functionを基本とするprogrammingのことね。

C++だと、template、operator/method/function overloadを使う。
0031デフォルトの名無しさんNGNG
Modern C++ Designは、CUJのExpert ForumとかGotWとか好んで見てる人に
とっては必読の1冊ですよね。意外に早く翻訳されたのでよかった。
スマートポインタとかFactoryの話が出たので、ProxyとかFlyweightの例も
欲しかった気がしますが。

メインの開発環境がVisual C++ 6なんですが、Loki全部は通らないみたい。
Windows環境でコンパイル通そうと思ったら、CodeWarriorのWin版か
Cygwin+α的なのに頼ることになりそうですかね?

Lokiのうち、templateのパラメータにtemplate使ってるやつとか、
部分的な特殊化の入ってる部分以外は通ると思ったんで、そいつらを使わない
書きかたで置きかえられるかな、とおもってチャレンジしてみたんですけど
全て敗北しました。「あぁ、こりゃしかたないか」みたいに感じたんですけど、
単に、実力が足りんような気もするし。

部分的に汎用性を捨てて、固定のポリシーで書きなおしてやれば、
それはそれで、それなりに使えるような気もします。

Lokiを使いたいところだけ、通せるコンパイラでライブラリ化してやって
そいつをVC6で使うのはどうだろうかと思ったんですが、それはそれで
ライブラリの名前マングリングの話があって面倒なのでは、とか。
(試してみた人いません?)

いや、、単なる感想で特に言いたいこともないんですが。。。
0032デフォルトの名無しさんNGNG
templateだとexportできないとライブラリ化できないと思う...。
003331NGNG
う、、コンパイル不可なものは所詮をexportするわけにはいかん、と
そういう指摘でしょうか。lokiをコンパイル可能なコンパイラに
templateインスタンスをexportする機能がついているのか、という
お話でしょうか。。

VC++なDLLの場合、templateインスタンスなクラスはexportできるみたいで。
ライブラリ側でポリシーの選択までやっちゃって必要なインスタンスクラスだけ
exportする、という使い方はどうかと。export側とimport側でコンパイラとか
標準ライブラリのバージョンが違って出来上がるバイナリが変わってしまったら
コケるかもしれませんが。

lokiそのものをライブラリ化しよう、というわけではないので、PImplな部分を
lokiで作ってやって、dll exportなインターフェイスをつけてやれば、よいか
と思ったんですが、実行時のパフォーマンスは落ちそうですね。

ライブラリ化してる時点でありがたみ半減には違いないです。
0034デフォルトの名無しさんNGNG
32 の言っているのは、template の前に付ける export キーワードのこと
でしょう。私は、これをサポートしているコンパイラ (というかリンカか?)
って見たことないです。
でも、33 の言うようにテンプレートを個々にインスタンス化したものは、
DLL の意味で export 可能だろうとは思います。
0035デフォルトの名無しさんNGNG
あぁ、exportですか。
なんかで見た記憶があります。プログラミング言語C++第3版だったと思うけど。。
正直いって、どういうしくみになってるのか想像できなかったんですよ、あれは。
テンプレートパラメータが残ってるから。

翻訳単位が違うってことは、テンプレートパラメータが何になってもいいよ、
っていうオブジェクトがあって、それが外部から参照できます、ってこと
ですよね。それってどういう風に実装できるんでしょう、リンカ的に。
なんかいろいろ制約がつきそうですが。
(厨房に解説してやろうというかたお待ちしております)

コンパイル済みオブジェクトにgenericな動作がさせられるっていうのは
なにやら凄そうですが。
0036デフォルトの名無しさんNGNG
勝手な想像ですが、すなおに考えると、export を見た時点ではコンパイラは
たんに export があったということを覚えているだけ。リンク時に未定義な
テンプレートインスタンスが発見されるので、そこで初めてインスタンス生成を
開始。つまりリンカの協力のもとに遅延コンパイルをするという感じかなぁ。
0037デフォルトの名無しさんNGNG
http://research.microsoft.com/projects/clrgen/
に面白い話が載ってるよ。CLRに言語共通なgenericsを導入しようと言う話。
Lazy dictionary creation, JIT, Specialization and Sharingなど、
これまでのlinkerをかなり逸脱する話が含まれてる。(つーか実行時…)
0038デフォルトの名無しさんNGNG
>>37
そのページのタイトル、「COM+ 2.0 Generics」...
0039デフォルトの名無しさんNGNG
>>27
typoがあるYO。

template <template <class> class C, typename T>
C<T> function()
{
  return C<T>();
}
0040デフォルトの名無しさんNGNG
>>39
失礼。書き間違えちゃった。
でも、39のでもダメなんだよね...。これって規格上だめなのかな。
0041デフォルトの名無しさんNGNG
>>40
functio < C < T > >();
じゃだめ?

>>27
>(temlate <typename T> friend function<T>();がだめなのは参ったけど)
これは言語の設計上できないようにしているだけ。
friend classは限定的につかおうってこと
0042デフォルトの名無しさんNGNG
>>41
27 が書きたかったのは、
template<typename T> class Hoge {
frind T function<T>();
};
ということだと思うけど。これは規格上 OK です。つか、function の後の
<T> の有無で意味が変わる。g++ は標準規格に合ってるけど、VC++ なんかは
合っていませんね。
0043デフォルトの名無しさんNGNG
>>27,>>39
うーん、メタテンプレートみたいのを使いたいということ?
これのテンプレート引数の C って、それ自身がテンプレートになってるような
書き方だけど。
でも、そもそもどうやったらテンプレートそのものを引数として渡せるのやら。

004427NGNG
>>42
それは、あのあと確かめたらBCC5.5.1はgccと同じ(規格と同じ)でした。ごめん。
関連することでは、今ISOの規格書読みながらいろいろ試してるんだけど、
template <typename T>
class SampleClass
{
//...
};
の定義の中で、
template <typename T, typename U>
void TestFunction(const TestClass<T> &, const TestClass<U> &);
をfriendにするにはどうしたらいいんでしょう。
BCC5.5.1だとどうやってもエラーになってしまう。
(「宣言が間違ってる」みたいなエラーだから、単なるコーディングミスかも知れない)

あの時書きたかったのは、
template <typename T>
class Hoge {
template <typename U>
friend class Hoge<U>;
};
みたいなのなんです。
(今回も手元にソース持ってきてないので適当に書いてますが...。)
サポートされてない、ってエラーが出ちゃうんだよね。
Effective C++の付録のsmart pointer実装例では使っているので、
規格決定直前に変更になってなければ規格上OKだと思うんだけど。

>>43
template引数にtemplateを使うのは問題ないはずなんだけど...
004527NGNG
ごめん。
class SampleClass
じゃなくて、
class TestClass
です。

コンパイラ通してから書かなきゃだめだね、こりゃ。
004643NGNG
うたがってすまんかった。たしかにテンプレート引数としてテンプレートを
取ることはできるね。でも、その有効な使い道というのがよくイメージできないなあ。
0047デフォルトの名無しさんNGNG
>>46
そのクラスがつかうコンテナを選ぶとか?

cls<vector>
cls<list>
0048デフォルトの名無しさんNGNG
>>44
規格によれば、
template <typename T, typename U>
friend void TestFunction(const TestClass<T> &, const TestClass<U> &);
でよいみたいだけど。でも、クラステンプレートの引数と T がかぶっているのは
まずいかもしれませんね。

friend クラスのほうは、
template <typename T>
class Hoge {
template <typename U>
friend class Foo;
};
でよいみたい。(foo の後の <U> がいらない)) >>44 だと、どちらも Hoge に
なってるけど、それは単なる typo?

0049デフォルトの名無しさんNGNG
>>44
VCではコンパイル通ったよーん。
0050デフォルトの名無しさんNGNG
今読んでる。
普通のC++プログラミングを実数軸の話とすれば、
テンプレートを使った繰り返しや再帰は虚数軸の話だと思った。
抽象度が高すぎるたとえですまぬ。
0051 NGNG
>50
をぃをぃ,それだけじゃ何を読んでるのか分からん人も出て来るだろ.
まぁ Modern C++ Design なんだろうなぁとは思うが.
0052デフォルトの名無しさんNGNG
ごめん、この本専用のスレだと思ってた。
Googleで"Modern C++ design"検索してたまたまこのスレにたどり着いたので。
Functor萌え。
0053デフォルトの名無しさんNGNG
//from "C++ Template as Partial Evaluation"

template<int N>
class Pow
{
public:
 static const int result = Pow<N-1>::result * N;
};

class Pow<1>
{
public:
 static const int result = 1;
};

//...
 const int a = Pow<5>::result;
//...
0054デフォルトの名無しさんNGNG
Factorial じゃないのか??
0055デフォルトの名無しさんNGNG
Functorはやはり関手と訳すのでしょうか?
0056デフォルトの名無しさんNGNG
>>53
>template<int N> class Pow {
>public:
> static const int result = Pow<N-1>::result * N;
こういう場合はstruct Powにしましょう。
非公開メンバー&メソッド無いんですから。

でもGenerativeプログラムの基本やね
汎化と特化のいい関係。
005753NGNG
>>54
そう。スマソ。階乗とべき乗のどっち書くかぼんやり迷ってたから混ざった……。
005853NGNG
>>55
classを類とは訳してないからいいんじゃない?(w
0059デフォルトの名無しさんNGNG
Generic Programmingってさあ、
C/C++のマクロのパワーアップ版って言ったらダメかなぁ。
オブジェクト指向マクロとか。
0060デフォルトの名無しさんNGNG
>>59
結果的にそうなってるだけ。
006153NGNG
>>59
ダメ。機能限定版でもあるから(w。

・マクロはトークンならなんでも置き換えてくれる(予約語さえ)けど、
 templateは型か特定の型の定数しか置き換えてくれない。

・マクロはパラメタのないトークンを置き換えられるが、
 関数テンプレートは関数しか置き換えられないし、
 クラステンプレートを使うには型宣言のときにパラメタ指定が必要。

・マクロ展開の際に引数は文字列として結合ができる
 templateは与えられた引数を文字列として加工する能力はない。

・マクロはプログラムのごく一部にだけ選択的に作用させることもできるが、
 テンプレートはグローバルに影響を及ぼす。

・・・・・・だからマクロとテンプレートには似た性質
(コンパイル時までに処理される)もあるけど、
別のものと思ったほうがいい。
0062デフォルトの名無しさんNGNG
//from "Expression Template Technique"
//(1) Exp<T> and BinOp<T1,T2>

template<typename T>
struct Exp
{
typedef ContType T;
virtual ContType eval(int i) = 0;
};

template<typename T1, typename T2>
struct BinOp : public Exp<T1::ContType>
{
 T1 a1;
 T2 a2;

 BinOp(T1 arg1, T2 arg2)
  :a1(arg1), a2(arg2), op(operation)
  {;}

virtual ContType operation (ContType, ContType) = 0;

 ContType eval(int i)
  {return (operation(a1.eval(i), a2.eval(i)));}
};
0063デフォルトの名無しさんNGNG
//from "Expression Template Technique"
//(2) operators : AddOp<T1,T2> and operator "+" overloading

template<typename T1, typename T2>
struct AddOp : public BinOp<T1,T2>
{
 ContType operation (ContType a1, ContType a2)
  {return (a1 + a2);}
}

template<typename T1, typename T2>
AddOp<T1,T2> operator+ (T1 a1, T2 a2)
{return (AddOp(a1, a2));}
0064デフォルトの名無しさんNGNG
//from "Expression Template Technique"
//(3) Vector<T>

template<typename T>
struct Vect : public Exp<T>
{
 typedef ContType T;
//...
 T* cont;
 int n;

 Vector(int size)
  : n(size), cont(new T[size])
  {;}

 ContType eval(int i)
  {return (cont[i])}

 operator= (Exp<ContType> exp)
  {
  for(int i=0; i<n; i++)
   {cont[i]=exp.eval(i);}
  }
};
0065デフォルトの名無しさんNGNG
//from "Expression Template Technique"
//(4) sample expression

//...
Vector<double> v1;
Vector<double> v2;
Vector<double> v3;
Vector<double> v_res;
//...
v_res = v1 + v2 + v3;
0066デフォルトの名無しさんNGNG
//>>63 訂正
//from "Expression Template Technique"
//(2) operators : AddOp<T1,T2> and operator "+" overloading

template<typename T1, typename T2>
struct AddOp : public BinOp<T1,T2>
{
 AddOp(T1 a1, T2 a2)
  : BinOp(a1, a2)
 {;}

 ContType operation (ContType a1, ContType a2)
  {return (a1 + a2);}
};

template<typename T1, typename T2>
AddOp<T1,T2> operator+ (T1 a1, T2 a2)
{return (AddOp(a1, a2));}
006753NGNG
//>>54 こんどこそPowだと思う(弱気sage)

template<int N, int X>
class Pow
{
public:
 static const int reult =
  (N%2==1)?X:1)*(Pow<(N>>1)>::result)*(Pow<(N>>1)>::result);
};

template<int X>
class Pow<0, X>
{
public:
 static const int result = 1;
};

//...
 const int pow5_5 = Pow<5,5>::result;
//...
0068デフォルトの名無しさんNGNG
>>67
static使うのはまずくない?リンカは削除できるのか?
あとコンパイル時に計算するのにN%2をやるのはなんかけなげ。
コンパイル時間を短縮するための効率的な構造とかてできそうで
怖い。SchemeをコンパイルタイムにやるC++は異常。
0069デフォルトの名無しさんNGNG
>>67
いやいやちょっとまて。static const intが
コンパイル時評価であることは保証されているのか?
てか?文は実行時だろう。とするとこれは
数字を保持したstatic intオブジェクトを
実行時の静的オブジェクト初期化時に順に掛けていくという
クレイジーなプログラムになるんじゃないか?
0070デフォルトの名無しさんNGNG
>>67
static const int じゃなくて enum にすれ。
007171?NGNG
>>67
template<int I,int P>struct Pow{
  enum{R = I * Pow<I,P-1>::R};
};

template<int I>struct Pow<I,0>{
  enum{R = 1};
};
007253NGNG
>>68
テンプレートから展開されるクラス定義の数を減らす効果があるっす。>N%2とPow<(N>>1)>
クラス内のstaticはクラス1つに1個の意味だからそんなに仮に領域が割り当てられていたとしても、
クラス定義を処理する以上には悩ましくはないかと。>static

>>69
プログラミング言語C++第3版 A.5によれば
constant expressionにconditional expression(?: && ||)は含まれるらしいすよ。
ということは評価時に定数になるならば立派に定数式っす。
で、定数式ならコンパイル時に計算され、constに領域は割り当てられない筈。
007353NGNG
具体的には
N=5
ならば
5%2=1 5>>1=2
2%2=0 2>>1=1
1%2=1 1>>1=0
が順に計算できるから
クラス定義の参照関係
Pow<5,X>→Pow<2,X>→Pow<1,X>→Pow<0,X>
という順序に従ってクラス定義が
Pow<5,X>←Pow<2,X>←Pow<1,X>←Pow<0,X>
と展開されていくので
Pow<0,X>::result=1、
Pow<1,X>::result=X*(Pow<0>::result)*(Pow<0>::result)=X、
Pow<2,X>::result=1*(Pow<1>::result)*(Pow<1>::result)=X*X、
Pow<5,X>::result=X*(Pow<2>::result)*(Pow<2>::result)=X*X*X*X*X
の順で初期値が確定する。
007453NGNG
//>>67を一般の引数用に改良、多分展開されるはず。

template<typename T, int N>
class Pow
{
public:
 T operator() (T x)
  {
  T pw = Pow<(N>>1)>(x);
  return (((N%2==1)?x:1)*pw*pw);
  }
};

template<typename T>
class Pow<T,0>
{
public:
 T operator() (T)
  {return (1);}
};

//...
 double pow5_5 = Pow<double,5>(5);
//...
0075デフォルトの名無しさんNGNG
>>74
> 多分展開されるはず。
試してみ。
007653NGNG
>>75
お家にはC++コンパイラ置いてないの(しくり)。今、容量に余裕がなくって。
007753NGNG
とはいえ、
類似のコードは昔論文を読んだときに
g++で試したので、書き損じが無ければ>>74も動作はする筈。
inline展開と定数伝播の程度・能力に関してはコンパイラによるけど。
0078デフォルトの名無しさんNGNG
>>72-74
staticは意味が大きすぎてリンカは削除できないと思う。
5乗の計算に20バイト使う可能性がある!
constもinlineも保証はないので結局残るのはenumだけなんじゃないか?と。
運が悪いと普通のpowになっちゃいますよ的な。
そうして74のintの部分特別化にenumを使えるかなとかなんとか考えると疲れた寝る。
0079デフォルトの名無しさんNGNG
>>78
「意味が大きい」って?
あと20バイトくらいを問題にするなら展開されたコードの方が全然大きいかもよ?(w

大体enumの初期値として処理できる定数式なら
constの初期値として処理できない筈がない。
思うに、展開されたクラスのstatic constについて誰かがアドレス取らない限り
リンカまでも行かないで領域はないと思われる。

ちなみに、
Pow<N,X>::resultは定数式として定数の初期化に使えるところが利点。
Pow<T,N>(x)はNに関しては、
コンパイラが一般の部分特化のアルゴリズムを備えていなくても
テンプレートと定数伝播、inline展開の常識的な実装を備えてさえいれば
確実に部分特化の意図が伝わるのが利点。

初期のcfrontでトランスレートしてた時代ならイザ知らず、
constもinlineもここで出てる例くらいならば、今の最適化技術では
可能不可能の問題でなくやるかやらないかの問題だから、
一般用途のまっとうなコンパイラでは十分できる範囲だと思う。
0080デフォルトの名無しさんNGNG
>>79
だから、とりあえず手元の処理系で試してみろって。
008171?NGNG
>>74
BCCでためしたで
ASM見たけど思惑道理なってるで
0082デフォルトの名無しさんNGNG
>>81
よって問題なし、と。

規格について一通り調べがついた後は、「思う」と書いてあーだこーだ議論するより
実際処理系での結果を出した方が話が早いっしょ。
008353NGNG
>>81-82
どうもです。
今、ようやく試せる環境(研究室の自分の机)にたどり着きました(w。
もう話は終わってるみたいですが。
0084デフォルトの名無しさんNGNG
>>79
20バイトというより1バイトさえも使っては意味がないし
コードが展開されてはそもそもいけない。
コンパイル時評価になることが保証されてこその新しいPow。
Pow<N,X>::resultは、コンパイル時評価は保証されないし
計算ごとに生まれる多くのstatic intが削除されることが
保証されないので恐ろしくて使えない。
Pow<T,N>(x)は、やはりインラインが保証されない上、
インライン展開されてもコンパイル時評価になることが
保証されないので駄目。
いままで標準準拠のコードを書くためにがんばってきたのに
ここでenumを裏切るのはなぜか。
あとcfrontがどうとか言い出すのが好感度下げる。ワラ
008571?NGNG
>>84
いいたいことはわかるが、templateでやる以上、
pow( 2.0 , 3.5 )とかやりたいね。
0086デフォルトの名無しさんNGNG
>>84
完璧確実を求めるならちゃんとPartial Evaluationなり、
2-level Languageなり使うしかないんでは?
元々C++の機能の有り合わせで実現してるんだから。

とりあえず両者とも(仮に最適化されなくても)規格的には最低限動作することになっていて、
少なくとも普及している処理系の一つで意図どおり動作するコードではあるのは確か。

ちなみに実行時にtemplateの展開処理をする珍しいコンパイラでない限り
Pow<N,X>::resultはコンパイル時に定数になっていなければならない。
当然定数式の必要なところでは定数として利用できる。
このコードの本来の目的はそれ。
領域が割り当てられて残るかどうかは副次的なことに過ぎない。
仮に、アドレスを取ったりできるように領域が割り当てられたとしても、
定数伝播の最適化とはまた別の側面の話なので問題はない。
(せいぜいメモリ使用量が増えるだけ。実行速度に悪影響はない。
元々展開テクニックではメモリ使用量ではなくて実行速度に重点が置かれる。)

それに標準準拠って言うけどstatic const intではダメでenumに拘る理由も結局不明。
初期化がコンパイル時に実行できないかどうかは、初期化式の側の問題であって
初期化される変数・定数の側の問題ではない。

裏切るも何も、列挙しない単一の定数の宣言にenumを使うほうこそ
考え様によっては病的だと思うがどうか?
(領域がないことを保証させるための抜け道だということは知っているが、
病的なことに変わりはない。)

あと、>>84君の好感度などはこの際限りなくどうでもよいこと。

もう一つ言えば、
これは標準数学ライブラリのpowを置き換えることを意図したものではない。
Pow<N,X>::resultは定数式の必要なところ(固定長配列の長さとか)で
べき乗の計算を行うために必要なだけのもので、
Pow<T,N>(x)は整数Nを固定したべき乗演算が繰り返される場合に有効なコード。
そういう特殊な用途以外の一般の場合には標準的なライブラリのpow()を使えばよい。

さらに言えば、これはGenerativeなコードをC++の有り合わせで書く場合に利用できる
テクニックを紹介するためのサンプルかつ部品である。
powだけ計算して満足しているわけではない。

>>85
残念ながらx^nのnは整数でないと特化できない。
0087デフォルトの名無しさんNGNG
>85
@sin( 1.46 )とかを展開するような
独自プリプロセサを書けや。
0088デフォルトの名無しさんNGNG
>>87
そんなことせんでもsin(1460000) // =1.46*1000000とかして
1000000で割ればいいじゃん。
古典的手法
0089デフォルトの名無しさんNGNG
>sin(1460000)
sinをテンプレートで実用的にかけると仰る?
0090デフォルトの名無しさんNGNG
>>86
>少なくとも普及している処理系の一つで意図どおり動作するコード
それが駄目だとあれほど。

コンパイル時評価が保証されないので
全くGenerativeではない。君は

賢いコンパイラは仮想呼び出しを実呼び出しに最適化できるので
templateはいらない、仮想関数で十分。
領域が割り当てられて残るかどうかは副次的なことに過ぎない。
せいぜいメモリ使用量が増えるだけ。実行速度に悪影響はない。
多態性にtemplateを使うのは病的。

と思っている。確かにこれは正しい。ワラ
ここでSTLが大好きな君が裏切るのはなぜか。
0091デフォルトの名無しさんNGNG
つまりさあ、87とかの話題ってfixed演算なわけだよね。
そういうことしたいならLISPでプリプロでも書いたほうが自由度高いし簡単。

(defconst var `(,(sin 1.46))) ;;;リストvarにsin(1.46)の結果を埋め込み。

C++もコンパイル時に関数を実行できる仕様だったら便利なのにね。
0092デフォルトの名無しさんNGNG
べつにLISPじゃなくてもいいんだけどね。perlやRubyとかでも。
関係ないけどVBでこういうことができないのは不思議。
0093デフォルトの名無しさんNGNG
>そんなことせんでもsin(1460000) // =1.46*1000000とかして
>1000000で割ればいいじゃん。
まさか・・・
0094デフォルトの名無しさんNGNG
>>91
C++で実装される言語がなにやらほざいているな
0095デフォルトの名無しさんNGNG
STLいいんだけどさぁ、
コンパイルエラー等ででてくる、エラーをどうにかしてほしい。
0096デフォルトの名無しさんNGNG
>>95
『STL Error Decryptor』
 http://www.bdsoft.com/tools/stlfilt.html
みたいなものを使ってみるとか。
0097 NGNG
>96
をぉ!それは便利そうだ!!!!
と思ったら VC 用かよ・・・
残念sage
0098デフォルトの名無しさんNGNG
>>90
もう、その話題は良いって。

使えると思うヤツは自分のコンパイラで試した上で使えば良いし、汎用性が
必要なプログラムを書いてる場合には、それなりの対処しろ。
0099デフォルトの名無しさんNGNG
>>98
Genericが汎用って意味なのだが
0100デフォルトの名無しさんNGNG
>>99
言葉遊びは、技術系の板の外でな。

Generic Programming を Win32 API と組み合わせてプログラミングしたって
良いじゃない。
0101デフォルトの名無しさんNGNG
「入門C言語」とか銘打っておいて、なかみをみると
いきなりWinMainからはじまったりすると激しく萎える。
0102デフォルトの名無しさんNGNG
>>101
そんな本があるのかーΣ(゚д゚lll)
禿げしくスレ違いだが書名キボンヌ
0103デフォルトの名無しさんNGNG
94は煽りのつもりだろうか
0104デフォルトの名無しさんNGNG
良スレage
0105デフォルトの名無しさんNGNG
>>100
話のすり替えは、技術系の板の外でな。

enumを置き換えられると思いこんだんだな。
0106デフォルトの名無しさんNGNG
>>105
言語の仕様上はこの場合でもenumはstatic const intに置き換えられるのでは?
置き換えられないというなら実例をキボンヌ
0107デフォルトの名無しさんNGNG
>>106
もう相手にしないで、放っておいてやるのが良いと思われ。
0108デフォルトの名無しさんNGNG
>>91
この例の意義はC++が既に持っている機能でこういうことが書けると言うところに意味がある。

・実用的なGenerativeアプリケーションの開発
・Generativeを正式にサポートする言語の研究開発への動機付け

他の言語に替えてよければ、それこそLISPもそうだが'CとかMetaMLとか色々ある。
0109デフォルトの名無しさんNGNG
それにこの例はGeneric ProgrammingとGenerative Programmingの近しい関係を端的に示している。
0110デフォルトの名無しさんNGNG
かくしてtemplateによってC++は2レベル(コンパイル時/実行時)言語になってしまっているいるわけだが、
元々そういう用途を意図して設計しているわけではないので、
この2レベルで激しく構文が違ってしまっているという問題はある。

例えば……:
template引数にはクラス・オブジェクトはおろか整数定数しか渡せない。
書きなれた命令型ではなく関数型プログラミングのスタイルで書かなければならない。
コンパイル時関数を表現するのにtemplateクラスを定義するのはやっぱ無理がある。

というわけでプログラミング言語学的には今後の研究が待たれるところであるっす。
0111デフォルトの名無しさんNGNG
>プログラミング言語学的

0112デフォルトの名無しさんNGNG
>111

0113デフォルトの名無しさんNGNG
C++Builder6の案内が着たけど
3ユーザーとしては買いでしょうか?
0114デフォルトの名無しさんNGNG
>>110
煽りはともかくとして、昔のCでマクロレベルでどうにかする、
ってのと基本的に変わらないね。
処理系がえらく大きくなった割には対効果が低いのが気になる。
>>108
'Cってなんですか?
quote-C?
0115デフォルトの名無しさんNGNG
>>114
今回の Pow() あたりだと、
> 処理系がえらく大きくなった割には対効果が低い
のは確かだが、STL の関数オブジェクトやアルゴリズムまで行くと、そう
捨てたものじゃないぞ。
0116デフォルトの名無しさんNGNG
templateあたりはもうちょっと洗練して縮小とかしてくれないと
あんまり使う気になれないんですが。オブジェクト指向とか以前に。
LISPのマクロなんかは最小限の労力で物凄い効果を期待できますけど、
あんな感じになって欲しいな。
0117デフォルトの名無しさんNGNG
現状のC++って複数の言語使ってる感じなんだよね・・・
0118デフォルトの名無しさんNGNG
みんなC++なんて止めてほかの言語を使おう(笑
0119デフォルトの名無しさんNGNG
C#ですかあ?
0120デフォルトの名無しさんNGNG
AllegroCLでも使いますか?(笑
0121デフォルトの名無しさんNGNG
実行時型やtemplateあたりの登場からC++では「おや?」と
思うようになったな。
javaもgenericを搭載するらしいが、はたしてどうなることやら。
なんつーか、ポリシーを持って作ってほしいね。
0122デフォルトの名無しさんNGNG
C++ではなくObjectiveCが普及すべきであった、せめて。
0123デフォルトの名無しさんNGNG
Objective-Cが普及しないのは名前長いから?
コミュニティが弱小だから?
ともかくObjective-CをC++という名前にして、
今までのC++は無かったことにするとか。
ストラウストラップは始めからいなかった事に(w
BorlandもDelphiと統合できなくて困ってるみたいだし。
0124デフォルトの名無しさんNGNG
MacOSXもC++で開発できるようには出来なかったらしい。
OSの設計に言語の汚さがついて行けなったらしく。
ObjectiveCがメインで、Javaでもなんとかなるとかならないとか。

C#登場で一気に滅亡しそうな予感もしてるんだな。
0125デフォルトの名無しさんNGNG
>>117
それは言えてる。

手続き、OO、汎用プログラミングなんでもアリなのはメリットだとは思うが、各々の
親和性がもうちょっと上がると嬉しい気がする。template がらみのエラーメッセー
ジとか。
0126デフォルトの名無しさんNGNG
C#はガベコレあるから、もはや別の次元でしょう。>124
0127デフォルトの名無しさんNGNG
最初の方で generative generative って言ってた人もう来ないのかな?
generic なアプローチと generative な方法との違いが知りたいんだけど。
0128デフォルトの名無しさんNGNG
>>127
俺は最初の方の人とは違うけど、

generic
 型に依存しない操作

generative
 コンパイル時にポリシーを与えて、コードを動的に生成する

ってイメージがあるな。STL だと algorithm は generic だけど、container なんか
は generative っぽい気がする。
0129デフォルトの名無しさんNGNG
>>106
置き換えられないことを説明するのに疲れたよ
>>84あたり読んでくれ
>>107
自分で言うのがまさに再起的でこのスレにぴったりだな。思われ君よ。
0130デフォルトの名無しさんNGNG
>>129
> 置き換えられないことを説明するのに疲れたよ
もう説明しなくていいって。書くことは一通り書いたんだから、後は読んだやつが
各自で判断すればいいだろ?
0131デフォルトの名無しさんNGNG
>>130
レス早くて怖いよ!
あと>>86長すぎだよ!
もっと話そうよ友達になれそうだ
0132デフォルトの名無しさんNGNG
>>131
構って欲しければ、馴れ合い系の板に逝けよ(w
0133デフォルトの名無しさんNGNG
>>132
そういった時点で呉越同舟だよ!!ワラ
0134デフォルトの名無しさんNGNG
scheme読んでて思ったんだが
(自分はgenerativeプログラミングは
staticプログラミングとでも呼んだ方がいいと思う)
factorialとかsumとかpowとか書いてると
これらをさらにgeneralizeして
マクロにする。Modern..本のTYPELISTみたく。
こんなことやってるライブラリはないんだろうかね。
intのリストは全部staticに処理できるのではないかと。
あまり役には立たないだろうけれども。
0135デフォルトの名無しさんNGNG
>>129
ヲイヲイ、>>84のいったいどこが実例なんだYO!
0136107 (!= 106)NGNG
>>135
だから、放っておいてあげなよ。アレで本人は満足なんだから。
0137デフォルトの名無しさんNGNG
VC.NETのtemplateはまじでどうなったのかな。
たのむよ!
0138デフォルトの名無しさんNGNG
>>114
tick-C
実行時にコード生成できるように拡張したC。
処理を実行時まで遅らせるようにコードをマークする記法と、
遅らせた中の一部をコンパイル時に実行できるようにマークする記法を組み込んだ
2レベル言語になっている。

http://www.pdos.lcs.mit.edu/tickc/

テンプレート方式のコード生成と呼ばれる技法で実装されている。
0139デフォルトの名無しさんNGNG
>>128
genericな関数の定義を効率よく実装する方法の一つが
パラメータ毎に展開してコード生成すること。
templateを利用したgenerativeテクニックはそのコード生成機能を逆手に取って
実現されている。

ちなみにJavaに導入されるtemplateは実行時に処理されるらしいので、
ここで話題になったようなコード生成テクニックには利用できない。

まぁ、Javaの場合、
コード生成素直にダイナミック・ロードでなんとかしろってことなんでしょうか?
0140デフォルトの名無しさんNGNG
 保守age
0141デフォルトの名無しさんNGNG
Modern C++ Design買ったはいいけどまだぜんぜん読んでない。
0142 NGNG
>141
0143デフォルトの名無しさんNGNG
久しぶりにあげてみる
0144デフォルトの名無しさんNGNG
Modern C++ Design
amazon注文age
0145デフォルトの名無しさんNGNG
スレタイが際立ってるな。
0146デフォルトの名無しさんNGNG
age
0147デフォルトの名無しさんNGNG
>>146
ageてばかりだと、そのうち
ageばっかりになるぞ
なんかしゃべれ
0148(ΦωΦ)フフフ・・・NGNG
(ΦωΦ)フフフ・・・
0149(Φ∀Φ)フフフ・・・ NGNG
(Φ∀Φ)フフフ・・・
0150デフォルトの名無しさんkNGNG
買ってきた。明日の朝9時までに3章までは毒派する予定。
0151デフォルトの名無しさんNGNG
この本、期待してたほどにはカルチャーショック受けなかった。
なんつーか、何かにつけてめんどくさいね。
0152デフォルトの名無しさんNGNG
>>151
それが C++ の限界。
もうパズルだよな。

このスレは generic programing と generative programming が
混じってるので混乱する。
URL 紹介
http://www.generative-programming.org/
0153デフォルトの名無しさんkNGNG
これに書かれてる内容のようなことはMLやHaskellだったら
もっとスマートに出来るの?
0154デフォルトの名無しさんNGNG
>>151
haskellはともかく、MLはこういうことに関してはすんごいよ
0155デフォルトの名無しさんNGNG
>>154
Haskell はダメなの?
0156デフォルトの名無しさんNGNG
>>154
HaskellやMLで出来ない技が多いよ。

たしかに、この本の中に出てくるFunctorは
関数型言語では高階関数(カリー化)というものと、とても似ています。

しかしC++のテンプレートは、ソースを実際にマクロのように展開しています。
こういうマクロのように展開することを関数型言語ではα簡約といっているらしいですが。
こういう機能はLispとSchemaにはありますが、MLやHaskellでは無いです。

本質を見極めた上で書きましょう。
0157デフォルトの名無しさんNGNG
マクロ展開できることは本質的なことなんですか?
0158デフォルトの名無しさんNGNG
>>157
C++にとっては本質的
0159デフォルトの名無しさんNGNG
正直、Cのマクロを多少強化すれば解決する問題が多い気がするんだけど
0160デフォルトの名無しさんNGNG
>>159
「多少強化」がやろうとすると多少の強化では済まないことも多いからなぁ。
タイプ・チェックも計算能力も。
0161デフォルトの名無しさんNGNG
Lispに追いつこうと頑張るのは凄いけど、
> > >と最後の閉じカッコがなんともまぬけでイイ(w
0162156NGNG
<<157
何時、評価&簡約されるかということ。
α変換(C++で言えばプリプロセッサによるマクロの展開、テンプレートの展開)はコンパイルされるとき展開、簡約されますね。
β変換(実行時に引数を渡すこと)は、実行時に評価、簡約されます。
何時評価されるかって結構だよね。

訂正:α簡約なんていう言葉は無いです。α変換の間違いです。
漏れも逝きます。
0163λ中将NGNG
# α簡約と言わないことも無いと思う。。。
0164デフォルトの名無しさんNGNG
誰か下の二冊を読んだ人がいたら感想聞かせてほすぃ

【Generative and Component-based Software Engineering】
http://www.amazon.co.jp/exec/obidos/ASIN/3540411720/

【Generative Programming: Methods, Tools, and Applications】
http://www.amazon.co.jp/exec/obidos/ASIN/0201309777/
0165デフォルトの名無しさんNGNG
http://www.moderncppdesign.com/
0166デフォルトの名無しさんNGNG
>> 【Generative and Component-based Software Engineering】
かなり抽象度高くて眠くなる。 C++ で Lisp ごっこをやる章は楽しかったけど。
学術的な雰囲気の強い本なので、そういう素養がないとつらいとおもう。
(OOPSLA の論文読んで理解できるレベルなら十分。)
0167デフォルトの名無しさんNGNG
age
0168デフォルトの名無しさんNGNG
これからlokiみたいなライブラリが増産されていくのかと思うと、
楽しみと思う反面、地獄の予感もしたりする、、
0169デフォルトの名無しさんNGNG
だれか、>>53みたいなやつで、LOG書いてくれ。
0170デフォルトの名無しさんNGNG
>>162-163
β変換がβ簡約とも言われるのは適用されるたびにλ項が解消されて減っていくから。

(ある種のλ式ではβ変換を有限回適用することで簡約順序に関わらずそれ以上簡約できない
「標準形」になることがわかっている。無限回簡約できるようなλ式、
またその中でも評価順序によっては有限回でそれ以上簡約できなくなるようなλ式もある。)

α変換は名前の付け替え変換だから式の形自身は変わらないので、
無限回繰り返すこともできるが、
同一視することによって無視する(α合同関係)ことが多い。

というわけで、α簡約とはやっぱりあまり言わないかも。

まー、マクロ展開にせよテンプレートの展開にせよ
単純なλ計算そのものではない。

例えば、プリプロセサマクロの名前付け替えは、
付け替え後の名前が付け替え対象の名前になるような関係による
循環を避ければ有限回で終了する。

それでも敢えて喩えて言えば、
プリプロセッサのマクロ展開だからα変換とも限らず、
引数つきマクロなどはβ変換といってもいいかもしれない。
0171170NGNG
肝心なことを書き忘れた。
>>170
つまり標準形のあるλ式(計算が終了する)であるならば、
λ項はβ変換適用ごとに減っていくので「簡約」なわけです。
通常、計算は終了することに意味があるとされるので、逆に
β変換が「簡約」であるようなλ式を「正しい」プログラムの表現
と見るわけです。

ついでに言えば、現実のプログラムでは評価順序も決まってるから、
その評価順序において簡約し切れるような式であれば良いわけで、
標準形のあるλ式以外にも、特定の簡約順序によって
有限回で簡約不能な式(値)になるような式も
条件付で認めるが立場あり、実はプログラムの基礎理論としては主流です。
0172デフォルトの名無しさんNGNG
>>171=170
わかったから。
そいうことは関数型言語板かLispShcema板でやって
お願い
0173デフォルトの名無しさんNGNG
>>172
ModernC++Design読むと逆にSchemeとかMLやってみたくならねぇ?
これから10年後のC++のプログラムとか、今のクラスライブラリの
惨状から想像するとぞっとするんだけど。
0174デフォルトの名無しさんNGNG
>>172
この本のやってることってtemplateでどこまでconst演算できるか?
ってのもあるからあながち無駄でもないかも。
0175172NGNG
>>173
もちろん無駄だといってる訳ではない。
ModernC++Designを読んでる最中にHaskellに出会って
今、はまりまくってるよ。
そのせいか、STLもパラメータ化クラス(型?)を使いまくってる性で
関数言語風味たっぷりに感じてるよ。
どれくらい嵌ってるかというと、関数プログラミングからホーアCSP理論まで読んで
「ほー、Eiffelの表明の元ネタは仕様記述言語Zから来てたのは知ってるけど
そのZ言語の元ネタはCSP理論なんかー。おもしれーなー。
表明の推論もできそうだなー」とか訳のわからんことを考えるくらい嵌ってる。

ただ、この手のネタは、この板の主旨から結構ズレてしまったのでは?
と思うわけよ。

>>174
これも面白いと思う。
非正格言語でtemplateみたいなコンパイル時簡約?みたいなことが
出来たら実行速度が手続き型言語に勝てる関数型言語も夢では無いかもしれない
と俺は創造してしまう。
(CleanやMLは代入使って実行速度を上げてるようだが、そんなセコイことせずにな)

でも、なーtemplateは形検査してくれないからなー。
ModernC++Designの技はやり過ぎだと思う。
ハッタリには使えると漏れも思う。
(研究する価値が無いというつもりは無い。そこは酌んでほしい)
0176デフォルトの名無しさんNGNG
>>172
やっぱり実践的なプログラムにあれは使うものじゃないよね。
Cの変なテクニックを積み重ねたようなプログラムなんて物凄く
読みにくいけど、それの上を逝ってるよ。
0177デフォルトの名無しさんNGNG
あれは「上には上がいるもんだが、ここまでやっちゃあいかん」という見本だ。
頭の体操には悪くないが。
0178デフォルトの名無しさんNGNG
COBOLでオブジェクト指向、みたいな話になってる気がする
0179デフォルトの名無しさんNGNG
まぁでも実際に使ってみないことにはなんとも言えないね。
0180デフォルトの名無しさんNGNG
テンプレートの特殊化に対する適合アルゴリズムについて詳しく解説してる
サイト、キボーン!(懐)
0181デフォルトの名無しさんNGNG
gcc3.0でLOKIは動きますか?
0182デフォルトの名無しさんNGNG
>>181
動くらしい。(LokiのReadMeに書いてなかったけ?)
Lokiがコンパイルできる珍しい処理系
0183デフォルトの名無しさんNGNG
VCじゃできないのか??
0184デフォルトの名無しさんNGNG
BCCでもだめなのにVCで動くかー
0185デフォルトの名無しさんNGNG
>>183
じゃ、駄目じゃん、、、
いったいなんでgccでは動くのか、その理由が知りたいな。
実際、ここまで互換性がないとテンプレート怖くて使えないんだけど。
0186デフォルトの名無しさんNGNG
>>185
あるSTLの本の第一章に。

「互換性が低いことを怖がってSTLに対して保守的にならないで下さい。
時代はstanderd C++に向かっているのです。」
0187デフォルトの名無しさんNGNG
>>186
・・・で?
0188デフォルトの名無しさんNGNG
>>185
VC++ だと部分特殊化もメンバ関数テンプレートもサポートしてないから…
つーかもう4年近く前のコンパイラだよ?<VC6

VC.NETだとどの程度templateに対応してるんだろ。
0189デフォルトの名無しさんNGNG
VC.NETでLokiコンパイルしてみたひといる?
0190デフォルトの名無しさんNGNG
一応MSDN MagazineにはBoostやLokiがちゃんとコンパイルできる、
って書いてあったが<VC.NET
0191デフォルトの名無しさんNGNG
>>185
gccが開発バージョン2.9から最新ANSI C++規格を実装したからさ
それと.NETでLokiは使いたくないなー。VC.NETはやめとけ。
氏ぬぞ。
0192デフォルトの名無しさん NGNG
gccマンセー
0193デフォルトの名無しさんNGNG
Lokiってどこにあるの??
サイトがでかすぎて分からないヨ
0194デフォルトの名無しさんNGNG
http://www.awl.com/cseng/titles/0-201-70431-5/loki.zip
0195デフォルトの名無しさんNGNG
サンクス〜〜♪
0196デフォルトの名無しさんNGNG
Loki初めてみた。
凄ぇ・・・まさに天才。
0197デフォルトの名無しさんNGNG
みんなあれを最後まで理解した?
おれは3章であっぷあっぷだよ。
あんまりテンプレート自体を使いこなして内省かも。
0198デフォルトの名無しさんNGNG
色々とお褒めの言葉をならべてもLokiを使ったサンプルコードが
出てこないところをみると皆自分の中で消化吸収してる最中なのかな?

おれはあと3ヶ月ぐらいはかかるだろうな。
0199デフォルトの名無しさんNGNG
あげ!
0200デフォルトの名無しさんNGNG
Lokiすごいけどさ、やっぱりすごいだけで泥臭いと思うよ。
0201デフォルトの名無しさんNGNG
つーかおれはそもそもテンプレートの構文が嫌いだ。
0202デフォルトの名無しさんNGNG
こらこらtemplateあってのC++だ。
0203デフォルトの名無しさんNGNG
漏れもそうだ。
C++使う理由の大半はテンプレートがあることだからね。
STL なーんて素晴らしい。
0204デフォルトの名無しさんNGNG
じゃ、templateのないC++はなんなんだyo!
0205デフォルトの名無しさんNGNG
非互換C
0206デフォルトの名無しさんNGNG
>>204
Java
0207デフォルトの名無しさんNGNG
あんな糞言語と一緒にするなよ
0208デフォルトの名無しさんNGNG
やばい。ちんこ勃ってきた。
0209デフォルトの名無しさんNGNG
>>204
D言語
0210デフォルトの名無しさんNGNG
C#にはテンプレートに該当する物はあるのか?
0211デフォルトの名無しさんNGNG
つーかeval相当はないの?
0212デフォルトの名無しさんNGNG
>>211
evalはやめてー
究極すぎる
0213デフォルトの名無しさんNGNG
Ruby以外の言語は使い物になりません。以上。
0214デフォルトの名無しさんNGNG
>>213 激しく同意
0215デフォルトの名無しさんNGNG
えっへん!
0216デフォルトの名無しさんNGNG
あの本の一章に書いてあるポリシーパターンだけでも
結構使えるよな。テンプレートパラメータからホストクラスを
派生させるってのカッコいいから使ってるよ。
0217デフォルトの名無しさんNGNG
Int2TypeとかType2Typeもね
0218デフォルトの名無しさんNGNG
VS.NETを購入された方へ質問があるのですが、C#にはC++でいうところの
STLに該当する機能はあるのでしょうか。購入検討の資料としたいのです。
0219デフォルトの名無しさんNGNG
>>218
よく知らないけど、System.Collectionsのコンテナを
使うんじゃないかな?だからSTLは無いと思うけど。
0220デフォルトの名無しさんNGNG
タイプリストはなんか凄そうなんだけどあれをどう活用するのか
分からない。だれか簡単に説明してくれないかな?
0221デフォルトの名無しさんNGNG
なんでもλ
ttp://www.shiro.dreamhost.com/scheme/docs/lambda-j.html

STLといい最近のC++は関数型プログラミングの匂いがー
関数プログラミングのすばらしさはまだまだあるぜーいえー。
なんでも再帰
ttp://www.shiro.dreamhost.com/scheme/docs/tailcall-j.html
なぜ関数プログラミングは重要か
ttp://www.sampou.org/haskell/article/whyfp.html
0222デフォルトの名無しさんNGNG
>>220
Functorと組み合わせて高階関数ができるからかな?
ttp://www-6.ibm.com/jp/developerworks/linux/010921/j_l-prog3.html
ttp://www.teu.ac.jp/kougi/koshida/Prog6/Text08/index.html
ttp://a414s1.it.nanzan-u.ac.jp/smlbook/smlwww/node10.html

TypeListと補助するtemplateだけでも役にたつところもあるかな?
ttp://www.google.com/search?q=cache:5o9J68CC7oMC:www.tama.or.jp/~o-mikita/phantasien/memo/p0108.html+C%2B%2B+TypeList&hl=ja&lr=lang_ja
0223デフォルトの名無しさんkNGNG
今タイプリストの使い方を色々と本読みながら考えてるんですが、

class Cls
{
public:
 //このクラスにおいて関係するタイプのリストを作成する
 //(全てのアプリケーションコードにあるクラス内において必須)
 typedef TYPELIST_3(Cls1, Cls2, Cls3) MyClsList;
 ・・・
private:
 //必要なインスタンスを作成する
 Loki::TL::TypeAt<MYClsList, 0> cls1;
 Loki::TL::TypeAt<MYClsList, 2> cls3;
};

とかって感じにタイプリストからの型選択テンプレートクラスに
リストを渡して選ばせる感じに使うんでしょうか?
なんか頭が固くていい使い方が思い浮かばないなw
クラス間の関係が明確になるメリットは大きいかな。
0224デフォルトの名無しさんNGNG
アプリケーションコードにおいてもテンプレートパラメータの
諸関係だけを記述するようなプログラムを作るのってかなり頭痛いよね。
上の奴もCls自体をいくつかのテンプレートパラメータ(タイプリスト)を
もらうように直したら、かなり自由度は上がるけどもう何がなんだか
分からんものになりそうな・・・
アプリケーションプログラマにそこまで要求するんか!の世界。
この本読んで任意の処理に対するタイプリストの設計を勉強しないと
全然ダメだな。

こういうのはもっと若いうちにやりたかったよ。。。(遠い目

Lispハカーは、こういったやり方でいつもプログラミングしてるんですか?
0225デフォルトの名無しさんNGNG
>>223
その設計は良くないのでは?
(タイプリストの引数の数が変わったとき作りなおさなやね)
今手元に本が無いので上手く掛けないけど・・・
TypeListのクラスを単一継承するという活用法が載ってた
と思うけど、そってで攻めてみては?

あっ。Cls2,Cls3,Cls4見たいにしたらいいんか
0226223=224NGNG
>>225
今まではOO的なプログラミングということでインターフェイスを
規定してそれに対して実装するってやり方だったけど、これは
全然違うね。

最初にタイプリストありき。それの関係を記述するようなプログラミング。
あたま痛くなってくる。でもこれがホントの再利用性なのかも。
0227223=224NGNG
ダメだ、、、
馬ファ輪飲んで今日はもう寝る
0228225NGNG
>>223=224
個人的にはType2Typeぐらいしか使いたくないなー
実際の開発に使えそうなものって何かな?
0229デフォルトの名無しさんNGNG
結論
天才が書いたコードは天才しか再利用できない
0230223=224NGNG
>>228
んー、自分でも色々と考えてるんだけど、これをつかった効果を
なんとなく想像するので精一杯。

イメージとしては、既存の開発において
ライブラリコード:アプリケーションコード=1:10
ぐらいの比率だったとして、Alexandrescu方式のプログラミングを
導入したことで
ライブラリコード:アプリケーションコード=8:2
みたいなところまで比率に上げる。というか外部のライブラリやシステムに
依存したものを極力排除する。そうして全体のステップ数を減らす。
こんな世界(w)を期待してるのは分かるんだけど、
いかにライブラリコードを設計するかは一筋には逝かないね。

システムの全体を理解してパターンを適用し、それらの関係を
リストで表現する。こんな天才的能力がある人だけが使うものかもね。
リストをデータ構造としか考えてこなかった俺みたいなヘタレには
そもそも無関係かも(w

STLで上がった生産性がアプリケーション全体に適応されたら
天才とヘタレの能率の差なんて目も当てられないだろな。
0231223=224NGNG
>>229
天才の書いたコードは天才しか再利用できないかもしれないけど、
ModernC++Designで言われているのは「自分の書いたコードぐらい
再利用しようぜ」ってことだと思う。

天才がこういったプログラム設計をあっという間に理解して
抽象度の高いプログラミングをしてると思うとカナーリ鬱なんだけど、
ヘタレもお遊び程度にはやっておかないと。

今日はショックで眠れないYO、トホホ
0232デフォルトの名無しさんNGNG
Haskellマンセー!!!
0233デフォルトの名無しさんNGNG
>>223=224
クラス同士の機能が独立したものになるように
設計すればいいかも。
そのクラス同士を組み合わせるところにGenerativ Programming
を使えばよいと考えている。

しかし完全に機能が独立したクラスまで上手く機能を分割できないと・・・・
俺にはむりっす
0234デフォルトの名無しさんNGNG
おみゃーら、Haskellやれ。
C++のきったねー構文に関する知識は後から詰め込めばよし。
まずはプログラミングが何なのかを学ぶためにHaskellをやれ。
0235デフォルトの名無しさんNGNG
>>234
スレ違い。
0236デフォルトの名無しさんNGNG
>>234
板違い

http://cheese.2ch.net/test/read.cgi/math/1015420115/
あっちの板では認知度が低いです。がんばって宣伝してきてね
0237デフォルトの名無しさんNGNG
>>234
HaskellはIOとのやり取りが弱いので実用的ではない。
まあ、これは言語ではなく処理系の問題だが。

あとHaskellはマクロが無いね。
コンパイル時でないと知りえない情報(__FILE__とか__LINE__)が
かけない。すこし残念。
0238デフォルトの名無しさんNGNG
ああいったプログラミングテクニックってどこに書いてあるの?
C++Report?DDJ?
0239デフォルトの名無しさんNGNG
単にLoki::SingletonHolderを使ってみるだけでも苦労した。鬱だ…
0240デフォルトの名無しさんNGNG
Loliは凄いけどタイプリストのマクロ定義にがっかりした人も多いはず!
もっと柔軟なものをここでなんとしてでも作りませう!
0241デフォルトの名無しさんkNGNG
無理
0242デフォルトの名無しさんNGNG
俺には無理
0243241NGNG
静的型付け言語としてあれが精一杯だと思うけどどうだろ。
マクロの部分ならなんとかなるかもしれないけど。
0244デフォルトの名無しさんNGNG
(´・ω・`)ショボーン
0245デフォルトの名無しさんNGNG
>>242
Andrei Alexandrescu にも無理(だった)

>>240
どうでもいいが Loli じゃなくて Loki な。
0246デフォルトの名無しさんNGNG
Lokiは標準に準拠したコンパイラなら通らなければいけないコードなんですか?
0247デフォルトの名無しさんNGNG
C++がRubyにまさっている天安か有る?
0248デフォルトの名無しさんNGNG
>>247
ありません、ごめんなさい
0249デフォルトの名無しさんNGNG
やたああああああああああああああああああああああああああああああああ
Ruby >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> C++
0250デフォルトの名無しさんNGNG
Ruby!!!!!!!!!!!
0251Rubyは好きだけど、比べることは不毛だ。NGNG
無いと > なのか?
= って可能性は無いわけ?
0252デフォルトの名無しさんNGNG
ロリ>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>Loki
0253デフォルトの名無しさんNGNG
>>251
たぶん operator>>>>>>>>...() だから stream から入力してるんだと思うが。
0254デフォルトの名無しさんNGNG
頼むからレス付けないでくれ。
別スレが丁度あるじゃん。
0255デフォルトの名無しさんNGNG
>>253
いや、激しくビットシフトしてるんだと思うぞ。
0256デフォルトの名無しさんNGNG
シフトしてる数は少ないけど、ビットシフトの勢いは激しいのかも。
はしっこのビットがはみ出すくらいに・・・
0257デフォルトの名無しさんNGNG
STLはインライン展開しまくってくれるのがどうも。。。。
確かに画期的だとは思うのだけど。

インラインしてくれる分、それだけコードは早くなるんだけどね。
0258デフォルトの名無しさんNGNG
>>257
コンパイラのオプションをいじって、最適化を「速度優先」から「サイズ優先」
に変更しましょう。インライン展開が、かなりの程度まで抑制されます。
0259デフォルトの名無しさんNGNG
>>257
全く変化なしでしたよ。
0260デフォルトの名無しさんNGNG
>>259
ちがった。
>>258
全く変化なしでしたよ。
0261デフォルトの名無しさんNGNG
>>257
最近のCPUではインラインしすぎはかえって遅くなることが
あるんで、よろしく。STLに限った話じゃないけども。
0262デフォルトの名無しさんNGNG
STL
0263デフォルトの名無しさんNGNG
WTLで、メッセージハンドラがマクロ内に
インライン展開されてたのにはびっくりした。
0264デフォルトの名無しさんNGNG
>>263
そりゃマクロだからインライン展開するわな。
つうかマクロをインライン展開というのかは微妙
# あれにびっくりしたのには同意。
0265263NGNG
class Hoge : public CWindowImpl<Hoge>{
BEGIN_MSG_HANDLER(Hoge)
MESSAGE_HANDLER( WM_HOGE ,OnHoge ) 
//OnHogeがここにinline展開される
MESSAGE_HANDLER( WM_HOGE2 ,OnHoge2 ) 
//OnHoge2はここにinline展開される
END_MSG_HANDLER()
LRESULT OnHoge(){...} //ここではbpかけられない
LRESULT OnHoge2(){...}
};
0266デフォルトの名無しさんNGNG
>>265
そんなあなたに

__asm { int 3 }

(っつー話じゃないか)
0267デフォルトの名無しさんNGNG
Alexandrescuってさなんかデザパタの著者とかEffectiveやExceptionalの
著者に遠慮して本書いてないか?modern~はとても実践的な本だけど、もっとTypelistに
特化した馬鹿みたいなオタク本を書いて欲しいところだな。
0268デフォルトの名無しさんNGNG
もっと色んな実例を集めて紹介してほしかったりする。>Alexandrescu
彼のWebページは何だかな。
0269デフォルトの名無しさんNGNG
>>268
いやWebで公開するには惜しいアイディアがあるんだろ。
more modernが出るのをひたすら待つのみ
0270デフォルトの名無しさんNGNG
んなもん読む暇あったらChristopher Alexanderの著作嫁
Alexandrescuは彼のパクリ
0271デフォルトの名無しさんNGNG
>>270
知ったかしてます?
なんか具体的なこと語ってみてよ
0272デフォルトの名無しさんNGNG
Alexandrescuのテクニックはパターンの実装においても
使えるけど、それ以外のことにも可能性がある点が面白いわけで
270のような奴はそもそも勘違いしてるんだろな。
0273デフォルトの名無しさんNGNG
Functorのサンプルコード、g++3.0で動いた人いますか?
なんかローダーがエラー返してくる。。
0274デフォルトの名無しさんNGNG
ああ、すまそ。SmallObj.cppをコンパイルするの忘れてた。失礼!
0275デフォルトの名無しさんNGNG
>>164
下の本注文しますた!
0276デフォルトの名無しさんNGNG
テンプレートあげ!
0277デフォルトの名無しさんNGNG
VCのtemplateの限界がわからん。
何処まで許されているのだ?
0278デフォルトの名無しさんNGNG
VCなんて捨て捨て。
これからはC++コンパイラといえばG++を指します。
0279デフォルトの名無しさんNGNG
G++って何ですか?
VC、BCB、gccしか知らないものですから・・・。
0280デフォルトの名無しさんNGNG
gccのC++コンパイラがg++。
0281デフォルトの名無しさんNGNG
>>280
しかし g++ と G++ は、かなり違う気がするが。(特に UNIX だと)
0282デフォルトの名無しさんNGNG
g++はいいんだけど、autoconf,automakeの使い方覚えるのが
偉い大変だよな。みんなあれをすんなり覚えられた?
0283仕様書無しさんNGNG
CppTestつかいながら覚えるとよい。
0284デフォルトの名無しさんNGNG
最近のg++は、単にC++用のオプションをつけてgccを呼び出すスクリプトです。
0285デフォルトの名無しさんNGNG
あげ
0286デフォルトの名無しさんNGNG
>>284
(゚Д゚)ハァ?
0287284NGNG
>>286
>>280に言ってるんだけど、なにか?
0288デフォルトの名無しさんNGNG
スクリプトじゃなくてバイナリの実行ファイルになってるけど
0289デフォルトの名無しさんNGNG
$ man g++

G++(1) GNU Tools G++(1)

名称
g++ - GNU プロジェクト C++ コンパイラ (v2.4)

書式
g++ [option | filename ]...

解説
C コンパイラおよび C++ コンパイラは統合されました。 g++ は
gcc に C++ を解釈するようにするオプションをつけてコール す
るスクリプトです。詳細は英語版のオンラインマニュアルおよび
gcc(1) を参照して下さい。
0290 NGNG
>>289
情報が古いと思われ。っつーか基本的にスレ違いだよな、この話題。
0291デフォルトの名無しさんNGNG
でも現実的に今、Lokiが使えるC++コンパイラといえば
gccかCodeWarriorぐらい。
しかたがないね。

CodeWarriorかおか?
0292デフォルトの名無しさんNGNG
ついでにこっちもあげ
0293デフォルトの名無しさんNGNG
VC6でBCCで使える様にLokiを修正できないの?
0294デフォルトの名無しさんNGNG
そんな糞は捨て捨て
gcc使いなさい。
0295デフォルトの名無しさんNGNG
糞クソ言わないでヨ!
(`ε’)プンプン
0296デフォルトの名無しさんNGNG
>>293
できん。
特にVCでは不可能。

BCCでも機能が足りん。
テンプレートクラスの中でテンプレートクラスが宣言できない。
T1 < T2 < T3, T4 >, T5 >みたいな複雑なテンプレートの特殊化ができない。
これじゃねー。
0297デフォルトの名無しさんNGNG
面白さと革新さは認めるけどVCで使えないんじゃ
はっきり言ってただのオナニーコードじゃん
GCCだけで閉じられてる商用プロジェクトなんてあんまり
ないんじゃないかと思うがどうよ?
結局現時点では実践向きじゃないって事?
0298デフォルトの名無しさんNGNG
>>296
それができるとどんな利点があるの?
0299デフォルトの名無しさんNGNG
>特にVCでは不可能。
>BCCでも機能が足りん。
これってテンプレートの限界を表わしてるよね。
これじゃ実用にならない。
0300デフォルトの名無しさん NGNG
300get!

>>298
テンプレートパラメータとしてタイプリストを
作りそのリスト値から任意の型を取り出せる。

>>299
vs7のコンパイラならいけるらしい。
それにlokiはansic++準拠だよ
テンプレートの限界じゃなくて
コンパイラメーカーの限界
0301デフォルトの名無しさんNGNG
理解できない→「んなもん、実用にならんわい」といいたくなる罠。

と、マンネリな煽りはさておいてvcも7.1で対応させるとか、させないとか。
0302デフォルトの名無しさんNGNG
>GCCだけで閉じられてる商用プロジェクトなんてあんまり
うふ♪
0303デフォルトの名無しさんNGNG
p.210で、
素のC++だと、"Deriverd" という文字列からDeriverd型のオブジェクトを作成できなくて
云々とあるけど、この本のどのへんのコードを見れば文字列からオブジェクト生成するのが楽に
汎用的にできるのかがさっぱりわかんない俺はガス管くわえて死んだ方が世の中の為ですか?
0304デフォルトの名無しさんNGNG
>>303
コンパイラの内部表現としての型と
コードに記された型名の違いということではなくて?
0305デフォルトの名無しさんNGNG
name mangling の話…? は余り関係ないように思われ
0306296NGNG
>>298
本を読んでから、返事をください。
先の例より複雑なテンプレートがいっぱい出てきます。

>>303
本の例とは逆に
template < class T > class GetClassNameAble{
char* getClassname() { return T; }
}
みたいなことができても面白いと思われ。
0307デフォルトの名無しさんNGNG
>>306
そんなのいみねー
文字列からクラスを生成(Reflection)できると便利だが(構造上&仕様上不可能なのは承知)
>>306の例だとほとんど使う意味がない
0308デフォルトの名無しさんNGNG
>>306
> 本を読んでから、返事をください。
> 先の例より複雑なテンプレートがいっぱい出てきます。

了解しますた。もっと勉強します。
0309デフォルトの名無しさんNGNG
>>299
「実用」の定義によるな。gcc で仕事してる人間には実用レベルだし、Win32
アプリケーションを VC6 で書いてる人間には使い物にならん。

ただ、VC も BCC もいずれ ANSI C++ 準拠してくるだろうから、そのときに
使える選択肢が一つ増えるって事で。

(そういや Boost に Loki 入れようという話、どうなってる?)
0310デフォルトの名無しさんNGNG
SHをターゲットとしたプログラムにタイプリストが使われまくり、
Windows上のプログラムでは未だに従来のデザパタのサンプルコード
みたいなのが使われてるなんて、、、なんか違和感あるなw
0311デフォルトの名無しさんNGNG
>>306
クラス名を文字列化するのは typeid(T).name() で出来るし。別に面白くもなんとも。
0312303NGNG
で…どんなかんじ?
神。
0313296=306NGNG
>>311
この例、面白くなーい?
残念だなー。

>>307
const char*なら、いけるんじゃない?
もしくはコンパイラが自動的にFactoryを作ってくれるというのも
面白いかも。
というかTypeListで作れるか。あはははは。
0314デフォルトの名無しさんNGNG
>>313
つくって。
0315 NGNG
>>309
>(そういや Boost に Loki 入れようという話、どうなってる?)
って初耳なんだけど、本当なの?
誰か情報キボンヌ
0316デフォルトの名無しさんNGNG
ちょっと考えてみましたけども、sizeof(クラス)と、
そのクラスのコンストラクタのアドレスがわかれば、
実行時にダイナミックにクラスの作成できるかな?

実装依存(コンパイラ依存)なら書けるでしょうか?
0317デフォルトの名無しさんNGNG
LLが入りそうってのはどっかで見聞きしたなぁ。
0318デフォルトの名無しさんNGNG
>>315
Boost の開発者 ML で議論してる。スレッド長いから追ってないけど
Andrei Alexandrescu も話に参加してる模様。

(メールアドレスが @hotmail.com だけど)
0319デフォルトの名無しさんNGNG
>>316
実装依存って言ったらそれこそなんでもありやん
0320デフォルトの名無しさんNGNG
>>319
そそ、ダイナミックにソース作って、コンパイラ起動して、できたプログ
ラムに制御渡しゃどんなクラスでもできるぞ。
0321315NGNG
>>318
boost-dev(?) の ML 読んでんの?すげー。
所詮俺は厨房である事を再確認した・・・
cppmlぐらいなら分かるんだけどさすがにそんなところ
まで手は伸ばせんわ・・・

独り言sage
0322デフォルトの名無しさんNGNG
>>321
> boost-dev(?) の ML 読んでんの?すげー。
全部は追ってないし、開発にも参加してない。必要そうなヤツだけ斜め読み
だよ。(C++ は仕事道具だし)

Boost -- Boost mailing list
http://lists.boost.org/mailman/listinfo.cgi/boost

> cppmlぐらいなら分かるんだけどさすがにそんなところ
cppml ではなくて cppll かしらん?

俺は cppll は最初は読んでたんだが、エピスが検定試験云々言い始めた頃に
S/N 比が許容値を下回ったので切った。最近はどうなん?>読んでる人
0323デフォルトの名無しさんNGNG
>>322
cppIIは今も取ってるが未読が1253通(藁
全然読んでないよ。
エピス氏はコード出して技術的な話をしているうちはいいが、
取り巻きも含めて雑談モードに入るとうるさいからな。

重鎮扱いで誰もつっこめないし。
0324デフォルトの名無しさんNGNG
>>323
俺も彼の言語感覚についていけないクチだね…
自動で s/ぢ/じ/g してから読めば少しはマシになるかな(w
0325デフォルトの名無しさんNGNG
うむ。
10代、せめて20代前半ならまだ許せるが、
某本で素顔の写真見ちゃったからなぁ・・・
0326デフォルトの名無しさんNGNG
あの写真はショックだったという人
わりといますね。典型的な(略)
0327デフォルトの名無しさんNGNG
だれかvcppかcppIIでエピス当てにうざいってレス付けてくれないか。
漏れは怖くてできない

電柱○家
Tit○w
あ○る

あたりが突っ込んできそうだな。
「いきなり出てきてあんたの方が役に立ってない」とかいいながら。
0328デフォルトの名無しさんNGNG
すとーるまんみたいな感じ?
0329デフォルトの名無しさんNGNG
全然。
0330デフォルトの名無しさんNGNG
テンプレートと
http://www.csg.is.titech.ac.jp/~chiba/opencxx/html/index.html
これとの組合せでたのしいことになったりしませんか?
0331デフォルトの名無しさんNGNG
>>330
なにこれ?
0332デフォルトの名無しさんNGNG
C++でリフレクションが使えるようになる(前)処理系
0333デフォルトの名無しさんNGNG
>>322
あのMLでは「低いS/Nの中からいかに情報を取り出すか」というのも重要なテーマです(藁
うまいフィルタ作れないかな。もちろんcppで。
0334デフォルトの名無しさんNGNG
C++ Builderってバージョンあがってもう少し使えるようになるかと思ったら
テンプレート周辺にバグがあるんでしょ?がっかり。
しっかりしてくれよ、Borland。期待してるんだから。Pascal以外の言語もがんばってくれよ。
0335デフォルトの名無しさんNGNG
>>334
えっ?初耳。ソースはどこかにありますか?教えて下さい
0336デフォルトの名無しさんNGNG
>>333
struct pr : public std::binary_function< string, string, bool>{
bool operator()(const string& x, const string& y)const{
return search(x.begin(), x.end(), y.begin(), y.end()) != x.end();
}
};

vector<string> articles;
・・・

articles.erase(remove_if(articles.begin(), articles.end(), bind2nd(pr(), "ぢ")), articles.end());
articles.erase(remove_if(articles.begin(), articles.end(), bind2nd(pr(), "ちう")), articles.end());
0337デフォルトの名無しさんNGNG
いっそのこと、
articles.erase(remove_if(articles.begin(), articles.end(), bind2nd(pr(), "FUKUDA Fumiki")), articles.end());
で。

0338デフォルトの名無しさんNGNG
>>334
えっ?猫耳。
0339デフォルトの名無しさんNGNG
>>338
えっ?愛猫。
0340デフォルトの名無しさんNGNG
>338-339
つまんねーよきみら
0341デフォルトの名無しさんNGNG
http://osl.iu.edu/~tveldhui/papers/Template-Metaprograms/meta-art.html

すごい!!
0342デフォルトの名無しさんNGNG
VC7へぼい・・

template<class T> void swap(T& x, T& y) {}
template<class T> void swap(vector<T>& x, vector<T>& y) {}

これコンパイル通らないんだよね・・
プログラミング言語C++ではこういう書き方してるのに。
0343デフォルトの名無しさんNGNG
>>342
using namespace std; を外して、std::vector にしてごらん。
0344デフォルトの名無しさんNGNG
あげげ
0345デフォルトの名無しさんNGNG
おまえらに質問。

最近関数オブジェクトがおもしろくてしょうがないんだけど、
引数がいっぱいあるメンバ関数をもつクラス T があるとして、
std::vector<T> t(100);
std::for_each(t.begin(), t.end(), &T:func);
みたいなのを引数渡ししつつぐるぐるやる方法はないかな。
mem_funcだとうまく引数が渡せないので、引数をなんとかする
関数オブジェクトをいっこつくってぐるぐるするしかないと思うんだけど、
いざコードを書こうとするとかっこわるくていかんのです。

0346デフォルトの名無しさんNGNG
どっちかというとSTLスレで聞くべきだった。
sage鬱

0347デフォルトの名無しさんNGNG
>>345
boost::bindとboost::mem_funとかで出来るんじゃないか?
0348デフォルトの名無しさんNGNG
>>347
たとえば引数が三つあるメンバ関数を考えたとき、
すべての引数に値を渡せるかな?

0349デフォルトの名無しさんNGNG
>>348
3つのうち2つが固定なら出来るんじゃないか?
0350デフォルトの名無しさんNGNG
>>349
ふむ。ちと試してみるよ。
ありがとん

0351デフォルトの名無しさんNGNG
>>343

template<T> void swap(T& x, T& y) {}
template<T> void swap(Class<T>& x, Class<T>& y) {}

2個のオーバーロード関数があいまいで最適な変換ができません。

STLソースではこうなってる模様
template<class T> Class {
public:
friend void swap(Class& x, Class& y) {}
};

でもこれでは既に他の名前空間にあるswapを特殊化できない罠。
なんかおかしくない?
おかしいのは漏れ?
0352デフォルトの名無しさんNGNG
>>351
たぶん、キミがおかしい。
VC7 のことはよくわからんけど、ふつう swap は <algorithm> の中で
次のように定義されているはず:
namespace std{
template<class T> inline void swap(T& x, T& y) { … }
}
で、何か標準ヘッダーをインクルードして、using namespace std;
してるでしょ? それで、1行目の swap とバッティングしてるんだと
思うけど。
ちなみに、2行目の swap は関係ない。それを外してもエラーが出るん
じゃない?
0353デフォルトの名無しさんNGNG
お手軽だからって
using namespace std はやめよーよ。
0354デフォルトの名無しさんNGNG
>>352
例が悪かった・・
swapじゃなくてなんでもいいです。
とにかくテンプレート関数をクラステンプレートで特殊化しようとすると
特殊化優先順位で弾かれる。
名前空間とは関係ない問題です。(これが後々関係してくるが)
0355デフォルトの名無しさんNGNG
具体例を書くよ

template<class T> class Class {};
template<class T> void func(T& x, T& y) {}
template<class T> void func(Class<T>& x, Class<T>& y) {}

void main() {
Class<int> x, y;
func(x, y);
}

error C2667: 'func' : 2 個のオーバーロード関数があいまいで最適な変換ができません。

で、

template<class T> class Class {
public:
friend void func(Class& x, Class& y) {}
};
template<class T> void func(T& x, T& y) {}

これならOK。VC7のSTLもこのパターンで実装されてる。
でも例えばfuncとClassが違う名前空間にあると
このパターンは成り立たない。色々試したがダメだった。
具体的にはstd::swapなんかを
自作のテンプレートクラスで特殊化しようとした場合なんかに
困るわけなんだな、これが。
0356デフォルトの名無しさんNGNG
なんか、テンプレートでいくらがんばっても
あんまり実りが無い感じ。
0357デフォルトの名無しさんNGNG
>>355
前半部分、13.5.1(p.404) によって後者が選ばれなきゃいけない話?
gcc 2.95ではちゃんと選ばれたよ。
0358デフォルトの名無しさんNGNG
>>357
C++の本を見る限りではそのgccの動作が正しいと思うんだけど。
VC7では選ばれる以前にコンパイルエラーになる。
多分、テンプレート関数とクラステンプレートで特殊化したテンプレート関数の
特殊化優先順位が等しいからこんなことになる。
これだったらすぐ直りそうなもんだからSPで直してほしい・・
0359デフォルトの名無しさんNGNG
メーカーの製品がこの程度の品質って、
C++のテンプレートの仕様を把握するのが一苦労って事なのかな?
0360デフォルトの名無しさんNGNG
上記の話、VC6でも確認。前からああみたいだ。

違う名前空間の関数を特殊化するなという意味だろうか。
Javaみたく階層的に名前空間分けてたら
同一プロジェクトでも同じ問題が発生するが・・
共通関数を使わずメンバ関数を使えという話になるんだろうけど
それだとSTLのうまみも半減だわな

ところでクラステンプレートをクラステンプレートで特殊化って
C++的に可能なの?VCではダメだった。
0361デフォルトの名無しさんNGNG
gccは3.0になってからその辺の構文的な要素は完全対応してるのかな?
0362デフォルトの名無しさんNGNG
>>355
Borland-C++ 5.6では正しくコンパイルできますた。
0363デフォルトの名無しさんNGNG
SDLがブレーク? フン、しねーよ。少なくともあなたには必要ないと思われ。
0364デフォルトの名無しさんNGNG
age

0365デフォルトの名無しさんNGNG
Lokiマンセー!!!
でDLしたらVC.NETじゃコンパイルできねージャン!!
氏ねMS!IDEばっか凝ってねーでコンパイラ改良しる!
0366デフォルトの名無しさんNGNG

 ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄」
―――――――――――――‐┬┘
                        |
       ____.____    |
     |        |        |   |
     |        | ∧_∧ |   | C++を窓から投げ捨てろ
     |        |( ´∀`)つ ミ | 
     |        |/ ⊃  ノ |   | C++
        ̄ ̄ ̄ ̄' ̄ ̄ ̄ ̄    |    




--------------------------------------------
0367デフォルトの名無しさん NGNG
>>365
そもそもMSがcl.exeをANSIに完全対応させる気がないのだとしたら
どういう事態になるんだろう。
0368デフォルトの名無しさんNGNG
ANSIが規格をねじ曲げれば一件落着。
0369デフォルトの名無しさんNGNG
関数ポインタの配列とenumの関係で質問です。

enum {HOGE,MOGE,MONA,SAGE};
void hoge(void);
void moge(void);
void mona(void);
void sage(void);

typedef void (*FUNC)(void);
FUNC func[] = {hoge,moge,mona,sage};

こんな感じで、HOGEのときはhogeを呼ぶ、みたいに対応させてます。
このとき、enumの順番を変えたら、それに応じてfunc内の関数順番を
手動で変えるのがわずらわしいのです(enumとfuncは別ファイルです。
includeして、見えるようにはなってますけど)。
enumの順番に沿って、対応する関数がfunc内で自働的に並んでいて欲しいのです。
コンパイル時点では順番は確定しているんですから、テンプレートを
ごりごり使いこなせる人間ならできるんじゃないかと淡い期待を
持ってるんですが、どうにかして出来ませんでしょうか?
0370デフォルトの名無しさんNGNG
無理
不可能
0371デフォルトの名無しさんNGNG
>>369
なぜ順番を変えようとする?
0372デフォルトの名無しさんNGNG
数が多いなら、excelのシートに関数名とenum識別子をかいといて
VBAかなにかでボタン一個でソース吐くようにしとけば?

俺だけかもしらんが、よくやってるよ。

その場限りならセルに文字列適当に連結する式かいてコピペ、とかもやるし。
0373デフォルトの名無しさんNGNG
なぜ順番を変えるのかは突っ込まないで置こう。
見栄えが気にくわなくてあっち入れ替えたりこっち動かしたりする時期があるもんさ。
0374デフォルトの名無しさんNGNG
perlスクリプトで自動で吐くようにすればいいやん
0375デフォルトの名無しさんNGNG
ちょっと面倒だけど、こんなん駄目?

#include "stdafx.h"

template< int > struct Function{};
#define DEF_FUNC( index, func ) template<> struct Function<index>{ \
static void call(void){ func(); } }

enum {HOGE,HAGE,};
void hoge(){puts("hoge");}
void hage(){puts("hage");}

DEF_FUNC( HOGE, hoge );
DEF_FUNC( HAGE, hage );

int main(int argc, char* argv[])
{
Function<HOGE>::call();
Function<HAGE>::call();
return 0;
}
0376375NGNG
ガーン!
今頃気づいたけど、呼び出し時のインデックスはコンパイル時には確定してないのか・・・じゃ駄目だ。
0377375NGNG
上のを修正。
ちょっとオーバーヘッドがあるけど、
(テンプレートクラス内のcallをfuncへのポインタに出来ればいいんだろうけど、俺はやり方知らない。)

void (*funcs[])(void) = {
Function<HOGE>::call,
Function<HAGE>::call
};

int main(int argc, char* argv[])
{
for( int index = HOGE; index<=HAGE; ++index )
{
funcs[index]();
}
return 0;
}
0378デフォルトの名無しさんNGNG
> void (*funcs[])(void) = {
> Function<HOGE>::call,
> Function<HAGE>::call
> };

それだと結局、enumを
 enum {HAGE,HOGE,};
に変えられたときにマズーではないか?
0379375NGNG
ぐわぁ!
やっちまった(藁
0380デフォルトの名無しさんNGNG
>>375-377
ちょっとなぁ、という気がする。
自分が書くにはいいが、人には見せられない。

そもそも、見栄えを気にする(順番を入れ替える)んだから、
その書き方はいいとは思えない
0381375NGNG
>>380
つーか普通はこんなことしねぇって。
0382375NGNG
こら待て、今気づいたんだが、375でいいじゃねぇかよ。
enum値と対応させるってことは配列のインデックスは手打ちでenumの値を書くってことだろ?
インデックスが実行時に決まるならenumに対応させる意味もないし。
0383デフォルトの名無しさんNGNG
enum {
 HAGE,
 HOGE,
};

template<int i>
void f();

template<>
void f<HAGE>()
{
 return;
}

void f<HOGE>()
{
 return;
}

void (*func[])() = {
 f<HAGE>,
 f<HOGE>,
};

0384デフォルトの名無しさんNGNG
あ、ダメやん・・・(鬱
0385369NGNG
Modern C++ のInt2Typeとかをみてると、なーんかできそうな気がしてくるんですよねー。
どうやればいいのかはさっぱり分かりませんけど。

>>382
いや、呼び出すときは (*func[n])() ですが…。
対応させる意味がない…? えーと。考えます。
0386デフォルトの名無しさんNGNG
おいおい、じつはCOMだから関数の順序が....とかなんとか理由つけてくれよ
0387デフォルトの名無しさんNGNG
>>385
テーブルを動的に作るのはだめなん?
0388デフォルトの名無しさんNGNG
>>387
俺もそう思う。
0389369NGNG
えーとですね。ふたつの実行ファイルが、enum値に依存してるわけなんです。
エンコーダとデコーダを作ってまして。
エンコーダは、テキストの文字列 "hoge" "hage"を読み込んで、
バイナリでenum値「HOGE,HAGE」を吐きます。んで、
デコーダは、バイナリでHOGE,HAGEをみて、関数hoge(),hage()を呼ぶ、と。
そういう状況です。

>>テーブルを動的に
いや、いいんですけど。でも、静的に解決できることじゃないですか。
出来たらかっこいいじゃないですか。そういうスレじゃないですか、ここは。
0390デフォルトの名無しさんNGNG
>>389
もし出来たとしても決してかっこよくはならないと思うぞ。
0391デフォルトの名無しさんNGNG
#include <iostream>
using std::cout;
using std::endl;

enum {SAGE,MONA,MOGE,HOGE, END}; // ←ここ順番変えてよし!
typedef void (*FUNC)();
void hoge() { cout<<"hoge"<<endl; }
void moge() { cout<<"moge"<<endl; }
void mona() { cout<<"mona"<<endl; }
void sage() { cout<<"sage"<<endl; }

template<int> inline void f() {}
#define ASSOC_FUNC(E,F) template<> inline void f<E>() { F(); }
ASSOC_FUNC(HOGE,hoge)
ASSOC_FUNC(MOGE,moge)
ASSOC_FUNC(MONA,mona)
ASSOC_FUNC(SAGE,sage)
FUNC func[] = { f<0>, f<1>, f<2>, f<3> };

int main()
{
for( int i=0; i<END; ++i )
func[i]();
return 0;
}

…と思ったんだけど、関数ポインタ経由だからinline展開されないよなぁ、これ…。
0392デフォルトの名無しさんNGNG
文字列からenum値に変換するのか?
それだったら、
std::map<std::string, void(*)()> m;
m["hoge"] = hoge;
これでいいじゃん。
0393デフォルトの名無しさんNGNG
文字列->定数で解決したいんだろう

試みとしてはおもしろいかな。
でも、おれの知識じゃまだ無理だなあ。
Modern もっとよむか
0394デフォルトの名無しさんNGNG
なんかみんな無理してるよね(w
それがもの凄く伝わってくるスレ
0395デフォルトの名無しさんNGNG
>>391
改造してみた、本末転倒?

#include <iostream>
using std::cout;
using std::endl;

enum {SAGE,MONA,MOGE,HOGE, END}; // ←ここ順番変えてよし!
#define sage f<SAGE>
#define mona f<MONA>
#define moge f<MOGE>
#define hoge f<HOGE>

typedef void (*FUNC)();
template<int> void f() {}
template<> void sage(){cout<<"sage"<<endl;}
template<> void mona(){cout<<"mona"<<endl;}
template<> void moge(){cout<<"moge"<<endl;}
template<> void hoge(){cout<<"hoge"<<endl;}

FUNC func[] = { f<0>, f<1>, f<2>, f<3> };

int main()
{
for( int i=0; i<END; ++i )
func[i]();
return 0;
}
0396デフォルトの名無しさんNGNG
>>395
全然かっこよくないぞ
0397デフォルトの名無しさんNGNG
もはやかっこよさなんてどうでもいい罠
0398369NGNG
かっこよさ以前に、ちゃんと動作してくれないんですが…。VCのせい?
0399デフォルトの名無しさんNGNG
>>396
Modern(の前半)読んでかっこいいと思ったか?
俺は、すげぇとは思ったがかっこいいとは思わなかったよ(むしろ汚い)。
このスレで今やってることも同じようなもんさ。
おとなしく動的作成にしない389が悪い。
0400デフォルトの名無しさんNGNG
>>398
#include "stdafx.h"
をソースファイルの先頭に入れ忘れてるとか。
0401デフォルトの名無しさんNGNG
関数テンプレートのテンプレートパラメータに定数を使うのは、
VCだとバグのせいでうまくいかなかったはず。
たしか、すべて同一の実体を指すようになってたような。
0402デフォルトの名無しさんNGNG
そういえばそうだったな。
他のに乗り換えれ。
0403デフォルトの名無しさんNGNG
#include <iostream>

template <int i> void func()
{
 std::cout << i << std::endl;
}

int main()
{
 func<0>();
 func<1>();
 return 0;
}

これをコンパイルしてみればわかる
0404デフォルトの名無しさんNGNG
結局、VC(6以下)使ってる限りは無理って結論でよろしいか?
0405369NGNG
両方とも 1 が出力されました…。 (T_T)
0406デフォルトの名無しさんNGNG
関数テンプレートにせずに、クラステンプレートにすればいいやん。

template<int i> class func {
public:
 func() {
  std::cout << i << std::endl;
 }
};
0407デフォルトの名無しさんNGNG
すげー見にくくなってきたな・・・
0408369NGNG
たしかにクラステンプレートならVCでもいける…。
で、あとは391と組み合わせれば…?
0409369NGNG
コンパイルが通らない…。(T_T)
どうすれば…。
0410デフォルトの名無しさんNGNG
>>409
ヒント

enum {
 HAGE,
 HOGE,
};

class FuncBase {
public:
 virtual void operator()() { }
};

template<int i> class FuncObj;

template<>
class FuncObj<HAGE> : public FuncBase {
public: void operator()() {
   std::cout << "hage" << std::endl;
  }
} hage;

template<>
class FuncObj<HOGE> : public FuncBase {
public: void operator()() {
   std::cout << "hoge" << std::endl;
  }
} hoge;

FuncBase* func[] = {
 &hage,
 &hoge,
};

int main()
{
 (*func[HOGE])();
 (*func[HAGE])();
 return 0;
}

テーブルに登録するところをいじってくれ
0411デフォルトの名無しさんNGNG
正直、>>410みたいにしてまでコンパイル時に決定したいとは思わないが。
0412デフォルトの名無しさんNGNG
とりあえずなんでもかんでも関数オブジェクトにしちまうか....
最悪だな
0413デフォルトの名無しさんNGNG
はっきりいって、ここまでしてやることじゃないと思う
0414デフォルトの名無しさんNGNG
やっぱり、動的にテーブルを作るのが一番って事で、

********************** 終了 ************************
0415369NGNG
出来ました!
>>395にはかないませんけど、>>391より効率よく、なおかつVC6でも動きます。

#include <iostream>
using namespace std;

enum{HOGE,MOGE,HAGE,SAGE};// ←順番は任意に入れ替え可能
void hoge(void){cout<<"hoge"<<endl;}
void sage(void){cout<<"sage"<<endl;}
void moge(void){cout<<"moge"<<endl;}
void hage(void){cout<<"hage"<<endl;}

typedef void (*FUNC)(void);

template<int v>
struct f{
static FUNC f_;
};
#define ASSOC_FUNC(A,B) template<> FUNC f<A>::f_ = B;
ASSOC_FUNC(HOGE,hoge)
ASSOC_FUNC(HAGE,hage)
ASSOC_FUNC(SAGE,sage)
ASSOC_FUNC(MOGE,moge)
#undef ASSOC_FUNC

FUNC funcTable[4] = {f<0>::f_ ,f<1>::f_ ,f<2>::f_ ,f<3>::f_ };

int main(int argc, char* argv[])
{
for (int i=0;i<4;++i)
(funcTable[i])();
return 0;
}
0416デフォルトの名無しさんNGNG
初期状態よりも何倍も汚くなっている罠
0417デフォルトの名無しさんNGNG
まさに自己満足以外の何者でもない
0418デフォルトの名無しさんNGNG
プログラムの半分は自己満足で出来ています。
0419デフォルトの名無しさんNGNG
自己満足っつーか、ひとりよがり、って感じ。
0420369NGNG
うえーん、一生懸命考えたのに、ボロクソ言われてるよー
 ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄∨ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄
            ∧_∧
          ( ´Д⊂ヽ
          ⊂    ノ
           人  Y
          し (_)


(´-`).。oO(っていうか、考えついたのが満足であって、>>415を使ったりはしないけどね…)
(´-`).。oO(.NETなら>>395を使えるのかしら?)
0421デフォルトの名無しさんNGNG
とりあえず、よくやった。
でも誰も使うことはないだろう。
0422デフォルトの名無しさんNGNG
筋トレと同じ。
これが実戦と同じだと勘違いしたら問題だが、
こういう鍛え方でしか鍛えられないことはある。
どんどんやるべきだと思うよ。
0423デフォルトの名無しさんNGNG
見せるため、自己満足のための筋トレと
運動するための筋トレはまったく別物。

鍛え方を間違っちゃいかん。
0424デフォルトの名無しさんNGNG
八頭身の予感 age

0425369NGNG
ポリシーやらファンクタやらを勉強ししてて、ふとこんな構文が
通ることに気付いてしまいました。

#include <iostream>
using namespace std;

class Hoge
{
public:
void operator()(void){cout<<"hoge"<<endl;}
};

int main(){
Hoge()();// ←なんと奇怪な構文!
return 0;
}

…うわー。これ、ホントに通っていいんですか? まあ、理屈には合ってますけど…。
(最初のカッコでHogeのデフォルトコンストラクタでテンポラリインスタンスを生成。
次のカッコでHogeのoperator()を呼び出す)

VCだけじゃないことを祈りまふ…。

ちとスレ違いかな。sage.
0426デフォルトの名無しさんNGNG
>>425
それ、普通だが?
文が完了するまで一時オブジェクトの寿命が続くはず。
Hoge(), foo(), bar();
こうすると、bar()の後にHogeのデストラクタが呼ばれる
0427369NGNG
いや、奇怪だっつーてるのは、カッコが連続してることです。
コンストラクタやoperator()の引数次第で、関数宣言だとか
関数ポインタだとか、そのあたりと間違えてしまいそうな構文だなーと。
0428デフォルトの名無しさんNGNG
関数オブジェクトを作り始めれば、別に不思議に思わなくなるよ。
0429デフォルトの名無しさんNGNG
>>425
struct Hoge { Hoge& operator()(void){return *this;} };
int main() {
  Hoge()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()();
}
…はともかくとして、何の変哲もないふつうの構文だと思うよ。

> 関数宣言だとか関数ポインタだとか、そのあたりと間違えてしまいそうな構文
引数付きのコンストラクタを呼び出したりする時に、
下手すると関数宣言扱いになっちまうことはあり。
Effective STLとか参照。
0430デフォルトの名無しさんNGNG
>>425
それ、Cでも通らん?

#include<stdio.h>

typedef void (*fp)(void);
typedef fp (*fpp)(void);

void hogegege(void)
{
printf("\nhogegege\n");
return;
}

fp hogege(void)
{
printf("\nhogege\n");
return(hogegege);
}

fpp hoge(void)
{
printf("\nhoge\n");
return(hogege);
}

int main (int argc, char argv[])
{
hoge()()();
return(0);
}

----
/tmp>gcc hoge.c
/tmp>./a.out

hoge

hogege

hogegege
/tmp>
0431デフォルトの名無しさんNGNG
>>430の登場によって、>>425のささやかな期待は、崩れ去ろうとしている。
しかしそれはC++信望崩壊への、ほんの序曲でしかなかった──────。

425「げ、良く考えたらどれもこれも、Cで作れるじゃん!」
430「それ、Cでも通らん?」
413「はっきりいって、ここまでしてやることじゃないと思う」
426「それ、普通だが?」
425「し、Cマンセー!C++なんてクソ。これ定説!」

だれかprojクトX風に仕立ててくれ。
0432デフォルトの名無しさんNGNG
                 ( ̄ ̄<     / ̄>
                  \  ヽ   / /ソ
        プ ロ ジ ェ ク ト\  ヽ P r o j e c t X
   ─────────────────────
         Generatorたち /|_/ /\Generators
                 |   /   \   丶
                 \/       \__ノ
Genericスレッド。
このスレで425は一人で悩んでいた。なぜこんな構文が許されるのかと。
「いや、関数オブジェクトでは当たり前だ。」
「こんな物は普通だ。」
次々とヤジが飛ぶ。へこんだ。
万策尽き果てたとき、ふと430が現れる。
「Cでも出来るんじゃないか?」
これは、C++に翻弄された男たちの物語である。

風の中のスバル〜♪
0433デフォルトの名無しさんNGNG
まぁ変な書き方とかは狙えばいくらでもできるからね

1+-+-+-+-+-+-+-+1 とか
0434デフォルトの名無しさんNGNG
ぜんぜんgenericじゃない。
0435425NGNG
>>431
一応、マジフォロー。

 Hoge()()()

がCでも関数ポインタを使えば構文上は通るとは言っても、
もちろん単なる関数ポインタと関数オブジェクトでは意味合いは大分違う。

たとえば、ベキ級数アルゴリズムを抽象化したクラスを考える:

class PowerSeries {
private:
int n;
double* coef;

public:
PowerSeries(double* coefficients, int number_of_coefficients)
n(number_of_coefficients), coef(coefficients){;}

double operator(double x){
double rst = coef[n];
for(int i = n - 1; n >= 0; i--){
rst *= x;
rst += coef[i];
}

return (rst);
}

};

このように関数オブジェクトではコード(級数計算アルゴリズム)に対して
それをカスタマイズするようなデータ(係数データ)を付加することができるが、
関数ポインタではできない。

この例は一種のCurry化であるが、一般にこのようなことを記述するには
「データを付加できる関数ポインタのようなもの」が必要になる。
もし高階関数型言語ならば、関数を返り値として関数クロージャーを利用すれば、
クロージャーにこのようなデータを記録できるが、C/C++には
高階関数がないので関数オブジェクトが必要となる。
Genericプログラムにおける関数オブジェクトの効用もそこにある。
0436430NGNG
>>435
スマン。名前間違えた。425じゃなくて430でした。
その上、間違えてageてるし・・・・・・。
0437430NGNG
さらにミスが。やっぱコンパイラ通すのサボっちゃだめスカねぇ。

誤>double operator(double x){
正>double operator() (double x){
0438デフォルトの名無しさんNGNG
でも、たとえばSTLのalgorithmに関数オブジェクトを渡すと、
コピーを渡すことになるのでクロージャのデータは破棄されることになる。
0439430NGNG
うげ、さらにミスが。

誤>ベキ級数アルゴリズムを抽象化したクラス
正>ベキ級数を抽象化したクラス(評価にホーナーのアルゴリズムを使う)
0440430NGNG
>>438
C/C++のオブジェクトの代入セマンティクスでは
デフォは参照じゃなくてコピーざんすからねぇ。
受け渡したいデータの性質と意味に応じてコピー・コンストラクタあたりで
なんとか頑張るしかないでしょうなぁ。
0441430NGNG
>>440
参照カウントやGCライブラリを使うという選択もあるかもしれないけど。
0442デフォルトの名無しさんNGNG
悩める愚者より識者にしつもーん

std::transformに渡す関数オブジェクトって副作用があっちゃダメってことですけど、
これの具体的な根拠ってどこにあって、
実際どういう不具合が考えられるのかわかりますか?

状態変数のようなものを内部に持てるのが関数オブジェクトのいいところだと
思っていたのですが、これはつまり、副作用を期待して呼び出す std::for_eachと
はちがって操作対象の変換(のみ)を純粋に扱うstd::transformが呼ぶ関数オブジェクト
は副作用があってはいけない、といういみでしょうか。

たとえば、
呼び出されるたびに内部カウンタをインクリメントした値を加算する変態加算関数オブジェクト
struct addinc : std::unary_function<int, int> {
addinc(int serial = 0) : serial_(serial) {}
int operator()(int n) { return n + serial++_; }
private:
int serial_;
};
みたいなのは、transformに対して使用するには不適切、ということでしょうか?

それとも関数オブジェクト呼び出しがconstかどうかが問題であって、
int operator()(intn)をconstメンバに、int serial_をmutableとかにしちゃえば
セマンティクス的にもOKというわけなんでしょうか?
0443デフォルトの名無しさんNGNG
age
0444デフォルトの名無しさんNGNG
>>442
> std::transformに渡す関数オブジェクトって副作用があっちゃダメってことですけど、
これ初耳なのだがどこに書いてあったん?
0445デフォルトの名無しさんNGNG
標準テンプレートライブラリによるC++プログラミングの二版の22.16.3の最後に書いてあるんです。

今SGIのSTLのドキュメントを読みましたが、そんなことは書いてないですね。
0446デフォルトの名無しさんNGNG
仕方なく英文のサイトを必死扱いて探してみたところ、

ttp://www.cuj.com/experts/1902/langer.htm?topic=experts
には
Requires: op shall not have any side effects
みたいなことが書いてありますね。

Effective STLかなにかにもtransformに渡すのは述語でなきゃいかん、みたいな
ことがあった気がします。(今手元にないので確認できません。)
0447デフォルトの名無しさんNGNG
>>442
Effective STL 39項がそのものズバリの解説になっている気がする
0448デフォルトの名無しさんNGNG
はうう、後で読み直してみます。
ありがとーございましし。
0449430NGNG
手元にあるC++標準テンプレートライブラリをざっと読む限りだと:
この場合言われてる「副作用」は厳密な参照透明性
(、内部状態変数やグローバル変数への代入、入出力禁止とかを含む)
とかじゃなくて、与えられた引数(イテレータ)の指すオブジェクトを
書き換えてはイカンということなんじゃ?
0450430NGNG
>>449
C++標準テンプレートライブラリ

The C++ Standard Template Library
(P.J.Plauger他著、)の邦訳(ピアソン・エデュケーション刊)ね。
0451430NGNG
>>449
transformがじゃなくてオペレーターがね。>書き換え禁止
0452デフォルトの名無しさんNGNG
>>449
そんな気がする。

Effective STL で取り上げられてたのは Item 37 の std::for_each と
std::accumerate の話じゃない? >>447
0453447NGNG
>>452

チェックしてみたらご指摘の通りでした。すんません。
0454442NGNG
ありがとうございましし。
>>449=430さんのおっしゃるような意味だと解釈しましし。
0455デフォルトの名無しさんNGNG

Lokiの存在を知って以来VCでの開発が苦痛だ・・・
0456デフォルトの名無しさんNGNG
>>455
マジで?
実際にLokiなんか使う場面あるか?
0457デフォルトの名無しさんNGNG
>>456
俺様ライブラリを作るときとか。
Lokiのすべてとは言わないが、カスタマイズ可能なスマートポインタ(他)はホスィ・・・
0458デフォルトの名無しさんNGNG
LokiはA.Alex.の壮大なネタだ
0459デフォルトの名無しさんNGNG
Lokiって実用ライブラリじゃなくてストレステストでしょ
といってみるテスツ
0460デフォルトの名無しさんNGNG
>456
SingletonHolderは使ってますが何か?
0461デフォルトの名無しさんNGNG
誰か話題振れよう。 || (>>303 漏れにも教えて)

0462デフォルトの名無しさんNGNG
どなたかallocator<>の使い方教えて下さい。難しすぎる・・・・・
0463デフォルトの名無しさんNGNG
T型オブジェクトの配列のためのメモリ管理用テンプレート?
がんばれー
0464デフォルトの名無しさんNGNG
T型オブジェクトの配列のためのメモリ管理用テンプレート?
がんばれー
0465デフォルトの名無しさんNGNG
>>455
C#のテンプレートに期待しよう。
0466デフォルトの名無しさんNGNG
>>465
あるの?テンプレート??
0467デフォルトの名無しさんNGNG
>>458は名言だと思う。
というかほんとにそんな気がしてならない。死のう・・・
0468デフォルトの名無しさんNGNG
あの人、コンパイラメーカーで働いてるの?
0469デフォルトの名無しさんNGNG
学生ちゃうん?
0470デフォルトの名無しさんNGNG
>>469
まじ?
0471デフォルトの名無しさんNGNG
各コンパイラメーカーのテンプレートサポートが落ち着いてくれば
Lokiで使われているテクニックが次のスタンダードに導入されるだろう事は
まず間違い無いと思われ。
0472デフォルトの名無しさんNGNG
>>471
一部は使われると思うが、使わないネタも多いんじゃないかなぁ……。
0473デフォルトの名無しさんNGNG
TypeListは必須だな
0474デフォルトの名無しさんNGNG
それはない
0475デフォルトの名無しさんNGNG
>>474
あれ無しでどうしろと?
0476デフォルトの名無しさんNGNG
どう考えても浸透しそうなのはポリシーのみ。
それ以外は実務で役立つかというと(?)
0477デフォルトの名無しさんNGNG
a
0478デフォルトの名無しさんNGNG
aa
0479仕様書無しさんNGNG
aaa
0480デフォルトの名無しさんNGNG
Typelistのとこで、58ページの下に、「コードに繰り返しを
含める事なく、配列を初期化することもできます」ってあるん
ですけど。これって、どうやるんですか?
0481ageNGNG
age.
0482デフォルトの名無しさんNGNG
>>480
読んだ事ないけどstd::fill使うとか?
0483デフォルトの名無しさんNGNG
>>482
fillじゃ無理っしょ。
単なるforループなんだから
0484デフォルトの名無しさんNGNG
試しに繰り返しを使わず配列の初期化をやってみよう。
template <int i>
class A{
public:
template<typename T>
static inline void foo(T* p){ *p = 0; A<i-1>::foo(p+1); }
};

int x[10];
A<10>::foo(x);
これでどうだ。・・・あんまり意味なさげ。
0485デフォルトの名無しさんNGNG
凄いソースだな、そう思うだろ?>>484
0486485NGNG
>>485
お前、頭大丈夫か?

もうだめぽ・・・(-_- )
0487デフォルトの名無しさんNGNG
>>484
最高だ!応用すればループがインライン展開されるfor_eachとか書けそう!
0488デフォルトの名無しさんNGNG
>>487
http://www2.tky.3web.ne.jp/~bandai/24net/prog2/tips1.html
0489デフォルトの名無しさんNGNG
>>487
だめだよ。大抵のコンパイラはtemplateの展開可能レベルが浅い。
0490デフォルトの名無しさんNGNG
最近のコンパイラは最低限のunrollは行ってくれる
最近のCPUはunrollするとキャッシュのミスヒットでパフォーマンスが低下する
0491デフォルトの名無しさんNGNG
>>490
unrollする量でチューニング。
テンプレートを利用した行列計算でメモリ階層を意識して
ブロック化、ループ展開などの最適化を施した例としてMTLがある。
0492480NGNG
>>484
いや、Typelistのとこでの話なんですから、コンパイル時に初期化が
終わるんじゃないかと。
このやり方だと、実行時に初期化してますよね。
0493480NGNG
この58ページの雰囲気的には、

std::type_info* intsRtti[Length<SignedIntegrals>::value] =
{
 TypeAt<SignedIntegrals,0>::Result,
 TypeAt<SignedIntegrals,1>::Result,
 TypeAt<SignedIntegrals,2>::Result,
 TypeAt<SignedIntegrals,3>::Result,
 // Lengthの示す長さ分だけ続ける…
}

これを、コンパイル時に自働的に解決するための汎用性のある書き方が存在する、
ってことだと思うんですよ。

…どうすりゃいいんでしょうね。
0494デフォルトの名無しさんNGNG
配列の要素が静的に初期化できる構文といえば

double a[3] = {1.0 ,2.0 ,3.0};

だが。テンプレートから生成できるとは思えんしなー。
まさか、

template<class T, int N>
struct A
{
T d = T(N)/*constant expression of N*/;
A<T, N-1> succ;
};

template<class T>
struct A<T,1>
{
T d = T(1)/* constant expression */;
};

template<class T, int N>
const T* getArray(const Struct<T,N> s)
{
return((T*)(&s))
}

なんてこたないよな。
仮想メンバ関数もなく継承とかもしてないstructはCの構造体と互換だが……。
移植性あるか?(alignment調整のpackingとか。)
0495494NGNG
>>494
今、手元にコンパイラがないんで未テスト。スマソ。
0496494NGNG
>>494
ごめん。packing -> padding
0497494NGNG
//さすがに動かなかったよ。

#include<iostream.h>

template<int N>
struct Init
{
static const double data = Init<N-1>::data * double(N);
static const Init<N-1> succ;
};

template<>
struct Init<1>
{
static const double data = 1.0;
};

template<int N>
inline const double* getArray(const Init<N> a)
{
return((double*)(&(a)));
}

Init<5> init;
const double* a = getArray(init);

int main(int Argc, char* Argv[])
{
cout << "\n";

for(int i = 0; i < 5; i++)
{
cout << " " << a[i];
}

cout << "\n";

cout << init.data << " ";
cout << init.succ.data << " ";
cout << init.succ.succ.data << " ";
cout << init.succ.succ.succ.data << " ";
cout << init.succ.succ.succ.succ.data << " ";

cout << "\n";

return(0);
}
0498494NGNG
>>497↑はコンパイルは通るけど結果は思ったようにならない。
結果:

4.85246e-270 2.96439e-323 5.08888e-322 1.58101e-322 4.85634e-270
120 24 6 2 1

ある意味ホっとした。
0499デフォルトの名無しさんNGNG
>>497
・・・えーとさぁ。突っ込んでいいかなあ?

> return((double*)(&(a)));
ここでアドレス取ってるけど、これって getArray の引数 a のアドレスだよなぁ?
getArray の引数 a は getArray の終了時にスタックから消滅してるから、
そのアドレスを戻り値として返すのは不正なんじゃなかろうか。

それと、Init<5> の非スタティックメンバって何もないから、
sizeof(Init<5>) = 0 (あるいは 1)のはずで、
それを double にキャストして逆参照してもゴミ値なんじゃないの?
0500494NGNG
>>499
そうすね。頭寝てました。
0501デフォルトの名無しさんNGNG
std::iterator_traits<int*>::value_type val;

C++スレに書かれてたやつだけど、なんかこっちのほうがふさわしそうなんでこっち持ってきた。
VC++6でコンパイルエラーだそうです。

VC++.NETでコンパイルしたら

> xutility(98): error C2825: '_Iter::iterator_category': 限定名を形成できません。
> xutility(98): error C2039: 'iterator_category' : 'operator``global namespace''' のメンバではありません。
> xutility(98): fatal error C1507: エラーが多すぎてコンパイルを継続できません。

って言われた。
ツールチップの型ヒントではちゃんとintのtypedefになってるんだけど、
なぜコンパイルできないんでしょう?
0502デフォルトの名無しさんNGNG
>>501
そのソース、g++とかだと通るの?
0503デフォルトの名無しさんNGNG
>>502
501じゃないけど、g++ならふつうに通るみたいだよ。
0504501NGNG
調べてみました、VC++のコンパイラの能力ではiterator_traitsをポインタに対して特殊化することが出来ないんですね。
そのため特殊化されていない形式のiterator_traitsを構築しようとしてコンパイルエラーが出ているようでした。
STLのソースの中でもiterator_traitsはほとんど使用されていませんでした。
Genericの中に書かれている古いタイプの方法に近い形で実装されているようです。
0505デフォルトの名無しさんNGNG
ああ、まだ上には上がいるんだな。
勉強が足りなかった。
0506デフォルトの名無しさんNGNG
>>303
これってどういう意味? 8章を読んだけど全く理解できなかったってこと?
それとも、全部理解したけど期待した程じゃねーぞゴルァ、ってこと?
0507デフォルトの名無しさんNGNG
>>506
一ヶ月前のレスだぞ?
0508たんなる雑談NGNG
画像の描画処理にPoplicyを使うことにしました
描画処理は
・速度が要求される
・透過、拡大、反転など組み合わせ次第で処理の量が膨大になる
ということでPolicyの考え方にまさにベストマッチですが、
どこをPolicyクラスにしてどこをtemplateクラスにするのかの判断はやっぱり難しいですねぇ。
Policyの境界を越えた最適化が出来ないというのもちょっとネックになりそうです。
0509デフォルトの名無しさんNGNG
>Policyの境界を越えた最適化が出来ないというのもちょっと
これは層化の設計の問題でしょ。
下層で問題になるなら上層のPolicyをごっそり入れ替えればよし。

余談:Policyテクニック自体はSTLが存在するころから存在してるよね。
   STL自身が使ってるから。
0510508NGNG
う〜〜ん使いこなせるようにはまだしばし時間が必要(^^;
0511デフォルトの名無しさんNGNG
http://pc.2ch.net/test/read.cgi/tech/1021548960/3
>書籍中で紹介、また使用されているライブラリLokiはVC++ではコンパイルできません(;_;)サイアク・・・
これって、ちょっとした手直しとかのレベルでは、
使える様にはならないのかな。
0512デフォルトの名無しさんNGNG
>>511
誰か手直ししたら漏れにも下さい
0513デフォルトの名無しさんNGNG
>>511
ほんの一部なら動くがほとんどはダメです。
LokiのキモであるところのTypeListは
テンプレートの部分的な特殊化を前提に組まれてます。
再帰的な処理、その終端の特殊化もその機能に依存してます。
そしてVCでは部分的な特殊化はサポートされません。
これはヘルプにはっきり書いてあります。
0514デフォルトの名無しさんNGNG
じゃあだめじゃん。
クリティカルな問題が無くならないね。
もうちょっと単純な仕様にすればいいのに。>テンプレート
0515デフォルトの名無しさんNGNG
↓これどうなん?

Q: 他のC++ ツールで、より標準に適合しているものはありますか?

JON CAVES: はい、Visual C++よりも標準に適合するC++ コンパイラはあります。
1つの例は、私が100%適合していると信じるEdison Design Group (EDG)によるコンパイラです。
ただし、このコンパイラはWindows プラットホームではあまり利用できませんが。
Windows プラットホームではやはり、Visual C++が最も標準に適合するコンパイラの1つです。
0516デフォルトの名無しさんNGNG
>>515
一長一短ではあるけど、
gcc3 、CodeWarrior7、 bcc5.6 (C++Builder) 辺りは
VC6よりは遙かに標準に近い気がする。VC.NETだとどうなんだろ?
それに、EDGのフロントエンドも100%とは思えないが…。
0517デフォルトの名無しさんNGNG
VC.NETのテンプレート機能はVC6と大差ないです。
テンプレートパラメータがサポートされた程度。
てゆうかLokiコンパイルできません。
0518デフォルトの名無しさんNGNG
>>517

>テンプレートの部分的な特殊化

はどうなの?
0519デフォルトの名無しさんNGNG
VC6と変わりません。つまりダメ。
>>513 はVC.NETでの話。
0520デフォルトの名無しさんNGNG
テンプレートの部分的な特殊化は実装がなかなか複雑なようで
その優先順位の判断にパターンマッチングやらなんやらが必要らしいです。
しかしModernC++によって部分的な特殊化がほぼ別物といっても良いくらい
飛躍的な表現力の向上につながることが明らかにされたわけなので
今後積極的にサポートされていく可能性は高いでしょう。
0521369NGNG
>>519
だ、ダメなんすかー!? がーん。
0522デフォルトの名無しさんNGNG
ModernC++はほんとパラダイムシフトだよね。
あれでコンパイラメーカーの奮起を期待したいところだね。
VC++に関してはどうなんだろう。MSやる気あんのかなぁ。。

個人的には.netでのアクロバットなテンプレートサポートに
期待してるけどね。
0523デフォルトの名無しさんNGNG
>>522
Adobe Acrobat.NET(テンプレート付き)
0524デフォルトの名無しさんNGNG
ワロタ
0525名無しさんNGNG
gcc 3.1 でてるね。
0526デフォルトの名無しさんNGNG
C++じゃ無くても良いんじゃないのかな。
0527508NGNG
デキタ━━(゜∀゜)━( ゜∀)━(  ゜)━(  )━(゜  )━(∀゜ )━(゜∀゜)━━!!!!!

拡大反転透過楕円半透明コピーが出来たときには感動した!!
馬鹿正直に書いてたら数千〜数万行のコードがたったの500行ですんだ、すごいYO!!
0528デフォルトの名無しさんNGNG
『Moder C++ Design』を読んでいるのですが、
公式サイトからダウンロードしたソースに、バグらしきものを発見しました。

該当個所は、第四章で紹介されているFixedAllocatorのVicinityメソッドです。
SmallObj.cpp の中で以下のようになっていますが(左は行番号)、

271: Chunk* lo = deallocChunk_;
272: Chunk* hi = deallocChunk_ + 1;
273: Chunk* loBound = &chunks_.front();
274: Chunk* hiBound = &chunks_.back() + 1;

もし deallocChunk_ が &chunks_.back() と同じ値であった場合、

290: if (p >= hi->pData_ && p < hi->pData_ + chunkLength)

この hi が指しているのは範囲外の要素となってしまいます。
これは既知のバグなのでしょうか。
参考までに VicinityFind メソッドを全文引用しておきます。



264:FixedAllocator::Chunk* FixedAllocator::VicinityFind(void* p)
265:{
266: assert(!chunks_.empty());
267: assert(deallocChunk_);
268:
269: const std::size_t chunkLength = numBlocks_ * blockSize_;
270:
271: Chunk* lo = deallocChunk_;
272: Chunk* hi = deallocChunk_ + 1;
273: Chunk* loBound = &chunks_.front();
274: Chunk* hiBound = &chunks_.back() + 1;
275:
276: for (;;)
277: {
278: if (lo)
279: {
280: if (p >= lo->pData_ && p < lo->pData_ + chunkLength)
281: {
282: return lo;
283: }
284: if (lo == loBound) lo = 0;
285: else --lo;
286: }
287:
288: if (hi)
289: {
290: if (p >= hi->pData_ && p < hi->pData_ + chunkLength)
291: {
292: return hi;
293: }
294: if (++hi == hiBound) hi = 0;
295: }
296: }
297: assert(false);
298: return 0;
299:}
0529直してみたNGNG
264:FixedAllocator::Chunk* FixedAllocator::VicinityFind(void* p)
265:{
266: assert(!chunks_.empty());
267: assert(deallocChunk_);
268:
269: const std::size_t chunkLength = numBlocks_ * blockSize_;
270:
271: Chunk* lo = deallocChunk_;
272: Chunk* hi = deallocChunk_; // ココ
273: Chunk* loBound = &chunks_.front();
274: Chunk* hiBound = &chunks_.back() + 1;
275:
276: for (;;)
277: {
278: if (lo)
279: {
280: if (p >= lo->pData_ && p < lo->pData_ + chunkLength)
281: {
282: return lo;
283: }
284: if (lo == loBound) lo = 0;
285: else --lo;
286: }
287:
294: if (++hi == hiBound) hi = 0; // ココ
288: if (hi)
289: {
290: if (p >= hi->pData_ && p < hi->pData_ + chunkLength)
291: {
292: return hi;
293: }
295: }
296: }
297: assert(false);
298: return 0;
299:}
0530デフォルトの名無しさんNGNG
行番号ウザイ
0531デフォルトの名無しさんNGNG
return 0 は0行目に戻れな罠。
0532528NGNG
>>529
おー、これだとたしかになおってそうですね。
つうか、オレもなおしちゃったけど。
もし未知のバグなら、報告したほうがいいんですかね。英語わかんねえけど。

>>530
がんばって行番号つけたのにッ! BASICを使ってた思い出に浸っていたのにッ!
オレの思い出をこわさないでー!

>>531
んなわけねえだろ。だいたい0行目なんて存在しねえんだよ。
テメエはCのやりすぎだ。一日二回くらいにしといたほうがいいぞ。
0533デフォルトの名無しさんNGNG
>>532
なんか、ギャップにワラタ
0534デフォルトの名無しさんNGNG
>>532
訳者のページに行ってみてはどうか。
オンラインで直ってないなら未知と思われるので。
0535デフォルトの名無しさんNGNG
>>532
me fix bug. this patch
とか書いてdiff結果張り付けてメールとか。
0536528NGNG
とりあえずいろいろ検索してみたら、同じようなことを書いているようなページ発見。
でも英語なので、あいかわらずよくわかりませんです。
http://www.kuro5hin.org/story/2002/4/5/82022/76326

>>533
ギャップってアレか。テキストエディタつくるときに使うとか聞いたことあるやつ。
それはギャップバッファだー! ちゅどーん!

>>534
訳者の方のページは見てみましたが、誤植の情報しかないようでした。残念賞。

>>535
出会い系サイトじゃないと、知らない人にメールなんて出せませんよ。怖すぎ。
しかも外人さんだし。やけに深呼吸ばかりしてそうだし(洋モノビデオの見すぎ)。
0537デフォルトの名無しさんNGNG
>>529
ワロタ。
0538デフォルトの名無しさんNGNG
528が常駐してからスレの雰囲気が悪くなったな
0539デフォルトの名無しさんNGNG
うむ
0540528NGNG
>>538-539
あら、雰囲気悪くなっちゃった? ユーモアってやつをわかってねえなあ。
ほれ、良書って言われる類の書籍には、たいていアメリカンジョークが書いてあるじゃん。
それもすっげーつまんないやつ。立派なプログラマなら、それで笑えるようになろうぜ。

理想としては、>>537の人みたいにソースコードを見ただけで
笑いがこみ上げてくるレベルを目指すべし。
0541デフォルトの名無しさんNGNG
>>540 面白くもないモノに笑えるほど出来た人間じゃないんでね。
キエロ
0542デフォルトの名無しさんNGNG
541<<<<<<<<<<<540
0543デフォルトの名無しさんNGNG
>たいていアメリカンジョークが書いてあるじゃん。
528のはそれ未満なので笑えません。
0544デフォルトの名無しさんNGNG
>>542
それはあり得ない。
常に541>540である
0545デフォルトの名無しさんNGNG
いやホント、>>528って救いようがないよ。
0546デフォルトの名無しさんNGNG
せめてIQが平均気温より高ければなぁ。
0547デフォルトの名無しさんNGNG
>>546
単位は?

(ケルビンじゃないよな)
0548デフォルトの名無しさんNGNG
528って自分に自信のないデヴオタヒッキーなんだろうなぁ…
なんか、某駄スレのJohnに酷似しているし。

0549デフォルトの名無しさんNGNG
Johnの方が小賢しいな
0550デフォルトの名無しさんNGNG
テンプレート使いまくりのコード書いたら
コンパイル速度激しく遅くなったんですが(;´Д`)
PCHにいれても入れなくても変わらず
自業自得ですけど・・・死ねるほどおそひ・・・VC.NET・・・
0551デフォルトの名無しさんNGNG
PCH使って死ぬほど遅いのは、9割方使い方がおかしいだけ。
0552デフォルトの名無しさんNGNG
ちょっとした短いコード(10行以内?)以外は
インライン実装するべきじゃない。
デメリットのほうが大きい。
素直にテンプレートの具体的な特殊化か
ポリモフィズムを使用するべし。
0553デフォルトの名無しさんNGNG
>>552
昔の実装と違ってinlineはregisterと同じくもはやヒントでしかないし……。
そうカリカリせんでもいいんじゃない?
(暗黙のstticの意味を除けば。)
0554デフォルトの名無しさんNGNG
ほっしゅほっしゅ
0555デフォルトの名無しさんNGNG
>>552
VC++の場合ちょっとでも大きいとインライン展開してくれないようです
3行くらいでもわりと複雑な計算してると展開されません
チョー速度が要求されるところだったから__forceinline使いましたが
0556デフォルトの名無しさんNGNG
差分コンパイルができない。=
依存関係のある全てのソースにリコンパイルがかかる。
また、インライン展開されなくとも複数の実体が生成される可能性もある。
そもそもインライン展開の判断自体、処理系依存である。
ちっこいプロジェクトなら問題ないかもしれんが
大規模ではちょっとした手抜きの割に被害はでかい。
テンプレートの使い方とその設計手法をまともに考えれば
クソでかい関数はできないはず。
0557デフォルトの名無しさんNGNG
テンプレートだけ変換することってできない?
0558デフォルトの名無しさんNGNG
>>552 が言っていることがよくわからなんだけど、
inlineとexportしてない(できない)templateとtemplateの明示的特化って
別物じゃないの?
0559デフォルトの名無しさんNGNG
ああまだ上には上がいたんだな(´Д`)
出直そう
0560552NGNG
>ちょっとした短いコード(10行以内?)以外は
>インライン実装するべきじゃない。
>デメリットのほうが大きい。
ここは一般論でその理由は>>556

>素直にテンプレートの具体的な特殊化か
>ポリモフィズムを使用するべし。
こっちは>>550に対してアドヴァイスしたつもりだった。
言葉足らずスマン。
テンプレート関数をexportできる処理系はまだ見たこと無いので
無いものとして話してる。

補足:
>テンプレートの具体的な特殊化
具体的な特殊化でテンプレート引数がすべて決まれば
普通のクラスと同じように非インライン関数として書ける。
テンプレートの用途からするとほとんど使えないテクだが・・
0561デフォルトの名無しさんNGNG
以下のようなテンプレートの特殊化がVC++(ver6)では通らないんですが
何が問題なのでしょうか?g++ならば通るんですが・・・。

template<typename T, typename U> struct test {};
template<class T> struct test<int,T> {};
0562デフォルトの名無しさんNGNG
>>561
VC++は諦めてください
0563561NGNG
マジですか?>>562
いやほんとに頼みます。
0564デフォルトの名無しさんNGNG
>>563
マジです
0565561NGNG
>>564
ありがとうございます。ショックでかいです。
で質問なんですが.NETなら大丈夫とかないですか?
スレとずれて恐縮なんですが。
0566デフォルトの名無しさんNGNG
>>565
.NETでもダメです。
正直がっかりでしたがVC8に期待しましょう。
0567561NGNG
>>566
ありがとうございました(TДT)
0568デフォルトの名無しさんNGNG
VCっていう前提が取れないところが素晴らしい
0569デフォルトの名無しさんNGNG
いまさらVC使う意味は無いと思うんだが。
0570デフォルトの名無しさんNGNG
VitaminC
0571デフォルトの名無しさんNGNG
お金が無いんだよ!!無職なんだから
0572デフォルトの名無しさんNGNG
お金がないならそれこそどうしてVC++?
0573デフォルトの名無しさんNGNG
VSのIDEでコンパイルだけgcc使えればいいのに・・・。
0574デフォルトの名無しさんNGNG
デバッグできないから意味無いじゃん
0575デフォルトの名無しさんNGNG
IDEというのはこれとなんか関係してますか?

http://www.objectcentral.com/
0576VC6に乗せたいNGNG
VS.NETが買えない貧乏人の私としては、VC6で何とか動かしてみたい。

template <class TList>
struct Length
{
  enum { value = 1 + Length<TList::Tail>::value };
};
template <> struct Length<NullType>
{
  enum { value = 0 };
};

template <class TList, unsigned int i>
struct TypeAt
{
  template<int cnt>
  struct isEnd
  {
    typedef typename TypeAt<TList::Tail, cnt-1>::Result type;
  };
  template<> struct isEnd<0>
  {
    typedef typename TList::Head type;
  };
  typedef typename isEnd<i>::type Result;
};

こういう風に書き換えればTypeListを使うことができるようになった。
既出ならスマソ
0577デフォルトの名無しさんNGNG
>>576
なんだかわからんけど、よくやった!
次もこの調子でたのむ。
0578デフォルトの名無しさんNGNG
>>576は神!!
0579デフォルトの名無しさんNGNG
>>576
よくやった!

ただ、
不明な型が厳密にひとつしかないクラステンプレートなら
部分的な特殊化を使わずに実装できるんだが
TypeListにはそうでない機能がいくつかあるんだよね。
0580デフォルトの名無しさんNGNG
VC++で無理やりSingletonHolderを動くようにしたんです。
って言ってもtemplateなstatic変数が作れないだけですから、
マクロ作って個々にインスタンスを作ってやっただけですけど。
で、ためしにLoki::SingletonWithLongevity使ってみたら
GetLongevityの戻り値が大きいほうから先に削除されちゃうんです。
ここでまたぶち切れですよ。
ModernにはGetLongevityの戻り値が小さいほうから削除されるように書かれているのに。
これはどう解釈したら言いのでしょう。
0581デフォルトの名無しさんNGNG
>>576
VC++でSelectをなんとか出来ませんか?
0582VC6に乗せたいNGNG
昼頃出先で書き込もうとしたら、串が2ch鯖に知られてて書き込めず、激しく鬱。
それはさておき。

VC++6.0は、ご承知のようにクラステンプレートの部分的な特殊化を
サポートしていません。
しかし、クラステンプレートの完全な特殊化はサポートされています。

[VC6で使えない例]
template <class TA, class TB>
struct baa{};

template <class TA>
struct baa<TA, int> ← すでに定義されているというエラーが出る
{};

[VC6で通る例]
template <class T>
struct baa{};
template <> struct baa<double> {};

あるいは、
template <class TA, class TB>
struct tee{};
template <> struct tee<double, int> {};

これだけなら大したことはできないのですが、
これをTypeAtのように、クラス内クラスで使うことで、
事実上の部分特殊化を掛けることができるようになります。

現在、手元でIndexOf まで仕上げました。
私はファンクタとダブルディスパッチを使いたいと思っているので、
それらの実装を目指すことにします。
0583デフォルトの名無しさんNGNG
>>582
おぉぉ!

template< A, B, C >

Aだけ特殊化は出来ないから
template< A > class{ template< B, C > }
にしてAを特殊化するんですね!
Select行ってみます!
0584583NGNG
Selectはできたけんども
TypeAtNonStrictで見事に撃沈・・・
完成したら作者に報告とともにどっかにウプしてくれ・・・>>583
0585583NGNG
583を訂正

template< A, B, C > struct
{
 template< A > struct
 { //↑ここを特殊化するんですね
 }
}
0586584(´д`;NGNG
584を訂正
ポインタが・・・>>583じゃ無くて>>582だ。
・・・鬱だ・・・氏んでくる
0587VC6に乗せたいNGNG
>>583殿。>>582で示したガイドラインに沿ってTypeAtNonStrictを書いてみました。

あのように作り方を明記すると、考えが整理できるものですね。
>>576で載せたテンプレートも、ガイドラインに沿った命名に書き換えました。

template <class TList, unsigned int index,
typename DefaultType = NullType>
struct TypeAtNonStrict
{
  template <class tmpTList>
  struct tmp2TypeAt
  {
    template <unsigned int cnt>
    struct tmp1TypeAt
    {
      typedef TypeAtNonStrict<tmpTList::Tail, cnt-1, DefaultType>::Result Result;
    };
    template <> struct tmp1TypeAt<0>
    {
      typedef tmpTList::Head Result;
    };
    typedef tmp1TypeAt<index>::Result Result;
  };
  template <> struct tmp2TypeAt<DefaultType>
  {
    typedef DefaultType Result;
  };
typedef tmp2TypeAt<TList>::Result Result;
};

このコードで、コンパイル、テスト動作ができることは確認しております。
願わくば、この勢いで TypeList.h で定義されている
テンプレート群をVC6仕様に書き換える作業にご協力願いたい。
正直、一人ではきついので。
0588デフォルトの名無しさんNGNG
>>587
で、今どこまで出来てるの?
協力しようにも何が出来てて何がまだなのか分からんと。

ただ、漏れ VC++ 持ってねぇんだよなぁ・・・
0589デフォルトの名無しさんNGNG
強力はおしまんですよ、TypeAtNonStrictすらできなかった漏れが役に立てるかどうかはわからんですけど、
>>587
下から6行目
> template <> struct tmp2TypeAt<DefaultType>

> template <> struct tmp2TypeAt<NullType>
だと思います。
0590VC6に乗せたいNGNG
>>588殿。恥ずかしながら、まだ IndexOf を実装しただけです。
本業もあるため、平日は遅々とした進度になるかと思われます。
できそうなところからどんどん発表していくつもりです。

あと、>>589の指摘ですが、原著の作者の実装をそのまま置き換えたため、
そのようになっております。元ソースと比較してみてください。
なお、先日から取り組んでいる Typlist 型関数は、
数値関数に置き換えれば、このようになります。

Result TypeAtNonStrict(class TList, int index,
class DefaultType = NullType)
{
if(TList != DefaultType)
{
if(index != 0)
{
return TypeAtNonStrict(TList.Tail, index-1, DefaultType);
}
else
{
return TList.Head;
}
}
else
{
return DefaultType;
}
};

元ソースよりもいくらか手続きっぽくなってるのかも。
0591デフォルトの名無しさんNGNG
age
0592VC6に乗せたいNGNG
しまった。タブの置き換えを忘れていました。スマソ

Result TypeAtNonStrict(class TList, int index,
      class DefaultType = NullType)
{
  if(TList != DefaultType)
  {
    if(index != 0)
    {
      return TypeAtNonStrict(TList.Tail, index-1, DefaultType);
    }
    else
    {
      return TList.Head;
    }
  }
  else
  {
    return DefaultType;
  }
};
0593583NGNG
とりあえず私はtypelist.hの下から行きます。
今MostDerived終わりました。後でどっかでマージしませう

あとtmpじゃ分かりにくいので名前付け方法を決めたほうがいいと思います。
私は

template <class TList, unsigned int index,
 typename DefaultType = NullType> struct TypeAtNonStrict
{
 template <class tmpTList> struct SelectTList
 {
  template <unsigned int cnt> struct SelectIndex
  {
    hogehoge...
  };
 };

 typedef SelectTList<TList>::SelectIndex<index>::Result Result;
};

のようにしました
0594デフォルトの名無しさんNGNG
す、すげー。あんたら、すげーよ。完成したら、ぜひ使わせてもらうよ! がんばってっ!
0595583NGNG
ReplaceとReplaceAll終わりました
つーか使っててすげーです、Lokiマンセー!!!
0596デフォルトの名無しさんNGNG
目から鱗すぎます。
素晴らしい。
第二版に日本人の名を連ねられるか??
期待して待つ!
0597デフォルトの名無しさんNGNG
あー
漏れ私的に使いたかったTypeTraitsの移植に挑戦してみようかな・・・
0598583NGNG
Erase以降全て終わりますた
>>597
人が作ったものは作り直したくないので、終わったらここに報告してね。
0599583NGNG
漏れがLokiと格闘してる間にイタリア1点取ってるし・・・(´д`;
0600583NGNG
うぉ!
もしかしてtypelist.h終わったじゃん。
どっかにウプしよーぜ!
0601デフォルトの名無しさんNGNG
sourceforge.comだと世界中から見つかりやすげ
0602デフォルトの名無しさんNGNG
>>601
sourceforge.netだ
0603583NGNG
>>601-602
使い方分からん・・・(´д`;

編集済みtypelist.hとtypemanip.h、
VC++用に改造したsingleton.hが入ってます。
http://www68.dns.ne.jp/~bbs2/upload3/helen/OB00011454.zip
VC++.NETで作ったので、VC++6.0で動かなかったらゴメソ

なにぶん以前は動いてなかったので、typelist.hとtypemanip.hが元と同じように動作するかは確認できてません。
特にtypemanip.hのConversionが、exists2Wayが元と違う方法を使ってるので、その辺でばぐるかも。

編集後のSingletonHolderは残念ながら元と全く同じように使うことは出来ません、
これを使うときは、
プロジェクト内のCPPファイル内でImplementLokiSingletonマクロを使って
SingletonHolderのstaticメンバ変数の実体を作ってちょ

とにかく576は間違いなく神だな・・・
神の啓示を受けた気分だ。
0604583(゚ Д ゚ ;)・・・・NGNG
もしかして・・・車輪の再発明でしたか?

http://www.geocities.com/rani_sharoni/LokiPort.html
0605VC6に乗せたいNGNG
おおおっ! ちょっと離席していた間にもう終わったのですか。すげー!
>>603は早速ダウンロードして、すべてチェックしました。
今のところ、VC6でも正常に動作しているようです。

typename とはこういうものだったのですか。
これを知らずにAppendの実装がうまくいかず、一時中断していたのですが。
知らぬではどうにもならぬですね。まだまだ修行が足りないです。
勉強になります。
0606583NGNG
LokiPortよりも漏れらのやつのほうが美しいようだ、良かった良かった。
0607583NGNG
おりょ?
やっぱりやってることはほとんど同じか・・・(鬱
(汚いと見えた)MakeTypeListやis_TypelistはLokiのバージョンアップで追加されたものかな?
0608VC6に乗せたいNGNG
>>583その「is_Typelist」が、VC6ではコンパイラに通らないです。
結局、VC6にはtypename 指定をしないと、
template<typename Head, typename Tail>
Typelist<Head, Tail>

NullType の区別がつかないようなのです。

VC.NET用はともかく、VC6用は、ここで新規開発しないといけないかも。
0609597NGNG
>>598
ダメですた。
ポインタの特殊化がどーーーしてもできまへん。
と思ったら>>604 で見事に実装されてますた。
悔しいやら嬉しいやら。

ともかく念願のTypeTraitsが手に入りますた。
ありがとうございます。
0610597NGNG
そういえばVCは
なぜか前から関数テンプレートのポインタ等の特殊化を
サポートしてるんだよな・・。
その調子でクラステンプレートも実装してホスィ
0611583NGNG
>>608
漏れはVC.NETなのでLokiPortに満足してしまいますた。
続きはがんばってください。
何かあれば協力しますし。
0612デフォルトの名無しさんNGNG
MakeTypeList age
これがあるとがぜん使う気が起きるね!
0613VC6に乗せたいNGNG
>>608まあ今時VC6でなにかしようというのが、もう時代遅れなのかもしれないですが。
>>609 LokiPort の MakeTypeList は単体で動作するようです。
>>583氏のヘッダに移植できました。

あと、うっかりサンプルソースでReverseを呼び出すのを忘れていたのですが、
こいつがエラーが出てコンパイラにとおりません。(VC6)
ガイドライン通りにちゃんと書かれているようなのですが。原因はまだ不明です。
0614デフォルトの名無しさんNGNG
このスレの前のほう見るとLokiをVCで通るようにするのは絶対無理って書かれてるな。
>>613はその発想力を大切にするといい。
0615デフォルトの名無しさんNGNG
ModernC++のページでもセンセーショナルだと書かれてるね>604
出てきたのが今年の3月だから、タッチの差は僅かだ。

MakeTypeList も上のほうで無理言われてたけどあっさり実装されちゃってる
まるで魔法だ。
C++って奥深すぎる。鬱だ。
0616デフォルトの名無しさんNGNG
テンプレート乱用しすぎますた(´д`;)
1翻訳単位のコンパイルにジャスト3分(あんまり長いので測った
まだ(やってることは)小さなプログラムなのにビルド後のファイルサイズは1MB突破・・・

テンプレート依存は一箇所に局所化して他の翻訳単位は高速化したけどそれでもつらいっす・・・
0617デフォルトの名無しさんNGNG
嘘くせー
0618616NGNG
ヽ(`Д´)ノナンダト!!
0619デフォルトの名無しさんNGNG
>>616
ひょっとしてポインタ型各種について展開してないか?
0620デフォルトの名無しさんNGNG
早速Lokiを酷使してるとか?
0621616NGNG
書き始めたころ(>>508くらい)はまだVCでLokiが動かせるとは夢にも思って無かったです。

画像の描画処理を転送・フィルター・形状・スケーリングの4つのポリシーに分けらああなりますた。
特に2つの転送ポリシーを合成するポリシーを作ったらコードサイズも時間も爆発。(まぁ当然か
0622デフォルトの名無しさんNGNG
転送をポリシーととらえるのはどうか。
ピクセルの特性をポリシーとするなら分かるが。
0623616NGNG
>>622
エフェクト、といえばよかったかも。
単純描画や飽和加算など
0624デフォルトの名無しさんNGNG
なるほど
某otakuのGTLの発展したような物ですね、
かっこよさそうです。
0625デフォルトの名無しさんNGNG
demo otaku はどこいっちゃったんでしょうか?
0626613NGNG
>>621 Effective C++で、void* で受けることで
テンプレートによって生成されるコード量を大幅に
減らすアイデアが載っていましたが、いかがか?

>>604からスレの流れが変わったので、コテハンやめるっす。

0627デフォルトの名無しさんNGNG
>>626
Effectiveもってないっす、詳細きぼん
0628デフォルトの名無しさんNGNG
STLスレって倉庫落ち?
0629デフォルトの名無しさんNGNG
>>628
ageたよ
http://pc.2ch.net/test/read.cgi/tech/1004287394/
0630デフォルトの名無しさんNGNG
あぐ
http://pc.2ch.net/test/read.cgi/tech/1021787032/556
に書いてしまった…。サンクスコ>>629
0631613NGNG
>>627
Modern C++ Designは Effective C++に書いてあることが前提になっているので、
先に読んでおいたほうがいいですぞ。買っても後悔しないです。

要は、コンテナに入れるものをvoid*として格納するコンテナを用意しておき、
要素に対する操作を定義しておきます。(ソートだとか何とか)
で、void*として放り込む作成・破壊クラスを別に定義します。
確かこんな感じだったはず。詳細は当該書籍を読まれよ。
0632デフォルトの名無しさんNGNG
既出の質問かもしれませんが、教えて下さい。
メンバー関数の有無によってコードを書き分けるにはどうしたら良いのでしょうか。

例えば、次のようなテンプレートクラスがあるとします。
template <class A>
class X {
 void func() {
  if (/* A::foo() があるかどうかの判定*/) }
   /*CODE1: A::foo()を使う処理 */
  } else {
   /*CODE2: A::foo()を使わない処理、もしくはA::foo()の処理を肩代りする処理*/
  }
 }
};

ここでクラスA1にはメンバー関数foo()があり、
クラスA2にはメンバー関数foo()がないとします。

このとき、X<A1>::func()とX<A2>::func()は
それぞれCODE1とCODE2の部分だけ実行するようにしたいのです。
できれば、判定をコンパイル時に行ない、コンパイルされたオブジェクト
にはコードが最適化されてCODE1とCODE2のどちらかしかしか
存在しないようにしたいと思っています。

こういうことは可能でしょうか?
可能だとするとどのようにしたら良いでしょうか?
0633デフォルトの名無しさんNGNG
>>632
タグディスパッチ
0634632NGNG
>>633
さっそくどうもありがとうございました。

Googleで検索してみたら、次のURLがヒットしました。
http://www.issei.org/programming/boost/more/generic_programming.htm
ここで言われているのがそれですか?

なかなか凝ったやり方に感じましたが、勉強になりました。
0635デフォルトの名無しさんNGNG
>>632
C++にはリフレクション機能が無いので
特定メンバあるかどうかの判断はできない。(・・よね?)
だから他の条件が必要。

渡されるクラス全てにタグを定義とかの制限をつけてもよいならタグディスパッチ
だめならlokiのTypeTraitsで使えそうな特性をみつけるとか。
私的には特定のクラスのサブクラスかどうかで分けるのが良いと思うが。
0636626NGNG
>>613 なんだかよく分からないのですが、
>>583氏のヘッダに適宜 LokiPortのコードを移植することで、
LokiPortのTest_Typelist.cpp がコンパイルできてしまいました。
ということは、Typelistに関してはVC6でも動作可能ということですよね。
ううむ。

0637デフォルトの名無しさんNGNG
移植完了品をパッチかアーカイブの形式で全部UPしてください
0638デフォルトの名無しさんNGNG
>>636
VC6ってテンプレートパラーメータサポートしてなかったと思うけど
どうやってるの?
0639デフォルトの名無しさんNGNG
>>638
ん? できないのは部分特殊化でしょ?
テンプレートパラメータサポートしてないってどういうこと?
文字通り取るとtemplate自体使えないような。
0640デフォルトの名無しさんNGNG
>>639
テンプレートテンプレートパラメータのことでしょ。わざわざ揚げ足取らんでも。
template< class A, template<class> B > class C { ... };

ってゆーかしかし、LokiのTypeListって部分特殊化さえあれば動くと思ったが。
0641デフォルトの名無しさんNGNG
>>640
どういうときに使うの?
0642デフォルトの名無しさんNGNG
>>641
http://www.comeaucomputing.com/techtalk/templates/#ttp
0643デフォルトの名無しさんNGNG
LokiPortのTypeTraits::isConstがうまく動かない・・
参照型が問答無用でconstと判断されてしまう。
まぁあんまり使い道の無い機能ではあるが
ザンネン。
0644デフォルトの名無しさんNGNG
・・・よくよく考えると
参照そのものは変更できないからconstという判断でいいのかな。
そういうことにしよう!
0645デフォルトの名無しさんNGNG
ん?
isPointerの実装おかしいような??
これconstの判別できないだろ?
0646デフォルトの名無しさんNGNG
>>644-645
仮にVC++の話であるなら
http://msdn.microsoft.com/library/default.asp?url=/library/en-us/vclang/html/vclrf14552partialorderingoffunctiontemplates.asp
なのでそこんとこ注意。
0647デフォルトの名無しさんNGNG
>>646
そうなんだよね・・
それなのになんで動くのかちと不思議。
保障されない動作なんだろうか。

とりあえずisPointerはポイント先の修飾された奴を全部消して
コンストポインタの判定を追加したらうまく動いた。
0648デフォルトの名無しさんNGNG
template<typename U>
static yes is_pointer1(Type2Type<U *>);
static no is_pointer1(...);
template<typename U>
static yes is_pointer2(Type2Type<U * const>);
static no is_pointer2(...);

enum {
isPointer =
sizeof(is_pointer1(Type2Type<T>())) == sizeof(yes) ||
sizeof(is_pointer2(Type2Type<T>())) == sizeof(yes) ||
};

これで動いた。
これって単に動作確認してなかったのかな。
それともSPあてる・あてないで動作変わったのかな・・
0649デフォルトの名無しさんNGNG
>>632
激しく遅レスだが
VC++には__if_exists/__if_not_existsなるキーワードがあって
関数や変数の有無で処理を分けられる
移植性を考えれば使えないが
0650デフォルトの名無しさんNGNG
>>649
それどうやって使うの?
解説キボンヌ
0651デフォルトの名無しさんNGNG
>>649
それって.NET専用?
0652デフォルトの名無しさんNGNG
>>650

#include <iostream>

int main(void)
{
int a;
__if_exists( a ){ std::cout << "a ハケーン" << std::endl; }
__if_not_exists( a ){ std::cout << "そんな変数無いです" << std::endl; }
}

こんな感じ
このままだと "a ハケーン" が表示される
int a;をコメントアウトすると "そんな変数無いです" が表示される

( ) 括弧の中は変数だけじゃなくて、任意のシンボルが入れられる。
もちろんメンバ関数も。
0653デフォルトの名無しさんNGNG
>>651
ネイティブにも使えるけど、もしかしたらVC++.NETから新しく追加された機能かも
0654デフォルトの名無しさんNGNG
6.0には無かった。
0655名無しさんNGNG
>>649
メンバー、メソッドでもOKなの?
0656デフォルトの名無しさんNGNG
このスレに巣食ってる型はハイレベルですね・・・。
0657デフォルトの名無しさんNGNG
こういうのぜひ 規格 にフィードバックして欲しい
(識別子をどうするかは、考えないといけないが)
0658デフォルトの名無しさんNGNG
>>657
コンパイラによるリフレクション? 規格はさすがに無理ぽそうだけど...
0659名無しさんNGNG
つーか、どういう時に効くのかな?
ウヒャ─、これは便利、って例ある?

http://msdn.microsoft.com/library/default.asp?url=/library/en-us/vclang/html/vclrfthe__if_existsstatement.asp
memberもOKなのね。しかし、なんじゃこりゃ? って感じ。
0660デフォルトの名無しさんNGNG
std::advanceのようなアルゴリズムを記述するのに、
タグディスパッチがいらなくなるんじゃない
0661名無しさんNGNG
template <class _Iterator, class _Distance>
inline void advance(_Iterator& __i, _Distance __n) {
 __if_exists( _Iterator::operator[]){ __i += __n; } // random
 __if_exists( _Iterator::operator--){ if (__n >= 0) while (__n--) ++__i; else while (__n++) --__i; } // bi
 // elseがないからtag抜きでforward iterator書きにくい。
}
こんな感じ?


 
0662デフォルトの名無しさんNGNG
Templateを初心者にも分かりやすく教えてください。
0663デフォルトの名無しさんNGNG
>>662
コンパイラがコンパイルの前に置換をしてくれるんだよ。
プリプロセッサがやる単純な置換と違い、コンパイラが型チェックに
責任を持ってくれる。

0664デフォルトの名無しさんNGNG
>>633
Templateはどういうときに使うのですか?
0665デフォルトの名無しさんNGNG
>>664
リストって知ってるよね?単方向でも双方向でも。

例えば、構造体Aと言う値を保持するリストのクラスを作ったとする。
これがなかなか便利で他のプログラムにも使いたい。

しかし、構造体Aは前のプログラム独自の物なので汎用性を持たせたい。
そこで、構造体Aの代わりにvoid *を持たせることにした。

しかし、これでは型キャストの嵐になるし、新しいノードを作るとき、自動的にデータ格納用の
メモリ領域を確保したり開放したりすることが困難になる。

next = new nextnode();
next.data = new ここを使う型が変わるたびに変更しなくてはならない。


そこでテンプレート。これは特定の抽象型を具体的な型に置換できる。
例えば、データ用の型をDATAとし、それをintと具体化すれば、
int型を扱うリストが出来るし、struct aaaと具体化すればaaa構造体のリストとなる。
0666デフォルトの名無しさんNGNG
あれ、完全に置換はしないってあったような気がするけど
0667デフォルトの名無しさんNGNG
>>664
抽象化する時
(メソッドとか関数とか)
0668613NGNG
>>663 >>665

激しくスレ違いに真面目にレス。2ちゃんねらーの鑑です。
私も見習わないと。

ということで真面目レスを追加しておきますと、
テンプレート(template)の萌芽はMFCのコンテナにも見られます。
(CMap、CListなど)

でもやはり、STLは一通り勉強しましょう。
ttp://www.wakhok.ac.jp/~sumi/stl/index.html
それから、Effective C++、More Effective C++を一通り読んで、
>>1 のModern C++ Design を買えば、
晴れてこのスレの住人に仲間入りです。
頑張りなされ。
0669デフォルトの名無しさんNGNG
Effective C++、More Effective C++、Modern C++ Design
いくらかかると思ってんのYO(`Д´)
0670デフォルトの名無しさんNGNG
>>669
全部持ってるYO!高かったけど仕方ないYO!
0671デフォルトの名無しさんNGNG
>>669
書籍にかけた金は、すぐに仕事実績で取り返せる(ちゃんと読めば)。惜しむな。
0672デフォルトの名無しさんNGNG
> 書籍にかけた金は、すぐに仕事実績で取り返せる(ちゃんと読めば)。惜しむな。
そう思いこみたいんですね :)
0673デフォルトの名無しさんNGNG
>>672
怖がりすぎー。
0674デフォルトの名無しさんNGNG
「primitiveな変数をいちいちconstructorで
初期化するのはめんどくせー」ってことで、
WithInit< int , 600 > m_intvalue;
ちゅーよーなのを書いた。
ひょっとして、車輪を再発名した……?
0675 ◆4COMPILE NGNG
>>674
勝手に600に初期化されるint ってこと?
0676ageNGNG
VC++.NETにて下記のコードで InnerInStrict がコンパイルエラー
"error C2516: 'Inner' : は正しい基本クラスではありません。"
を吐きます。
InnerInFunc は問題なく通ります。
これはC++の仕様?それともVC++の問題?
InnerInStruct も使えるように出来ないのでしょうか?

struct Base{ struct Inner{};};
template< typename T > struct Mid: public T{};

template< typename T > struct Sub
{
 struct InnerInStruct: public Mid< T >::Inner{};
 Sub()
 {
  struct InnerInFunc: public Mid< T >::Inner{};
 }
};

int main(void)
{
 Sub< Base > sub;
}

0677デフォルトの名無しさんNGNG
>>674
整数型でしか使えないじゃん。
0678デフォルトの名無しさんNGNG
>>676
g++3.1やbcc5.5.1では何ごともなく通ったよん
0679676NGNG
>>678
鬱・・・
0680デフォルトの名無しさんNGNG
>677
bool, int ,char , short, long , float, doubleと使えれば
充分じゃねーんすか?
0681デフォルトの名無しさんNGNG
Genericプログラミングマニアのみなさま。汎用シーケンスコンテナを作れませんか。

Effective STLの第2項、「コンテナに依存しないコードという幻想に注意しよう」を
読んだ上で言ってます。
vector,deque,listってのは、しょせん実装の詳細なわけですから、最初っから
「汎用シーケンスコンテナ」ってのがあって、その実装を、vector,deque,listなどの中から
ポリシーで選べたら便利なんじゃないかと思うわけですが。
Effective STLには、たとえば「vectorをサポートしようとすると、push_frontとpop_frontを
使用できない」とか書いてあります。要するに、「全部に共通するメンバ関数がないから、無理」
ってなことに過ぎないわけでして。全部ラップして作り直せば問題解決なんでは、と思った
わけです。どうでしょう?

// ポリシークラスその1。vectorによる実装。
template<class T>
class ImplVector
{
public:
  typedef std::vector<T> cont_t;
  typedef cont_t::iterator Iter;
  typedef cont_t::size_type SizeType;
private:
  cont_t c_;
public:
  void PushFront(T val){
    c_.insert(c_.begin(),T);
  }
  void PushBack(T val){
    c_.push_back(T);
  }
  void Erase(T val){
    // eraseとremoveの慣用的用法ってやつ。
    c_.erase(remove(c_.begin(),c_.end(),val),c_.end());
  }
  T& operator[](SizeType n){
    return c_[n];
  }
};
0682681NGNG
// ポリシークラスその2。listによる実装。
template<class T>
class ImplList
{
public:
  typedef std::list<T> cont_t;
  typedef cont_t::iterator Iter;
  typedef cont_t::size_type SizeType;
private:
  cont_t c_;
public:
  void PushFront(T val){
    c_.push_front(T);
  }
  void PushBack(T val){
    c_.push_back(T);
  }
  void Erase(T val){
    c_.remove(T);
  }
  T& operator[](SizeType n){
    Iter it = c_.begin();
    for (int i=0;i<n;++i){
      ++it;
    }
    return *it;
  }
}

// Generic Sequence Container
template
  <
    class T,
    template <class> class ImplContainer = ImplVector
  >
class GSC : public ImplContainer<T>
{
};

GSC<int> gsc;
gsc.PushBack(3);
gsc.PushFront(5);
gsc.Erase(3);
int a = gsc[0];

こんな感じで、効率の良し悪しは無視して、思いつく限りのメンバ関数を
用意しておけばいいんじゃないかなと。後で「vector実装でOKだと思ってたけど、
list実装の方がよかったな〜」ってときは、GSC<int>って定義をGSC<int,ImplList>に
変えるだけです。使ってる部分のコードは全く変更しなくていい、ってのが当然の目標。

……とかいって、どっかですでに開発されてましたー、じゃ虚しいんで、
存在を知ってる人がいたら、さっさとツッコミ入れてくださいね。
0683デフォルトの名無しさんNGNG
>>674
初期値を変更したくなったときに依存してるソース全部で
再婚パイルが必要なのって面倒い。

>>682
「vectorでOKだと思って operator[] を使って色々実装していたけど
やっぱりlistの方が良かったなー」なんてことは起こり得んと思うがどうか。

例えば std::queue のコンテナにはほとんどの実装だと list/deque は取れても
vectorは使えないけれど、それはvectorを使う意味が全くないからであって、
そこにあえてvectorを渡せるように汎用性を持たせる…みたいなことって
やってもしょうがないのでは。
0684デフォルトの名無しさんNGNG
>>680
> bool, int ,char , short, long , float, doubleと使えれば
> 充分じゃねーんすか?

いや、template に float や double (char もか?) の即値はつっこめないのではないかと。。。
0685681NGNG
>>683
いや、それは単にそういうありえなさそうな状況を挙げてるだけでは。(^^;
operator[]を使うって事は最初っからlistが考慮の外なのは明らかですから、
そういう状況を持ってきて否定されても。std::queueのほうも、目的が
はっきりしているなら、汎用シーケンスコンテナなんて必要ないのは
あたりまえです。

とりあえず、俺がこれを欲しいと思った動機を。vectorでもlistでもいいような、
曖昧な状況で『とりあえずvector』で開発をはじめたけど、あとで『げ、中間への
データ挿入が出てきた。やっぱlist』って切り替えたくなったんです。そのとき、
データ削除部分の形がvectorとlistでは全然違うやん、ってので参ったんです。

要するに、『どのシーケンスコンテナが最適なのか、不透明な状況』に対して
最適な回答をもたらすために、汎用シーケンスコンテナがあればいいなぁ、と。

どのコンテナが最適なのかわかんないうちから開発を始めてんじゃねーぞ、
って言われたら、「はい、ごめんなさい」と凹むしかないですが……。
0686デフォルトの名無しさんNGNG
Effective STLに書いてあったかどうかしらんが、必ずtypedefをするようにしとくだけで
いいんでないの?

いちおう、
どういうコンテナを使うべきかの分析無しで作りはじめてんじゃねーゾ。
0687デフォルトの名無しさんNGNG
age
0688668NGNG
>>685
私の場合は、テキストエディタを作るときに1行のテキストを
stringに入れて、listに入れて使いました。
stringはコピーにコストがかかるので、

vector::[] + insert よりは、
list::advance + insert の方がパフォーマンスがよかったです。
(advance 10万回で0.04秒程度)

しかしそれはコンテナの性質と設計上の要請を勘案すれば
事前に分かることで、わざわざポリシーにするほどのことではないと思うのですが。
0689デフォルトの名無しさんNGNG
テキストエディタはlist+キャッシュと言うのが常套手段だよな。
もう常識中の常識。

それより、1行に持てるデータの構造をどう記述するかの方が問題。
0690681NGNG
>>686
typedefは必ずやってます。>>681で書いてるみたいなやつを。
でも、typedefじゃ『削除』はどうにもならないんですよね。

とりあえず逝ってきます……。
0691デフォルトの名無しさんNGNG
listっておい、まともなやつはgapped bufferだろ..
0692デフォルトの名無しさんNGNG
>>691
listとギャップバッファは用途違うと思うが?
それから、ギャップバッファも1行に保持するデータが長くなってくると
パフォーマンスががた落ちするよ、所詮2セグメントのデータだからね。
0693デフォルトの名無しさんNGNG
>684
VC++6で、double即値、char即値ともつっこめますた。
0694648NGNG
Boostにごっついtype_traitsの実装があることに今ごろ気付きますた・・・!!
死のう。
0695デフォルトの名無しさんNGNG
>>691は何行になるかわからんのにいちいち行ごとに
オブジェクト作るなって言いたいんじゃないのか?

そういう点でみれば>>692のは激しく的はずれ

0696デフォルトの名無しさんNGNG
gapped bufferってn行へジャンプとかが苦手じゃないの?
0697デフォルトの名無しさんNGNG
苦手といえば苦手だが克服は簡単だよ
最近のPCは速いし。
0698デフォルトの名無しさんNGNG
listと違ってn行へのジャンプが定数時間で終わるのがgapbufferじゃないのか?
0699デフォルトの名無しさんNGNG
>>698
gapped buffer って、バッファの内容をカーソル位置で分割して管理する方法だよね。
それだと、コストはこうじゃないかな。

gapped buffer
 一文字追加、削除 O(1)
 指定行の移動 O(バッファの総文字数)

リスト
 一文字追加、削除 O(一行の文字数)
 指定行への移動 O(ファイルの行数)

gapped buffer は「普段よく使うのは一文字単位の追加・削除だから、こっちを
早くしたほうが快適だ」という信念に基づくデータ構造だと思うよ。ついでに、今
時の PC を前提とするなら、どっちでも早すぎて変わらん。
0700デフォルトの名無しさんNGNG
>gapped buffer って、バッファの内容をカーソル位置で分割して管理する方法だよね。

これだと先頭から終端までジャンプするのに、バッファのコピーが発生するよね?
めちゃくちゃ遅くならない?
0701デフォルトの名無しさんNGNG
>>700
挿入・削除のタイミングでバッファ内の整理をすればよいので
全然そんなことない。

極端にでかいファイルもストレスなく開けるようにするのに便利。
0702デフォルトの名無しさんNGNG
VZは行編集バッファを別に持って、
何か書き換え始めたら行編集バッファにコピーしてきて編集し、
カーソルがその行から出たりするタイミングで書き戻してたっけ。
0703デフォルトの名無しさんNGNG
ちょっと質問 gapped bufferってデータを
head part  cursor    tail part
|-----------| + |------------|
こんな感じで持つ構造と考えて良いのでしょうか?

それとも、下の様にいくつかのフラグメントに分けて保存して、
編集時のコピー量を少なく納める構造なのでしょうか?
|-----| |-----| |----+-| |------|

日本語のサイトをいくつか検索しても、
どっちとも取れるようなどっちも違うような記述でよく分かりません
0704名無しさんNGNG
後者は変形の一つ。

>>700
正直、editorならほとんど変りがない。今や一番重いのはGUIの描画。
0705デフォルトの名無しさんNGNG
>>703
カーソル位置とギャップ位置は関係ない
ギャップは普通エディットしている部分に作られる
0706デフォルトの名無しさんNGNG
どうでもいいけど話題がスレ違い
0707デフォルトの名無しさんNGNG
ではだれかgapped bufferをgenericに実装した例をキボンヌ
0708デフォルトの名無しさんNGNG
>>707
http://www.google.co.jp/search?sourceid=navclient&hl=ja&ie=utf8&oe=utf8&q=%E3%82%AE%E3%83%A3%E3%83%83%E3%83%97%E3%83%90%E3%83%83%E3%83%95%E3%82%A1
0709デフォルトの名無しさんNGNG
gapped bufferのメリットがぜんぜんわからぬ・・・
0710デフォルトの名無しさんNGNG
http://www.jah.ne.jp/~naoyuki/Programs/Programs.html
ここにあるな
0711デフォルトの名無しさんNGNG
STLPortとLokiPort(のSmallObj)同時に使えないっすね。
STLPortのlower_boundに不具合があるんですけど、
どうにもならないですかね。
0712デフォルトの名無しさんNGNG
>>711
lower_boundにどんな不具合がありますか?
0713デフォルトの名無しさんNGNG
>>712
ぉ!
Generic Programing and the STL見てみたら、
STLPortの動作のほうが正しいですね。
// MSDNには書いてない新たな条件が・・・
LokiPortのほうの使い方に問題があるみたいですね
0714デフォルトの名無しさんNGNG
boostのTypeTraitsのコード読んでたんだが
ちょっと前、Lokiの移植で話題になってたVCで
テンプレートの部分的な特殊化をエミュレーションしてる部分に
こんなコメントかいてあるんだけどあれのどこが not legal なの?
ーー以下引用ーーー

// the following VC6 specific implementation is *NOT* legal
// C++, but has the advantage that it works for incomplete
template<class T1>
struct is_same_part_1 {
template<class T2> struct part_2 { enum { value = false }; };
template<> struct part_2<T1> { enum { value = true }; };
};

ーー引用ココまでーー
他のコンパイラでは動かないのかな?
0715デフォルトの名無しさんNGNG
.NET Framework SDKについてるC++のコマンドラインコンパイラでは
Lokiを使えますか?
0716デフォルトの名無しさんNGNG
>>715
過去ログよめ
0717デフォルトの名無しさんNGNG
>>716
過去ログにはVC++.NETとあるだけなので、VisualStudioなのか
.NET Framework SDKだけでも大丈夫なのかわかりませんが。
0718デフォルトの名無しさんNGNG
>>717
一応、最適化のオプションが使えなくなってるだけで、
あとは普通にManagedも吐ければ、通常コンパイルもできる

まずは使ってから質問しろ。
lokiが使いたいだけならgccにしろ。
0719デフォルトの名無しさんNGNG
>>718
使うかどうかまだ決めてないんで。
情報どうも。
0720デフォルトの名無しさんNGNG
>>719
LokiPortを使えば?
http://www.geocities.com/rani_sharoni/LokiPort.html
0721デフォルトの名無しさんNGNG
VC7.0のコンパイラって何処で落とせますか??
0722デフォルトの名無しさんNGNG
>>721
http://msdn.microsoft.com/netframework/
0723デフォルトの名無しさん NGNG
VC7.0はtypeof演算子は使える?
g++だといけるんだけど。
0724デフォルトの名無しさんNGNG
>>723
それがGeneric Programmingと何の以下略
0725デフォルトの名無しさんNGNG
>>724
コンパイラへのプログラミングにおいて
限られた道具が増えることは、かなり重要なことだと思うけど・・・

今のところ、どう使うか考えてるところではあるんだけどね:)
0726デフォルトの名無しさんNGNG
処理系依存の話は、できれば余所でお願いしたいところだが。

(まぁ C++ の template 自体、完全実装してる処理系はほとんどないから、
処理系依存に近いのが現状だけどさ)
0727デフォルトの名無しさんNGNG
http://www-cdserver.fnal.gov/cd_public/sag/J16/J16.htm
http://www-cdserver.fnal.gov/cd_public/sag/J16/J16_files/slide0042.htm

• typedef templates:
template< class T >
typedef std::map< std::string, T > Dictionary;
Dictionary<double> d;
Dictionary<PhoneNumber> phonebook;

• typeof() compile-time operator:
template< class T >
void foo( T t ) {
  typeof( f(t) ) y = f(t);
… ;
}

こりゃ凄いと思うがどうよ。
0728デフォルトの名無しさんNGNG
あ、凄いのはtypedef templateの方ね(笑
0729デフォルトの名無しさんNGNG
どっちもホスィ・・・
0730デフォルトの名無しさんNGNG
typeofって拡張だろ?
0731デフォルトの名無しさんNGNG
>>730
標準に含めて欲しいっていう提案はされてるみたい
0732デフォルトの名無しさんNGNG
なるほど、スレ違いってうまい言葉だなあ
0733標準化委員会NGNG
typeofはもうすぐ導入予定です
0734デフォルトの名無しさんNGNG
typeofはいいから早くANSIに対応してくれよ>VC++

g++ってあれだけがんばってるのに、ユーザーは
相変わらずCでゴリゴリ書くのが好きな人ばっかりで、
なんか哀れだよね。
0735デフォルトの名無しさんNGNG
typeof萌え、標準にすぐ入れるべし、
0736デフォルトの名無しさんNGNG
typeofはテンプレートのないCに取り入れられた方が
劇的にコーディングスタイルが変わりそう。
0737デフォルトの名無しさんNGNG
>>736
マクロプログラミングですか?
イヤだなぁ
0738デフォルトの名無しさんNGNG

#define foreach( itr, cont ) for( typeof( (cont).begin() ) itr = (cont).begin(); itr!=(cont).end(); ++itr )
0739デフォルトの名無しさんNGNG
template<typename T>struct SA{
   template<typename A,typename B>struct TSA{TSA(){cout<<"A"<<endl;}};
   template<>struct TSA<T,int>{TSA<T,int>(){cout<<"B"<<endl;}};
   template<>struct TSA<T,double>{TSA(){cout<<"C"<<endl;}};←これが警告になって、しかも無視されるのがわからない。なんで?
};
0740名無しさん@カラアゲうまうまNGNG
オーバーロードの曖昧さ?
0741デフォルトの名無しさんNGNG
Cスタイルの文字列を受け取れるテンプレートで、
const char* を受け取れるようにしとけば動作するけど、
template< unsigned N > f( const char (&x)[N] );
にバージョンを用意しとけば、文字列リテラルを受け取ったときに、
N で文字列長を受け取れる分、より効率的に処理できるようです。
ですが、↑みたいなテンプレートを使ってるのをほかで見たことがありません。
なにか問題があるからなのでしょうか?
それとも、見つけれて無いだけで、めずらしくもない方法なんでしょうか?
0742デフォルトの名無しさんNGNG
>>741
boos::type_traits::is_array
0743デフォルトの名無しさんNGNG
^boos^boost
0744741NGNG
>>742
配列型の判別はできても、boostのやつには N が取れないように見えますが、
同じことができるってことですか?
0745デフォルトの名無しさんNGNG
LokiPortのis_arrayにも似たような記述があるが
環境依存な部分も少なからずあるみたい。
ただ単にサイズを自動的に取得したいという目的ならば不要かと。
const char* との共存ができないようだし。(VC7)
普通にstring(literal, sizeof(literal))で問題無いかと。
0746デフォルトの名無しさんNGNG
もうtemplateは疲れた。
0747デフォルトの名無しさんNGNG
正直、Lokiの延長みたいのが仕事で使われるようになったら、
この業界辞める。もっとらくちんなの希望。
0748デフォルトの名無しさんNGNG
>>747
ライブラリ作るのとそれ使うのとでは全然違うと思われ
0749デフォルトの名無しさんNGNG
>>747
激しく同意。
STLのように使うだけのライブラリとはちょっと違う。
プログラム設計において根本から変わってしまうような
ものだと思う。
というかそろそろ言語の機能をフル活用しなければならない
っていう呪縛から逃れたいところだね。C++使ってるひとには
自分も含めて、この傾向が強いから。
0750デフォルトの名無しさんNGNG
自分が便利だと思う機能をしっかりと使えればいーんじゃネーノ?


……と思ったが、そうすると他人のプログラムの保守ができんな。
0751デフォルトの名無しさんNGNG
機能は、必要を感じた時に初めてその使用の検討をするべき。
templateなんて特にそうだと思うぞ。
俺は無いと困るみたいな状況に陥ったことがないので、
使ったことは無いが。w
0752デフォルトの名無しさんNGNG
>>751
> 機能は、必要を感じた時に初めてその使用の検討をするべき。
とはいえ、全く知らないと

 これを使えば簡単に済むのに

っつーことに気づかぬ罠。
0753デフォルトの名無しさんNGNG
templateで一番威力を発揮するのはコンテナでしょ。
その辺だけ使えればいいんじゃないの?
構文汚いけど。
0754デフォルトの名無しさんNGNG
関数オブジェクトもなかなか
0755デフォルトの名無しさんNGNG
GenScatterHierarchyとGenLinearHierarchy最高。
さてこれをどう使ったらいいものやら。。
0756デフォルトの名無しさんNGNG
>>755

クラスのメモリレイアウトをコントロールできない。
というわけでスクリプトでプログラムを書くときのように
手軽に、巨大なシステムを構築してしまいたいが型は
大切にしたいとき(どんなときだ?)に使う。
0757名無しさんNGNG
>>749
「プログラム設計において根本から変わってしまう」ことと、
「言語の機能をフル活用しなければならない」は相関性弱いと思うが…
後者は実装の話でしょ。

俺はcompilerのerror messageさえなんとかなれば、Lokiくらいは容認。
0758デフォルトの名無しさんNGNG
プライベートなコーディングにおいては
Loki使いまくり。正直、もう昔のGoF本に載ってる
ような野暮ったいコーディングには戻れない。
Typelistは最初は違和感あるけど、我慢して一ヶ月ぐらい
使いつづければ誰でも慣れる。typelistの新たな
使い方を考えるのはかなり厳しいが、MCDの
本に載ってるようなDPへの適用を真似る程度であれば
大したことはない。
0759デフォルトの名無しさんNGNG
MCDってなに?
0760デフォルトの名無しさんNGNG
ModernC++Designのことね。勝手に省略ゴメソ
0761デフォルトの名無しさんNGNG
「ふーん、そんなこと言える身分なの?」
「恥ずかしいことしてるのばれちゃってるのに・・」
3人はイチゴの顔をじっくりみつめる。
そしてその中の1人がそっと言った。
「しかたないわ、あ私たちめくるのやめるわ。」
イチゴはほっとした。
『許してくれるんだ・・・・』
「ありがとうございます・・・・」
0762デフォルトの名無しさんNGNG
>>761
ほえ?
0763デフォルトの名無しさんNGNG
型のコレクションをマクロ無しで扱う機能を次のC++標準に入れて欲しい。
0764デフォルトの名無しさんNGNG
>>763
現在の ANSI C++ 決めるまでにかかった時間から考えて、次の ANSI C++ 規格
が出るのは

 話し合いが始まる 2005年
 リリース目標    2008年
 実際に決まる    2010年

ぐらい?
0765デフォルトの名無しさんNGNG
コンパイラベンダの実装完了目標 2015年
実際に実装される 前に次の標準の話し合いが始まる
無限ループ?
0766デフォルトの名無しさんNGNG
つーか今の規格でもういいよ。
SQL99みたいになっても意味無し男
0767デフォルトの名無しさんNGNG
>>765
VC++はそのころになっても現在の規格にすら準拠できてなさそうだな・・・(鬱
0768デフォルトの名無しさんNGNG
LokiからBasicFastDispatcherってどうして取り除かれたの?
致命的なバグでも見つかったとか?
一番実用的なアイディアだと思っただけに残念。。
0769デフォルトの名無しさんNGNG
ポストC++を開発する良い機会だと思うけど。
0770763NGNG
もう、始まってるのさ...
http://std.dkuug.dk/jtc1/sc22/wg21/
0xだそうだからあと7年以内になんとか。
0771デフォルトの名無しさんNGNG
>>770
あと7年・・・それまでにパソコン業界はどうなっているのだろうか?
ハードディスク1TB超、CPU10GHz、メモリ10GBなんてのは当たり前に
なってそうだ。いや、これくらいなら4年もあれば実現する。

(C++)++ってのは文法違反か?
0772デフォルトの名無しさんNGNG
CPU4台くらい積むのが当たり前になってるかもね。
基本は省電力モードで休眠状態。
いわゆる論理区画みたいなもんかね。

そうなっているとすれば、そのころのOSの役割は
本来の資源管理にのみ特化しててもよさそうだね。
0773デフォルトの名無しさんNGNG
> (C++)++ってのは文法違反か?

Cの型(というか多重定義演算子の定義のされ方)による。>>771
0774デフォルトの名無しさんNGNG
10年後はC++の次ができてそうだね
0775デフォルトの名無しさんNGNG
>>773
なるほど。基本型はエラーになるようだ。

>>774
Cを拡張したのがC++だけど、もうこれ以上小手先だけで拡張できない
ほどメチャクチャになっているので、新しい言語を作った方がいいような
気がする。
CPUで言うと丁度x86みたいな様相を呈しているからな・・・・・
0776デフォルトの名無しさんNGNG
とりあえずC互換部分を(全部とはいわないけど)なるべく消して欲しい。
"..."とかも。(そうなるとModern C++ Designが困るのだが)
あとグローバル変数も要らん。
0777デフォルトの名無しさんNGNG
>>776
つまらん。
0778デフォルトの名無しさんNGNG
>>776
C++ - C ってことは、言語名は ++ ですか?

>>775
確かに template がらみだと、

「たしかに template 使えばできるけど、あまりに直感的じゃない。言語の方で
 直にサポートしてくれよ」

という機能も多いよな。でも template がこんなに強力な代物だとは、出てきた
当時は思いもよらなかったよ。
0779デフォルトの名無しさんNGNG
クラスつきのCとしてのC++からC互換の危ない部分を取り除いて
それをベースに型推論を導入してテンプレート宣言はやめる。
代わりに仕様として部分評価を導入して生成的プログラミングスタイルをサポート。
(つまり関数はデフォルトで暗黙のうちにテンプレート関数なわけ。値による特化は部分評価技術で。)

ただクラス・テンプレートの宣言をどうするかはちょっと迷うところだ。
関数型言語のように構築子を強化してクラス宣言を特殊な関数宣言とみなして
構造体アクセスのパターンマッチング機能と組み合わせてと言う路もあるが、
あまりにもCらしさからかけ離れてしまう気がするし。
(命令型C風MLみたいになってしまう。)
0780デフォルトの名無しさんNGNG
静的型付け言語の現状C++マンセー!!!
0781デフォルトの名無しさんNGNG
>>780
型推論は、強い型付けと矛盾しないけど。
0782デフォルトの名無しさんNGNG
>>781
あ、そなの?MLとか知らないからよく分からんけど。。
その辺は他の言語もやってみないとダメだね。
0783デフォルトの名無しさんNGNG
Cの怨念部分を取り払う時期がくるか
0784デフォルトの名無しさんNGNG
ちなみにAlexandrescuはMLやHaskellなどの関数型言語も、
自著で名前を何回も出すぐらいだからかなり知ってるのかもね。
0785デフォルトの名無しさんNGNG
つーか、プログラミング言語ネタで本を出すようなヤシでML知らないのはモグリ。
0786デフォルトの名無しさんNGNG
MLやHaskellにいかずとも、空リストや特殊定義でlispを思い出
す以前に、リストにアルゴリズムを施したりファンクタ
つくらせてカリーイングやったりという近年のC++の傾向そのもの
がオブジェクト指向と別方向の関数型言語指向なわけで。
lispと違って、それなりのパフォーマンスを維持しつつそういう
遊びがあるところに近時のC++の長所があると。
ただ実用から行くと、Java + generics + メモリ直接操作 くらいが
受けのいいところでしょ。
どうせ次期標準C++なんていってもせいぜい確率高い順に

hash_map他のSGI拡張、boost等のスマートポインタ、正規表現、数学等のライブラリが入るかどうか
サイズ規定のプリミティブ型が入るかどうか
typeofやらclosure/delegateやらの言語拡張が入るかどうか
マルチスレッドやネットワークのサポートが入るかどうか

とかだろ? しかも付け加えてばかりでは実装上文句が出るはず
だけど具体的にどこってのは全然見えない。そもそもVC++8のリリ
ース時期に合わせないと誰も使わないだろうな。
C99と互換性無いと駄目とかそっちの方がむしろ主流ではないの。
0787デフォルトの名無しさんNGNG
>>786
同じ文章をどこかで見たことがある気がする(デ・ジャ・ヴ?)

長所禿同
C++には多少手を加えるにしても全体としては今のままを維持してホスィ・・・
OOPらしいOOPがやりたい人はJavaでもC#でもやってりゃいいんで
0788デフォルトの名無しさんNGNG
性能と手軽さのトレードオフのある今のOO/GenericなC++でだいたい足りるわ。
今ある規格には準拠して欲しいとも思うがね。

それよりコンパイラのバグ減らせ!
0789デフォルトの名無しさんNGNG
gcc3.1+boost1.23でlambdaを使ってます。
下の結果が3ではなく、4になってしまうのですが、
どうしてでしょうか?

int i = 1;
std::cout << (_1 + i)(i = 2) << std::endl;
0790デフォルトの名無しさんNGNG
_1 って?
それにスレ違い
0791デフォルトの名無しさんNGNG
>>790
別にスレ違いじゃないだろ。genericsがらみだし。
>>789
boost 1.23??
0792デフォルトの名無しさんNGNG
>>789
一つ言えることは _1 + i と i = 2 のどちらが先に実行されるかわからないのだから
そういう書き方をしてはダメってことだ
0793デフォルトの名無しさんNGNG
>>791
あ、1.28です。
最新版の配布パッケージです。
boost::lambdaのドキュメントには

>int i = 1;
>(_1 + i)(i = 2);
>The value of the expression in the last line is 3, not 4. In other words, the lambda expression _1 + i creates a lambda function lambda x.x+1 rather than lambda x.x+i.

このように書いてあるのですが…
0794デフォルトの名無しさんNGNG
>>793
今回のとは無関係だとは思うけど一応
http://www.catnet.ne.jp/kouno/c_faq/c3.html#9
こういうのがあった。

_1 + i が内部で i の値を利用しようがしまいが未定義になっているのかもしれない。
0795デフォルトの名無しさんNGNG
未定義じゃないはず。
((int(*)(int))operator+(_1, i))(i = 2);
たしか、こんな感じになるはずだし。
0796デフォルトの名無しさんNGNG
_1

そっか、各種名前としては成立するな・・・。クソ迷惑だけど。
0797デフォルトの名無しさんNGNG
普通にx/y/z等を占有されるよりも_1/_2/_3の方がいいじゃん
0798デフォルトの名無しさんNGNG
検索してもユーザーサイトがこれぐらいしかみつからない。
http://user.ecc.u-tokyo.ac.jp/~g940455/wp/loki/
他の皆はLoki使いこなしてる?
未だにSmartPtrやFuntorを実験してる・・・
0799デフォルトの名無しさんNGNG
>>798
残念ながら使いこなすほど成熟したライブラリではないと思う。
Alexandrescu本人も実際に使ってるかはなはだ疑問。
0800デフォルトの名無しさんNGNG
ACEはLoki的な書き方をすればコードはかなり小さくなりそうな予感。
完成したライブラリではないが、それてきなものをテクニックの一つと
捉えて、どんどんコードを書いていくことは大事なことな気がする。
0801名無しさん@EmacsNGNG
お前らちゃっとTypelist使ってますか?
0802デフォルトの名無しさんNGNG
ちゃっと使ってます
0803名無しさん@EmacsNGNG
>>802
どうつかってるの?
本にのってるやつ真似てるだけ?
それとも自分で新たに技作ってやってるとか?
0804デフォルトの名無しさんNGNG
>>803
意味解析すると>>801による、

>お前らちゃっとTypelist使ってますか?

という誤文(正しくは「ちゃんと」であろう)に対して、>>802は同じ調子で、

>ちゃっと使ってます

と応答した。
これは恐らく「ちゃんと」と「チャット(chat)」を掛けている可能性が高い。
よって、>>802が本当に「ちゃんとTypelistを使いこなせているよ」
という意味で返答したのかどうかは、このレスでは判断できない。

また、これを踏まえると>>802に対しての>>803の応答は、
抽象的すぎるきらいがある。
>>802への適切な応答としては、

1)s/ちゃっと/ちゃんと/

などとし、話の流れを元に戻すか、

2)チャットは何のソフト使ってるの?

が考えられる。
0805デフォルトの名無しさんNGNG
Typelistはべつに新たに使い方を発明する必要はないな。
そういうのは一部の天才たちに任せよう:)
それよりもデザインパターンを適用したソフトウェア設計が
できるかどうかの方がよっぽど大切。これが出来ないことには
Alexandrescuの本に書いてあることの多くが使えない。

おれはよく知らないけど、Typelist自体についてもっと
勉強するには他の型付関数型言語のコーディングテクニックとかを
勉強する方がよいんじゃないの?
0806デフォルトの名無しさんNGNG
>>801-804
名古屋弁で「ちゃっと」といえば「さっと(すばやく)」くらいの意味だ。

ちゃっとやっとかんとかんわ。=さっとやっておかななければならない
0807デフォルトの名無しさんNGNG
Effective C++読み終えたよ。
大体は知ってたけどいろいろと役に立った。
次はMore Effectiveでも読むかな。
0808 ◆4COMPILE NGNG
>>807
Moreは訳がくそなので読むのに想像力と忍耐力が必要だぞ。
(ここでいうことでもないのでsage)
0809デフォルトの名無しさんNGNG
頭の中で英語に訳しながら理解すべし。(ワラ
0810名無しさん@カラアゲうまうまNGNG
bk1 で More 注文したけど入荷できずにキャンセルされちゃったよ。
思い切って洋書を注文したよ。がんがろ。
0811デフォルトの名無しさんNGNG
More Modern C++ Design
0812デフォルトの名無しさんNGNG
effective C++って第2版でどう変わったの?
0813デフォルトの名無しさんNGNG
>>808
普通に読めたよ。
0814デフォルトの名無しさんNGNG
D&E
ARM
(;´Д`)
0815デフォルトの名無しさんNGNG
>>812
標準C++の文法に準拠した新しい機能を使っている。
0816名無しさん@カラアゲうまうまNGNG
救いage
0817 ◆4COMPILE NGNG
>>813
すごいな、漏れは "コンストラクター" と、伸びる時点でかなりひいたし、
後半はわけがわからないので、原書かっちまったが・・・
0818デフォルトの名無しさんNGNG
>>817
伸ばし棒の事なんかどうでもいいから後半のわけわからないっぷりについて
おしえてください。
0819 ◆4COMPILE NGNG
>>819
たとえば、
const と コンストラクタ が混同されている部分があったりする。
そんな間違いをできるくらいで(だって普通文脈上そんな間違いできないでしょ)、
訳者は著者の書いていることを全然理解してない。
0820 ◆4COMPILE NGNG
>>819
(・∀・)サイキレス カコイイ!!

すまぬ、>>818の間違い。
0821デフォルトの名無しさんNGNG
その点ModernC++Designの村上氏は、
誤植の問題にも逐一訂正を載せてるし、
原著の修正にも載ってないものに
関しては報告してるみたいだから素晴らしいね。

翻訳もののダメっぷりばかりが目立つ
この業界の出版事情だけどいい仕事してる
ひともいるわけで、そういった人の本が
もっと売れるようになって欲しいところだね。
ダメな人を晒あげても切りがないので、
いい仕事をしている人を取り上げよう。

私は村上さんの本は信頼できると思います。
0822デフォルトの名無しさんNGNG
そういや訳してるヤシはプログラマなのか?
0823デフォルトの名無しさんNGNG
>>819
わしは脳内補正して読んだ。
0824デフォルトの名無しさんNGNG
>>819
それはすごい。
0825_1NGNG
関数ポインタを勉強してるんですが、
CTest2みたいなことは無理でしょうか?(CTest1はOKでした)
/*
int test(int a)
{
CTemp temp;
return temp.Func(*this,f,a);
}
クラス(*this)を渡して動的にテンプレートで作成させれば 何個も CTemp<???> を作らなくて済む。
*/

#include<iostream>
using namespace std;

template <typename _T>class CTemp
{public:
typedef int (_T::*Pstd)(int);
int Func(_T& ob,Pstd f1,int a)
{
return (ob.*f1)(a);
}
};

class CTest
{public:
int f(int a){ return a*2;}
int test(int a)
{
CTemp<CTest> temp;
return temp.Func(*this,f,a);
}
};


0826_2NGNG
class CTemp2
{public:
template <typename T,typename R> typedef R (T::*Pstd)(R);//typedef はtemplate化 できないのか?
template <typename T,typename R> R Func(T& ob,Pstd f1,R a)
{
return (ob.*f1)(a);
}
};

class CTest2
{public:
template <typename TM1>TM1 f(TM1 a){return a*2}
template <typename TM> TM test(TM a)
{
CTemp2 temp;
return temp.Func(*this,f,a);
}
};

int main()
{
CTest t;
cout << t.test(100);

CTest2 t2;
cout << t2.test(100);
}
0827デフォルトの名無しさんNGNG
>>826
typedef のテンプレートはまだできないよ
0828825NGNG
>>827
そうでしたか...。ちょっと変えたらできました。
class CTemp2
{
public:
template<typename T,typename R> R Func(T& ob,int (T::*f1)(R),R a)
{
return (ob.*f1)(a);
}
};

class CTest2
{
public:
int f(int a){ return a*2;}
template<typename R> R test(R a)
{
CTemp2 temp;
return temp.Func(*this,f,a);
}

};
0829名無しさん@カラアゲうまうまNGNG
http://sourceforge.net/projects/loki-lib/
0830828NGNG
下みたいにすると、
関数テンプレートを関数の引数として使用できません。
とでるんですけど、
無理なんでしょうか?
(補足:828はC++.NETならコンパイル可です。gccはオプションの設定が
よく分からないのでコンパイルできませんでした)

class CTest2
{
public:
template<typename R> R f(R a){ return a*2;}//ここを変更
template<typename R> R test(R a)
{
CTemp2 temp;
return temp.Func(*this,f,a);
}

};
0831デフォルトの名無しさんNGNG
>>830
少なくともVC++.NETならこれで通った。

template<typename R> R test(R a)
{
  int (CTest2::*tf)(R) = f<R>;
  CTemp2 temp;
  return temp.Func(*this,tf,a);
}

が、bccとかgcc2.95はICEる。gcc3.xはわからん。
0832デフォルトの名無しさんNGNG
>>831
できた!サンクス。
LokiのFunctorをVC++.NETでコンパイルできないんだけど
やっぱり書き換えないと駄目なのかな?それとも設定ミス?

template<typename R> R test(R a)
{
typename R (CTest2::*tf)(R) = f<R>;
CTemp2 temp;
return temp.Func(*this,tf,a);
}
0833デフォルトの名無しさんNGNG
>>832
LokiPortは?
0834デフォルトの名無しさんNGNG
++a+a+++a+++a+a+++a+++a+a+++a+a+++a++; // + 激しくインクリメント + //
0835デフォルトの名無しさんNGNG
>>834
ワロタ
0836デフォルトの名無しさんNGNG
ジェネリックネタは尽きたか・・・!?アゲ
0837デフォルトの名無しさんNGNG
template<class T,class S>class Typelist{
typedef T t;
typedef S s;
};
0838デフォルトの名無しさんNGNG
>>837
パブリックのメンバしかないクラスはstructを使うのが
彼のコーディング規約らしい。
あとテンプレートパラメータがプリミティブになるときにはtypename

これが一番役にたったかな。。。鬱
0839デフォルトの名無しさんNGNG
template<class T,class S>struct Typelist{
typedef T HEAD;
typedef S TAIL;
};
template<class A>struct TCA{
typedef A::HEAD A;
typedef A::TAIL B;
A a;
};
void main(void)
{
TCA<Typelist<int,double> > tca;
}
なんでエラーになるねん?
0840デフォルトの名無しさんNGNG
間違ってるから
0841デフォルトの名無しさんNGNG
>>838
> typedef A::HEAD A;
そりゃー無理だろう。
0842デフォルトの名無しさんNGNG
template<class T,class S>struct Typelist{
typedef T HEAD;
typedef S TAIL;
};
template<class A>struct TCA{
typedef typename A::HEAD HEAD;
typedef typename A::TAIL TAIL;
A a;
};
void main(void)
{
TCA<Typelist<int,double> >::HEAD tca1;
TCA<Typelist<int,double> >::TAIL tca2;
}
0843デフォルトの名無しさんNGNG
>>839
まぁでもBCCだと通ってしまうという
0844デフォルトの名無しさんNGNG
Lokiにはstruc.incの亡霊が見える。
こういう拡張は、言語の死の前兆なのだろうか、と思ってみたり。
0845デフォルトの名無しさんNGNG
著者はテンプレの制限追っかけるより
手っ取り早くcppを拡張してほしい。
C++は詰め込みすぎだ。
0846デフォルトの名無しさんNGNG
多次元配列についてはどうだ?
0847デフォルトの名無しさんNGNG
なにが?
0848デフォルトの名無しさんNGNG
最近boost-mlではMPLの話題が多いのぅ…
あれがboost本家に入ればここも盛り上がる…かな?
0849デフォルトの名無しさんNGNG
誰か俺に力を

template< typename T > class A
{
public:
//A(void){}
~A(void){ T::function_not_called(); }
};
class B
{
public:
A< class C > c;
};

int main(void)
{
new B();
}

VC.NET
A()のコメントはずすと~A()でコンパイルエラー・・・Why?
0850デフォルトの名無しさんNGNG
>>849
g++ でちょっと調べてみた。

A() がある場合、 B() をコンパイラが生成する。
で、 B() が生成された段階で、 B(){throw 0;} みたいなコードに
対応するために(だと思う) ~A<C>() がインスタンス化される。

A() が無い場合、 B() も無いことになって、このとき ~A<C>() はインスタンス化されない。

ためしに、 A(){} をコメントアウトしたまま、 B(){} を追加しても同じエラーになる。
でも、 B(); として外部参照にすると、エラーは消える。
これは、 ~A<C> が B() のコンパイル時にインスタンス化されているということだと思う。

それならと思って例外処理を無効にするオプションを追加してみたけど、
結果が変わらなかったのがよくわからないところ。
0851デフォルトの名無しさんNGNG
>>850
あんたすごいよ!
俺は思いつきもしなかった・・・
VC.NET も同様の結果。
実際のコードは B もテンプレートだったりして、あきらめるしかないか。
0852デフォルトの名無しさんNGNG
プチStateパターン。なんてのを提案してみます。

状態ごとに振る舞いを変えたいけど、Stateパターンをやるまでもないという
場合は、だいたいこんな感じでやってますよね?

// Hoge.h
class CHoge
{
  int state_;
  void age(void) {}
  void sage(void) {}
  void giko(void) {}
  void mona(void) {}
public:
  void Action(void);
};

// Hoge.cpp
typedef void (CHoge::*FUNC)();
FUNC table[] = {
  &CHoge::age,
  &CHoge::sage,
  &CHoge::giko,
  &CHoge::mona,
}

void CHoge::Action(void)
{
  // 状態ごとに振る舞いを変える。
  (this->*table[state_])();
}


こうやっていると、ひとつ状態が増えただけで、呼び出す関数が増えるから、
Hoge.hを書き換えなきゃならないのが弱点。そこで、こんなのはどうでしょう。
0853デフォルトの名無しさんNGNG
(続き)

// Hoge.h
class CHoge
{
  int state_;
  template<int> void InnerAction(void);
public:
  void Action(void);
};

// Hoge.cpp
enum {
  AGE,SAGE,GIKO,MONA,
};

template<> void CHoge::InnerAction<AGE>(void) {}
template<> void CHoge::InnerAction<SAGE>(void) {}
template<> void CHoge::InnerAction<GIKO>(void) {}
template<> void CHoge::InnerAction<MONA>(void) {}

typedef void (CHoge::*FUNC)();
FUNC table[] = {
  &CHoge::InnerAction<0>,
  &CHoge::InnerAction<1>,
  &CHoge::InnerAction<2>,
  &CHoge::InnerAction<3>
}

void CHoge::Action(void)
{
  // 状態ごとに振る舞いを返る。
  (this->*table[state_])();
}

こうすると、状態がいくら増えても、変更するのはHoge.cppだけ。
Hoge.hは変えなくてよくなります。プチStateパターンと名付けたけど、
なにげにBridgeパターンも兼ねてるわけです。
tableで「CHoge::InnerAction<0>」とマジックナンバーが入っているのは、
enum順が変わっても、tableの並びを変えなくていい、というテクです。
>>369-423を参照して下さい。

仕様が不安定な中で開発するときは割と使えると思いますけど、
どうでしょ、このテク。
0854デフォルトの名無しさんNGNG
template<>の中でifは使えないが、三項演算子なら使えるのだな。
誰かこれ使って何かしてくれよ。
0855デフォルトの名無しさんNGNG
>>854
boost::call_traits
0856デフォルトの名無しさんNGNG
>>853
Hoge.hを書き換えられないという状況があんまり想定できん
0857名無しさん@カラアゲうまうまNGNG
>>856
Hoge.h を書き換えてビルドしたら、これをインクルードしている
ものも再構築しなければならない罠ってやつでは?
0858デフォルトの名無しさんNGNG
>>857
やればいいやん。ビルドに時間がかかるんならそれはそれで問題。
0859デフォルトの名無しさんNGNG
>>857
外部インターフェースと実装を分離したいなら pimpl イディオム使うのが
一般的だと思う。pimpl イディオムだと、内部的に使うメンバ変数が増えて
も OK だし。
0860デフォルトの名無しさんNGNG
関数レベルのプチな振る舞い変化ならStateパターンなど使わずにswitch/case使うべきと思われ
0861デフォルトの名無しさんNGNG
>>849
それ以前に、C++で f(void)はやめれ。間違いじゃないけど。
0862デフォルトの名無しさんNGNG
>>861
なぜっすか?
0863デフォルトの名無しさんNGNG
俺はvoidな変数とvoidな引数がホスィな

void set_name_age( char const* name, int age ){}

void result = set_name_age( "もな", 5, void, void );

テンプレート使うときに幸せだ・・・
0864デフォルトの名無しさんNGNG
>>862
無意味だから。
0865デフォルトの名無しさんNGNG
>>864
おまえの存在が無意味
0866デフォルトの名無しさんNGNG
>>861
じゃ戻り値intもその時のreturn 0も書くのやめるか?
0867デフォルトの名無しさんNGNG
>>866
意味不明だが……何を主張してるんだ?
0868デフォルトの名無しさんNGNG
>>867
main(){

}
で十分だろ
0869デフォルトの名無しさんNGNG
>>868
いいえ
0870デフォルトの名無しさんNGNG
>>869
なぜ?
0871デフォルトの名無しさんNGNG
>>870
本気で聞いてるの?
0872デフォルトの名無しさんNGNG
>>871
つーか本気で言ってるの?
0873デフォルトの名無しさんNGNG
>>872
Are you a Generic C++ Programmer?
0874デフォルトの名無しさんNGNG
>>872
>867 と >869 は本気で言ってる。それ以前の書き込みは俺じゃないから知らん。

>>866
> じゃ戻り値intもその時のreturn 0も書くのやめるか?
C++ の規格に照らし合わせて

1. 仮引数宣言を (void) とするのは () と等価。
2. 関数の型を省略すると int と見なされる

までは正しいが、

3. int 型関数で return を省略すると、デフォルト値 0 が戻り値として渡される

のは嘘だよな。

省略可能な int, void を書くかどうかはスタイルの問題だが(俺は書くけど)、
return を書かないのは規格上マズイって話。
0875デフォルトの名無しさんNGNG
>>874
mainに限ってはreturnがない場合0が返る。
0876デフォルトの名無しさんNGNG
// 望洋せんせいは

int foo1() {
}
int foo2( void ) {
}
int var() {
  foo1( 0 ); // 問題なし
  foo2(); // コンパイルエラー
}

// ってゆってたよ。
0877876NGNG
ちがった!
foo2( 0 ); // これで、コンパイルエラー。
foo2(); // は、もちろんOK。
0878デフォルトの名無しさんNGNG
>>876
多分、いろいろ勘違いしている
0879デフォルトの名無しさんNGNG
>>876
CならOK
C++じゃだめ。
0880876NGNG
>>879
いま g++ と gcc で試してみたらそのとおりだった。
スレ汚しちゃってスマソ。
0881876NGNG
// これも試してみたよ。
// 常に 0 が表示されちゃう。
#include <stdio.h>
int foo() {}
void main() {
    printf("%d\n",foo());
}

// % g++ -v
// gcc version 2.95.3-5 (cygwin special)
0882デフォルトの名無しさんNGNG
>>875
ほんとだ。いつ追加された仕様なんだろうな、これ?

(VC6 あたりだと警告が出る)
0883デフォルトの名無しさんNGNG
C99からだったりして
0884デフォルトの名無しさんNGNG
亀レスで失礼。

>>323
"もっと技術的な話をきぼんぬ" って本人にメール出したら多分聞き入れてくれるよ。
...どういった方向の技術の話題を希望するのか書いとけば恵比寿氏も喜ぶよ、きっと。

>>327
いや、恵比寿氏が用意した場所で本人にうざいって言うのは人としてどうかと思うぞ。
わざわざ、人んちに押しかけといて家主に "あんた邪魔、帰れ!" って言うのと同じ様なもんだぞ。
0885デフォルトの名無しさんNGNG
>>884
御説はもっともなのだが、おぬし、流石に亀レスすぎないか。
0886デフォルトの名無しさんNGNG
>>885
ごめん。古い書き込みとはいえ、なんか無駄な非難をほっとけなくて。
0887デフォルトの名無しさんNGNG
ひょっとして本人?
0888デフォルトの名無しさんNGNG
>>876
ANSI規則でコンパイルしてみれ。
0889884NGNG
>>887
違う、道イヒ師。
0890デフォルトの名無しさんNGNG
わざわざ名乗らんでもええのに
0891884NGNG
>>890
気づかれなかったことが、なんか寂しかった。

...スレ汚しスマソ。本題の話を続けてくれ。
じゃ、バイバイ〜♪。(´ω`)ノシ
0892デフォルトの名無しさんNGNG
そんなこと言われても本題と言えるほどのネタがない罠。
0893デフォルトの名無しさんNGNG
Lokiがboostに入るなんて話はないんでしょうか?
0894デフォルトの名無しさんNGNG
あったりする。
0895sageNGNG
trickタソ…
ハァハァ
0896 ◆4COMPILE NGNG
>>894
まじ?
0897デフォルトの名無しさんNGNG
>>896
894の妄想。
0898デフォルトの名無しさんNGNG
>>896
・Functor, メモリプール, TypeTraits 辺りは既にboostにある。
・TypeListなどはMPL( MetaProgrammingLibrary )とゆーもっと
 汎用的な枠組みで吸収。1.30.0くらいでリリース版に入りそう。
・Policyベースのスマートポインタは統合作業&議論中。
・AbstractFactory/Singletoneなどは、boost::DesignPattern
 ライブラリを作るとか作らんとか言ってた気がするけど不明。
0899 ◆4COMPILE NGNG
>>898
にゃるほど、ちょっと調べてみる。
0900デフォルトの名無しさんNGNG
4compileさん(・∀・)イイ!
0901デフォルトの名無しさんNGNG
boostってフリー?商用もいけるの?
0902デフォルトの名無しさんNGNG
ライセンス調べろ
0903デフォルトの名無しさんNGNG
キミのこと気持ちよくしてあげたいんだ・・・
0904デフォルトの名無しさんNGNG
>>902
英語読めねぇから聞いてんだYO。
0905デフォルトの名無しさんNGNG
>>904
何様?(w
0906デフォルトの名無しさんNGNG
>>905
何様か聞いてどうしる?
0907デフォルトの名無しさんNGNG
>>906
愛撫するとか。


a means for you!: http://www.excite.co.jp/world/text/
0908デフォルトの名無しさんNGNG
>>907
thanks
でも変な訳で意味がよくわからんよ。
誰かやわらかく教えて臭い。
0909デフォルトの名無しさんNGNG
いつの間にか MPL が boost の cvs に入ってますな。
0910ageNGNG
age
0911ageNGNG
age
0912デフォルトの名無しさんNGNG
テンプレートメタプログラミングは戦場では必要なし!
っていうスレ立ててもいいっすか・・・・ ;_;
0913デフォルトの名無しさんNGNG
ィィョ
0914デフォルトの名無しさんNGNG
ョクナィョ
0915デフォルトの名無しさんNGNG
立てたらi`
0916デフォルトの名無しさんNGNG
>>912
激しく盛り下がりそうな予感がするぜ
0917デフォルトの名無しさんNGNG
>>916
戦場スレに書き込んでみたら一応反応してもらえました。ハァハァ
0918デフォルトの名無しさんNGNG
テンプレートで渡された型が、参照(あるいは値)であるかポインタであるかを判断するにはどうしたら
いいでしょうか?

template<typename T> struct Fn : public std::binary_function< T, T, bool > {
 result_type operator() ( first_argument_type f, second_argument_type s ) const {
  return (f.Hoge() < s.Hoge());
 }
};

のようなファンクタクラスをつくるとき、operator()の内部を f.Hoge() とすべきか f->Hoge() とすべきか
コンパイルタイムに判定したいのです。

Lokiのこのへん、とかboostのこれ、とかでいいので情報のポインタをいただけませんか。

0919デフォルトの名無しさんNGNG
>>918

template<typename T> struct Fn : public std::binary_function<T&, T&, bool> {
 result_type operator() (T& f, T& s) const {
  return (f.Hoge() < s.Hoge());
 }
};

template<typename T> struct Fn : public std::binary_function<T*, T*, bool> {
 result_type operator() (T* f, T* s) const {
  return (f->Hoge() < s->Hoge());
 }
};

のように単にオーバーロードすればいいのでは?
0920デフォルトの名無しさんNGNG
>>918
template < typename T& >
template < typename T* >で判断できなかったかな?
どうだったっけ?
0921デフォルトの名無しさんNGNG
>>919
スマートポインタが渡せないデスヨ
0922デフォルトの名無しさんNGNG
>>921

template<typename T> struct Fn : public std::binary_function<std::auto_ptr<T>, std::auto_ptr<T>, bool> {
 result_type operator() (std::auto_ptr<T> f, std::auto_ptr<T> s) const {
  return (f->Hoge() < s->Hoge());
 }
};

ではいかんの?
0923デフォルトの名無しさんNGNG
Modernの2.10型の特性(TypeTraits)か?

>>920
template <class T> class A;
template <class T> class A<T*>{};
template <class T> class A<T&>{};
こうか?
0924918NGNG
>>919
オーバーロードできるんですか。理解が足りませんでした。
てっきりboost::mplのようなものを使って判断するとばっかり。

>>922
スマートポインタの類は恥ずかしながら一度も使ったことが
ありません。auto_ptrの引数で受ける、というのがどういう
意味を持ちどういう動作をするのか、勉強してみます。

ありがとうございました>919,922他の神々
0925921NGNG
>>922
いいんですが、巷にはたくさんスマートポインタがあり、
対応するのにいちいちそれを書いていたらとっても大変です。

以下のクラスを書きました。
参照、ポインタ、スマートポインタを吸収し、ただのポインタとして保持します。

template <typename T>
class pointer
{
public:
template <class U>pointer(U &p) { init(p,&p); }

pointer(T &p) { p_=&p; }

pointer(T *p) { p_=p; }

operator T *() const { return p_; }

T *operator ->() const { return p_; }
private:
template <class U> void init(U &p,const T *) { p_=&p; }

template <class U> void init(U &p,const void *) { p_=&*p; }
private:
T *p_;
};

0926921NGNG
続き

使い方は
template<typename T> struct Fn : public std::binary_function<pointer<T>, pointer<T>, bool> {
 result_type operator() (pointer<T> f, pointer<T> s) const {
  return (f->Hoge() < s->Hoge());
 }
};
これひとつで参照、ポインタ、スマートポインタを渡せる関数オブジェクトになります。
0927918NGNG
あーこりゃべんりですね。ども。

0928デフォルトの名無しさんNGNG
>>925>>926
ほほおなるほど。早速使ってみます。
0929デフォルトの名無しさんNGNG
>>925
*での間接参照を許さないスマートポインタもあったりするからちょとやっかいだな。
# auto_ptr もじゃなかったっけ?(うろ覚えスマソ)
0930921NGNG
>>929
&pは許さないスマートポインタはたくさんありますが、
*pを許さない奴はめったにありません。(auto_ptrもOKです)。

これはMyライブラリーに入っていて良く使うので何が悪いか良くわかってます。
欠点はpointer<void>と出来ないことです。
ですので、pointer<void>の時の特殊化も定義してください。

あと、constポインタにしたい場合はpointer<const int> としてください。
0931921NGNG
あ、すいません。

T &operator *() const
{ return *p_; }

をpublic面罵に追加してください。なぜかなかったです。
0932929NGNG
>>930
ゴメンよ、どっか見間違えてたよ
生ポインタへの変換を許さないのはあるけど*が駄目なのは滅多に無いね
0933デフォルトの名無しさんNGNG
うわわわ、いろいろやってみていたら、関数オブジェクトは同名の
オーバーロードをするとエラーが出ますよ。
0934デフォルトの名無しさんNGNG
>>933
参考までにこんぱいらなに?
0935デフォルトの名無しさんNGNG
>>934
Borland-C++ 5.6です。今からMinGW(gcc3.2)でも試してみます。
0936デフォルトの名無しさんNGNG
MinGW(gcc3.2)でもやはり redifinitionエラーが出ます。同名の関数オブジェクト
は使えないなんて初めて知った(汗。
0937デフォルトの名無しさんNGNG
>>926
参照を渡すときのFnの実体化は、Fn<Foo> f; ですか Fn<Foo&> f; ですか?
とりあえず後者は通らないようです(gcc3.2)

0938937NGNG
いや、pointer<>は T* を保持するんだから、Tは * やら & つけちゃだめか。
スマソ。
0939937NGNG
できました。サンクスコ。
禿げしくコンパイル時間が延びたような気もするが・・
0940デフォルトの名無しさんNGNG
>>938
T&はだめですが、T*はOKです。
0941デフォルトの名無しさんNGNG
うぅぅ〜。。。typedefのtemplateはダメなのかよぉ…。
0942もうだめぽ。。。NGNG
template <template<class> class T>なクラス←なんて言うんだ?
を書いてみたものの、bccだと型変換演算子でコケて、
gccだとstd::vectorで特殊化した方のクラスの演算子でコケる…。。。

(−_−)
(∩ ∩)
0943デフォルトの名無しさんNGNG
http://sourceforge.net/projects/loki-lib/
ここから落とした最新のLoki+テストコードを使っています。
コンパイラはg++3.2です。

Loki/tools/RegressionTest/Test_MultiMethods.cpp
このテストプログラムにおいてよく分からないことが
あるので教えてください。
場所はBasicDispatcherをテストしている160行目あたりの
ShapeDispatcherAddというテンプレート関数です。

ここで関数の引数として取得したディスパッチャーインスタンスの
Addテンプレート関数を呼んでいるのですが、
この関数のテンプレートパラメータはどこで指定すれば
よいのでしょうか?。テストコードでは(通常の関数テンプレートと
同じように)メソッドをコールする時点において指定していますが
どうもこれが上手くいっていないようです。
x.Add<Shape1,Shape2>(HatchDispatcher<Shape1,Shape2>);
という行で、既にインスタンス化されたテンプレートクラス内の
関数を実体化するはずなのですが、これがコンパイラエラーと
なります。
x.Add()(HatchDispatcher<Shape1,Shape2>);とテンプレートパラメータ
の指定を取り除くとエラーは消えます。

なにか問題を回避するような方法があれば教えてください。
0944デフォルトの名無しさんNGNG
訂正です
x.Add()(HatchDispatcher<Shape1,Shape2>);
ではなくて
x.Add(HatchDispatcher<Shape1,Shape2>);
でした
0945デフォルトの名無しさんNGNG
>>941
どんなのが駄目なの?

いま漏れも
typedef boost::tuple<const int, const std::string, const std::string> hoge;
がVCでのみ通らなくて困ってるんだけど。

#スレ違いの予感
0946943NGNG
エラーの原因を突き止めるため単純化したプログラムを
一つ作ってみました。

template<class T> class CLS{
public:
template<class U>
void memfunc(){U i;}
};
template<class T>
void func(T& a){
a.memfunc<int>(); //これがどうもおかしい
}
int main(){
CLS<int> a;
func(a);
}

これを回避するためにはどうすればいいのでしょう?

template<class T> class CLS{
public:
template<class U>
void memfunc(){U i;}
};
int main(){
CLS<int> a;
a.memfunc<int>();
}
このようにパラメータとしてやり取りするのを省けば
上手くいくのですが。。。
0947デフォルトの名無しさんNGNG
>>942
g++ でダメな演算子ってどんなの?
まあ、なんにしても VC++ じゃ通らないから仕事では
避けざるをえないんだけどね。
0948943NGNG
やっぱり仕様書をよく覚えないとダメだね、こりゃ。
いままで仕様書見てプログラミング言語覚えたこと
なかったからどうも抵抗があったんだけどそうも
いってられなさそう。。。

14882の14章をよく読んできます。
0949デフォルトの名無しさんNGNG
>>946
これは、template 限定子ってのが必要になるケースだね。

template<class T>
void func(T& a) { // ここでは a がどういう型か分からないので
a.template memfunc<int>(); // このように memfunc がテンプレートであることを明示する
}
09501NGNG
これで 950 レス目だけど、次スレはもう不要でしょ。
とりあえずは STL スレか Boost スレを使うことにして、
いずれは 「C++ Template & Libraries (STL, Boost, Loki, etc.)」
みたいな形で統一しましょう。
0951943NGNG
>>949
素晴らしい!素晴らしすぎます!!!
どうもありがとうございました。

どうしてそんなことを知っているのでしょうか?
"C++""限定子"で検索かけても一つ引っかかるだけ。。。
C++は奥が深いですね。

ちなみにテストコードは以下のようになりました。

template<class T> class CLS{
public:
template<class U>
void memfunc(U&){U i;}
};
template<class T>
void func(T& a){
// a.template memfunc(a); //テンプレート関数の型推論を試すその2。error
a.template memfunc<T>(a);
}
int main(){
CLS<int> a;
func(a); //テンプレート関数の型推論を試すその1。ok
}

型推論の機構もあわせてもう少し調べてみます。
ありがとうございました。
0952デフォルトの名無しさんNGNG
>>951
Borland-C++5.5.1だとtemplate限定子がなくても通ってしまうね。

でもgcc3.2だとエラーが出る。

プログラミング言語C++第3版§C.13.6、P971によるとmemfuncの
テンプレート引数は予測不能なので、"<"が比較演算子だと誤認
されエラーが出るようだ。
0953943NGNG
>>952
プログラミング言語C++はそんなことまで載って
いるんですね。私はC++Primerで勉強しているのですが
そんな記述あったかしら??。帰って読み直してみます。

ちなみにCLSはpublicのメンバーしかないから
structとすべきですね。こういう細かなルールは
大事にしたいものです。。

>>950
次スレは要らないでしょうね。Lokiはもう一般的に
認知されたと思っていますので、特別に扱うのも
なにか違うかなとおもいます。
boostスレで十分でしょう。ちなみに私の質問は
相談室の方ですべきでした。すみませんm(  )m
0954943NGNG
Lokiのダブルディスパッチャ(<Loki/MultiMethods.h>)に関して
疑問があります。

class FnDispatcherなのですが、このクラスは三つのAdd()関数を
持っていますが引数のないAddが二つ含まれています。
これってオーバーロードできずにコンパイルエラーになると
思うのですがどうでしょうか?
一つは対照ディスパッチャ(二つの要素の順序関係なし)として
機能するようにbool型のフラグ(bool symmetric)を受け付けるように
定義されていますが、そもそも関数の部分的特殊化は出来ないはずですよね?

これはg++-3.2では"cannot be overloaded"というエラーが出ます。
これはコンパイラの構文解釈としては正しいと思われますが、
なぜかg++-2.95では通ってしまうんですね。。

ライブラリのバグでしょうか?それとも私の何勘違いでしょうか?
0955943NGNG
また、正しくオーバーロードが行われるように、
対照ディスパッチャの引数としてAdd(bool)などという
ものを加えれば正しく動作するのですが、これって
なんかカッコ悪いですよね。汗
コンパイル時にだけしか使わない情報はなるべくテンプレート
パラメータとして渡したいところです。

template <class SomeLhs, class SomeRhs,
ResultType (*callback)(SomeLhs&, SomeRhs&),
bool symmetric>
void Add()
{
    typedef Private::FnDispatcherHelper<
        BaseLhs, BaseRhs,
        SomeLhs, SomeRhs,
        ResultType,
        CastingPolicy<SomeLhs,BaseLhs>,
        CastingPolicy<SomeRhs,BaseRhs>,
        callback> Local;
    Add<SomeLhs, SomeRhs>(&Local::Trampoline);
    if (symmetric)
    {
        Add<SomeRhs, SomeLhs>(&Local::TrampolineR);
    }
}
0956943NGNG
そもそも対照性を持つ場合はこのようなコードになっているので、
単にAddのテンプレート引数symmetricにデフォルト値として
falseを与えればいいように思うのですが、それだと困るような
コンパイラがあるのでしょうか?
template <class SomeLhs, class SomeRhs,
ResultType (*callback)(SomeLhs&, SomeRhs&),
bool symmetric = false>
void Add()
0957デフォルトの名無しさんNGNG
Loki のことは全くわからないんだけど、関数の部分的特殊化は
可能のはず。VC++ みたいにできないコンパイラもあるけど。

>956
関数テンプレートでは、デフォルトのテンプレート引数は使えないはず。
0958943NGNG
あ、勘違いしてました。。。恥

FnDispatcher::Add()は部分的特殊化ではなくて、
一次テンプレートが二つあるんですね。

んー、そうするとAddが二つあるのはいいんだろうか?

>>957
ModernC++DesignのP30には
「残念なことに、テンプレートの部分的特殊化は、メンバ関数、
非メンバ関数を問わず、関数には適用されません。」と書いてあります。
例として、
template <class T, class U> T Fun(U obj); //一次テンプレート
template <class U> void Fun(U obj); //部分的な特殊化(不正)
template <class T> T Fun(Window obj); //オーバーロード(正当)
というものが挙げられています。

関数テンプレートのデフォルト引数には関しては、、、調べてみます。
0959943NGNG
template <class U> void Fun(U obj); //部分的な特殊化(不正)
この行は間違いでした。書きたかったのは、
template <class U> void Fun<void, U>(U obj); //部分的な特殊化(不正)
です。失礼しました。

0960957NGNG
あ、おそかったかw
すまん、関数テンプレートの部分特殊化はダメだったかもしれない。
多重定義は可能なので部分特殊化ができていると勘違いした。
0961943NGNG
毎度、スレ汚しすみませんが簡単なテストプログラムです。

#include<iostream>
template <class T> struct CLS
{
template <class U, class R>
void Add(){std::cout << "二つのテンプレートパラメータの関数" << std::endl;}
template <class U>
void Add(){std::cout << "一つのテンプレートパラメータの関数" << std::endl;}
};
int main(){
CLS<int> a;
a.Add<int, int>();
a.Add<int>();
}

これがg++-2.95だと通ってしまうんですね。g++-3.2によるエラーは以下の通りです。
test2.cc:8: `template<class U> void CLS::Add() [with U = U, T = int]' and `
template<class U, class R> void CLS::Add() [with U = U, R = R, T = int]'
cannot be overloaded

そもそも一次テンプレートを二つも定義できてしまうのはやはり問題で、
それに増して、テンプレート引数の数による部分的特殊化が出来てしまうのは
ちょっと。。。動作としてはg++-3.2の動作が正しいと思うのですがどうでしょうか?
また、もしそうだとするならこれはLokiのバグですよね?
0962943NGNG
>>957さん
何か資料に当たったわけではないのですが、
テンプレート関数のテンプレートパラメータには
デフォルト引数は設定できないです。
g++の3.2,2.95のどちらも
"default argument for template parameter"
と返してきます。

勉強になりました。ありがとうございます。
0963957NGNG
ちょっと気になったので、規格書を調べてみた。
●関数の部分的特殊化は不可
14章冒頭の2
a function template declaration, the declarator-id shall be a template-name
(i.e., not a template-id).
つまり、template<class T> void foo<T>(); のように <T> を付けた宣言は
できないということ。(ただし explicit specialization の場合は可)

●関数テンプレートではデフォルトのテンプレート引数を使えない
14.1 の 9
A default template-argument shall not be specified in a function template declaration
or a function template definition, nor in the template-parameter-list of the definition
of a member of a class template.

●テンプレート引数が異なっていれば、戻値やシグネチャの一致する関数テンプレートの
 オーバーロードは可能
14.5.5.1 の 4
The signature of a function template consists of its function signature,
its return type and its template parameter list. The names of the template parameters
are significant only for establishing the relationship between the template parameters
and the rest of the signature. [Note: two distinct function templates may have identical
function return types and function parameter lists, even if overload resolution alone
cannot distinguish them.

template<class T> void f();
template<int I> void f(); // OK: overloads the first template
// distinguishable with an explicit template argument list

実際、g++-3.2 でも非メンバ関数テンプレートならオーバーロード可能だった。
0964943NGNG
なるほど、どうもありがとうございます。
とくに三つ目の件に関しては勉強になりましたm(  )m

●1つ目
explicit specializationとは完全な特殊化という意味ですよね?
template <class T> T foo();
template <> int foo<int>(){};
template <> double foo<double>(){};
というような。。

●3つ目
以下のようなコードはg++-3.2,2.95どちらでもOKでした。
namespace{//無名名前空間の外でも同じでした。
    template<class T> void func(){cout << "<class T>" << endl;}
    template<int I> void func(){cout << "<int I>" << endl;}
    template<class T,class U> void func(){cout << "<class T,class U>" << endl;}
    template<class T,int I> void func(){cout << "<class T,class int>" << endl;}
}
int main(){
    func<int>();
    func<8>();
    func<int,char>();
    func<int,3>();
}

ということはg++-3.2のテンプレートメンバ関数の解釈はどうなんでしょう?
g++のバグということになるんでしょうかね??
0965943NGNG
補足ですが、クラスに関して同じようなことは当然×みたいですね。

struct CLS;
template <class T> struct CLS;
template <class T, class U> struct CLS;

こういうのは当然のごとくエラーになりますね。
previous declaration `template <class T> CLS<T>'といったかんじのメッセージがでます。
関数テンプレートが部分的特殊化が許されていない分、ユーザーに対して
サービスしてくれたのかな(藁

というよりも考え方としてはオーバーロードの延長として見るべきでしょうかね。
クラスは原則として名前が一意に決定されていなくてはならない。だけどそれでは
コンパイル時にクラスの選択をさせることができない。原則を守りつつの追加という形で
explicit specialization, partical specializationがそれぞれ可能になっている。
関数にはもとからオーバーロード機能が付いていたので、その機能を補う形で
一次テンプレート(というよりも関数テンプレートには一次しかない。完全な特殊化は
どちらかというと実体化っていうかんじかな)でのオーバーロードと
explicit specializationの二つの機能が付いたという。。。

C++を勉強していていつも思うのが、なんでそういう仕様になっているのかという
その理由の分からなさのこと。どういった事情からそういう仕様になっているのか
まとめてあるようなドキュメントが読みたいです、というよりその前に英語の仕様書を
なんとか読まなくてはいけないのですが。。。はぁー
0966デフォルトの名無しさんNGNG
>949
いいことしった(・∀・)!
0967デフォルトの名無しさんNGNG
http://www.microsoft.com/japan/developer/library/default.asp?URL=/japan/developer/library/dsmsdn/deep04202000.htm
でexportキーワードについて説明している箇所で、"EDGのトランスレータ"
という語が出てくるんですが、これってナニ?
0968デフォルトの名無しさんNGNG
>>967
C++のソース→中間言語へのトランスレータ。
C++処理系の中で標準準拠度が一番高い、らしい。
http://www.edg.com/cpp.html
0969デフォルトの名無しさんNGNG
アリガトウ-
0970デフォルトの名無しさんNGNG
oh. あのComeauのコンパイラもEDGのフロントエンドを使用しているのね。
http://www.edg.com/resellers.html#x86
勉強になった。
0971デフォルトの名無しさんNGNG
>>968
これ売り物?
ダンロードできないんですが。
0972967NGNG
コンパイラのバックエンドを作成している企業にしか販売してませーん
ということじゃないかなぁ。
0973971NGNG
ありがとう。
やっぱ売り物なのね。
0974968NGNG
http://www.edg.com/faq.html
> Q: How much does a source code license cost?
>
> A: Usually somewhere between $40,000 and $250,000. There are
> lots of different kinds of licenses, so you'll have to contact us
> to get a specific quote.

ちょっと個人では手が出しにくいお値段だぁね。
0975デフォルトの名無しさんNGNG
gcc3.2でいいやぁ・・
0976デフォルトの名無しさんNGNG
Intel C++ Compiler でもいいのかもね。
http://www.intel.com/support/performancetools/c/v6/windows/generalcompat.htm#17
0977デフォルトの名無しさんNGNG
VCに使えばいいのに
0978デフォルトの名無しさんNGNG
>>977
このスレではVCは出入り禁止ですが何か・・・・?

0979デフォルトの名無しさんNGNG
梅梅
0980デフォルトの名無しさんNGNG
980ゲット
0981デフォルトの名無しさんNGNG
このスレも埋め立てるだけか。
0982デフォルトの名無しさんNGNG
C++スレは少し減らした方がいいと思われ。
0983デフォルトの名無しさんNGNG
記念パピコV(^o^)V
0984アレックスとレスクNGNG
という訳でLokiネタもboostスレへと殴りこみに入ります。
みなさん一年間どうもありがとうございました。
0985デフォルトの名無しさんNGNG
梅うまうま
レス数が950を超えています。1000を超えると書き込みができなくなります。