Generic Programming with C++ Template
レス数が950を超えています。1000を超えると書き込みができなくなります。
0001デフォルトの名無しさん
NGNG参考図書:
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デフォルトの名無しさん
NGNG0003デフォルトの名無しさん
NGNG1で挙げた Modern… は、3章まで読んだ。いままでのところ、ムズいと
感じたのは 1章かな。ポリシーというのになじみがなかったもので。
正直、ポリシーと特性 (traits) の違いがよくわかっていない。
3章はテクニックの話なので、むしろ分かりやすかった。LISP という
よりは prolog とかの単一化のイメージに近いね。こんなことが
template でできるということには驚いたが。でも、タイプリスト
なるものの使い方については、まだ、まったくわからん。
0004デフォルトの名無しさん
NGNG0005デフォルトの名無しさん
NGNG0006デフォルトの名無しさん
NGNG> でも、タイプリストなるものの使い方については、まだ、まったくわからん。
型によってコンパイル時に関数を選択させる場合に使える。STL で似たようなことをやってるのは、
iterator によってアルゴリズムを選択してるヤツかな。たとえば advance() は
randome access iterator なら iter += n
forward iterator なら ++iter を n 回
で処理するようになってる。(あれの魔法の種は iterator_traits なんで、ちょっと違うけど)
0007デフォルトの名無しさん
NGNG// コンパイル時にチェックできる assert
template<bool> struct CTAssert;
template<> struct CTAssert<true> {};
で、たとえば CTAssert<sizeof(int) == 0> とかやるとコンパイルエラーを
出してくれる。ぜんぜん generic ってな感じはしないけどね。
0008デフォルトの名無しさん
NGNG0009デフォルトの名無しさん
NGNG意味わかってる?
Generic Programingとは違う。
この本に載っている技法は「Generative Programming」生成的プログラミング
といわれるだぜ?
俺は「Generative Programming」萌えだ。
C++のtemplate特性を逆手に、とった巧妙な技法だ
ちなみにC++に依存してるわけじゃない。
たぶんPerlでもASPでもできる。
0010デフォルトの名無しさん
NGNG楽しい NE!
デモチョトボクニハムズカシイヨ…
0011高校生
NGNGいわゆるGoFのPrototypeパターンとは別物?
それともLISPのマクロみたいに実行時にクラスを
生成するのか?(C++では絶対無理だと思うが。。。)
#例外が実装される前は良く使ったけどなぁ>C++
0012デフォルトの名無しさん
NGNG>それともLISPのマクロみたいに実行時にクラスを
>生成するのか?(C++では絶対無理だと思うが。。。)
もちろんLISPのようなクラスを生成というのは無理だ。
ある意味、LISPの様にC++でも生成できる様にしている。
templateを使いクラスを生成するためパーツを作ってるんだ。
0013高校生
NGNG違う新手のアーキテクチャーなんだろうか?
訳書で4800円か。。。まずは立ち読みから(;;
001412
NGNG(まあ俺は消防だから話半分ぐらいで聞いてくれ)
Generative Programmingとオブジェクト指向は直行している
Generative ProgrammingとSTLを使うとHaskell的プログラミングができそうだ。
「Modern C++ Design」のHP
ttp://cseng.aw.com/book/0,,0201704315,00.html
にLokiといライブラリが公開されている。
見てみてはどうかな?
(サンプルコードが無いから本を読まないと使えんか)
0015デフォルトの名無しさん
NGNGGenerative じゃなくて Generic の方だが、俺は次のように理解している。
手続き型のプログラミングでは「手続き」を定義することで、
オブジェクト指向プログラミングでは「インターフェース」を定義することで、
ソフトウェアの抽象化を進めた。
それでも抽象化できてないものの一つに「ループ」なんてのがある。たとえば整数の配列や
文字列をコピーするコードは、効率を考えなければどれも
for (i = 最初; i < 最後; ++i)
dst[i] = src[i];
みたいなものだが、これは手続き型でも OO でも、汎用的には書けないわけだ。コピーする
「手続き」、たとえば memcpy とかあるだろと反論するかもしれないが、あれは
特定の型やデータ構造に縛られる
という点で、汎用的ではない。たとえば C++ のオブジェクトなんかは、単純にメモリをコピー
して済ますわけには行かない。参照カウンタつきのクラスなんかは、そんなことしたら確実
に壊れるし。
そこで「一連の要件」を定義することで、汎用的で再利用可能なアルゴリズムを定義できる
ようにしたのが Generic プログラミング(C++ の規格書読んでると Assinable Type とか出
てくるけど、あれが要件)。ただ「一連の要件」というのが曲者で、手続きや型と比べると把
握しづらいんだよな。
C++ でうまくテンプレートを使ったコードを読むと「このループ何」みたいなことが少ない。
ループや比較に名前がついていて、コードを読んで意図が汲みやすいようになってる。
いまどき変数を使わずアドレス直書きなプログラムなんざ
「たとえ正しく動いていようが、こんなプログラムメンテナンスできん」
と思うように、将来は名前の無いループや比較演算を直接埋めたプログラムは
「読めるか、こんな抽象度の低いコード」
とか言われるのかも知れず。
0016デフォルトの名無しさん
NGNG0017デフォルトの名無しさん
NGNG■[直行]の大辞林第二版からの検索結果
ちょっこう ちよくかう 【直行】
(名)スル
(1)途中どこにも寄らず、目的地へまっすぐ行くこと。「出張先から会社に―する」
(2)人の思惑などを考えず思うとおりに行うこと。「直言―」「―の士」
(3)正しいおこない。
0018デフォルトの名無しさん
NGNGまじれす
各概念が独立していること
単独でも使えるし、組み合わせることも可
(元ねた、XYグラフはX軸とY軸は直行している)
0020デフォルトの名無しさん
NGNGちゃいます。
正直、ム・マ板では「直交」はNGワードですな(藁
>>19
正解(漢字が)
0021デフォルトの名無しさん
NGNG> 一種のTemplate methodと考えるのはまずいですかね?
それはあくまで「手法」の一つであって、背景にある「概念」とは異なると思う。オブジェクト指向って
関数ポインタですよね、というのと同じぐらいには外してると思うぞ。
(Generic プログラミングをサポートするのは C++ に限らないわけだし)
0022デフォルトの名無しさん
NGNG0023デフォルトの名無しさん
NGNGテンプレート使ってると時々コンパイラがFatalErrorを吐く。
自分が間違っているのか、コンパイラの問題なのか分からなくて悩む。
ま、VC6よりはましだけど。
#とりあえずage
0024デフォルトの名無しさん
NGNGTemplateだけ展開するコマンド無かったっけ?
0025デフォルトの名無しさん
NGNGどんなコードでFatalErrorになるの?
ちなみにBCC5.5はANSI C++には対応していません。
うそ書くなBorland
0026デフォルトの名無しさん
NGNG23 じゃないけど、たとえばこんなコード。
vector<vector<int> > vv;
for_each(vv.begin(), vv.end(), boost::bind(&vector<int>::resize, _1, 1));
致命的エラー F1004 vv.cpp 14: コンパイラ内部のエラー(関数 main() )
002723
NGNGtemplate <template class<> class C, typename T>
C<T> function() {return C<T>();}
みたいなの。
コードの方が間違ってる気もするんだけど…。
BCC5.5はISO C++と違う部分もいくつかあるけど
(temlate <typename T> friend function<T>();がだめなのは参ったけど)
まあ比較的頑張ってるんじゃないかな。
Windows用コンパイラでもっといいのある?
0028デフォルトの名無しさん
NGNGModern C++ Design の著者は、サンプルコードを
Comeau C++ 4.2.38
CodeWarrier Pro 6.0
で動作確認した、と書いてある。あとは gcc 3.x 系列じゃないかな。
(妥協して VC7 ってのも現実的な選択肢だと思うけど)
0029デフォルトの名無しさん
NGNGLoki の readme.txt に
> Also, Loki has been ported to gcc 2.95.3 by Nick Thurn.
ってあるよ.
0030デフォルトの名無しさん
NGNGobjectを中心とするような王道OOとは違って、
generic functionを基本とするprogrammingのことね。
C++だと、template、operator/method/function overloadを使う。
0031デフォルトの名無しさん
NGNGとっては必読の1冊ですよね。意外に早く翻訳されたのでよかった。
スマートポインタとかFactoryの話が出たので、ProxyとかFlyweightの例も
欲しかった気がしますが。
メインの開発環境がVisual C++ 6なんですが、Loki全部は通らないみたい。
Windows環境でコンパイル通そうと思ったら、CodeWarriorのWin版か
Cygwin+α的なのに頼ることになりそうですかね?
Lokiのうち、templateのパラメータにtemplate使ってるやつとか、
部分的な特殊化の入ってる部分以外は通ると思ったんで、そいつらを使わない
書きかたで置きかえられるかな、とおもってチャレンジしてみたんですけど
全て敗北しました。「あぁ、こりゃしかたないか」みたいに感じたんですけど、
単に、実力が足りんような気もするし。
部分的に汎用性を捨てて、固定のポリシーで書きなおしてやれば、
それはそれで、それなりに使えるような気もします。
Lokiを使いたいところだけ、通せるコンパイラでライブラリ化してやって
そいつをVC6で使うのはどうだろうかと思ったんですが、それはそれで
ライブラリの名前マングリングの話があって面倒なのでは、とか。
(試してみた人いません?)
いや、、単なる感想で特に言いたいこともないんですが。。。
0032デフォルトの名無しさん
NGNG003331
NGNGそういう指摘でしょうか。lokiをコンパイル可能なコンパイラに
templateインスタンスをexportする機能がついているのか、という
お話でしょうか。。
VC++なDLLの場合、templateインスタンスなクラスはexportできるみたいで。
ライブラリ側でポリシーの選択までやっちゃって必要なインスタンスクラスだけ
exportする、という使い方はどうかと。export側とimport側でコンパイラとか
標準ライブラリのバージョンが違って出来上がるバイナリが変わってしまったら
コケるかもしれませんが。
lokiそのものをライブラリ化しよう、というわけではないので、PImplな部分を
lokiで作ってやって、dll exportなインターフェイスをつけてやれば、よいか
と思ったんですが、実行時のパフォーマンスは落ちそうですね。
ライブラリ化してる時点でありがたみ半減には違いないです。
0034デフォルトの名無しさん
NGNGでしょう。私は、これをサポートしているコンパイラ (というかリンカか?)
って見たことないです。
でも、33 の言うようにテンプレートを個々にインスタンス化したものは、
DLL の意味で export 可能だろうとは思います。
0035デフォルトの名無しさん
NGNGなんかで見た記憶があります。プログラミング言語C++第3版だったと思うけど。。
正直いって、どういうしくみになってるのか想像できなかったんですよ、あれは。
テンプレートパラメータが残ってるから。
翻訳単位が違うってことは、テンプレートパラメータが何になってもいいよ、
っていうオブジェクトがあって、それが外部から参照できます、ってこと
ですよね。それってどういう風に実装できるんでしょう、リンカ的に。
なんかいろいろ制約がつきそうですが。
(厨房に解説してやろうというかたお待ちしております)
コンパイル済みオブジェクトにgenericな動作がさせられるっていうのは
なにやら凄そうですが。
0036デフォルトの名無しさん
NGNGたんに export があったということを覚えているだけ。リンク時に未定義な
テンプレートインスタンスが発見されるので、そこで初めてインスタンス生成を
開始。つまりリンカの協力のもとに遅延コンパイルをするという感じかなぁ。
0037デフォルトの名無しさん
NGNGに面白い話が載ってるよ。CLRに言語共通なgenericsを導入しようと言う話。
Lazy dictionary creation, JIT, Specialization and Sharingなど、
これまでのlinkerをかなり逸脱する話が含まれてる。(つーか実行時…)
0038デフォルトの名無しさん
NGNGそのページのタイトル、「COM+ 2.0 Generics」...
0039デフォルトの名無しさん
NGNGtypoがあるYO。
template <template <class> class C, typename T>
C<T> function()
{
return C<T>();
}
0040デフォルトの名無しさん
NGNG失礼。書き間違えちゃった。
でも、39のでもダメなんだよね...。これって規格上だめなのかな。
0041デフォルトの名無しさん
NGNGfunctio < C < T > >();
じゃだめ?
>>27
>(temlate <typename T> friend function<T>();がだめなのは参ったけど)
これは言語の設計上できないようにしているだけ。
friend classは限定的につかおうってこと
0042デフォルトの名無しさん
NGNG27 が書きたかったのは、
template<typename T> class Hoge {
frind T function<T>();
};
ということだと思うけど。これは規格上 OK です。つか、function の後の
<T> の有無で意味が変わる。g++ は標準規格に合ってるけど、VC++ なんかは
合っていませんね。
0043デフォルトの名無しさん
NGNGうーん、メタテンプレートみたいのを使いたいということ?
これのテンプレート引数の C って、それ自身がテンプレートになってるような
書き方だけど。
でも、そもそもどうやったらテンプレートそのものを引数として渡せるのやら。
004427
NGNGそれは、あのあと確かめたら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を使うのは問題ないはずなんだけど...
004527
NGNGclass SampleClass
じゃなくて、
class TestClass
です。
コンパイラ通してから書かなきゃだめだね、こりゃ。
004643
NGNG取ることはできるね。でも、その有効な使い道というのがよくイメージできないなあ。
0047デフォルトの名無しさん
NGNGそのクラスがつかうコンテナを選ぶとか?
cls<vector>
cls<list>
0048デフォルトの名無しさん
NGNG規格によれば、
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デフォルトの名無しさん
NGNGVCではコンパイル通ったよーん。
0050デフォルトの名無しさん
NGNG普通のC++プログラミングを実数軸の話とすれば、
テンプレートを使った繰り返しや再帰は虚数軸の話だと思った。
抽象度が高すぎるたとえですまぬ。
0052デフォルトの名無しさん
NGNGGoogleで"Modern C++ design"検索してたまたまこのスレにたどり着いたので。
Functor萌え。
0053デフォルトの名無しさん
NGNGtemplate<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デフォルトの名無しさん
NGNG0055デフォルトの名無しさん
NGNG0056デフォルトの名無しさん
NGNG>template<int N> class Pow {
>public:
> static const int result = Pow<N-1>::result * N;
こういう場合はstruct Powにしましょう。
非公開メンバー&メソッド無いんですから。
でもGenerativeプログラムの基本やね
汎化と特化のいい関係。
005753
NGNGそう。スマソ。階乗とべき乗のどっち書くかぼんやり迷ってたから混ざった……。
005853
NGNGclassを類とは訳してないからいいんじゃない?(w
0059デフォルトの名無しさん
NGNGC/C++のマクロのパワーアップ版って言ったらダメかなぁ。
オブジェクト指向マクロとか。
0060デフォルトの名無しさん
NGNG結果的にそうなってるだけ。
006153
NGNGダメ。機能限定版でもあるから(w。
・マクロはトークンならなんでも置き換えてくれる(予約語さえ)けど、
templateは型か特定の型の定数しか置き換えてくれない。
・マクロはパラメタのないトークンを置き換えられるが、
関数テンプレートは関数しか置き換えられないし、
クラステンプレートを使うには型宣言のときにパラメタ指定が必要。
・マクロ展開の際に引数は文字列として結合ができる
templateは与えられた引数を文字列として加工する能力はない。
・マクロはプログラムのごく一部にだけ選択的に作用させることもできるが、
テンプレートはグローバルに影響を及ぼす。
・・・・・・だからマクロとテンプレートには似た性質
(コンパイル時までに処理される)もあるけど、
別のものと思ったほうがいい。
0062デフォルトの名無しさん
NGNG//(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//(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//(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//(4) sample expression
//...
Vector<double> v1;
Vector<double> v2;
Vector<double> v3;
Vector<double> v_res;
//...
v_res = v1 + v2 + v3;
0066デフォルトの名無しさん
NGNG//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));}
006753
NGNGtemplate<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デフォルトの名無しさん
NGNGstatic使うのはまずくない?リンカは削除できるのか?
あとコンパイル時に計算するのにN%2をやるのはなんかけなげ。
コンパイル時間を短縮するための効率的な構造とかてできそうで
怖い。SchemeをコンパイルタイムにやるC++は異常。
0069デフォルトの名無しさん
NGNGいやいやちょっとまて。static const intが
コンパイル時評価であることは保証されているのか?
てか?文は実行時だろう。とするとこれは
数字を保持したstatic intオブジェクトを
実行時の静的オブジェクト初期化時に順に掛けていくという
クレイジーなプログラムになるんじゃないか?
0070デフォルトの名無しさん
NGNGstatic const int じゃなくて enum にすれ。
007171?
NGNGtemplate<int I,int P>struct Pow{
enum{R = I * Pow<I,P-1>::R};
};
template<int I>struct Pow<I,0>{
enum{R = 1};
};
007253
NGNGテンプレートから展開されるクラス定義の数を減らす効果があるっす。>N%2とPow<(N>>1)>
クラス内のstaticはクラス1つに1個の意味だからそんなに仮に領域が割り当てられていたとしても、
クラス定義を処理する以上には悩ましくはないかと。>static
>>69
プログラミング言語C++第3版 A.5によれば
constant expressionにconditional expression(?: && ||)は含まれるらしいすよ。
ということは評価時に定数になるならば立派に定数式っす。
で、定数式ならコンパイル時に計算され、constに領域は割り当てられない筈。
007353
NGNGN=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
の順で初期値が確定する。
007453
NGNGtemplate<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> 多分展開されるはず。
試してみ。
007753
NGNG類似のコードは昔論文を読んだときに
g++で試したので、書き損じが無ければ>>74も動作はする筈。
inline展開と定数伝播の程度・能力に関してはコンパイラによるけど。
0078デフォルトの名無しさん
NGNGstaticは意味が大きすぎてリンカは削除できないと思う。
5乗の計算に20バイト使う可能性がある!
constもinlineも保証はないので結局残るのはenumだけなんじゃないか?と。
運が悪いと普通のpowになっちゃいますよ的な。
そうして74のintの部分特別化にenumを使えるかなとかなんとか考えると疲れた寝る。
0079デフォルトの名無しさん
NGNG「意味が大きい」って?
あと20バイトくらいを問題にするなら展開されたコードの方が全然大きいかもよ?(w
大体enumの初期値として処理できる定数式なら
constの初期値として処理できない筈がない。
思うに、展開されたクラスのstatic constについて誰かがアドレス取らない限り
リンカまでも行かないで領域はないと思われる。
ちなみに、
Pow<N,X>::resultは定数式として定数の初期化に使えるところが利点。
Pow<T,N>(x)はNに関しては、
コンパイラが一般の部分特化のアルゴリズムを備えていなくても
テンプレートと定数伝播、inline展開の常識的な実装を備えてさえいれば
確実に部分特化の意図が伝わるのが利点。
初期のcfrontでトランスレートしてた時代ならイザ知らず、
constもinlineもここで出てる例くらいならば、今の最適化技術では
可能不可能の問題でなくやるかやらないかの問題だから、
一般用途のまっとうなコンパイラでは十分できる範囲だと思う。
0080デフォルトの名無しさん
NGNGだから、とりあえず手元の処理系で試してみろって。
0082デフォルトの名無しさん
NGNGよって問題なし、と。
規格について一通り調べがついた後は、「思う」と書いてあーだこーだ議論するより
実際処理系での結果を出した方が話が早いっしょ。
008353
NGNGどうもです。
今、ようやく試せる環境(研究室の自分の机)にたどり着きました(w。
もう話は終わってるみたいですが。
0084デフォルトの名無しさん
NGNG20バイトというより1バイトさえも使っては意味がないし
コードが展開されてはそもそもいけない。
コンパイル時評価になることが保証されてこその新しいPow。
Pow<N,X>::resultは、コンパイル時評価は保証されないし
計算ごとに生まれる多くのstatic intが削除されることが
保証されないので恐ろしくて使えない。
Pow<T,N>(x)は、やはりインラインが保証されない上、
インライン展開されてもコンパイル時評価になることが
保証されないので駄目。
いままで標準準拠のコードを書くためにがんばってきたのに
ここでenumを裏切るのはなぜか。
あとcfrontがどうとか言い出すのが好感度下げる。ワラ
0086デフォルトの名無しさん
NGNG完璧確実を求めるならちゃんと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@sin( 1.46 )とかを展開するような
独自プリプロセサを書けや。
0088デフォルトの名無しさん
NGNGそんなことせんでもsin(1460000) // =1.46*1000000とかして
1000000で割ればいいじゃん。
古典的手法
0089デフォルトの名無しさん
NGNGsinをテンプレートで実用的にかけると仰る?
0090デフォルトの名無しさん
NGNG>少なくとも普及している処理系の一つで意図どおり動作するコード
それが駄目だとあれほど。
コンパイル時評価が保証されないので
全くGenerativeではない。君は
賢いコンパイラは仮想呼び出しを実呼び出しに最適化できるので
templateはいらない、仮想関数で十分。
領域が割り当てられて残るかどうかは副次的なことに過ぎない。
せいぜいメモリ使用量が増えるだけ。実行速度に悪影響はない。
多態性にtemplateを使うのは病的。
と思っている。確かにこれは正しい。ワラ
ここでSTLが大好きな君が裏切るのはなぜか。
0091デフォルトの名無しさん
NGNGそういうことしたいならLISPでプリプロでも書いたほうが自由度高いし簡単。
(defconst var `(,(sin 1.46))) ;;;リストvarにsin(1.46)の結果を埋め込み。
C++もコンパイル時に関数を実行できる仕様だったら便利なのにね。
0092デフォルトの名無しさん
NGNG関係ないけどVBでこういうことができないのは不思議。
0093デフォルトの名無しさん
NGNG>1000000で割ればいいじゃん。
まさか・・・
0094デフォルトの名無しさん
NGNGC++で実装される言語がなにやらほざいているな
0095デフォルトの名無しさん
NGNGコンパイルエラー等ででてくる、エラーをどうにかしてほしい。
0096デフォルトの名無しさん
NGNG『STL Error Decryptor』
http://www.bdsoft.com/tools/stlfilt.html
みたいなものを使ってみるとか。
0098デフォルトの名無しさん
NGNGもう、その話題は良いって。
使えると思うヤツは自分のコンパイラで試した上で使えば良いし、汎用性が
必要なプログラムを書いてる場合には、それなりの対処しろ。
0099デフォルトの名無しさん
NGNGGenericが汎用って意味なのだが
0100デフォルトの名無しさん
NGNG言葉遊びは、技術系の板の外でな。
Generic Programming を Win32 API と組み合わせてプログラミングしたって
良いじゃない。
0101デフォルトの名無しさん
NGNGいきなりWinMainからはじまったりすると激しく萎える。
0102デフォルトの名無しさん
NGNGそんな本があるのかーΣ(゚д゚lll)
禿げしくスレ違いだが書名キボンヌ
0103デフォルトの名無しさん
NGNG0104デフォルトの名無しさん
NGNG0105デフォルトの名無しさん
NGNG話のすり替えは、技術系の板の外でな。
enumを置き換えられると思いこんだんだな。
0106デフォルトの名無しさん
NGNG言語の仕様上はこの場合でもenumはstatic const intに置き換えられるのでは?
置き換えられないというなら実例をキボンヌ
0107デフォルトの名無しさん
NGNGもう相手にしないで、放っておいてやるのが良いと思われ。
0108デフォルトの名無しさん
NGNGこの例の意義はC++が既に持っている機能でこういうことが書けると言うところに意味がある。
(
・実用的なGenerativeアプリケーションの開発
・Generativeを正式にサポートする言語の研究開発への動機付け
)
他の言語に替えてよければ、それこそLISPもそうだが'CとかMetaMLとか色々ある。
0109デフォルトの名無しさん
NGNG0110デフォルトの名無しさん
NGNG元々そういう用途を意図して設計しているわけではないので、
この2レベルで激しく構文が違ってしまっているという問題はある。
例えば……:
template引数にはクラス・オブジェクトはおろか整数定数しか渡せない。
書きなれた命令型ではなく関数型プログラミングのスタイルで書かなければならない。
コンパイル時関数を表現するのにtemplateクラスを定義するのはやっぱ無理がある。
というわけでプログラミング言語学的には今後の研究が待たれるところであるっす。
0111デフォルトの名無しさん
NGNGぷ
0112デフォルトの名無しさん
NGNGぷ
0113デフォルトの名無しさん
NGNG3ユーザーとしては買いでしょうか?
0114デフォルトの名無しさん
NGNG煽りはともかくとして、昔のCでマクロレベルでどうにかする、
ってのと基本的に変わらないね。
処理系がえらく大きくなった割には対効果が低いのが気になる。
>>108
'Cってなんですか?
quote-C?
0115デフォルトの名無しさん
NGNG今回の Pow() あたりだと、
> 処理系がえらく大きくなった割には対効果が低い
のは確かだが、STL の関数オブジェクトやアルゴリズムまで行くと、そう
捨てたものじゃないぞ。
0116デフォルトの名無しさん
NGNGあんまり使う気になれないんですが。オブジェクト指向とか以前に。
LISPのマクロなんかは最小限の労力で物凄い効果を期待できますけど、
あんな感じになって欲しいな。
0117デフォルトの名無しさん
NGNG0118デフォルトの名無しさん
NGNG0119デフォルトの名無しさん
NGNG0120デフォルトの名無しさん
NGNG0121デフォルトの名無しさん
NGNG思うようになったな。
javaもgenericを搭載するらしいが、はたしてどうなることやら。
なんつーか、ポリシーを持って作ってほしいね。
0122デフォルトの名無しさん
NGNG0123デフォルトの名無しさん
NGNGコミュニティが弱小だから?
ともかくObjective-CをC++という名前にして、
今までのC++は無かったことにするとか。
ストラウストラップは始めからいなかった事に(w
BorlandもDelphiと統合できなくて困ってるみたいだし。
0124デフォルトの名無しさん
NGNGOSの設計に言語の汚さがついて行けなったらしく。
ObjectiveCがメインで、Javaでもなんとかなるとかならないとか。
C#登場で一気に滅亡しそうな予感もしてるんだな。
0125デフォルトの名無しさん
NGNGそれは言えてる。
手続き、OO、汎用プログラミングなんでもアリなのはメリットだとは思うが、各々の
親和性がもうちょっと上がると嬉しい気がする。template がらみのエラーメッセー
ジとか。
0126デフォルトの名無しさん
NGNG0127デフォルトの名無しさん
NGNGgeneric なアプローチと generative な方法との違いが知りたいんだけど。
0128デフォルトの名無しさん
NGNG俺は最初の方の人とは違うけど、
generic
型に依存しない操作
generative
コンパイル時にポリシーを与えて、コードを動的に生成する
ってイメージがあるな。STL だと algorithm は generic だけど、container なんか
は generative っぽい気がする。
0130デフォルトの名無しさん
NGNG> 置き換えられないことを説明するのに疲れたよ
もう説明しなくていいって。書くことは一通り書いたんだから、後は読んだやつが
各自で判断すればいいだろ?
0132デフォルトの名無しさん
NGNG構って欲しければ、馴れ合い系の板に逝けよ(w
0133デフォルトの名無しさん
NGNGそういった時点で呉越同舟だよ!!ワラ
0134デフォルトの名無しさん
NGNG(自分はgenerativeプログラミングは
staticプログラミングとでも呼んだ方がいいと思う)
factorialとかsumとかpowとか書いてると
これらをさらにgeneralizeして
マクロにする。Modern..本のTYPELISTみたく。
こんなことやってるライブラリはないんだろうかね。
intのリストは全部staticに処理できるのではないかと。
あまり役には立たないだろうけれども。
0135デフォルトの名無しさん
NGNGヲイヲイ、>>84のいったいどこが実例なんだYO!
0136107 (!= 106)
NGNGだから、放っておいてあげなよ。アレで本人は満足なんだから。
0137デフォルトの名無しさん
NGNGたのむよ!
0138デフォルトの名無しさん
NGNGtick-C
実行時にコード生成できるように拡張したC。
処理を実行時まで遅らせるようにコードをマークする記法と、
遅らせた中の一部をコンパイル時に実行できるようにマークする記法を組み込んだ
2レベル言語になっている。
http://www.pdos.lcs.mit.edu/tickc/
テンプレート方式のコード生成と呼ばれる技法で実装されている。
0139デフォルトの名無しさん
NGNGgenericな関数の定義を効率よく実装する方法の一つが
パラメータ毎に展開してコード生成すること。
templateを利用したgenerativeテクニックはそのコード生成機能を逆手に取って
実現されている。
ちなみにJavaに導入されるtemplateは実行時に処理されるらしいので、
ここで話題になったようなコード生成テクニックには利用できない。
まぁ、Javaの場合、
コード生成素直にダイナミック・ロードでなんとかしろってことなんでしょうか?
0140デフォルトの名無しさん
NGNG0141デフォルトの名無しさん
NGNG0142
NGNG嫁
0143デフォルトの名無しさん
NGNG0144デフォルトの名無しさん
NGNGamazon注文age
0145デフォルトの名無しさん
NGNG0146デフォルトの名無しさん
NGNG0147デフォルトの名無しさん
NGNGageてばかりだと、そのうち
ageばっかりになるぞ
なんかしゃべれ
0148(ΦωΦ)フフフ・・・
NGNG0149(Φ∀Φ)フフフ・・・
NGNG0150デフォルトの名無しさんk
NGNG0151デフォルトの名無しさん
NGNGなんつーか、何かにつけてめんどくさいね。
0152デフォルトの名無しさん
NGNGそれが C++ の限界。
もうパズルだよな。
このスレは generic programing と generative programming が
混じってるので混乱する。
URL 紹介
http://www.generative-programming.org/
0153デフォルトの名無しさんk
NGNGもっとスマートに出来るの?
0154デフォルトの名無しさん
NGNGhaskellはともかく、MLはこういうことに関してはすんごいよ
0155デフォルトの名無しさん
NGNGHaskell はダメなの?
0156デフォルトの名無しさん
NGNGHaskellやMLで出来ない技が多いよ。
たしかに、この本の中に出てくるFunctorは
関数型言語では高階関数(カリー化)というものと、とても似ています。
しかしC++のテンプレートは、ソースを実際にマクロのように展開しています。
こういうマクロのように展開することを関数型言語ではα簡約といっているらしいですが。
こういう機能はLispとSchemaにはありますが、MLやHaskellでは無いです。
本質を見極めた上で書きましょう。
0157デフォルトの名無しさん
NGNG0158デフォルトの名無しさん
NGNGC++にとっては本質的
0159デフォルトの名無しさん
NGNG0160デフォルトの名無しさん
NGNG「多少強化」がやろうとすると多少の強化では済まないことも多いからなぁ。
タイプ・チェックも計算能力も。
0161デフォルトの名無しさん
NGNG> > >と最後の閉じカッコがなんともまぬけでイイ(w
0162156
NGNG何時、評価&簡約されるかということ。
α変換(C++で言えばプリプロセッサによるマクロの展開、テンプレートの展開)はコンパイルされるとき展開、簡約されますね。
β変換(実行時に引数を渡すこと)は、実行時に評価、簡約されます。
何時評価されるかって結構だよね。
訂正:α簡約なんていう言葉は無いです。α変換の間違いです。
漏れも逝きます。
0163λ中将
NGNG0164デフォルトの名無しさん
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デフォルトの名無しさん
NGNG0166デフォルトの名無しさん
NGNGかなり抽象度高くて眠くなる。 C++ で Lisp ごっこをやる章は楽しかったけど。
学術的な雰囲気の強い本なので、そういう素養がないとつらいとおもう。
(OOPSLA の論文読んで理解できるレベルなら十分。)
0167デフォルトの名無しさん
NGNG0168デフォルトの名無しさん
NGNG楽しみと思う反面、地獄の予感もしたりする、、
0169デフォルトの名無しさん
NGNG0170デフォルトの名無しさん
NGNGβ変換がβ簡約とも言われるのは適用されるたびにλ項が解消されて減っていくから。
(ある種のλ式ではβ変換を有限回適用することで簡約順序に関わらずそれ以上簡約できない
「標準形」になることがわかっている。無限回簡約できるようなλ式、
またその中でも評価順序によっては有限回でそれ以上簡約できなくなるようなλ式もある。)
α変換は名前の付け替え変換だから式の形自身は変わらないので、
無限回繰り返すこともできるが、
同一視することによって無視する(α合同関係)ことが多い。
というわけで、α簡約とはやっぱりあまり言わないかも。
まー、マクロ展開にせよテンプレートの展開にせよ
単純なλ計算そのものではない。
例えば、プリプロセサマクロの名前付け替えは、
付け替え後の名前が付け替え対象の名前になるような関係による
循環を避ければ有限回で終了する。
それでも敢えて喩えて言えば、
プリプロセッサのマクロ展開だからα変換とも限らず、
引数つきマクロなどはβ変換といってもいいかもしれない。
0171170
NGNG>>170
つまり標準形のあるλ式(計算が終了する)であるならば、
λ項はβ変換適用ごとに減っていくので「簡約」なわけです。
通常、計算は終了することに意味があるとされるので、逆に
β変換が「簡約」であるようなλ式を「正しい」プログラムの表現
と見るわけです。
ついでに言えば、現実のプログラムでは評価順序も決まってるから、
その評価順序において簡約し切れるような式であれば良いわけで、
標準形のあるλ式以外にも、特定の簡約順序によって
有限回で簡約不能な式(値)になるような式も
条件付で認めるが立場あり、実はプログラムの基礎理論としては主流です。
0172デフォルトの名無しさん
NGNGわかったから。
そいうことは関数型言語板かLispShcema板でやって
お願い
0173デフォルトの名無しさん
NGNGModernC++Design読むと逆にSchemeとかMLやってみたくならねぇ?
これから10年後のC++のプログラムとか、今のクラスライブラリの
惨状から想像するとぞっとするんだけど。
0174デフォルトの名無しさん
NGNGこの本のやってることってtemplateでどこまでconst演算できるか?
ってのもあるからあながち無駄でもないかも。
0175172
NGNGもちろん無駄だといってる訳ではない。
ModernC++Designを読んでる最中にHaskellに出会って
今、はまりまくってるよ。
そのせいか、STLもパラメータ化クラス(型?)を使いまくってる性で
関数言語風味たっぷりに感じてるよ。
どれくらい嵌ってるかというと、関数プログラミングからホーアCSP理論まで読んで
「ほー、Eiffelの表明の元ネタは仕様記述言語Zから来てたのは知ってるけど
そのZ言語の元ネタはCSP理論なんかー。おもしれーなー。
表明の推論もできそうだなー」とか訳のわからんことを考えるくらい嵌ってる。
ただ、この手のネタは、この板の主旨から結構ズレてしまったのでは?
と思うわけよ。
>>174
これも面白いと思う。
非正格言語でtemplateみたいなコンパイル時簡約?みたいなことが
出来たら実行速度が手続き型言語に勝てる関数型言語も夢では無いかもしれない
と俺は創造してしまう。
(CleanやMLは代入使って実行速度を上げてるようだが、そんなセコイことせずにな)
でも、なーtemplateは形検査してくれないからなー。
ModernC++Designの技はやり過ぎだと思う。
ハッタリには使えると漏れも思う。
(研究する価値が無いというつもりは無い。そこは酌んでほしい)
0176デフォルトの名無しさん
NGNGやっぱり実践的なプログラムにあれは使うものじゃないよね。
Cの変なテクニックを積み重ねたようなプログラムなんて物凄く
読みにくいけど、それの上を逝ってるよ。
0177デフォルトの名無しさん
NGNG頭の体操には悪くないが。
0178デフォルトの名無しさん
NGNG0179デフォルトの名無しさん
NGNG0180デフォルトの名無しさん
NGNGサイト、キボーン!(懐)
0181デフォルトの名無しさん
NGNG0182デフォルトの名無しさん
NGNG動くらしい。(LokiのReadMeに書いてなかったけ?)
Lokiがコンパイルできる珍しい処理系
0183デフォルトの名無しさん
NGNG0184デフォルトの名無しさん
NGNG0185デフォルトの名無しさん
NGNGじゃ、駄目じゃん、、、
いったいなんでgccでは動くのか、その理由が知りたいな。
実際、ここまで互換性がないとテンプレート怖くて使えないんだけど。
0186デフォルトの名無しさん
NGNGあるSTLの本の第一章に。
「互換性が低いことを怖がってSTLに対して保守的にならないで下さい。
時代はstanderd C++に向かっているのです。」
0187デフォルトの名無しさん
NGNG・・・で?
0188デフォルトの名無しさん
NGNGVC++ だと部分特殊化もメンバ関数テンプレートもサポートしてないから…
つーかもう4年近く前のコンパイラだよ?<VC6
VC.NETだとどの程度templateに対応してるんだろ。
0189デフォルトの名無しさん
NGNG0190デフォルトの名無しさん
NGNGって書いてあったが<VC.NET
0191デフォルトの名無しさん
NGNGgccが開発バージョン2.9から最新ANSI C++規格を実装したからさ
それと.NETでLokiは使いたくないなー。VC.NETはやめとけ。
氏ぬぞ。
0192デフォルトの名無しさん
NGNG0193デフォルトの名無しさん
NGNGサイトがでかすぎて分からないヨ
0194デフォルトの名無しさん
NGNG0195デフォルトの名無しさん
NGNG0196デフォルトの名無しさん
NGNG凄ぇ・・・まさに天才。
0197デフォルトの名無しさん
NGNGおれは3章であっぷあっぷだよ。
あんまりテンプレート自体を使いこなして内省かも。
0198デフォルトの名無しさん
NGNG出てこないところをみると皆自分の中で消化吸収してる最中なのかな?
おれはあと3ヶ月ぐらいはかかるだろうな。
0199デフォルトの名無しさん
NGNG0200デフォルトの名無しさん
NGNG0201デフォルトの名無しさん
NGNG0202デフォルトの名無しさん
NGNG0203デフォルトの名無しさん
NGNGC++使う理由の大半はテンプレートがあることだからね。
STL なーんて素晴らしい。
0204デフォルトの名無しさん
NGNG0205デフォルトの名無しさん
NGNG0206デフォルトの名無しさん
NGNGJava
0207デフォルトの名無しさん
NGNG0208デフォルトの名無しさん
NGNG0209デフォルトの名無しさん
NGNGD言語
0210デフォルトの名無しさん
NGNG0211デフォルトの名無しさん
NGNG0212デフォルトの名無しさん
NGNGevalはやめてー
究極すぎる
0213デフォルトの名無しさん
NGNG0214デフォルトの名無しさん
NGNG0215デフォルトの名無しさん
NGNG0216デフォルトの名無しさん
NGNG結構使えるよな。テンプレートパラメータからホストクラスを
派生させるってのカッコいいから使ってるよ。
0217デフォルトの名無しさん
NGNG0218デフォルトの名無しさん
NGNGSTLに該当する機能はあるのでしょうか。購入検討の資料としたいのです。
0219デフォルトの名無しさん
NGNGよく知らないけど、System.Collectionsのコンテナを
使うんじゃないかな?だからSTLは無いと思うけど。
0220デフォルトの名無しさん
NGNG分からない。だれか簡単に説明してくれないかな?
0221デフォルトの名無しさん
NGNGttp://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デフォルトの名無しさん
NGNGFunctorと組み合わせて高階関数ができるからかな?
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デフォルトの名無しさんk
NGNGclass 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その設計は良くないのでは?
(タイプリストの引数の数が変わったとき作りなおさなやね)
今手元に本が無いので上手く掛けないけど・・・
TypeListのクラスを単一継承するという活用法が載ってた
と思うけど、そってで攻めてみては?
あっ。Cls2,Cls3,Cls4見たいにしたらいいんか
0226223=224
NGNG今まではOO的なプログラミングということでインターフェイスを
規定してそれに対して実装するってやり方だったけど、これは
全然違うね。
最初にタイプリストありき。それの関係を記述するようなプログラミング。
あたま痛くなってくる。でもこれがホントの再利用性なのかも。
0227223=224
NGNG馬ファ輪飲んで今日はもう寝る
0228225
NGNG個人的にはType2Typeぐらいしか使いたくないなー
実際の開発に使えそうなものって何かな?
0229デフォルトの名無しさん
NGNG天才が書いたコードは天才しか再利用できない
0230223=224
NGNGんー、自分でも色々と考えてるんだけど、これをつかった効果を
なんとなく想像するので精一杯。
イメージとしては、既存の開発において
ライブラリコード:アプリケーションコード=1:10
ぐらいの比率だったとして、Alexandrescu方式のプログラミングを
導入したことで
ライブラリコード:アプリケーションコード=8:2
みたいなところまで比率に上げる。というか外部のライブラリやシステムに
依存したものを極力排除する。そうして全体のステップ数を減らす。
こんな世界(w)を期待してるのは分かるんだけど、
いかにライブラリコードを設計するかは一筋には逝かないね。
システムの全体を理解してパターンを適用し、それらの関係を
リストで表現する。こんな天才的能力がある人だけが使うものかもね。
リストをデータ構造としか考えてこなかった俺みたいなヘタレには
そもそも無関係かも(w
STLで上がった生産性がアプリケーション全体に適応されたら
天才とヘタレの能率の差なんて目も当てられないだろな。
0231223=224
NGNG天才の書いたコードは天才しか再利用できないかもしれないけど、
ModernC++Designで言われているのは「自分の書いたコードぐらい
再利用しようぜ」ってことだと思う。
天才がこういったプログラム設計をあっという間に理解して
抽象度の高いプログラミングをしてると思うとカナーリ鬱なんだけど、
ヘタレもお遊び程度にはやっておかないと。
今日はショックで眠れないYO、トホホ
0232デフォルトの名無しさん
NGNG0233デフォルトの名無しさん
NGNGクラス同士の機能が独立したものになるように
設計すればいいかも。
そのクラス同士を組み合わせるところにGenerativ Programming
を使えばよいと考えている。
しかし完全に機能が独立したクラスまで上手く機能を分割できないと・・・・
俺にはむりっす
0234デフォルトの名無しさん
NGNGC++のきったねー構文に関する知識は後から詰め込めばよし。
まずはプログラミングが何なのかを学ぶためにHaskellをやれ。
0235デフォルトの名無しさん
NGNGスレ違い。
0236デフォルトの名無しさん
NGNG板違い
http://cheese.2ch.net/test/read.cgi/math/1015420115/
あっちの板では認知度が低いです。がんばって宣伝してきてね
0237デフォルトの名無しさん
NGNGHaskellはIOとのやり取りが弱いので実用的ではない。
まあ、これは言語ではなく処理系の問題だが。
あとHaskellはマクロが無いね。
コンパイル時でないと知りえない情報(__FILE__とか__LINE__)が
かけない。すこし残念。
0238デフォルトの名無しさん
NGNGC++Report?DDJ?
0239デフォルトの名無しさん
NGNG0240デフォルトの名無しさん
NGNGもっと柔軟なものをここでなんとしてでも作りませう!
0241デフォルトの名無しさんk
NGNG0242デフォルトの名無しさん
NGNG0243241
NGNGマクロの部分ならなんとかなるかもしれないけど。
0244デフォルトの名無しさん
NGNG0245デフォルトの名無しさん
NGNGAndrei Alexandrescu にも無理(だった)
>>240
どうでもいいが Loli じゃなくて Loki な。
0246デフォルトの名無しさん
NGNG0247デフォルトの名無しさん
NGNG0248デフォルトの名無しさん
NGNGありません、ごめんなさい
0249デフォルトの名無しさん
NGNGRuby >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> C++
0250デフォルトの名無しさん
NGNG0251Rubyは好きだけど、比べることは不毛だ。
NGNG= って可能性は無いわけ?
0252デフォルトの名無しさん
NGNG0253デフォルトの名無しさん
NGNGたぶん operator>>>>>>>>...() だから stream から入力してるんだと思うが。
0254デフォルトの名無しさん
NGNG別スレが丁度あるじゃん。
0255デフォルトの名無しさん
NGNGいや、激しくビットシフトしてるんだと思うぞ。
0256デフォルトの名無しさん
NGNGはしっこのビットがはみ出すくらいに・・・
0257デフォルトの名無しさん
NGNG確かに画期的だとは思うのだけど。
インラインしてくれる分、それだけコードは早くなるんだけどね。
0258デフォルトの名無しさん
NGNGコンパイラのオプションをいじって、最適化を「速度優先」から「サイズ優先」
に変更しましょう。インライン展開が、かなりの程度まで抑制されます。
0259デフォルトの名無しさん
NGNG全く変化なしでしたよ。
0261デフォルトの名無しさん
NGNG最近のCPUではインラインしすぎはかえって遅くなることが
あるんで、よろしく。STLに限った話じゃないけども。
0262デフォルトの名無しさん
NGNG0263デフォルトの名無しさん
NGNGインライン展開されてたのにはびっくりした。
0264デフォルトの名無しさん
NGNGそりゃマクロだからインライン展開するわな。
つうかマクロをインライン展開というのかは微妙
# あれにびっくりしたのには同意。
0265263
NGNGBEGIN_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そんなあなたに
__asm { int 3 }
(っつー話じゃないか)
0267デフォルトの名無しさん
NGNG著者に遠慮して本書いてないか?modern~はとても実践的な本だけど、もっとTypelistに
特化した馬鹿みたいなオタク本を書いて欲しいところだな。
0268デフォルトの名無しさん
NGNG彼のWebページは何だかな。
0269デフォルトの名無しさん
NGNGいやWebで公開するには惜しいアイディアがあるんだろ。
more modernが出るのをひたすら待つのみ
0270デフォルトの名無しさん
NGNGAlexandrescuは彼のパクリ
0271デフォルトの名無しさん
NGNG知ったかしてます?
なんか具体的なこと語ってみてよ
0272デフォルトの名無しさん
NGNG使えるけど、それ以外のことにも可能性がある点が面白いわけで
270のような奴はそもそも勘違いしてるんだろな。
0273デフォルトの名無しさん
NGNGなんかローダーがエラー返してくる。。
0274デフォルトの名無しさん
NGNG0275デフォルトの名無しさん
NGNG下の本注文しますた!
0276デフォルトの名無しさん
NGNG0277デフォルトの名無しさん
NGNG何処まで許されているのだ?
0278デフォルトの名無しさん
NGNGこれからはC++コンパイラといえばG++を指します。
0279デフォルトの名無しさん
NGNGVC、BCB、gccしか知らないものですから・・・。
0280デフォルトの名無しさん
NGNG0281デフォルトの名無しさん
NGNGしかし g++ と G++ は、かなり違う気がするが。(特に UNIX だと)
0282デフォルトの名無しさん
NGNG偉い大変だよな。みんなあれをすんなり覚えられた?
0283仕様書無しさん
NGNG0284デフォルトの名無しさん
NGNG0285デフォルトの名無しさん
NGNG0286デフォルトの名無しさん
NGNG(゚Д゚)ハァ?
0288デフォルトの名無しさん
NGNG0289デフォルトの名無しさん
NGNGG++(1) GNU Tools G++(1)
名称
g++ - GNU プロジェクト C++ コンパイラ (v2.4)
書式
g++ [option | filename ]...
解説
C コンパイラおよび C++ コンパイラは統合されました。 g++ は
gcc に C++ を解釈するようにするオプションをつけてコール す
るスクリプトです。詳細は英語版のオンラインマニュアルおよび
gcc(1) を参照して下さい。
情報が古いと思われ。っつーか基本的にスレ違いだよな、この話題。
0291デフォルトの名無しさん
NGNGgccかCodeWarriorぐらい。
しかたがないね。
CodeWarriorかおか?
0292デフォルトの名無しさん
NGNG0293デフォルトの名無しさん
NGNG0294デフォルトの名無しさん
NGNGgcc使いなさい。
0295デフォルトの名無しさん
NGNG(`ε’)プンプン
0296デフォルトの名無しさん
NGNGできん。
特にVCでは不可能。
BCCでも機能が足りん。
テンプレートクラスの中でテンプレートクラスが宣言できない。
T1 < T2 < T3, T4 >, T5 >みたいな複雑なテンプレートの特殊化ができない。
これじゃねー。
0297デフォルトの名無しさん
NGNGはっきり言ってただのオナニーコードじゃん
GCCだけで閉じられてる商用プロジェクトなんてあんまり
ないんじゃないかと思うがどうよ?
結局現時点では実践向きじゃないって事?
0298デフォルトの名無しさん
NGNGそれができるとどんな利点があるの?
0299デフォルトの名無しさん
NGNG>BCCでも機能が足りん。
これってテンプレートの限界を表わしてるよね。
これじゃ実用にならない。
0300デフォルトの名無しさん
NGNG>>298
テンプレートパラメータとしてタイプリストを
作りそのリスト値から任意の型を取り出せる。
>>299
vs7のコンパイラならいけるらしい。
それにlokiはansic++準拠だよ
テンプレートの限界じゃなくて
コンパイラメーカーの限界
0301デフォルトの名無しさん
NGNGと、マンネリな煽りはさておいてvcも7.1で対応させるとか、させないとか。
0302デフォルトの名無しさん
NGNGうふ♪
0303デフォルトの名無しさん
NGNG素のC++だと、"Deriverd" という文字列からDeriverd型のオブジェクトを作成できなくて
云々とあるけど、この本のどのへんのコードを見れば文字列からオブジェクト生成するのが楽に
汎用的にできるのかがさっぱりわかんない俺はガス管くわえて死んだ方が世の中の為ですか?
0304デフォルトの名無しさん
NGNGコンパイラの内部表現としての型と
コードに記された型名の違いということではなくて?
0305デフォルトの名無しさん
NGNG0306296
NGNG本を読んでから、返事をください。
先の例より複雑なテンプレートがいっぱい出てきます。
>>303
本の例とは逆に
template < class T > class GetClassNameAble{
char* getClassname() { return T; }
}
みたいなことができても面白いと思われ。
0307デフォルトの名無しさん
NGNGそんなのいみねー
文字列からクラスを生成(Reflection)できると便利だが(構造上&仕様上不可能なのは承知)
>>306の例だとほとんど使う意味がない
0308デフォルトの名無しさん
NGNG> 本を読んでから、返事をください。
> 先の例より複雑なテンプレートがいっぱい出てきます。
了解しますた。もっと勉強します。
0309デフォルトの名無しさん
NGNG「実用」の定義によるな。gcc で仕事してる人間には実用レベルだし、Win32
アプリケーションを VC6 で書いてる人間には使い物にならん。
ただ、VC も BCC もいずれ ANSI C++ 準拠してくるだろうから、そのときに
使える選択肢が一つ増えるって事で。
(そういや Boost に Loki 入れようという話、どうなってる?)
0310デフォルトの名無しさん
NGNGWindows上のプログラムでは未だに従来のデザパタのサンプルコード
みたいなのが使われてるなんて、、、なんか違和感あるなw
0311デフォルトの名無しさん
NGNGクラス名を文字列化するのは typeid(T).name() で出来るし。別に面白くもなんとも。
0312303
NGNG神。
0313296=306
NGNGこの例、面白くなーい?
残念だなー。
>>307
const char*なら、いけるんじゃない?
もしくはコンパイラが自動的にFactoryを作ってくれるというのも
面白いかも。
というかTypeListで作れるか。あはははは。
0314デフォルトの名無しさん
NGNGつくって。
0315
NGNG>(そういや Boost に Loki 入れようという話、どうなってる?)
って初耳なんだけど、本当なの?
誰か情報キボンヌ
0316デフォルトの名無しさん
NGNGそのクラスのコンストラクタのアドレスがわかれば、
実行時にダイナミックにクラスの作成できるかな?
実装依存(コンパイラ依存)なら書けるでしょうか?
0317デフォルトの名無しさん
NGNG0318デフォルトの名無しさん
NGNGBoost の開発者 ML で議論してる。スレッド長いから追ってないけど
Andrei Alexandrescu も話に参加してる模様。
(メールアドレスが @hotmail.com だけど)
0319デフォルトの名無しさん
NGNG実装依存って言ったらそれこそなんでもありやん
0320デフォルトの名無しさん
NGNGそそ、ダイナミックにソース作って、コンパイラ起動して、できたプログ
ラムに制御渡しゃどんなクラスでもできるぞ。
0321315
NGNGboost-dev(?) の ML 読んでんの?すげー。
所詮俺は厨房である事を再確認した・・・
cppmlぐらいなら分かるんだけどさすがにそんなところ
まで手は伸ばせんわ・・・
独り言sage
0322デフォルトの名無しさん
NGNG> boost-dev(?) の ML 読んでんの?すげー。
全部は追ってないし、開発にも参加してない。必要そうなヤツだけ斜め読み
だよ。(C++ は仕事道具だし)
Boost -- Boost mailing list
http://lists.boost.org/mailman/listinfo.cgi/boost
> cppmlぐらいなら分かるんだけどさすがにそんなところ
cppml ではなくて cppll かしらん?
俺は cppll は最初は読んでたんだが、エピスが検定試験云々言い始めた頃に
S/N 比が許容値を下回ったので切った。最近はどうなん?>読んでる人
0323デフォルトの名無しさん
NGNGcppIIは今も取ってるが未読が1253通(藁
全然読んでないよ。
エピス氏はコード出して技術的な話をしているうちはいいが、
取り巻きも含めて雑談モードに入るとうるさいからな。
重鎮扱いで誰もつっこめないし。
0324デフォルトの名無しさん
NGNG俺も彼の言語感覚についていけないクチだね…
自動で s/ぢ/じ/g してから読めば少しはマシになるかな(w
0325デフォルトの名無しさん
NGNG10代、せめて20代前半ならまだ許せるが、
某本で素顔の写真見ちゃったからなぁ・・・
0326デフォルトの名無しさん
NGNGわりといますね。典型的な(略)
0327デフォルトの名無しさん
NGNG漏れは怖くてできない
電柱○家
Tit○w
あ○る
あたりが突っ込んできそうだな。
「いきなり出てきてあんたの方が役に立ってない」とかいいながら。
0328デフォルトの名無しさん
NGNG0329デフォルトの名無しさん
NGNG0330デフォルトの名無しさん
NGNGhttp://www.csg.is.titech.ac.jp/~chiba/opencxx/html/index.html
これとの組合せでたのしいことになったりしませんか?
0331デフォルトの名無しさん
NGNGなにこれ?
0332デフォルトの名無しさん
NGNG0333デフォルトの名無しさん
NGNGあのMLでは「低いS/Nの中からいかに情報を取り出すか」というのも重要なテーマです(藁
うまいフィルタ作れないかな。もちろんcppで。
0334デフォルトの名無しさん
NGNGテンプレート周辺にバグがあるんでしょ?がっかり。
しっかりしてくれよ、Borland。期待してるんだから。Pascal以外の言語もがんばってくれよ。
0335デフォルトの名無しさん
NGNGえっ?初耳。ソースはどこかにありますか?教えて下さい
0336デフォルトの名無しさん
NGNGstruct 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デフォルトの名無しさん
NGNGarticles.erase(remove_if(articles.begin(), articles.end(), bind2nd(pr(), "FUKUDA Fumiki")), articles.end());
で。
0338デフォルトの名無しさん
NGNGえっ?猫耳。
0339デフォルトの名無しさん
NGNGえっ?愛猫。
0340デフォルトの名無しさん
NGNGつまんねーよきみら
0341デフォルトの名無しさん
NGNGすごい!!
0342デフォルトの名無しさん
NGNGtemplate<class T> void swap(T& x, T& y) {}
template<class T> void swap(vector<T>& x, vector<T>& y) {}
これコンパイル通らないんだよね・・
プログラミング言語C++ではこういう書き方してるのに。
0343デフォルトの名無しさん
NGNGusing namespace std; を外して、std::vector にしてごらん。
0344デフォルトの名無しさん
NGNG0345デフォルトの名無しさん
NGNG最近関数オブジェクトがおもしろくてしょうがないんだけど、
引数がいっぱいあるメンバ関数をもつクラス T があるとして、
std::vector<T> t(100);
std::for_each(t.begin(), t.end(), &T:func);
みたいなのを引数渡ししつつぐるぐるやる方法はないかな。
mem_funcだとうまく引数が渡せないので、引数をなんとかする
関数オブジェクトをいっこつくってぐるぐるするしかないと思うんだけど、
いざコードを書こうとするとかっこわるくていかんのです。
0346デフォルトの名無しさん
NGNGsage鬱
0347デフォルトの名無しさん
NGNGboost::bindとboost::mem_funとかで出来るんじゃないか?
0348デフォルトの名無しさん
NGNGたとえば引数が三つあるメンバ関数を考えたとき、
すべての引数に値を渡せるかな?
0349デフォルトの名無しさん
NGNG3つのうち2つが固定なら出来るんじゃないか?
0350デフォルトの名無しさん
NGNGふむ。ちと試してみるよ。
ありがとん
0351デフォルトの名無しさん
NGNGtemplate<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たぶん、キミがおかしい。
VC7 のことはよくわからんけど、ふつう swap は <algorithm> の中で
次のように定義されているはず:
namespace std{
template<class T> inline void swap(T& x, T& y) { … }
}
で、何か標準ヘッダーをインクルードして、using namespace std;
してるでしょ? それで、1行目の swap とバッティングしてるんだと
思うけど。
ちなみに、2行目の swap は関係ない。それを外してもエラーが出るん
じゃない?
0353デフォルトの名無しさん
NGNGusing namespace std はやめよーよ。
0354デフォルトの名無しさん
NGNG例が悪かった・・
swapじゃなくてなんでもいいです。
とにかくテンプレート関数をクラステンプレートで特殊化しようとすると
特殊化優先順位で弾かれる。
名前空間とは関係ない問題です。(これが後々関係してくるが)
0355デフォルトの名無しさん
NGNGtemplate<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前半部分、13.5.1(p.404) によって後者が選ばれなきゃいけない話?
gcc 2.95ではちゃんと選ばれたよ。
0358デフォルトの名無しさん
NGNGC++の本を見る限りではそのgccの動作が正しいと思うんだけど。
VC7では選ばれる以前にコンパイルエラーになる。
多分、テンプレート関数とクラステンプレートで特殊化したテンプレート関数の
特殊化優先順位が等しいからこんなことになる。
これだったらすぐ直りそうなもんだからSPで直してほしい・・
0359デフォルトの名無しさん
NGNGC++のテンプレートの仕様を把握するのが一苦労って事なのかな?
0360デフォルトの名無しさん
NGNG違う名前空間の関数を特殊化するなという意味だろうか。
Javaみたく階層的に名前空間分けてたら
同一プロジェクトでも同じ問題が発生するが・・
共通関数を使わずメンバ関数を使えという話になるんだろうけど
それだとSTLのうまみも半減だわな
ところでクラステンプレートをクラステンプレートで特殊化って
C++的に可能なの?VCではダメだった。
0361デフォルトの名無しさん
NGNG0362デフォルトの名無しさん
NGNGBorland-C++ 5.6では正しくコンパイルできますた。
0363デフォルトの名無しさん
NGNG0364デフォルトの名無しさん
NGNG0365デフォルトの名無しさん
NGNGでDLしたらVC.NETじゃコンパイルできねージャン!!
氏ねMS!IDEばっか凝ってねーでコンパイラ改良しる!
0366デフォルトの名無しさん
NGNG ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄」
―――――――――――――‐┬┘
|
____.____ |
| | | |
| | ∧_∧ | | C++を窓から投げ捨てろ
| |( ´∀`)つ ミ |
| |/ ⊃ ノ | | C++
 ̄ ̄ ̄ ̄' ̄ ̄ ̄ ̄ |
--------------------------------------------
0367デフォルトの名無しさん
NGNGそもそもMSがcl.exeをANSIに完全対応させる気がないのだとしたら
どういう事態になるんだろう。
0368デフォルトの名無しさん
NGNG0369デフォルトの名無しさん
NGNGenum {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なぜ順番を変えようとする?
0372デフォルトの名無しさん
NGNGVBAかなにかでボタン一個でソース吐くようにしとけば?
俺だけかもしらんが、よくやってるよ。
その場限りならセルに文字列適当に連結する式かいてコピペ、とかもやるし。
0373デフォルトの名無しさん
NGNG見栄えが気にくわなくてあっち入れ替えたりこっち動かしたりする時期があるもんさ。
0374デフォルトの名無しさん
NGNG0375デフォルトの名無しさん
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;
}
0376375
NGNG今頃気づいたけど、呼び出し時のインデックスはコンパイル時には確定してないのか・・・じゃ駄目だ。
0377375
NGNGちょっとオーバーヘッドがあるけど、
(テンプレートクラス内の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> Function<HOGE>::call,
> Function<HAGE>::call
> };
それだと結局、enumを
enum {HAGE,HOGE,};
に変えられたときにマズーではないか?
0379375
NGNGやっちまった(藁
0380デフォルトの名無しさん
NGNGちょっとなぁ、という気がする。
自分が書くにはいいが、人には見せられない。
そもそも、見栄えを気にする(順番を入れ替える)んだから、
その書き方はいいとは思えない
0382375
NGNGenum値と対応させるってことは配列のインデックスは手打ちでenumの値を書くってことだろ?
インデックスが実行時に決まるならenumに対応させる意味もないし。
0383デフォルトの名無しさん
NGNGHAGE,
HOGE,
};
template<int i>
void f();
template<>
void f<HAGE>()
{
return;
}
void f<HOGE>()
{
return;
}
void (*func[])() = {
f<HAGE>,
f<HOGE>,
};
0384デフォルトの名無しさん
NGNG0385369
NGNGどうやればいいのかはさっぱり分かりませんけど。
>>382
いや、呼び出すときは (*func[n])() ですが…。
対応させる意味がない…? えーと。考えます。
0386デフォルトの名無しさん
NGNG0387デフォルトの名無しさん
NGNGテーブルを動的に作るのはだめなん?
0388デフォルトの名無しさん
NGNG俺もそう思う。
0389369
NGNGエンコーダとデコーダを作ってまして。
エンコーダは、テキストの文字列 "hoge" "hage"を読み込んで、
バイナリでenum値「HOGE,HAGE」を吐きます。んで、
デコーダは、バイナリでHOGE,HAGEをみて、関数hoge(),hage()を呼ぶ、と。
そういう状況です。
>>テーブルを動的に
いや、いいんですけど。でも、静的に解決できることじゃないですか。
出来たらかっこいいじゃないですか。そういうスレじゃないですか、ここは。
0390デフォルトの名無しさん
NGNGもし出来たとしても決してかっこよくはならないと思うぞ。
0391デフォルトの名無しさん
NGNGusing 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それだったら、
std::map<std::string, void(*)()> m;
m["hoge"] = hoge;
これでいいじゃん。
0393デフォルトの名無しさん
NGNG試みとしてはおもしろいかな。
でも、おれの知識じゃまだ無理だなあ。
Modern もっとよむか
0394デフォルトの名無しさん
NGNGそれがもの凄く伝わってくるスレ
0395デフォルトの名無しさん
NGNG改造してみた、本末転倒?
#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全然かっこよくないぞ
0397デフォルトの名無しさん
NGNG0398369
NGNG0399デフォルトの名無しさん
NGNGModern(の前半)読んでかっこいいと思ったか?
俺は、すげぇとは思ったがかっこいいとは思わなかったよ(むしろ汚い)。
このスレで今やってることも同じようなもんさ。
おとなしく動的作成にしない389が悪い。
0400デフォルトの名無しさん
NGNG#include "stdafx.h"
をソースファイルの先頭に入れ忘れてるとか。
0401デフォルトの名無しさん
NGNGVCだとバグのせいでうまくいかなかったはず。
たしか、すべて同一の実体を指すようになってたような。
0402デフォルトの名無しさん
NGNG他のに乗り換えれ。
0403デフォルトの名無しさん
NGNGtemplate <int i> void func()
{
std::cout << i << std::endl;
}
int main()
{
func<0>();
func<1>();
return 0;
}
これをコンパイルしてみればわかる
0404デフォルトの名無しさん
NGNG0405369
NGNG0406デフォルトの名無しさん
NGNGtemplate<int i> class func {
public:
func() {
std::cout << i << std::endl;
}
};
0407デフォルトの名無しさん
NGNG0408369
NGNGで、あとは391と組み合わせれば…?
0409369
NGNGどうすれば…。
0410デフォルトの名無しさん
NGNGヒント
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デフォルトの名無しさん
NGNG0412デフォルトの名無しさん
NGNG最悪だな
0413デフォルトの名無しさん
NGNG0414デフォルトの名無しさん
NGNG********************** 終了 ************************
0415369
NGNG>>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デフォルトの名無しさん
NGNG0417デフォルトの名無しさん
NGNG0418デフォルトの名無しさん
NGNG0419デフォルトの名無しさん
NGNG0420369
NGNG ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄∨ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄
∧_∧
( ´Д⊂ヽ
⊂ ノ
人 Y
し (_)
(´-`).。oO(っていうか、考えついたのが満足であって、>>415を使ったりはしないけどね…)
(´-`).。oO(.NETなら>>395を使えるのかしら?)
0421デフォルトの名無しさん
NGNGでも誰も使うことはないだろう。
0422デフォルトの名無しさん
NGNGこれが実戦と同じだと勘違いしたら問題だが、
こういう鍛え方でしか鍛えられないことはある。
どんどんやるべきだと思うよ。
0423デフォルトの名無しさん
NGNG運動するための筋トレはまったく別物。
鍛え方を間違っちゃいかん。
0424デフォルトの名無しさん
NGNG0425369
NGNG通ることに気付いてしまいました。
#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それ、普通だが?
文が完了するまで一時オブジェクトの寿命が続くはず。
Hoge(), foo(), bar();
こうすると、bar()の後にHogeのデストラクタが呼ばれる
0427369
NGNGコンストラクタやoperator()の引数次第で、関数宣言だとか
関数ポインタだとか、そのあたりと間違えてしまいそうな構文だなーと。
0428デフォルトの名無しさん
NGNG0429デフォルトの名無しさん
NGNGstruct Hoge { Hoge& operator()(void){return *this;} };
int main() {
Hoge()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()();
}
…はともかくとして、何の変哲もないふつうの構文だと思うよ。
> 関数宣言だとか関数ポインタだとか、そのあたりと間違えてしまいそうな構文
引数付きのコンストラクタを呼び出したりする時に、
下手すると関数宣言扱いになっちまうことはあり。
Effective STLとか参照。
0430デフォルトの名無しさん
NGNGそれ、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しかしそれは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デフォルトの名無しさん
NGNG1+-+-+-+-+-+-+-+1 とか
0434デフォルトの名無しさん
NGNG0435425
NGNG一応、マジフォロー。
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プログラムにおける関数オブジェクトの効用もそこにある。
0437430
NGNG誤>double operator(double x){
正>double operator() (double x){
0438デフォルトの名無しさん
NGNGコピーを渡すことになるのでクロージャのデータは破棄されることになる。
0439430
NGNG誤>ベキ級数アルゴリズムを抽象化したクラス
正>ベキ級数を抽象化したクラス(評価にホーナーのアルゴリズムを使う)
0440430
NGNGC/C++のオブジェクトの代入セマンティクスでは
デフォは参照じゃなくてコピーざんすからねぇ。
受け渡したいデータの性質と意味に応じてコピー・コンストラクタあたりで
なんとか頑張るしかないでしょうなぁ。
0442デフォルトの名無しさん
NGNGstd::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デフォルトの名無しさん
NGNG0444デフォルトの名無しさん
NGNG> std::transformに渡す関数オブジェクトって副作用があっちゃダメってことですけど、
これ初耳なのだがどこに書いてあったん?
0445デフォルトの名無しさん
NGNG今SGIのSTLのドキュメントを読みましたが、そんなことは書いてないですね。
0446デフォルトの名無しさん
NGNGttp://www.cuj.com/experts/1902/langer.htm?topic=experts
には
Requires: op shall not have any side effects
みたいなことが書いてありますね。
Effective STLかなにかにもtransformに渡すのは述語でなきゃいかん、みたいな
ことがあった気がします。(今手元にないので確認できません。)
0447デフォルトの名無しさん
NGNGEffective STL 39項がそのものズバリの解説になっている気がする
0448デフォルトの名無しさん
NGNGありがとーございましし。
0449430
NGNGこの場合言われてる「副作用」は厳密な参照透明性
(、内部状態変数やグローバル変数への代入、入出力禁止とかを含む)
とかじゃなくて、与えられた引数(イテレータ)の指すオブジェクトを
書き換えてはイカンということなんじゃ?
0450430
NGNGC++標準テンプレートライブラリ
は
The C++ Standard Template Library
(P.J.Plauger他著、)の邦訳(ピアソン・エデュケーション刊)ね。
0452デフォルトの名無しさん
NGNGそんな気がする。
Effective STL で取り上げられてたのは Item 37 の std::for_each と
std::accumerate の話じゃない? >>447
0455デフォルトの名無しさん
NGNGLokiの存在を知って以来VCでの開発が苦痛だ・・・
0456デフォルトの名無しさん
NGNGマジで?
実際にLokiなんか使う場面あるか?
0457デフォルトの名無しさん
NGNG俺様ライブラリを作るときとか。
Lokiのすべてとは言わないが、カスタマイズ可能なスマートポインタ(他)はホスィ・・・
0458デフォルトの名無しさん
NGNG0459デフォルトの名無しさん
NGNGといってみるテスツ
0460デフォルトの名無しさん
NGNGSingletonHolderは使ってますが何か?
0461デフォルトの名無しさん
NGNG0462デフォルトの名無しさん
NGNG0463デフォルトの名無しさん
NGNGがんばれー
0464デフォルトの名無しさん
NGNGがんばれー
0465デフォルトの名無しさん
NGNGC#のテンプレートに期待しよう。
0466デフォルトの名無しさん
NGNGあるの?テンプレート??
0467デフォルトの名無しさん
NGNGというかほんとにそんな気がしてならない。死のう・・・
0468デフォルトの名無しさん
NGNG0469デフォルトの名無しさん
NGNG0470デフォルトの名無しさん
NGNGまじ?
0471デフォルトの名無しさん
NGNGLokiで使われているテクニックが次のスタンダードに導入されるだろう事は
まず間違い無いと思われ。
0472デフォルトの名無しさん
NGNG一部は使われると思うが、使わないネタも多いんじゃないかなぁ……。
0473デフォルトの名無しさん
NGNG0474デフォルトの名無しさん
NGNG0475デフォルトの名無しさん
NGNGあれ無しでどうしろと?
0476デフォルトの名無しさん
NGNGそれ以外は実務で役立つかというと(?)
0477デフォルトの名無しさん
NGNG0478デフォルトの名無しさん
NGNG0479仕様書無しさん
NGNG0480デフォルトの名無しさん
NGNG含める事なく、配列を初期化することもできます」ってあるん
ですけど。これって、どうやるんですか?
0481age
NGNG0482デフォルトの名無しさん
NGNG読んだ事ないけどstd::fill使うとか?
0483デフォルトの名無しさん
NGNGfillじゃ無理っしょ。
単なるforループなんだから
0484デフォルトの名無しさん
NGNGtemplate <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デフォルトの名無しさん
NGNG0487デフォルトの名無しさん
NGNG最高だ!応用すればループがインライン展開されるfor_eachとか書けそう!
0488デフォルトの名無しさん
NGNGhttp://www2.tky.3web.ne.jp/~bandai/24net/prog2/tips1.html
0489デフォルトの名無しさん
NGNGだめだよ。大抵のコンパイラはtemplateの展開可能レベルが浅い。
0490デフォルトの名無しさん
NGNG最近のCPUはunrollするとキャッシュのミスヒットでパフォーマンスが低下する
0491デフォルトの名無しさん
NGNGunrollする量でチューニング。
テンプレートを利用した行列計算でメモリ階層を意識して
ブロック化、ループ展開などの最適化を施した例としてMTLがある。
0493480
NGNGstd::type_info* intsRtti[Length<SignedIntegrals>::value] =
{
TypeAt<SignedIntegrals,0>::Result,
TypeAt<SignedIntegrals,1>::Result,
TypeAt<SignedIntegrals,2>::Result,
TypeAt<SignedIntegrals,3>::Result,
// Lengthの示す長さ分だけ続ける…
}
これを、コンパイル時に自働的に解決するための汎用性のある書き方が存在する、
ってことだと思うんですよ。
…どうすりゃいいんでしょうね。
0494デフォルトの名無しさん
NGNGdouble 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とか。)
0497494
NGNG#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);
}
0498494
NGNG結果:
4.85246e-270 2.96439e-323 5.08888e-322 1.58101e-322 4.85634e-270
120 24 6 2 1
ある意味ホっとした。
0499デフォルトの名無しさん
NGNG・・・えーとさぁ。突っ込んでいいかなあ?
> return((double*)(&(a)));
ここでアドレス取ってるけど、これって getArray の引数 a のアドレスだよなぁ?
getArray の引数 a は getArray の終了時にスタックから消滅してるから、
そのアドレスを戻り値として返すのは不正なんじゃなかろうか。
それと、Init<5> の非スタティックメンバって何もないから、
sizeof(Init<5>) = 0 (あるいは 1)のはずで、
それを double にキャストして逆参照してもゴミ値なんじゃないの?
0501デフォルトの名無しさん
NGNGC++スレに書かれてたやつだけど、なんかこっちのほうがふさわしそうなんでこっち持ってきた。
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そのソース、g++とかだと通るの?
0503デフォルトの名無しさん
NGNG501じゃないけど、g++ならふつうに通るみたいだよ。
0504501
NGNGそのため特殊化されていない形式のiterator_traitsを構築しようとしてコンパイルエラーが出ているようでした。
STLのソースの中でもiterator_traitsはほとんど使用されていませんでした。
Genericの中に書かれている古いタイプの方法に近い形で実装されているようです。
0505デフォルトの名無しさん
NGNG勉強が足りなかった。
0506デフォルトの名無しさん
NGNGこれってどういう意味? 8章を読んだけど全く理解できなかったってこと?
それとも、全部理解したけど期待した程じゃねーぞゴルァ、ってこと?
0507デフォルトの名無しさん
NGNG一ヶ月前のレスだぞ?
0508たんなる雑談
NGNG描画処理は
・速度が要求される
・透過、拡大、反転など組み合わせ次第で処理の量が膨大になる
ということでPolicyの考え方にまさにベストマッチですが、
どこをPolicyクラスにしてどこをtemplateクラスにするのかの判断はやっぱり難しいですねぇ。
Policyの境界を越えた最適化が出来ないというのもちょっとネックになりそうです。
0509デフォルトの名無しさん
NGNGこれは層化の設計の問題でしょ。
下層で問題になるなら上層のPolicyをごっそり入れ替えればよし。
余談:Policyテクニック自体はSTLが存在するころから存在してるよね。
STL自身が使ってるから。
0510508
NGNG0511デフォルトの名無しさん
NGNG>書籍中で紹介、また使用されているライブラリLokiはVC++ではコンパイルできません(;_;)サイアク・・・
これって、ちょっとした手直しとかのレベルでは、
使える様にはならないのかな。
0512デフォルトの名無しさん
NGNG誰か手直ししたら漏れにも下さい
0513デフォルトの名無しさん
NGNGほんの一部なら動くがほとんどはダメです。
LokiのキモであるところのTypeListは
テンプレートの部分的な特殊化を前提に組まれてます。
再帰的な処理、その終端の特殊化もその機能に依存してます。
そしてVCでは部分的な特殊化はサポートされません。
これはヘルプにはっきり書いてあります。
0514デフォルトの名無しさん
NGNGクリティカルな問題が無くならないね。
もうちょっと単純な仕様にすればいいのに。>テンプレート
0515デフォルトの名無しさん
NGNGQ: 他のC++ ツールで、より標準に適合しているものはありますか?
JON CAVES: はい、Visual C++よりも標準に適合するC++ コンパイラはあります。
1つの例は、私が100%適合していると信じるEdison Design Group (EDG)によるコンパイラです。
ただし、このコンパイラはWindows プラットホームではあまり利用できませんが。
Windows プラットホームではやはり、Visual C++が最も標準に適合するコンパイラの1つです。
0516デフォルトの名無しさん
NGNG一長一短ではあるけど、
gcc3 、CodeWarrior7、 bcc5.6 (C++Builder) 辺りは
VC6よりは遙かに標準に近い気がする。VC.NETだとどうなんだろ?
それに、EDGのフロントエンドも100%とは思えないが…。
0517デフォルトの名無しさん
NGNGテンプレートパラメータがサポートされた程度。
てゆうかLokiコンパイルできません。
0518デフォルトの名無しさん
NGNG>テンプレートの部分的な特殊化
はどうなの?
0519デフォルトの名無しさん
NGNG>>513 はVC.NETでの話。
0520デフォルトの名無しさん
NGNGその優先順位の判断にパターンマッチングやらなんやらが必要らしいです。
しかしModernC++によって部分的な特殊化がほぼ別物といっても良いくらい
飛躍的な表現力の向上につながることが明らかにされたわけなので
今後積極的にサポートされていく可能性は高いでしょう。
0522デフォルトの名無しさん
NGNGあれでコンパイラメーカーの奮起を期待したいところだね。
VC++に関してはどうなんだろう。MSやる気あんのかなぁ。。
個人的には.netでのアクロバットなテンプレートサポートに
期待してるけどね。
0523デフォルトの名無しさん
NGNGAdobe Acrobat.NET(テンプレート付き)
0524デフォルトの名無しさん
NGNG0525名無しさん
NGNG0526デフォルトの名無しさん
NGNG0527508
NGNG拡大反転透過楕円半透明コピーが出来たときには感動した!!
馬鹿正直に書いてたら数千〜数万行のコードがたったの500行ですんだ、すごいYO!!
0528デフォルトの名無しさん
NGNG公式サイトからダウンロードしたソースに、バグらしきものを発見しました。
該当個所は、第四章で紹介されている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直してみた
NGNG265:{
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デフォルトの名無しさん
NGNG0531デフォルトの名無しさん
NGNG0532528
NGNGおー、これだとたしかになおってそうですね。
つうか、オレもなおしちゃったけど。
もし未知のバグなら、報告したほうがいいんですかね。英語わかんねえけど。
>>530
がんばって行番号つけたのにッ! BASICを使ってた思い出に浸っていたのにッ!
オレの思い出をこわさないでー!
>>531
んなわけねえだろ。だいたい0行目なんて存在しねえんだよ。
テメエはCのやりすぎだ。一日二回くらいにしといたほうがいいぞ。
0533デフォルトの名無しさん
NGNGなんか、ギャップにワラタ
0534デフォルトの名無しさん
NGNG訳者のページに行ってみてはどうか。
オンラインで直ってないなら未知と思われるので。
0535デフォルトの名無しさん
NGNGme fix bug. this patch
とか書いてdiff結果張り付けてメールとか。
0536528
NGNGでも英語なので、あいかわらずよくわかりませんです。
http://www.kuro5hin.org/story/2002/4/5/82022/76326
>>533
ギャップってアレか。テキストエディタつくるときに使うとか聞いたことあるやつ。
それはギャップバッファだー! ちゅどーん!
>>534
訳者の方のページは見てみましたが、誤植の情報しかないようでした。残念賞。
>>535
出会い系サイトじゃないと、知らない人にメールなんて出せませんよ。怖すぎ。
しかも外人さんだし。やけに深呼吸ばかりしてそうだし(洋モノビデオの見すぎ)。
0537デフォルトの名無しさん
NGNGワロタ。
0538デフォルトの名無しさん
NGNG0539デフォルトの名無しさん
NGNG0540528
NGNGあら、雰囲気悪くなっちゃった? ユーモアってやつをわかってねえなあ。
ほれ、良書って言われる類の書籍には、たいていアメリカンジョークが書いてあるじゃん。
それもすっげーつまんないやつ。立派なプログラマなら、それで笑えるようになろうぜ。
理想としては、>>537の人みたいにソースコードを見ただけで
笑いがこみ上げてくるレベルを目指すべし。
0541デフォルトの名無しさん
NGNGキエロ
0542デフォルトの名無しさん
NGNG0543デフォルトの名無しさん
NGNG528のはそれ未満なので笑えません。
0544デフォルトの名無しさん
NGNGそれはあり得ない。
常に541>540である
0545デフォルトの名無しさん
NGNG0546デフォルトの名無しさん
NGNG0547デフォルトの名無しさん
NGNG単位は?
(ケルビンじゃないよな)
0548デフォルトの名無しさん
NGNGなんか、某駄スレのJohnに酷似しているし。
0549デフォルトの名無しさん
NGNG0550デフォルトの名無しさん
NGNGコンパイル速度激しく遅くなったんですが(;´Д`)
PCHにいれても入れなくても変わらず
自業自得ですけど・・・死ねるほどおそひ・・・VC.NET・・・
0551デフォルトの名無しさん
NGNG0552デフォルトの名無しさん
NGNGインライン実装するべきじゃない。
デメリットのほうが大きい。
素直にテンプレートの具体的な特殊化か
ポリモフィズムを使用するべし。
0553デフォルトの名無しさん
NGNG昔の実装と違ってinlineはregisterと同じくもはやヒントでしかないし……。
そうカリカリせんでもいいんじゃない?
(暗黙のstticの意味を除けば。)
0554デフォルトの名無しさん
NGNG0555デフォルトの名無しさん
NGNGVC++の場合ちょっとでも大きいとインライン展開してくれないようです
3行くらいでもわりと複雑な計算してると展開されません
チョー速度が要求されるところだったから__forceinline使いましたが
0556デフォルトの名無しさん
NGNG依存関係のある全てのソースにリコンパイルがかかる。
また、インライン展開されなくとも複数の実体が生成される可能性もある。
そもそもインライン展開の判断自体、処理系依存である。
ちっこいプロジェクトなら問題ないかもしれんが
大規模ではちょっとした手抜きの割に被害はでかい。
テンプレートの使い方とその設計手法をまともに考えれば
クソでかい関数はできないはず。
0557デフォルトの名無しさん
NGNG0558デフォルトの名無しさん
NGNGinlineとexportしてない(できない)templateとtemplateの明示的特化って
別物じゃないの?
0559デフォルトの名無しさん
NGNG出直そう
0560552
NGNG>インライン実装するべきじゃない。
>デメリットのほうが大きい。
ここは一般論でその理由は>>556
>素直にテンプレートの具体的な特殊化か
>ポリモフィズムを使用するべし。
こっちは>>550に対してアドヴァイスしたつもりだった。
言葉足らずスマン。
テンプレート関数をexportできる処理系はまだ見たこと無いので
無いものとして話してる。
補足:
>テンプレートの具体的な特殊化
具体的な特殊化でテンプレート引数がすべて決まれば
普通のクラスと同じように非インライン関数として書ける。
テンプレートの用途からするとほとんど使えないテクだが・・
0561デフォルトの名無しさん
NGNG何が問題なのでしょうか?g++ならば通るんですが・・・。
template<typename T, typename U> struct test {};
template<class T> struct test<int,T> {};
0562デフォルトの名無しさん
NGNGVC++は諦めてください
0564デフォルトの名無しさん
NGNGマジです
0566デフォルトの名無しさん
NGNG.NETでもダメです。
正直がっかりでしたがVC8に期待しましょう。
0568デフォルトの名無しさん
NGNG0569デフォルトの名無しさん
NGNG0570デフォルトの名無しさん
NGNG0571デフォルトの名無しさん
NGNG0572デフォルトの名無しさん
NGNG0573デフォルトの名無しさん
NGNG0574デフォルトの名無しさん
NGNG0575デフォルトの名無しさん
NGNGhttp://www.objectcentral.com/
0576VC6に乗せたい
NGNGtemplate <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なんだかわからんけど、よくやった!
次もこの調子でたのむ。
0578デフォルトの名無しさん
NGNG0579デフォルトの名無しさん
NGNGよくやった!
ただ、
不明な型が厳密にひとつしかないクラステンプレートなら
部分的な特殊化を使わずに実装できるんだが
TypeListにはそうでない機能がいくつかあるんだよね。
0580デフォルトの名無しさん
NGNGって言ってもtemplateなstatic変数が作れないだけですから、
マクロ作って個々にインスタンスを作ってやっただけですけど。
で、ためしにLoki::SingletonWithLongevity使ってみたら
GetLongevityの戻り値が大きいほうから先に削除されちゃうんです。
ここでまたぶち切れですよ。
ModernにはGetLongevityの戻り値が小さいほうから削除されるように書かれているのに。
これはどう解釈したら言いのでしょう。
0581デフォルトの名無しさん
NGNGVC++でSelectをなんとか出来ませんか?
0582VC6に乗せたい
NGNGそれはさておき。
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おぉぉ!
template< A, B, C >
の
Aだけ特殊化は出来ないから
template< A > class{ template< B, C > }
にしてAを特殊化するんですね!
Select行ってみます!
0585583
NGNGtemplate< A, B, C > struct
{
template< A > struct
{ //↑ここを特殊化するんですね
}
}
0587VC6に乗せたい
NGNGあのように作り方を明記すると、考えが整理できるものですね。
>>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で、今どこまで出来てるの?
協力しようにも何が出来てて何がまだなのか分からんと。
ただ、漏れ VC++ 持ってねぇんだよなぁ・・・
0589デフォルトの名無しさん
NGNG>>587の
下から6行目
> template <> struct tmp2TypeAt<DefaultType>
↓
> template <> struct tmp2TypeAt<NullType>
だと思います。
0590VC6に乗せたい
NGNG本業もあるため、平日は遅々とした進度になるかと思われます。
できそうなところからどんどん発表していくつもりです。
あと、>>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デフォルトの名無しさん
NGNG0592VC6に乗せたい
NGNGResult 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;
}
};
0593583
NGNG今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デフォルトの名無しさん
NGNG0595583
NGNGつーか使っててすげーです、Lokiマンセー!!!
0596デフォルトの名無しさん
NGNG素晴らしい。
第二版に日本人の名を連ねられるか??
期待して待つ!
0597デフォルトの名無しさん
NGNG漏れ私的に使いたかったTypeTraitsの移植に挑戦してみようかな・・・
0599583
NGNG0600583
NGNGもしかしてtypelist.h終わったじゃん。
どっかにウプしよーぜ!
0601デフォルトの名無しさん
NGNG0602デフォルトの名無しさん
NGNGsourceforge.netだ
0603583
NGNG使い方分からん・・・(´д`;
編集済み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(゚ Д ゚ ;)・・・・
NGNGhttp://www.geocities.com/rani_sharoni/LokiPort.html
0605VC6に乗せたい
NGNG>>603は早速ダウンロードして、すべてチェックしました。
今のところ、VC6でも正常に動作しているようです。
typename とはこういうものだったのですか。
これを知らずにAppendの実装がうまくいかず、一時中断していたのですが。
知らぬではどうにもならぬですね。まだまだ修行が足りないです。
勉強になります。
0606583
NGNG0607583
NGNGやっぱりやってることはほとんど同じか・・・(鬱
(汚いと見えた)MakeTypeListやis_TypelistはLokiのバージョンアップで追加されたものかな?
0608VC6に乗せたい
NGNG結局、VC6にはtypename 指定をしないと、
template<typename Head, typename Tail>
Typelist<Head, Tail>
と
NullType の区別がつかないようなのです。
VC.NET用はともかく、VC6用は、ここで新規開発しないといけないかも。
0609597
NGNGダメですた。
ポインタの特殊化がどーーーしてもできまへん。
と思ったら>>604 で見事に実装されてますた。
悔しいやら嬉しいやら。
ともかく念願のTypeTraitsが手に入りますた。
ありがとうございます。
0610597
NGNGなぜか前から関数テンプレートのポインタ等の特殊化を
サポートしてるんだよな・・。
その調子でクラステンプレートも実装してホスィ
0612デフォルトの名無しさん
NGNGこれがあるとがぜん使う気が起きるね!
0613VC6に乗せたい
NGNG>>609 LokiPort の MakeTypeList は単体で動作するようです。
>>583氏のヘッダに移植できました。
あと、うっかりサンプルソースでReverseを呼び出すのを忘れていたのですが、
こいつがエラーが出てコンパイラにとおりません。(VC6)
ガイドライン通りにちゃんと書かれているようなのですが。原因はまだ不明です。
0614デフォルトの名無しさん
NGNG>>613はその発想力を大切にするといい。
0615デフォルトの名無しさん
NGNG出てきたのが今年の3月だから、タッチの差は僅かだ。
MakeTypeList も上のほうで無理言われてたけどあっさり実装されちゃってる
まるで魔法だ。
C++って奥深すぎる。鬱だ。
0616デフォルトの名無しさん
NGNG1翻訳単位のコンパイルにジャスト3分(あんまり長いので測った
まだ(やってることは)小さなプログラムなのにビルド後のファイルサイズは1MB突破・・・
テンプレート依存は一箇所に局所化して他の翻訳単位は高速化したけどそれでもつらいっす・・・
0617デフォルトの名無しさん
NGNG0618616
NGNG0619デフォルトの名無しさん
NGNGひょっとしてポインタ型各種について展開してないか?
0620デフォルトの名無しさん
NGNG0621616
NGNG画像の描画処理を転送・フィルター・形状・スケーリングの4つのポリシーに分けらああなりますた。
特に2つの転送ポリシーを合成するポリシーを作ったらコードサイズも時間も爆発。(まぁ当然か
0622デフォルトの名無しさん
NGNGピクセルの特性をポリシーとするなら分かるが。
0624デフォルトの名無しさん
NGNG某otakuのGTLの発展したような物ですね、
かっこよさそうです。
0625デフォルトの名無しさん
NGNG0626613
NGNGテンプレートによって生成されるコード量を大幅に
減らすアイデアが載っていましたが、いかがか?
>>604からスレの流れが変わったので、コテハンやめるっす。
0627デフォルトの名無しさん
NGNGEffectiveもってないっす、詳細きぼん
0628デフォルトの名無しさん
NGNG0629デフォルトの名無しさん
NGNGageたよ
http://pc.2ch.net/test/read.cgi/tech/1004287394/
0630デフォルトの名無しさん
NGNGhttp://pc.2ch.net/test/read.cgi/tech/1021787032/556
に書いてしまった…。サンクスコ>>629
0631613
NGNGModern 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タグディスパッチ
0634632
NGNGさっそくどうもありがとうございました。
Googleで検索してみたら、次のURLがヒットしました。
http://www.issei.org/programming/boost/more/generic_programming.htm
ここで言われているのがそれですか?
なかなか凝ったやり方に感じましたが、勉強になりました。
0635デフォルトの名無しさん
NGNGC++にはリフレクション機能が無いので
特定メンバあるかどうかの判断はできない。(・・よね?)
だから他の条件が必要。
渡されるクラス全てにタグを定義とかの制限をつけてもよいならタグディスパッチ
だめならlokiのTypeTraitsで使えそうな特性をみつけるとか。
私的には特定のクラスのサブクラスかどうかで分けるのが良いと思うが。
0636626
NGNG>>583氏のヘッダに適宜 LokiPortのコードを移植することで、
LokiPortのTest_Typelist.cpp がコンパイルできてしまいました。
ということは、Typelistに関してはVC6でも動作可能ということですよね。
ううむ。
0637デフォルトの名無しさん
NGNG0638デフォルトの名無しさん
NGNGVC6ってテンプレートパラーメータサポートしてなかったと思うけど
どうやってるの?
0639デフォルトの名無しさん
NGNGん? できないのは部分特殊化でしょ?
テンプレートパラメータサポートしてないってどういうこと?
文字通り取るとtemplate自体使えないような。
0640デフォルトの名無しさん
NGNGテンプレートテンプレートパラメータのことでしょ。わざわざ揚げ足取らんでも。
template< class A, template<class> B > class C { ... };
ってゆーかしかし、LokiのTypeListって部分特殊化さえあれば動くと思ったが。
0641デフォルトの名無しさん
NGNGどういうときに使うの?
0643デフォルトの名無しさん
NGNG参照型が問答無用でconstと判断されてしまう。
まぁあんまり使い道の無い機能ではあるが
ザンネン。
0644デフォルトの名無しさん
NGNG参照そのものは変更できないからconstという判断でいいのかな。
そういうことにしよう!
0645デフォルトの名無しさん
NGNGisPointerの実装おかしいような??
これconstの判別できないだろ?
0646デフォルトの名無しさん
NGNG仮にVC++の話であるなら
http://msdn.microsoft.com/library/default.asp?url=/library/en-us/vclang/html/vclrf14552partialorderingoffunctiontemplates.asp
なのでそこんとこ注意。
0647デフォルトの名無しさん
NGNGそうなんだよね・・
それなのになんで動くのかちと不思議。
保障されない動作なんだろうか。
とりあえずisPointerはポイント先の修飾された奴を全部消して
コンストポインタの判定を追加したらうまく動いた。
0648デフォルトの名無しさん
NGNGstatic 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激しく遅レスだが
VC++には__if_exists/__if_not_existsなるキーワードがあって
関数や変数の有無で処理を分けられる
移植性を考えれば使えないが
0650デフォルトの名無しさん
NGNGそれどうやって使うの?
解説キボンヌ
0651デフォルトの名無しさん
NGNGそれって.NET専用?
0652デフォルトの名無しさん
NGNG#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ネイティブにも使えるけど、もしかしたらVC++.NETから新しく追加された機能かも
0654デフォルトの名無しさん
NGNG0655名無しさん
NGNGメンバー、メソッドでもOKなの?
0656デフォルトの名無しさん
NGNG0657デフォルトの名無しさん
NGNG(識別子をどうするかは、考えないといけないが)
0658デフォルトの名無しさん
NGNGコンパイラによるリフレクション? 規格はさすがに無理ぽそうだけど...
0659名無しさん
NGNGウヒャ─、これは便利、って例ある?
http://msdn.microsoft.com/library/default.asp?url=/library/en-us/vclang/html/vclrfthe__if_existsstatement.asp
memberもOKなのね。しかし、なんじゃこりゃ? って感じ。
0660デフォルトの名無しさん
NGNGタグディスパッチがいらなくなるんじゃない
0661名無しさん
NGNGinline 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デフォルトの名無しさん
NGNG0663デフォルトの名無しさん
NGNGコンパイラがコンパイルの前に置換をしてくれるんだよ。
プリプロセッサがやる単純な置換と違い、コンパイラが型チェックに
責任を持ってくれる。
0664デフォルトの名無しさん
NGNGTemplateはどういうときに使うのですか?
0665デフォルトの名無しさん
NGNGリストって知ってるよね?単方向でも双方向でも。
例えば、構造体Aと言う値を保持するリストのクラスを作ったとする。
これがなかなか便利で他のプログラムにも使いたい。
しかし、構造体Aは前のプログラム独自の物なので汎用性を持たせたい。
そこで、構造体Aの代わりにvoid *を持たせることにした。
しかし、これでは型キャストの嵐になるし、新しいノードを作るとき、自動的にデータ格納用の
メモリ領域を確保したり開放したりすることが困難になる。
next = new nextnode();
next.data = new ここを使う型が変わるたびに変更しなくてはならない。
そこでテンプレート。これは特定の抽象型を具体的な型に置換できる。
例えば、データ用の型をDATAとし、それをintと具体化すれば、
int型を扱うリストが出来るし、struct aaaと具体化すればaaa構造体のリストとなる。
0666デフォルトの名無しさん
NGNG0667デフォルトの名無しさん
NGNG抽象化する時
(メソッドとか関数とか)
0668613
NGNG激しくスレ違いに真面目にレス。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いくらかかると思ってんのYO(`Д´)
0670デフォルトの名無しさん
NGNG全部持ってるYO!高かったけど仕方ないYO!
0671デフォルトの名無しさん
NGNG書籍にかけた金は、すぐに仕事実績で取り返せる(ちゃんと読めば)。惜しむな。
0672デフォルトの名無しさん
NGNGそう思いこみたいんですね :)
0673デフォルトの名無しさん
NGNG怖がりすぎー。
0674デフォルトの名無しさん
NGNG初期化するのはめんどくせー」ってことで、
WithInit< int , 600 > m_intvalue;
ちゅーよーなのを書いた。
ひょっとして、車輪を再発名した……?
勝手に600に初期化されるint ってこと?
0676age
NGNG"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整数型でしか使えないじゃん。
0678デフォルトの名無しさん
NGNGg++3.1やbcc5.5.1では何ごともなく通ったよん
0680デフォルトの名無しさん
NGNGbool, int ,char , short, long , float, doubleと使えれば
充分じゃねーんすか?
0681デフォルトの名無しさん
NGNGEffective 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];
}
};
0682681
NGNGtemplate<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初期値を変更したくなったときに依存してるソース全部で
再婚パイルが必要なのって面倒い。
>>682
「vectorでOKだと思って operator[] を使って色々実装していたけど
やっぱりlistの方が良かったなー」なんてことは起こり得んと思うがどうか。
例えば std::queue のコンテナにはほとんどの実装だと list/deque は取れても
vectorは使えないけれど、それはvectorを使う意味が全くないからであって、
そこにあえてvectorを渡せるように汎用性を持たせる…みたいなことって
やってもしょうがないのでは。
0684デフォルトの名無しさん
NGNG> bool, int ,char , short, long , float, doubleと使えれば
> 充分じゃねーんすか?
いや、template に float や double (char もか?) の即値はつっこめないのではないかと。。。
0685681
NGNGいや、それは単にそういうありえなさそうな状況を挙げてるだけでは。(^^;
operator[]を使うって事は最初っからlistが考慮の外なのは明らかですから、
そういう状況を持ってきて否定されても。std::queueのほうも、目的が
はっきりしているなら、汎用シーケンスコンテナなんて必要ないのは
あたりまえです。
とりあえず、俺がこれを欲しいと思った動機を。vectorでもlistでもいいような、
曖昧な状況で『とりあえずvector』で開発をはじめたけど、あとで『げ、中間への
データ挿入が出てきた。やっぱlist』って切り替えたくなったんです。そのとき、
データ削除部分の形がvectorとlistでは全然違うやん、ってので参ったんです。
要するに、『どのシーケンスコンテナが最適なのか、不透明な状況』に対して
最適な回答をもたらすために、汎用シーケンスコンテナがあればいいなぁ、と。
どのコンテナが最適なのかわかんないうちから開発を始めてんじゃねーぞ、
って言われたら、「はい、ごめんなさい」と凹むしかないですが……。
0686デフォルトの名無しさん
NGNGいいんでないの?
いちおう、
どういうコンテナを使うべきかの分析無しで作りはじめてんじゃねーゾ。
0687デフォルトの名無しさん
NGNG0688668
NGNG私の場合は、テキストエディタを作るときに1行のテキストを
stringに入れて、listに入れて使いました。
stringはコピーにコストがかかるので、
vector::[] + insert よりは、
list::advance + insert の方がパフォーマンスがよかったです。
(advance 10万回で0.04秒程度)
しかしそれはコンテナの性質と設計上の要請を勘案すれば
事前に分かることで、わざわざポリシーにするほどのことではないと思うのですが。
0689デフォルトの名無しさん
NGNGもう常識中の常識。
それより、1行に持てるデータの構造をどう記述するかの方が問題。
0691デフォルトの名無しさん
NGNG0692デフォルトの名無しさん
NGNGlistとギャップバッファは用途違うと思うが?
それから、ギャップバッファも1行に保持するデータが長くなってくると
パフォーマンスががた落ちするよ、所詮2セグメントのデータだからね。
0693デフォルトの名無しさん
NGNGVC++6で、double即値、char即値ともつっこめますた。
0694648
NGNG死のう。
0695デフォルトの名無しさん
NGNGオブジェクト作るなって言いたいんじゃないのか?
そういう点でみれば>>692のは激しく的はずれ
0696デフォルトの名無しさん
NGNG0697デフォルトの名無しさん
NGNG最近のPCは速いし。
0698デフォルトの名無しさん
NGNG0699デフォルトの名無しさん
NGNGgapped buffer って、バッファの内容をカーソル位置で分割して管理する方法だよね。
それだと、コストはこうじゃないかな。
gapped buffer
一文字追加、削除 O(1)
指定行の移動 O(バッファの総文字数)
リスト
一文字追加、削除 O(一行の文字数)
指定行への移動 O(ファイルの行数)
gapped buffer は「普段よく使うのは一文字単位の追加・削除だから、こっちを
早くしたほうが快適だ」という信念に基づくデータ構造だと思うよ。ついでに、今
時の PC を前提とするなら、どっちでも早すぎて変わらん。
0700デフォルトの名無しさん
NGNGこれだと先頭から終端までジャンプするのに、バッファのコピーが発生するよね?
めちゃくちゃ遅くならない?
0701デフォルトの名無しさん
NGNG挿入・削除のタイミングでバッファ内の整理をすればよいので
全然そんなことない。
極端にでかいファイルもストレスなく開けるようにするのに便利。
0702デフォルトの名無しさん
NGNG何か書き換え始めたら行編集バッファにコピーしてきて編集し、
カーソルがその行から出たりするタイミングで書き戻してたっけ。
0703デフォルトの名無しさん
NGNGhead part cursor tail part
|-----------| + |------------|
こんな感じで持つ構造と考えて良いのでしょうか?
それとも、下の様にいくつかのフラグメントに分けて保存して、
編集時のコピー量を少なく納める構造なのでしょうか?
|-----| |-----| |----+-| |------|
日本語のサイトをいくつか検索しても、
どっちとも取れるようなどっちも違うような記述でよく分かりません
0704名無しさん
NGNG>>700
正直、editorならほとんど変りがない。今や一番重いのはGUIの描画。
0705デフォルトの名無しさん
NGNGカーソル位置とギャップ位置は関係ない
ギャップは普通エディットしている部分に作られる
0706デフォルトの名無しさん
NGNG0707デフォルトの名無しさん
NGNG0708デフォルトの名無しさん
NGNGhttp://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デフォルトの名無しさん
NGNG0710デフォルトの名無しさん
NGNGここにあるな
0711デフォルトの名無しさん
NGNGSTLPortのlower_boundに不具合があるんですけど、
どうにもならないですかね。
0712デフォルトの名無しさん
NGNGlower_boundにどんな不具合がありますか?
0713デフォルトの名無しさん
NGNGぉ!
Generic Programing and the STL見てみたら、
STLPortの動作のほうが正しいですね。
// MSDNには書いてない新たな条件が・・・
LokiPortのほうの使い方に問題があるみたいですね
0714デフォルトの名無しさん
NGNGちょっと前、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デフォルトの名無しさん
NGNGLokiを使えますか?
0716デフォルトの名無しさん
NGNG過去ログよめ
0717デフォルトの名無しさん
NGNG過去ログにはVC++.NETとあるだけなので、VisualStudioなのか
.NET Framework SDKだけでも大丈夫なのかわかりませんが。
0718デフォルトの名無しさん
NGNG一応、最適化のオプションが使えなくなってるだけで、
あとは普通にManagedも吐ければ、通常コンパイルもできる
まずは使ってから質問しろ。
lokiが使いたいだけならgccにしろ。
0719デフォルトの名無しさん
NGNG使うかどうかまだ決めてないんで。
情報どうも。
0720デフォルトの名無しさん
NGNGLokiPortを使えば?
http://www.geocities.com/rani_sharoni/LokiPort.html
0721デフォルトの名無しさん
NGNG0723デフォルトの名無しさん
NGNGg++だといけるんだけど。
0724デフォルトの名無しさん
NGNGそれがGeneric Programmingと何の以下略
0725デフォルトの名無しさん
NGNGコンパイラへのプログラミングにおいて
限られた道具が増えることは、かなり重要なことだと思うけど・・・
今のところ、どう使うか考えてるところではあるんだけどね:)
0726デフォルトの名無しさん
NGNG(まぁ C++ の template 自体、完全実装してる処理系はほとんどないから、
処理系依存に近いのが現状だけどさ)
0727デフォルトの名無しさん
NGNGhttp://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デフォルトの名無しさん
NGNG0729デフォルトの名無しさん
NGNG0730デフォルトの名無しさん
NGNG0731デフォルトの名無しさん
NGNG標準に含めて欲しいっていう提案はされてるみたい
0732デフォルトの名無しさん
NGNG0733標準化委員会
NGNG0734デフォルトの名無しさん
NGNGg++ってあれだけがんばってるのに、ユーザーは
相変わらずCでゴリゴリ書くのが好きな人ばっかりで、
なんか哀れだよね。
0735デフォルトの名無しさん
NGNG0736デフォルトの名無しさん
NGNG劇的にコーディングスタイルが変わりそう。
0737デフォルトの名無しさん
NGNGマクロプログラミングですか?
イヤだなぁ
0738デフォルトの名無しさん
NGNG#define foreach( itr, cont ) for( typeof( (cont).begin() ) itr = (cont).begin(); itr!=(cont).end(); ++itr )
0739デフォルトの名無しさん
NGNGtemplate<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名無しさん@カラアゲうまうま
NGNG0741デフォルトの名無しさん
NGNGconst char* を受け取れるようにしとけば動作するけど、
template< unsigned N > f( const char (&x)[N] );
にバージョンを用意しとけば、文字列リテラルを受け取ったときに、
N で文字列長を受け取れる分、より効率的に処理できるようです。
ですが、↑みたいなテンプレートを使ってるのをほかで見たことがありません。
なにか問題があるからなのでしょうか?
それとも、見つけれて無いだけで、めずらしくもない方法なんでしょうか?
0742デフォルトの名無しさん
NGNGboos::type_traits::is_array
0743デフォルトの名無しさん
NGNG0745デフォルトの名無しさん
NGNG環境依存な部分も少なからずあるみたい。
ただ単にサイズを自動的に取得したいという目的ならば不要かと。
const char* との共存ができないようだし。(VC7)
普通にstring(literal, sizeof(literal))で問題無いかと。
0746デフォルトの名無しさん
NGNG0747デフォルトの名無しさん
NGNGこの業界辞める。もっとらくちんなの希望。
0748デフォルトの名無しさん
NGNGライブラリ作るのとそれ使うのとでは全然違うと思われ
0749デフォルトの名無しさん
NGNG激しく同意。
STLのように使うだけのライブラリとはちょっと違う。
プログラム設計において根本から変わってしまうような
ものだと思う。
というかそろそろ言語の機能をフル活用しなければならない
っていう呪縛から逃れたいところだね。C++使ってるひとには
自分も含めて、この傾向が強いから。
0750デフォルトの名無しさん
NGNG……と思ったが、そうすると他人のプログラムの保守ができんな。
0751デフォルトの名無しさん
NGNGtemplateなんて特にそうだと思うぞ。
俺は無いと困るみたいな状況に陥ったことがないので、
使ったことは無いが。w
0752デフォルトの名無しさん
NGNG> 機能は、必要を感じた時に初めてその使用の検討をするべき。
とはいえ、全く知らないと
これを使えば簡単に済むのに
っつーことに気づかぬ罠。
0753デフォルトの名無しさん
NGNGその辺だけ使えればいいんじゃないの?
構文汚いけど。
0754デフォルトの名無しさん
NGNG0755デフォルトの名無しさん
NGNGさてこれをどう使ったらいいものやら。。
0756デフォルトの名無しさん
NGNGクラスのメモリレイアウトをコントロールできない。
というわけでスクリプトでプログラムを書くときのように
手軽に、巨大なシステムを構築してしまいたいが型は
大切にしたいとき(どんなときだ?)に使う。
0757名無しさん
NGNG「プログラム設計において根本から変わってしまう」ことと、
「言語の機能をフル活用しなければならない」は相関性弱いと思うが…
後者は実装の話でしょ。
俺はcompilerのerror messageさえなんとかなれば、Lokiくらいは容認。
0758デフォルトの名無しさん
NGNGLoki使いまくり。正直、もう昔のGoF本に載ってる
ような野暮ったいコーディングには戻れない。
Typelistは最初は違和感あるけど、我慢して一ヶ月ぐらい
使いつづければ誰でも慣れる。typelistの新たな
使い方を考えるのはかなり厳しいが、MCDの
本に載ってるようなDPへの適用を真似る程度であれば
大したことはない。
0759デフォルトの名無しさん
NGNG0760デフォルトの名無しさん
NGNG0761デフォルトの名無しさん
NGNG「恥ずかしいことしてるのばれちゃってるのに・・」
3人はイチゴの顔をじっくりみつめる。
そしてその中の1人がそっと言った。
「しかたないわ、あ私たちめくるのやめるわ。」
イチゴはほっとした。
『許してくれるんだ・・・・』
「ありがとうございます・・・・」
0762デフォルトの名無しさん
NGNGほえ?
0763デフォルトの名無しさん
NGNG0764デフォルトの名無しさん
NGNG現在の ANSI C++ 決めるまでにかかった時間から考えて、次の ANSI C++ 規格
が出るのは
話し合いが始まる 2005年
リリース目標 2008年
実際に決まる 2010年
ぐらい?
0765デフォルトの名無しさん
NGNG実際に実装される 前に次の標準の話し合いが始まる
無限ループ?
0766デフォルトの名無しさん
NGNGSQL99みたいになっても意味無し男
0767デフォルトの名無しさん
NGNGVC++はそのころになっても現在の規格にすら準拠できてなさそうだな・・・(鬱
0768デフォルトの名無しさん
NGNG致命的なバグでも見つかったとか?
一番実用的なアイディアだと思っただけに残念。。
0769デフォルトの名無しさん
NGNG0770763
NGNGhttp://std.dkuug.dk/jtc1/sc22/wg21/
0xだそうだからあと7年以内になんとか。
0771デフォルトの名無しさん
NGNGあと7年・・・それまでにパソコン業界はどうなっているのだろうか?
ハードディスク1TB超、CPU10GHz、メモリ10GBなんてのは当たり前に
なってそうだ。いや、これくらいなら4年もあれば実現する。
(C++)++ってのは文法違反か?
0772デフォルトの名無しさん
NGNG基本は省電力モードで休眠状態。
いわゆる論理区画みたいなもんかね。
そうなっているとすれば、そのころのOSの役割は
本来の資源管理にのみ特化しててもよさそうだね。
0773デフォルトの名無しさん
NGNGCの型(というか多重定義演算子の定義のされ方)による。>>771
0774デフォルトの名無しさん
NGNG0775デフォルトの名無しさん
NGNGなるほど。基本型はエラーになるようだ。
>>774
Cを拡張したのがC++だけど、もうこれ以上小手先だけで拡張できない
ほどメチャクチャになっているので、新しい言語を作った方がいいような
気がする。
CPUで言うと丁度x86みたいな様相を呈しているからな・・・・・
0776デフォルトの名無しさん
NGNG"..."とかも。(そうなるとModern C++ Designが困るのだが)
あとグローバル変数も要らん。
0777デフォルトの名無しさん
NGNGつまらん。
0778デフォルトの名無しさん
NGNGC++ - C ってことは、言語名は ++ ですか?
>>775
確かに template がらみだと、
「たしかに template 使えばできるけど、あまりに直感的じゃない。言語の方で
直にサポートしてくれよ」
という機能も多いよな。でも template がこんなに強力な代物だとは、出てきた
当時は思いもよらなかったよ。
0779デフォルトの名無しさん
NGNGそれをベースに型推論を導入してテンプレート宣言はやめる。
代わりに仕様として部分評価を導入して生成的プログラミングスタイルをサポート。
(つまり関数はデフォルトで暗黙のうちにテンプレート関数なわけ。値による特化は部分評価技術で。)
ただクラス・テンプレートの宣言をどうするかはちょっと迷うところだ。
関数型言語のように構築子を強化してクラス宣言を特殊な関数宣言とみなして
構造体アクセスのパターンマッチング機能と組み合わせてと言う路もあるが、
あまりにもCらしさからかけ離れてしまう気がするし。
(命令型C風MLみたいになってしまう。)
0780デフォルトの名無しさん
NGNG0781デフォルトの名無しさん
NGNG型推論は、強い型付けと矛盾しないけど。
0782デフォルトの名無しさん
NGNGあ、そなの?MLとか知らないからよく分からんけど。。
その辺は他の言語もやってみないとダメだね。
0783デフォルトの名無しさん
NGNG0784デフォルトの名無しさん
NGNG自著で名前を何回も出すぐらいだからかなり知ってるのかもね。
0785デフォルトの名無しさん
NGNG0786デフォルトの名無しさん
NGNGす以前に、リストにアルゴリズムを施したりファンクタ
つくらせてカリーイングやったりという近年のC++の傾向そのもの
がオブジェクト指向と別方向の関数型言語指向なわけで。
lispと違って、それなりのパフォーマンスを維持しつつそういう
遊びがあるところに近時のC++の長所があると。
ただ実用から行くと、Java + generics + メモリ直接操作 くらいが
受けのいいところでしょ。
どうせ次期標準C++なんていってもせいぜい確率高い順に
hash_map他のSGI拡張、boost等のスマートポインタ、正規表現、数学等のライブラリが入るかどうか
サイズ規定のプリミティブ型が入るかどうか
typeofやらclosure/delegateやらの言語拡張が入るかどうか
マルチスレッドやネットワークのサポートが入るかどうか
とかだろ? しかも付け加えてばかりでは実装上文句が出るはず
だけど具体的にどこってのは全然見えない。そもそもVC++8のリリ
ース時期に合わせないと誰も使わないだろうな。
C99と互換性無いと駄目とかそっちの方がむしろ主流ではないの。
0787デフォルトの名無しさん
NGNG同じ文章をどこかで見たことがある気がする(デ・ジャ・ヴ?)
長所禿同
C++には多少手を加えるにしても全体としては今のままを維持してホスィ・・・
OOPらしいOOPがやりたい人はJavaでもC#でもやってりゃいいんで
0788デフォルトの名無しさん
NGNG今ある規格には準拠して欲しいとも思うがね。
それよりコンパイラのバグ減らせ!
0789デフォルトの名無しさん
NGNG下の結果が3ではなく、4になってしまうのですが、
どうしてでしょうか?
int i = 1;
std::cout << (_1 + i)(i = 2) << std::endl;
0790デフォルトの名無しさん
NGNGそれにスレ違い
0791デフォルトの名無しさん
NGNG別にスレ違いじゃないだろ。genericsがらみだし。
>>789
boost 1.23??
0792デフォルトの名無しさん
NGNG一つ言えることは _1 + i と i = 2 のどちらが先に実行されるかわからないのだから
そういう書き方をしてはダメってことだ
0793デフォルトの名無しさん
NGNGあ、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今回のとは無関係だとは思うけど一応
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そっか、各種名前としては成立するな・・・。クソ迷惑だけど。
0797デフォルトの名無しさん
NGNG0798デフォルトの名無しさん
NGNGhttp://user.ecc.u-tokyo.ac.jp/~g940455/wp/loki/
他の皆はLoki使いこなしてる?
未だにSmartPtrやFuntorを実験してる・・・
0799デフォルトの名無しさん
NGNG残念ながら使いこなすほど成熟したライブラリではないと思う。
Alexandrescu本人も実際に使ってるかはなはだ疑問。
0800デフォルトの名無しさん
NGNG完成したライブラリではないが、それてきなものをテクニックの一つと
捉えて、どんどんコードを書いていくことは大事なことな気がする。
0801名無しさん@Emacs
NGNG0802デフォルトの名無しさん
NGNG0803名無しさん@Emacs
NGNGどうつかってるの?
本にのってるやつ真似てるだけ?
それとも自分で新たに技作ってやってるとか?
0804デフォルトの名無しさん
NGNG意味解析すると>>801による、
>お前らちゃっとTypelist使ってますか?
という誤文(正しくは「ちゃんと」であろう)に対して、>>802は同じ調子で、
>ちゃっと使ってます
と応答した。
これは恐らく「ちゃんと」と「チャット(chat)」を掛けている可能性が高い。
よって、>>802が本当に「ちゃんとTypelistを使いこなせているよ」
という意味で返答したのかどうかは、このレスでは判断できない。
また、これを踏まえると>>802に対しての>>803の応答は、
抽象的すぎるきらいがある。
>>802への適切な応答としては、
1)s/ちゃっと/ちゃんと/
などとし、話の流れを元に戻すか、
2)チャットは何のソフト使ってるの?
が考えられる。
0805デフォルトの名無しさん
NGNGそういうのは一部の天才たちに任せよう:)
それよりもデザインパターンを適用したソフトウェア設計が
できるかどうかの方がよっぽど大切。これが出来ないことには
Alexandrescuの本に書いてあることの多くが使えない。
おれはよく知らないけど、Typelist自体についてもっと
勉強するには他の型付関数型言語のコーディングテクニックとかを
勉強する方がよいんじゃないの?
0806デフォルトの名無しさん
NGNG名古屋弁で「ちゃっと」といえば「さっと(すばやく)」くらいの意味だ。
ちゃっとやっとかんとかんわ。=さっとやっておかななければならない
0807デフォルトの名無しさん
NGNG大体は知ってたけどいろいろと役に立った。
次はMore Effectiveでも読むかな。
Moreは訳がくそなので読むのに想像力と忍耐力が必要だぞ。
(ここでいうことでもないのでsage)
0809デフォルトの名無しさん
NGNG0810名無しさん@カラアゲうまうま
NGNG思い切って洋書を注文したよ。がんがろ。
0811デフォルトの名無しさん
NGNG0812デフォルトの名無しさん
NGNG0813デフォルトの名無しさん
NGNG普通に読めたよ。
0814デフォルトの名無しさん
NGNGARM
(;´Д`)
0815デフォルトの名無しさん
NGNG標準C++の文法に準拠した新しい機能を使っている。
0816名無しさん@カラアゲうまうま
NGNGすごいな、漏れは "コンストラクター" と、伸びる時点でかなりひいたし、
後半はわけがわからないので、原書かっちまったが・・・
0818デフォルトの名無しさん
NGNG伸ばし棒の事なんかどうでもいいから後半のわけわからないっぷりについて
おしえてください。
たとえば、
const と コンストラクタ が混同されている部分があったりする。
そんな間違いをできるくらいで(だって普通文脈上そんな間違いできないでしょ)、
訳者は著者の書いていることを全然理解してない。
0821デフォルトの名無しさん
NGNG誤植の問題にも逐一訂正を載せてるし、
原著の修正にも載ってないものに
関しては報告してるみたいだから素晴らしいね。
翻訳もののダメっぷりばかりが目立つ
この業界の出版事情だけどいい仕事してる
ひともいるわけで、そういった人の本が
もっと売れるようになって欲しいところだね。
ダメな人を晒あげても切りがないので、
いい仕事をしている人を取り上げよう。
私は村上さんの本は信頼できると思います。
0822デフォルトの名無しさん
NGNG0823デフォルトの名無しさん
NGNGわしは脳内補正して読んだ。
0824デフォルトの名無しさん
NGNGそれはすごい。
0825_1
NGNGCTest2みたいなことは無理でしょうか?(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_2
NGNG{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デフォルトの名無しさん
NGNGtypedef のテンプレートはまだできないよ
0828825
NGNGそうでしたか...。ちょっと変えたらできました。
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);
}
};
0830828
NGNG関数テンプレートを関数の引数として使用できません。
とでるんですけど、
無理なんでしょうか?
(補足: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少なくとも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できた!サンクス。
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デフォルトの名無しさん
NGNGLokiPortは?
0834デフォルトの名無しさん
NGNG0835デフォルトの名無しさん
NGNGワロタ
0836デフォルトの名無しさん
NGNG0837デフォルトの名無しさん
NGNGtypedef T t;
typedef S s;
};
0838デフォルトの名無しさん
NGNGパブリックのメンバしかないクラスはstructを使うのが
彼のコーディング規約らしい。
あとテンプレートパラメータがプリミティブになるときにはtypename
これが一番役にたったかな。。。鬱
0839デフォルトの名無しさん
NGNGtypedef 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デフォルトの名無しさん
NGNG0841デフォルトの名無しさん
NGNG> typedef A::HEAD A;
そりゃー無理だろう。
0842デフォルトの名無しさん
NGNGtypedef 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まぁでもBCCだと通ってしまうという
0844デフォルトの名無しさん
NGNGこういう拡張は、言語の死の前兆なのだろうか、と思ってみたり。
0845デフォルトの名無しさん
NGNG手っ取り早くcppを拡張してほしい。
C++は詰め込みすぎだ。
0846デフォルトの名無しさん
NGNG0847デフォルトの名無しさん
NGNG0848デフォルトの名無しさん
NGNGあれがboost本家に入ればここも盛り上がる…かな?
0849デフォルトの名無しさん
NGNGtemplate< 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デフォルトの名無しさん
NGNGg++ でちょっと調べてみた。
A() がある場合、 B() をコンパイラが生成する。
で、 B() が生成された段階で、 B(){throw 0;} みたいなコードに
対応するために(だと思う) ~A<C>() がインスタンス化される。
A() が無い場合、 B() も無いことになって、このとき ~A<C>() はインスタンス化されない。
ためしに、 A(){} をコメントアウトしたまま、 B(){} を追加しても同じエラーになる。
でも、 B(); として外部参照にすると、エラーは消える。
これは、 ~A<C> が B() のコンパイル時にインスタンス化されているということだと思う。
それならと思って例外処理を無効にするオプションを追加してみたけど、
結果が変わらなかったのがよくわからないところ。
0851デフォルトの名無しさん
NGNGあんたすごいよ!
俺は思いつきもしなかった・・・
VC.NET も同様の結果。
実際のコードは B もテンプレートだったりして、あきらめるしかないか。
0852デフォルトの名無しさん
NGNG状態ごとに振る舞いを変えたいけど、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誰かこれ使って何かしてくれよ。
0855デフォルトの名無しさん
NGNGboost::call_traits
0856デフォルトの名無しさん
NGNGHoge.hを書き換えられないという状況があんまり想定できん
0857名無しさん@カラアゲうまうま
NGNGHoge.h を書き換えてビルドしたら、これをインクルードしている
ものも再構築しなければならない罠ってやつでは?
0858デフォルトの名無しさん
NGNGやればいいやん。ビルドに時間がかかるんならそれはそれで問題。
0859デフォルトの名無しさん
NGNG外部インターフェースと実装を分離したいなら pimpl イディオム使うのが
一般的だと思う。pimpl イディオムだと、内部的に使うメンバ変数が増えて
も OK だし。
0860デフォルトの名無しさん
NGNG0861デフォルトの名無しさん
NGNGそれ以前に、C++で f(void)はやめれ。間違いじゃないけど。
0862デフォルトの名無しさん
NGNGなぜっすか?
0863デフォルトの名無しさん
NGNGvoid set_name_age( char const* name, int age ){}
void result = set_name_age( "もな", 5, void, void );
テンプレート使うときに幸せだ・・・
0864デフォルトの名無しさん
NGNG無意味だから。
0865デフォルトの名無しさん
NGNGおまえの存在が無意味
0866デフォルトの名無しさん
NGNGじゃ戻り値intもその時のreturn 0も書くのやめるか?
0867デフォルトの名無しさん
NGNG意味不明だが……何を主張してるんだ?
0868デフォルトの名無しさん
NGNGmain(){
〜
}
で十分だろ
0869デフォルトの名無しさん
NGNGいいえ
0870デフォルトの名無しさん
NGNGなぜ?
0871デフォルトの名無しさん
NGNG本気で聞いてるの?
0872デフォルトの名無しさん
NGNGつーか本気で言ってるの?
0873デフォルトの名無しさん
NGNGAre you a Generic C++ Programmer?
0874デフォルトの名無しさん
NGNG>867 と >869 は本気で言ってる。それ以前の書き込みは俺じゃないから知らん。
>>866
> じゃ戻り値intもその時のreturn 0も書くのやめるか?
C++ の規格に照らし合わせて
1. 仮引数宣言を (void) とするのは () と等価。
2. 関数の型を省略すると int と見なされる
までは正しいが、
3. int 型関数で return を省略すると、デフォルト値 0 が戻り値として渡される
のは嘘だよな。
省略可能な int, void を書くかどうかはスタイルの問題だが(俺は書くけど)、
return を書かないのは規格上マズイって話。
0875デフォルトの名無しさん
NGNGmainに限ってはreturnがない場合0が返る。
0876デフォルトの名無しさん
NGNGint foo1() {
}
int foo2( void ) {
}
int var() {
foo1( 0 ); // 問題なし
foo2(); // コンパイルエラー
}
// ってゆってたよ。
0877876
NGNGfoo2( 0 ); // これで、コンパイルエラー。
foo2(); // は、もちろんOK。
0878デフォルトの名無しさん
NGNG多分、いろいろ勘違いしている
0879デフォルトの名無しさん
NGNGCならOK
C++じゃだめ。
0881876
NGNG// 常に 0 が表示されちゃう。
#include <stdio.h>
int foo() {}
void main() {
printf("%d\n",foo());
}
// % g++ -v
// gcc version 2.95.3-5 (cygwin special)
0882デフォルトの名無しさん
NGNGほんとだ。いつ追加された仕様なんだろうな、これ?
(VC6 あたりだと警告が出る)
0883デフォルトの名無しさん
NGNG0884デフォルトの名無しさん
NGNG>>323
"もっと技術的な話をきぼんぬ" って本人にメール出したら多分聞き入れてくれるよ。
...どういった方向の技術の話題を希望するのか書いとけば恵比寿氏も喜ぶよ、きっと。
>>327
いや、恵比寿氏が用意した場所で本人にうざいって言うのは人としてどうかと思うぞ。
わざわざ、人んちに押しかけといて家主に "あんた邪魔、帰れ!" って言うのと同じ様なもんだぞ。
0885デフォルトの名無しさん
NGNG御説はもっともなのだが、おぬし、流石に亀レスすぎないか。
0886デフォルトの名無しさん
NGNGごめん。古い書き込みとはいえ、なんか無駄な非難をほっとけなくて。
0887デフォルトの名無しさん
NGNG0888デフォルトの名無しさん
NGNGANSI規則でコンパイルしてみれ。
0890デフォルトの名無しさん
NGNG0892デフォルトの名無しさん
NGNG0893デフォルトの名無しさん
NGNG0894デフォルトの名無しさん
NGNG0895sage
NGNGハァハァ
まじ?
0897デフォルトの名無しさん
NGNG894の妄想。
0898デフォルトの名無しさん
NGNG・Functor, メモリプール, TypeTraits 辺りは既にboostにある。
・TypeListなどはMPL( MetaProgrammingLibrary )とゆーもっと
汎用的な枠組みで吸収。1.30.0くらいでリリース版に入りそう。
・Policyベースのスマートポインタは統合作業&議論中。
・AbstractFactory/Singletoneなどは、boost::DesignPattern
ライブラリを作るとか作らんとか言ってた気がするけど不明。
にゃるほど、ちょっと調べてみる。
0900デフォルトの名無しさん
NGNG0901デフォルトの名無しさん
NGNG0902デフォルトの名無しさん
NGNG0903デフォルトの名無しさん
NGNG0904デフォルトの名無しさん
NGNG英語読めねぇから聞いてんだYO。
0905デフォルトの名無しさん
NGNG何様?(w
0906デフォルトの名無しさん
NGNG何様か聞いてどうしる?
0907デフォルトの名無しさん
NGNG愛撫するとか。
a means for you!: http://www.excite.co.jp/world/text/
0908デフォルトの名無しさん
NGNGthanks
でも変な訳で意味がよくわからんよ。
誰かやわらかく教えて臭い。
0909デフォルトの名無しさん
NGNG0910age
NGNG0911age
NGNG0912デフォルトの名無しさん
NGNGっていうスレ立ててもいいっすか・・・・ ;_;
0913デフォルトの名無しさん
NGNG0914デフォルトの名無しさん
NGNG0915デフォルトの名無しさん
NGNG0916デフォルトの名無しさん
NGNG激しく盛り下がりそうな予感がするぜ
0917デフォルトの名無しさん
NGNG戦場スレに書き込んでみたら一応反応してもらえました。ハァハァ
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デフォルトの名無しさん
NGNGtemplate<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デフォルトの名無しさん
NGNGtemplate < typename T& >
template < typename T* >で判断できなかったかな?
どうだったっけ?
0921デフォルトの名無しさん
NGNGスマートポインタが渡せないデスヨ
0922デフォルトの名無しさん
NGNGtemplate<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>>920
template <class T> class A;
template <class T> class A<T*>{};
template <class T> class A<T&>{};
こうか?
0924918
NGNGオーバーロードできるんですか。理解が足りませんでした。
てっきりboost::mplのようなものを使って判断するとばっかり。
>>922
スマートポインタの類は恥ずかしながら一度も使ったことが
ありません。auto_ptrの引数で受ける、というのがどういう
意味を持ちどういう動作をするのか、勉強してみます。
ありがとうございました>919,922他の神々
0925921
NGNGいいんですが、巷にはたくさんスマートポインタがあり、
対応するのにいちいちそれを書いていたらとっても大変です。
以下のクラスを書きました。
参照、ポインタ、スマートポインタを吸収し、ただのポインタとして保持します。
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_;
};
0926921
NGNG使い方は
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());
}
};
これひとつで参照、ポインタ、スマートポインタを渡せる関数オブジェクトになります。
0927918
NGNG0928デフォルトの名無しさん
NGNGほほおなるほど。早速使ってみます。
0929デフォルトの名無しさん
NGNG*での間接参照を許さないスマートポインタもあったりするからちょとやっかいだな。
# auto_ptr もじゃなかったっけ?(うろ覚えスマソ)
0930921
NGNG&pは許さないスマートポインタはたくさんありますが、
*pを許さない奴はめったにありません。(auto_ptrもOKです)。
これはMyライブラリーに入っていて良く使うので何が悪いか良くわかってます。
欠点はpointer<void>と出来ないことです。
ですので、pointer<void>の時の特殊化も定義してください。
あと、constポインタにしたい場合はpointer<const int> としてください。
0931921
NGNGT &operator *() const
{ return *p_; }
をpublic面罵に追加してください。なぜかなかったです。
0933デフォルトの名無しさん
NGNGオーバーロードをするとエラーが出ますよ。
0934デフォルトの名無しさん
NGNG参考までにこんぱいらなに?
0935デフォルトの名無しさん
NGNGBorland-C++ 5.6です。今からMinGW(gcc3.2)でも試してみます。
0936デフォルトの名無しさん
NGNGは使えないなんて初めて知った(汗。
0937デフォルトの名無しさん
NGNG参照を渡すときのFnの実体化は、Fn<Foo> f; ですか Fn<Foo&> f; ですか?
とりあえず後者は通らないようです(gcc3.2)
0938937
NGNGスマソ。
0939937
NGNG禿げしくコンパイル時間が延びたような気もするが・・
0940デフォルトの名無しさん
NGNGT&はだめですが、T*はOKです。
0941デフォルトの名無しさん
NGNG0942もうだめぽ。。。
NGNGを書いてみたものの、bccだと型変換演算子でコケて、
gccだとstd::vectorで特殊化した方のクラスの演算子でコケる…。。。
(−_−)
(∩ ∩)
0943デフォルトの名無しさん
NGNGここから落とした最新の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デフォルトの名無しさん
NGNGx.Add()(HatchDispatcher<Shape1,Shape2>);
ではなくて
x.Add(HatchDispatcher<Shape1,Shape2>);
でした
0945デフォルトの名無しさん
NGNGどんなのが駄目なの?
いま漏れも
typedef boost::tuple<const int, const std::string, const std::string> hoge;
がVCでのみ通らなくて困ってるんだけど。
#スレ違いの予感
0946943
NGNG一つ作ってみました。
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デフォルトの名無しさん
NGNGg++ でダメな演算子ってどんなの?
まあ、なんにしても VC++ じゃ通らないから仕事では
避けざるをえないんだけどね。
0948943
NGNGいままで仕様書見てプログラミング言語覚えたこと
なかったからどうも抵抗があったんだけどそうも
いってられなさそう。。。
14882の14章をよく読んできます。
0949デフォルトの名無しさん
NGNGこれは、template 限定子ってのが必要になるケースだね。
template<class T>
void func(T& a) { // ここでは a がどういう型か分からないので
a.template memfunc<int>(); // このように memfunc がテンプレートであることを明示する
}
09501
NGNGとりあえずは STL スレか Boost スレを使うことにして、
いずれは 「C++ Template & Libraries (STL, Boost, Loki, etc.)」
みたいな形で統一しましょう。
0951943
NGNG素晴らしい!素晴らしすぎます!!!
どうもありがとうございました。
どうしてそんなことを知っているのでしょうか?
"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デフォルトの名無しさん
NGNGBorland-C++5.5.1だとtemplate限定子がなくても通ってしまうね。
でもgcc3.2だとエラーが出る。
プログラミング言語C++第3版§C.13.6、P971によるとmemfuncの
テンプレート引数は予測不能なので、"<"が比較演算子だと誤認
されエラーが出るようだ。
0953943
NGNGプログラミング言語C++はそんなことまで載って
いるんですね。私はC++Primerで勉強しているのですが
そんな記述あったかしら??。帰って読み直してみます。
ちなみにCLSはpublicのメンバーしかないから
structとすべきですね。こういう細かなルールは
大事にしたいものです。。
>>950
次スレは要らないでしょうね。Lokiはもう一般的に
認知されたと思っていますので、特別に扱うのも
なにか違うかなとおもいます。
boostスレで十分でしょう。ちなみに私の質問は
相談室の方ですべきでした。すみませんm( )m
0954943
NGNG疑問があります。
class FnDispatcherなのですが、このクラスは三つのAdd()関数を
持っていますが引数のないAddが二つ含まれています。
これってオーバーロードできずにコンパイルエラーになると
思うのですがどうでしょうか?
一つは対照ディスパッチャ(二つの要素の順序関係なし)として
機能するようにbool型のフラグ(bool symmetric)を受け付けるように
定義されていますが、そもそも関数の部分的特殊化は出来ないはずですよね?
これはg++-3.2では"cannot be overloaded"というエラーが出ます。
これはコンパイラの構文解釈としては正しいと思われますが、
なぜかg++-2.95では通ってしまうんですね。。
ライブラリのバグでしょうか?それとも私の何勘違いでしょうか?
0955943
NGNG対照ディスパッチャの引数として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);
}
}
0956943
NGNG単にAddのテンプレート引数symmetricにデフォルト値として
falseを与えればいいように思うのですが、それだと困るような
コンパイラがあるのでしょうか?
template <class SomeLhs, class SomeRhs,
ResultType (*callback)(SomeLhs&, SomeRhs&),
bool symmetric = false>
void Add()
0957デフォルトの名無しさん
NGNG可能のはず。VC++ みたいにできないコンパイラもあるけど。
>956
関数テンプレートでは、デフォルトのテンプレート引数は使えないはず。
0958943
NGNGFnDispatcher::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); //オーバーロード(正当)
というものが挙げられています。
関数テンプレートのデフォルト引数には関しては、、、調べてみます。
0959943
NGNGこの行は間違いでした。書きたかったのは、
template <class U> void Fun<void, U>(U obj); //部分的な特殊化(不正)
です。失礼しました。
0960957
NGNGすまん、関数テンプレートの部分特殊化はダメだったかもしれない。
多重定義は可能なので部分特殊化ができていると勘違いした。
0961943
NGNG#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のバグですよね?
0962943
NGNG何か資料に当たったわけではないのですが、
テンプレート関数のテンプレートパラメータには
デフォルト引数は設定できないです。
g++の3.2,2.95のどちらも
"default argument for template parameter"
と返してきます。
勉強になりました。ありがとうございます。
0963957
NGNG●関数の部分的特殊化は不可
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 でも非メンバ関数テンプレートならオーバーロード可能だった。
0964943
NGNGとくに三つ目の件に関しては勉強になりました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++のバグということになるんでしょうかね??
0965943
NGNGstruct 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いいことしった(・∀・)!
0967デフォルトの名無しさん
NGNGでexportキーワードについて説明している箇所で、"EDGのトランスレータ"
という語が出てくるんですが、これってナニ?
0968デフォルトの名無しさん
NGNGC++のソース→中間言語へのトランスレータ。
C++処理系の中で標準準拠度が一番高い、らしい。
http://www.edg.com/cpp.html
0969デフォルトの名無しさん
NGNG0970デフォルトの名無しさん
NGNGhttp://www.edg.com/resellers.html#x86
勉強になった。
0971デフォルトの名無しさん
NGNGこれ売り物?
ダンロードできないんですが。
0972967
NGNGということじゃないかなぁ。
0973971
NGNGやっぱ売り物なのね。
0974968
NGNG> 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デフォルトの名無しさん
NGNG0976デフォルトの名無しさん
NGNGhttp://www.intel.com/support/performancetools/c/v6/windows/generalcompat.htm#17
0977デフォルトの名無しさん
NGNG0978デフォルトの名無しさん
NGNGこのスレではVCは出入り禁止ですが何か・・・・?
0979デフォルトの名無しさん
NGNG0980デフォルトの名無しさん
NGNG0981デフォルトの名無しさん
NGNG0982デフォルトの名無しさん
NGNG0983デフォルトの名無しさん
NGNG0984アレックスとレスク
NGNGみなさん一年間どうもありがとうございました。
0985デフォルトの名無しさん
NGNGレス数が950を超えています。1000を超えると書き込みができなくなります。