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


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

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



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

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

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


621 名前:604 mailto:sage [2005/05/22(日) 08:55:52 ]
>>619
reinterpret_castが即、環境依存につながるとは新鮮な考え方だな。
同じ環境内でキャストして、同じ環境内で元に戻すのであれば、環境依存も何もないだろうに(それを環境依存というのなら、コンパイラが吐くコードはすべて環境依存になるぞ)。
それとも、そういうことすら期待できない処理系が現存するというのか?
(そんなのが出てきた時点で reinterpret_cast は言語仕様から外されるだろうて。)

622 名前:デフォルトの名無しさん mailto:sage [2005/05/22(日) 09:07:29 ]
>>621
愉快な香具師だなお前。
C++の実装と進化の§14.3.3(P420)読んでみろ。

623 名前:デフォルトの名無しさん mailto:sage [2005/05/22(日) 09:09:30 ]
>>622
○C++の設計と進化
×C++の実装と進化

それから、規格票を優先しろ。

624 名前:604 mailto:sage [2005/05/22(日) 09:17:26 ]
その本は持ってない。
引用の範囲内だろうから、出典を明記して引用してくれ。
内容を咀嚼して説明してくれてもよいぞ。


625 名前:620 mailto:sage [2005/05/22(日) 09:35:20 ]
俺の面白いは純粋な意味であって、622と同じ意じゃないですよ

626 名前:デフォルトの名無しさん mailto:sage [2005/05/22(日) 09:38:55 ]
5.2.10 Reinterpret cast

4 A pointer can be explicitly converted to any integral type large enough to hold it.
The mapping function is implementation-defined [Note: it is intended to be unsurprising
to those who know the addressing structure of the underlying machine. ]

5 A value of integral type or enumeration type can be explicitly converted to a pointer.
A pointer converted to an integer of sufficient size (if any such exists on the implementation)
and back to the same pointer type will have its original value; mappings between
pointers and integers are otherwise implementation-defined.

要するに規格としてはポインタ型を整数型にreinterpret_castして
その値をそのままポインタ型に戻す操作以外は完全に実装依存

627 名前:604 mailto:sage [2005/05/22(日) 09:57:53 ]
「5.2.10 Reinterpret cast」の真意は、整数型にキャストし、演算後の《変更された値》をポインタにキャストし戻したとしても、それはポインタとして無効であるということだけだと思うぞ。
一例を挙げると、配列の特定要素を指すポインタを整数型に変換した後、インスタンスオブジェクトのサイズ分だけ値を加算し、ポインタ型に戻したとしても、次の要素へのポインタにはならないぞ、、、という。

Magic listにおける A-B-C という例において、Bに保存されている値はAのアドレスとCのアドレスを特定のルールで「エンコード」しただけの整数値であり、デコードすることにより元々のポインタ値を復元することが可能なはず(てーか復元できなければ意味はない)。
このため、上記の§5.2.10の規則には抵触しないと思うが?
むしろ「A pointer *can be* explicitly converted to any integral type」と書かれている以上、そのことが保証されているとも取れる。

integral typeにして何の演算も許さず、元のポインタに戻すことしかできないのであれば、そもそもキャストする意味ないし。 まさかシリアライズするのか?、、、ってそれはあまりにも危険だしな。


628 名前:デフォルトの名無しさん mailto:sage [2005/05/22(日) 10:18:14 ]
>>626
ん?問題ないんじゃない?

同じポインタからは同じ整数になり、
同じ整数からは同じポインタになるっていう射影だよね。
この規格表のいいたいところは要するに、
アドレスが16違っている2つのポインタを、
整数に直した時も16違っているかどうかはわからないよ、
というだけの話じゃん。


629 名前:626 mailto:sage [2005/05/22(日) 10:20:55 ]
>>627
>Magic listにおける A-B-C という例において、Bに保存されている値はAのアドレスとCのアドレスを特定のルールで「エンコード」しただけの整数値であり、デコードすることにより元々のポインタ値を復元することが可能なはず(てーか復元できなければ意味はない)。
>このため、上記の§5.2.10の規則には抵触しないと思うが?
>むしろ「A pointer *can be* explicitly converted to any integral type」と書かれている以上、そのことが保証されているとも取れる。

5.2.10/5はポインタを整数にreinterpret_castした後,その整数値を「そのまま何の演算も行わずに」
元のポインタ型に再度reinterpret_castした場合,元のポインタ値に復元されることを保証するものです.
604さんのmagic_listでは排他的論理和演算を取るため「そのまま」ではないものの
5.2.10/5は明らかにreinterpret_castによるpointer <-> integerの1対1写像を保証しているものと
読めるため確かにそのとおりですね.626は621に対する指摘のつもりでしたが,
いやはや指摘がまったく見当違いどころかむしろ621が正当である根拠になりえますね.
これまた大変失礼しました.

>>628
上に同じです.失礼しました.



630 名前:デフォルトの名無しさん mailto:sage [2005/05/22(日) 12:18:47 ]
magic list はネタとしては面白いが、現実には滅多に使われない
データ構造だな。この手のネタは Hakcer's Delight とか Knuth
センセの本を読むとイロイロ転がってるよ。

あと、現実のプログラミングだと、list に int 一個だけ入れるのも
珍しい気がする。手元のコードをいくつか見直してみたが、わりと
大きめの構造体を繋ぐか、スマートポインタを入れることが多い。
いずれにしてもポインタ二個分のメモリなんて誤差って感じ。

631 名前:デフォルトの名無しさん mailto:sage [2005/05/22(日) 13:39:00 ]
珍しいかどうかは、ともかく
メモリ云々行ってた奴は、たぶん初心者だから
初心者の戯言を、あまり真に受けないほうが

632 名前:デフォルトの名無しさん mailto:sage [2005/05/23(月) 09:43:55 ]
結論はvector使え、でいいのか?

633 名前:デフォルトの名無しさん mailto:sage [2005/05/23(月) 09:54:29 ]
>>632
いい

634 名前:デフォルトの名無しさん mailto:sage [2005/05/23(月) 12:40:40 ]
magic list は所詮オナニー

635 名前:デフォルトの名無しさん mailto:sage [2005/05/23(月) 18:35:46 ]
ここはジェネリックプログラミングの話題じゃないのか?

636 名前:デフォルトの名無しさん mailto:sage [2005/05/24(火) 00:13:26 ]
>>635
テンプレートの話題ですよ。尤も、スレタイも読めないなら
このレスも読めない可能性、大。

637 名前:デフォルトの名無しさん mailto:sage [2005/05/24(火) 03:37:35 ]
暇つぶしに作ってた、ヘボコンパイラは出来上がったから
今度は、マジックリストクラステンプレートでも作ってみようかな
作ったらほしい人いる?

638 名前:デフォルトの名無しさん mailto:sage [2005/05/24(火) 08:09:05 ]
>>637 興味はある

639 名前:デフォルトの名無しさん mailto:sage [2005/05/24(火) 09:47:05 ]
学術的な興味なら。
ソースより測定結果をみたい。listやvectorとの比較つきで。



640 名前:デフォルトの名無しさん mailto:sage [2005/05/24(火) 15:44:00 ]
というか作りかけてる・・・

641 名前:デフォルトの名無しさん mailto:sage [2005/05/24(火) 22:41:55 ]
できたら
>>639もぜひ。

642 名前:デフォルトの名無しさん mailto:sage [2005/05/24(火) 23:45:11 ]
>>640
637だけど、あなたに任せます

643 名前:デフォルトの名無しさん mailto:sage [2005/05/25(水) 01:39:21 ]
小規模だけど多次元配列のポインタがどうしても必要で、newも使いたくないから
std::vector<std::vector< ...> >
とかで書いてみたんだけど、4次元ぐらいからコンパイル時間が凄くかかる。
ま、コンパイル時に何がおきてるか想像すりゃ当たり前といえば当たり前だし、
コンパイル時だけの問題なので気にしなきゃいいんだけど、
環境になるべく依存しないで(boostとかは使えないし、VC,gcc両方通す必要あり)、
効率の良い方法がありまつかね。std::deque使ってもかわらなさそうだし。



644 名前:デフォルトの名無しさん mailto:sage [2005/05/25(水) 01:49:02 ]
>>643
その「多次元配列」のインターフェースを必要最小限に絞って、
pimpl なり抽象インターフェースなりでコンパイル単位を分ける。
基本だな。

645 名前:デフォルトの名無しさん mailto:sage [2005/05/25(水) 02:06:06 ]
>>644
dクス。
pimplイディオムは詳しくないので、Exceptional C++でも読んでみまつ。

646 名前:640 mailto:sage [2005/05/25(水) 02:46:33 ]
kansai2channeler.hp.infoseek.co.jp/cgi-bin/joyful/img/458.txt
面倒だったのでBoost使いました.1.32.0が必要です.すいません.
VC++7.1とGCC3.4.2(mingw)でコンパイル確認しています.
勢いだけで突っ走ったので激しく読みにくいコードで申し訳ないです.
イテレータが安定じゃないのでsplice系がイテレータ返さないと
使い物にならないので,イテレータ返すようにしてます.
std::listのインターフェースであと実装していないのはsortと演算子だけです.
でも今日はもう気力残ってません.パフォーマンス測定もしかりです.おやすみなさい.

647 名前:デフォルトの名無しさん mailto:sage [2005/05/25(水) 04:02:34 ]
void reverse() // throw()
{
head_ = decode(sentry_.code, head_);
}

感動してしまった。

648 名前:デフォルトの名無しさん mailto:sage [2005/05/26(木) 03:43:21 ]
kansai2channeler.hp.infoseek.co.jp/cgi-bin/joyful/img/468.txt
微妙なバカチョンと例外飛んだときのバグを直しました.多分これで完璧なつもりです.
ただ,相変わらずsortだけ面倒なので実装してないです.
指摘されていたこととは言え,このデータ構造イマイチ利点がぼやけてますね.
特にアラインメントの関係でノードのサイズが普通のリストのそれと
同じになってしまう(32-bitマシンでmagic_list<double>とか)場合もあったりで散々かも.
唯一,647さんが指摘されているように要素順の反転を定数時間でできるのが
大きな特色ですけれど,それがうれしい状況ってあるんでしょうか・・・.

649 名前:デフォルトの名無しさん [2005/06/06(月) 11:28:39 ]
質問です。
「具現化によって生成された実体」 = 「ユーザー定義ではないスペシャライゼーション」
という理解でいいの?



650 名前:デフォルトの名無しさん [2005/06/07(火) 22:08:43 ]
"template テンプレート パラメータ"の意味が理解できないッス。
"Modern C++ Design" P11 の以下のコードなんですけど、

template <template <class> class CreationPolicy>
class WidgetManager : public CreationPolicy<Widget>
{
...
}

ここで template <class> に対して私の頭の中で
シンタックスエラーが発生します

template<class T> // ノーマル
template<> // 特殊化
template<class T=int> // デフォルト引数
template<class T, int=10> // 特殊化とデフォルト引数

というシンタックスは理解できています。
template <class> って何者? 誰か教えてください。

651 名前:デフォルトの名無しさん mailto:sage [2005/06/07(火) 22:12:38 ]
省略されてるだけ。
template <class /*T*/>
class foo;

652 名前:デフォルトの名無しさん mailto:sage [2005/06/07(火) 22:27:41 ]
>>651
サンクスです。とすると何らかの型を受け取るけど、
その型の情報は無視するよ、っていうことなんですね。
これをもとにもう一回読んでみます。

653 名前:デフォルトの名無しさん mailto:sage [2005/06/07(火) 22:32:56 ]
>>650
int f(int i);
int g(int); // これも脳内エラーが出るか?

654 名前:デフォルトの名無しさん mailto:sage [2005/06/08(水) 00:28:08 ]
>>650

例えば、

template< template<class T, class A> class Vector>
struct hoge
{
typedef T value_t;
};

typedef hoge<std::vector> hv_t;

としても、この時点では”T"はまだ決まってないわけだから
名前付けても使えないのです。
無論、”Vector"もこのままでは使えません。

実際の使用には

template< tempalte<class,class> class V>
struct hoge
{
template<class T,class A>
struct bind
{
typedef V<T,A> type;
};
};

typedef hoge<std::vector> hv;
typedef typename hv::template bind<int,std::allo..>::type
のように使うことになりますね。


655 名前:デフォルトの名無しさん mailto:sage [2005/06/08(水) 00:31:15 ]
補足ですが、

使えない == typedefできないということです。


656 名前:デフォルトの名無しさん mailto:sage [2005/06/08(水) 00:41:11 ]
>>654-655 とても650の理解を助けるとは思えない。

657 名前:デフォルトの名無しさん mailto:sage [2005/06/08(水) 01:10:19 ]
間違ったことは言ってないが、質問の答えとしては完全にズレてるな。

658 名前:654 mailto:sage [2005/06/08(水) 01:22:29 ]
>>656-657

この場合
>"template テンプレート パラメータ"の意味が理解できないッス。
と書いてあるところから、名前云々は関係ないと思うのですが・・

659 名前:デフォルトの名無しさん mailto:sage [2005/06/08(水) 10:35:01 ]
>>658 会話になってないな。もういいから喋るな。



660 名前:デフォルトの名無しさん mailto:sage [2005/06/08(水) 21:38:27 ]
>>650です。
皆さんありがとうございます。
>>654さんのご意見もとても理解の助けになりました。

661 名前:デフォルトの名無しさん mailto:sage [2005/06/09(木) 08:01:15 ]
typedf templateってどうなったの?

662 名前:デフォルトの名無しさん mailto:sage [2005/06/09(木) 08:13:16 ]
template< template<class T, class A> class Vector>
struct hoge
{
typedef T value_t;
};
template<class B> typedef hoge<std::vector<B> > hv_t;
typeof(hv_t<int>::value_t) i;

みたいにtypedefの一文をテンプレート化できるんだっけ。

663 名前:デフォルトの名無しさん mailto:sage [2005/06/09(木) 08:32:30 ]
>>662
それはだめだろ。
template-templateパラメタのtemplateパラメタ(この場合T)
に言及するのは意味的におかしい。

664 名前:デフォルトの名無しさん mailto:sage [2005/06/09(木) 08:43:39 ]
こうじゃないか?

template <typename> struct hoge;
template <template <typename, typename> class V, typename T, typename A>
struct hoge<V<T, A> >
{
typedef T value_t;
};
template <typename T> typedef hoge<std::vector<T> > hv_t;
hv_t<int>::value_t i;

665 名前:デフォルトの名無しさん mailto:sage [2005/06/09(木) 08:49:01 ]
typedef templateを導入するなら変数templateや名前空間templateも欲しい。

と無責任に言ってみるテスト。

666 名前:デフォルトの名無しさん mailto:sage [2005/06/09(木) 08:56:13 ]
>>664
あーなるほど。C++よく分らないから適当に書いてみたんだけどそれなら理解できるw

>template <template <typename, typename> class V, typename T, typename A>
> struct hoge<V<T, A> >
こうやって部分的特殊化で各パラメータ間の関係を表現できるのね。

>>663
>template <typename T> typedef hoge<std::vector<T> > hv_t;

問題はこの部分で、パラメータvector<T>の高階性(?!)を維持してくれるのかどうかってところかねえ。

>>665
変数templateとはどんなもんでしょ?

667 名前:デフォルトの名無しさん mailto:sage [2005/06/09(木) 11:34:08 ]
もしも変数テンプレートがあったとしたらこんな感じ?
template <typename T> const T *NULL = 0;

int *pi = NULL;
char *pc = NULL;

#include <cstdio>
int main() {
  std::printf("%p", NULL<void *>);
}

668 名前:デフォルトの名無しさん mailto:sage [2005/06/09(木) 11:59:30 ]
>>667
>int *pi = NULL;
>char *pc = NULL;
これを許すとまた規則が複雑になるな。

669 名前:デフォルトの名無しさん mailto:sage [2005/06/09(木) 12:14:33 ]
class null {
public: template<typename T> operator T*() const { return 0; }
};

const null NULL;

int *ip = NULL;
char *cp = NULL;

printf("%p", (void*)NULL);

でいいような気がす



670 名前:デフォルトの名無しさん mailto:sage [2005/06/09(木) 12:16:52 ]
誰もそんな話ししてないわけだが

671 名前:デフォルトの名無しさん mailto:sage [2005/06/09(木) 13:24:53 ]
>>667
引数とるコンストラクターはどうなるんだ。

672 名前:デフォルトの名無しさん mailto:sage [2005/06/09(木) 13:52:48 ]
typedef template ムチャ欲しいな。

673 名前:デフォルトの名無しさん mailto:sage [2005/06/09(木) 14:26:04 ]
>>667
今のC++の型の取り扱いにあわせると

template<typename T> const T *NULL = 0;

は,右辺がリテラルの0でこれは型がintだからポインタ型に変換できず,
Tをどの型でinstantiationすれば良いのか判断できずコンパイルエラーになる,
っていう扱いが妥当だと思いますよ.
もうちょい厳密に変数テンプレートを定義しようとすると,
結局,型推論のためのautoキーワードの拡張

auto a = b; // typename(b) a = b; の構文糖

と同じになると思います.Andrew Koenigあたりがこのautoキーワードの代わりに
>>667の構文を提案してたはず.

674 名前:デフォルトの名無しさん mailto:sage [2005/06/09(木) 14:35:13 ]
>>673
>>667の代わりに、
template <typename T> struct wrap{static const T *null;};
template <typename T> const T *wrap<T>::null = 0;
と書けることを考えると、今の扱いなら、

・template <typename T> const T *NULL = 0;
の時点では何も起こらない。
・printf("%p" NULL<void *>);
の点でインスタンス化が引き起こされ、void *const *を0で初期設定しようとし、成功。

が妥当じゃないのか?

675 名前:デフォルトの名無しさん mailto:sage [2005/06/09(木) 14:50:45 ]
>>670
そうでなくて、必要性が全く感じられないと言っている
まともな利用例ぐらい出さないと

676 名前:デフォルトの名無しさん mailto:sage [2005/06/09(木) 14:56:07 ]
>>674
その使い方だと常に明示的にインスタンス化しないといけない
(NULLを利用するたびに型パラメータを与えないといけない)わけですよね?
それは利用範囲が著しく限られませんか?

677 名前:667 mailto:sage [2005/06/09(木) 15:03:10 ]
ところで俺は変数テンプレートは全く要らないと思うんだけどな。
俺も669と同じようなのを考えたことはあるけど。

678 名前:デフォルトの名無しさん mailto:sage [2005/06/09(木) 15:10:28 ]
>>676
使い道がないのは同意。
ただ、仮に現在のテンプレートの延長で「変数テンプレート」なるものを定義するなら、
>>674で言ったようになるはずだと思った。
>>673のような機能を導入するなら別の名前・構文を考えるべきだと思う。

679 名前:デフォルトの名無しさん mailto:sage [2005/06/09(木) 15:26:38 ]
型推論はされるとして、
NULLみたいに初期化子に使うとちょっと面白そうな…

クラス階層のあるところでPTHREAD_MUTEX_INITIALIZERみたいなやつ。



680 名前:デフォルトの名無しさん mailto:sage [2005/06/09(木) 15:29:21 ]
>>678
確かに「変数テンプレート」という名前は非常にまずいですね.
ただ構文については既存のキーワード使うとするとこれぐらいしかないような気がします.

681 名前:デフォルトの名無しさん mailto:sage [2005/06/12(日) 15:01:48 ]
アドビのオープンソースってど?流行ると思う?
STL、boostを基に、ウィンドウをスクリプトから生成する画期的システム
仮想マシンを実現とか、内容は理解を超えていた (つД`)

いわゆるチョット修正のときに威力を発揮すると思う
SEはどんな些細なこともPGに要望しなけりゃならない
PGは思いつきの修正のために仕事が増えるばかり
だれか人柱になってください、やっぱアドビ待ちなのかな

682 名前:デフォルトの名無しさん mailto:sage [2005/06/12(日) 17:16:13 ]
>>681
AdamとEve( ttp://opensource.adobe.com/ )のことか?なかなか
普及は難しいんじゃないかなぁ…

683 名前:デフォルトの名無しさん mailto:sage [2005/06/13(月) 00:40:41 ]
質問です。
BCC 5.5上のテンプレートのバグはどのようなものが
あるのでしょうか。

・・・特に大きいタイプリストを渡すと、他の特殊化に指定
したクラスが別のクラスに化けるとか、そんなのないですか?

684 名前:デフォルトの名無しさん mailto:sage [2005/06/13(月) 10:45:49 ]
>>683
質問するときはやりたいこと、実際にやったことを書いた方が良い。

685 名前:デフォルトの名無しさん mailto:sage [2005/06/13(月) 14:20:43 ]
>>683
どういうバグかは知らんがboostが満足に使えない。

686 名前:683 mailto:sage [2005/06/13(月) 21:39:52 ]
自己解決しちゃいました。

経緯だけ説明しますと、Modern C++ Designのマルチメソッドを
自分の使いやすい形に改良して使っていたんです。で特殊化の
際タイプリストを
template<..,class Head,class Tail>struct
Dispatcher<...,Typelist<Head,Tail>,...>{
...省略
};
と展開していて、6ほどの長さのタイプリストをわたしたところエラー吐かれました。
(5つまでは普通にコンパイル&動作しました)

これを
template<..,class TList>struct
Dispatcher<...,TList,...>{
...省略
};
としHeadにアクセスするときTList::Head,Tailにアクセスするときは
TList::Tailとするようにしたら今度は何十の長さでもコンパイルできました。

前者のコンパイルの仕方にバグがあるんでしょうかね・・・

687 名前:デフォルトの名無しさん mailto:sage [2005/06/13(月) 23:51:10 ]
BCCなんか使うなよ

688 名前:デフォルトの名無しさん mailto:sage [2005/06/14(火) 17:45:57 ]
もしかして、クラステンプレートのメンバ仮想関数って勝手に実体化される?

689 名前:デフォルトの名無しさん mailto:sage [2005/06/14(火) 17:58:42 ]
>>688
どんなコードでそう思った?



690 名前:688 mailto:sage [2005/06/14(火) 18:10:23 ]
ものすごく単純化すると、
class base
{
public:
virtual void foo() = 0;
};
template <class> class derived : public base
{
public:
virtual void foo() { std::cout << "呼ばれた\n"; }
};
int main()
{
derived<int> d;
static_cast<base&>(d).foo();
}
こんな感じ。

691 名前:デフォルトの名無しさん mailto:sage [2005/06/14(火) 18:24:16 ]
>>690
それってderived<int>型の変数dを宣言したからderived<int>が実体化されているだけのように見えるが。

692 名前:688 mailto:sage [2005/06/14(火) 18:28:53 ]
derived<int> が実体化されるのと
derived<int>::foo が実体化されるのは別じゃないですか?
クラステンプレートのメンバって呼ばれるまで実体化されませんよね?

693 名前:デフォルトの名無しさん mailto:sage [2005/06/14(火) 18:31:57 ]
>>688
規格では詳しくは規定されていないっぽい。
実際は
・derived<int>のインスタンスが宣言された
・derived<int>*からbase*の変換が行われた
のいずれかをトリガとして、仮想関数をすべて実体化することになると思う。

694 名前:688 mailto:sage [2005/06/14(火) 18:40:33 ]
>>693
サンクス。未定義ってことですか。
一応、明示的に実体化しておいたほうがよさそうですね。

695 名前:デフォルトの名無しさん mailto:sage [2005/06/14(火) 18:47:45 ]
>一応、明示的に実体化しておいたほうがよさそうですね。
なんでそうなる?

ついでに、「未定義」と「未規定」は違う。

696 名前:688 mailto:sage [2005/06/14(火) 18:50:17 ]
ん?
規定はされていなくても、正常に動くことは保証されているってことですか?

697 名前:693 mailto:sage [2005/06/14(火) 18:57:55 ]
言い方が不正確だったな。
規格には、「メンバ関数は、その定義が必要とされるとき実体化される(意訳)」とある。
で、virtual関数については、いつ「定義が必要とされる」か正確に規定している部分が(俺の見た限りでは)なかった。
従って、virtual関数の正確な実体化のタイミングは規定されていないことになる。
それでも、「必要」になり次第実体化されることは保障される。

698 名前:688 mailto:sage [2005/06/14(火) 19:22:06 ]
あー、なるほど。
規定されていないのは実体化されるタイミングだということですね。
どうもありがとうございました。

699 名前:デフォルトの名無しさん mailto:sage [2005/06/26(日) 18:25:16 ]
int k = 0;
for (vector< set<int> >::iterator it = v.begin(); it != v.end(); ++it)
it->insert(k++);

を boost::lambda か何かを使って for_each でシンプルに書けませんか?
メンバー関数に bind する仕方がよく分からないんですが・・・



700 名前:デフォルトの名無しさん mailto:sage [2005/06/26(日) 19:33:36 ]
>>699
typedef std::set< int > set_type;
typedef std::vector< set_type > vector_type;
void f( vector_type& v )
{
 using namespace boost::lambda;
 int k = 0;
 std::for_each(v.begin(), v.end(), (protect(bind((std::pair<set_type::iterator,bool> (set_type::*)(int const&))(&set_type::insert), _1, var(k)++)))(*_1));
}

○ boost::lambda か何かを使って
○ for_each で
× シンプルに

701 名前:700 mailto:sage [2005/06/26(日) 19:49:39 ]
メンバ関数に限らず、オーバーロードが絡むと lambda は使いにくいな。

702 名前:デフォルトの名無しさん mailto:sage [2005/06/27(月) 06:52:07 ]
protect要るか?

>>701
C++は名前が重なった場合の簡潔な指名定方法がないしね。
lambdaに限らず面倒。
typeofがBoostに入るそうだから、そのうち頑張って改善されるといいな。


703 名前:700 mailto:sage [2005/06/27(月) 07:50:29 ]
>>702
こんな感じで変形していったが、途中のやつの
エラーメッセージがひどくて(数100行ぐらい出る)、
何がまずかったのかよくわかってない。
× ((*_1)->*insert)(var(k)++)
× bind(insert, *_1, var(k)++)
○ (protect(bind(insert, _1, var(k)++)))(*_1)

704 名前:702 mailto:sage [2005/06/27(月) 22:11:02 ]
>>703
その3つの最初から間違ってるよ。
for_eachなんだから_1にはイテレータではなく参照が入る。よって
_1をdereferenceする必要はない。

まあ同じなんだけど、俺ならオーバーロードが絡む場合は
メンバ関数の特定を追い出すかな。
void hoge(vector<set<int> >& v) {
    typedef set<int> set_type;
    pair<set_type::iterator,bool>(set_type::*insert)(const int&)
        = &set_type::insert;

    int k = 0;
    for_each(v.begin(), v.end(), bind(insert, _1, var(k)++));
}


705 名前:700 mailto:sage [2005/06/28(火) 00:20:42 ]
>>704
うわ、とんでもない勘違いをしていたよ。
ありがとう。

706 名前:デフォルトの名無しさん mailto:sage [2005/07/05(火) 14:15:55 ]
ttp://d.hatena.ne.jp/soleil/searchdiary?word=%2a%5b%c5%fd%b7%d7%5d
ここに書いてあった
struct Mean
ってどう使うの? 例がないと分からない
functorなのは分かったけど

707 名前:デフォルトの名無しさん mailto:sage [2005/07/05(火) 14:27:54 ]
int array[] = {1, 3, 5};
std::vector<double> v = ...;

int ma = Mean<int *>()(array, array + 3);
double mv = Mean<std::vector<double>::iterator>()(v.begin(), v.end());

こんな感じじゃないか?

708 名前:デフォルトの名無しさん mailto:sage [2005/07/05(火) 16:19:10 ]
for_eachにかけるものではないのね
でも便利そう thx


709 名前:デフォルトの名無しさん mailto:sage [2005/07/05(火) 16:25:40 ]
>>707
のとおりにやってみたけど
コンパイル通らなかったよ



710 名前:デフォルトの名無しさん mailto:sage [2005/07/05(火) 17:04:14 ]
>>706
> 算術平均を求める Mean を書き直すと以下のようになる
> (もちろん Sum も反復子を使うように変更してあることが前提)

ちゃんとSumもコード書いた?

んで、漏れなら、合計値(累積値)を求めるアルゴリズムaccumulateを使い
平均値は:

void f(vector<double>& m) {
double avg = accumulate(m.begin(), m.end(), 0.0) / m.size();
}

のようにして求めるな。分散・標準偏差、RMSあたりも似たような実装ができる。


711 名前:デフォルトの名無しさん mailto:sage [2005/07/06(水) 04:42:18 ]
>>710
わざわざ関数にするのか?
コードの大きさを抑えるのにはいいけど。

712 名前:デフォルトの名無しさん mailto:sage [2005/07/06(水) 07:22:20 ]
>>711
しない。入力が何で出力が何か明確にしたかったので、関数形式で書いただけ。
実際に関数にするなら、template、inline、引数にはconst、戻値の型を明記、あたりが必要です。

蛇足で糞コード晒す。
template <typename T>
struct square : public binary_function<T, T, T> {
T operator()(const T& lhs, const T& rhs) { return lhs + rhs*rhs; };
};

double ms = accumulate(m.begin(), m.end(), 0.0, square<double>()) / m.size();
double rms = sqrt(ms);
double stdev = sqrt(ms - avg*avg);


713 名前:デフォルトの名無しさん mailto:sage [2005/07/06(水) 08:07:25 ]
STLは連続した、同じような事の繰り返し処理には滅法強いな。

714 名前:デフォルトの名無しさん mailto:sage [2005/07/06(水) 20:49:48 ]
>>713
あなたの人生もSTLで簡単になりますよ。

void silly_life(life& your_life)
{
  struct
  {
    static int daily(day& d)
    {
      d.nebou();
      d.nichan();
      d.onanu();
      d.shigoto();
      d.nichan();
      d.onanu();
      d.neru();
      return 0;
    }
  };

  std::for_each(your_life.begin(), your_life.end(), daily);
}

久しぶりにtemplate見たよ。。。C#使いづれ〜。。。orz

715 名前:デフォルトの名無しさん mailto:sage [2005/07/07(木) 00:00:05 ]
それがSTLクオリティ。

語呂悪いな。

716 名前:デフォルトの名無しさん mailto:sage [2005/07/07(木) 07:31:19 ]
速度が重要になるコードを書かなければなのですが、
やはりSTL経由の連続処理は、速度的に不利なんでしょうか?

一応自分なりに、次レスに書いたような実験をしてみたのですが、
プロファイル結果はSTL版hoge()が平均301msに対し、
シンプルなリストhage()の方が平均12msと、圧倒的な差に…。

今更自前リストなんて使うのは、考えただけで頭が痛くて。
なにかテストに落ちがないか、
或いはSTL版速度向上のための抜け道が無いか、教えて頂けないでしょうか。

717 名前:714 行制限のため、見づらくてすいません mailto:sage [2005/07/07(木) 07:35:09 ]
#include <list>
struct simple_list{
int val;
simple_list* next;
};
template <typename T>
void hoge( T first, T last ){
int sum = 0;
while( first != last ) sum += *(first++);
};
void hage( simple_list* sl_first ){
int sum = 0;
while( sl_first ){ sum += sl_first->val; sl_first = sl_first->next;}
};
int main(){
std::list<int> listInt;
for( unsigned long i=0; i < 100000; ++i ) listInt.push_back(i);

simple_list* sl_first = new simple_list;
simple_list* sl = sl_first;
for( unsigned long c=0; c < 100000; ++c ){
sl->val = c;
sl->next = new simple_list;
sl = sl->next;
}
sl->next = NULL;

hoge( listInt.begin(), listInt.end() );
hage( sl_first );
while( sl_first ){ sl = sl_first->next;delete sl_first; sl_first = sl; }
return 0;
}

718 名前:デフォルトの名無しさん mailto:sage [2005/07/07(木) 07:51:04 ]
>>716
プロファイルでは最適化は有効にしてる?
最適化しないと比較にならないし、最適化すると hoge(), hage() が
sum を返してないので、最適化で処理自体が消えてダメかもしれない。

hoge の sum += *(first++); を { sum += *first; ++first } にすると、少し違うかもしれない。

719 名前:デフォルトの名無しさん mailto:sage [2005/07/07(木) 07:51:41 ]
>>716
最適化した?
うちじゃ
hoge(): 8.46567 ms
hage(): 7.92051 ms
くらいなんだけど
環境はg++ (3.3.5)




720 名前:716 mailto:sage [2005/07/07(木) 08:08:12 ]
我ながら非道い
sl->next = NULL;を削って
sl->next = new simple_list; を
sl->next = (c != 100000-1) ? new simple_list : NULL; とでも

>>718-719
最適化をすっかり忘れていました。
なぜだかsumを返すようにしてもhogeの方が消えてしまうのですが
もう少し試行錯誤してみます。

いずれにせよ力づけられました。ホッとしています。
レスありがとうございました。

721 名前:デフォルトの名無しさん mailto:sage [2005/07/07(木) 08:20:05 ]
>>720
返すだけで戻り値を使ってないんじゃ、と消えるかもしれないな。
チェックもかねて、画面に値を出すようにすれば大丈夫じゃない?
(そこまでやっても、ただの定数に置き換えてしまうコンパイラとかあるかもしれない。)

最終的にはアセンブリを吐かせて確認するといい。

722 名前:716 mailto:sage [2005/07/07(木) 08:25:49 ]
最適化無しで719さんの方法で15%ほど速く
>>721
もしかしたらtemplateだったせいかも知れないです。インライン化されていたのかな。
templateを外したらhogeも出ました

hoge: 5.579 ms
hage: 5.313 ms
(vc++6)

朝からお騒がせしました、お二人(三人?)に再度感謝です

723 名前:デフォルトの名無しさん mailto:sage [2005/07/07(木) 08:31:10 ]
その程度の処理だとlistは兎も角、vectorは普通の配列と全く同じ速度出るよ。
#つーか、gccでもVC++でもstlの有無で全く同じ(質の)コード吐くんだけどね。

724 名前:デフォルトの名無しさん mailto:sage [2005/07/07(木) 18:13:33 ]
>>723
VCだと
vector>=配列
になるときもない?(誤差範囲内だけど)
GCCは
vector使うと少し遅くなる気がした。


725 名前:デフォルトの名無しさん mailto:sage [2005/07/07(木) 18:23:22 ]
その辺は具体的なコードを提示して比較でもしない限りなんとも言えないなぁ。
そもそも最適化で消えないコードでって条件になっちゃうし。

726 名前:デフォルトの名無しさん mailto:sage [2005/07/07(木) 18:30:29 ]
vectorのiteratorは大抵の処理系/STL実装で非デバッグ時には単なるポインタだろ。

727 名前:デフォルトの名無しさん mailto:sage [2005/07/07(木) 18:34:16 ]
>>722
ちなみに std::list が double-linked list だということは知ってるよな

728 名前:デフォルトの名無しさん mailto:sage [2005/07/07(木) 23:52:14 ]
doubleじゃないSTLのlistを提示しない限りそのレスは無意味

729 名前:デフォルトの名無しさん mailto:sage [2005/07/08(金) 00:55:24 ]
>>728
おれは>727じゃないけど、なんで?



730 名前:デフォルトの名無しさん mailto:sage [2005/07/08(金) 01:02:35 ]
そういえばslistは標準じゃないんだな。 STLPortにはあるけど。

731 名前:デフォルトの名無しさん mailto:sage [2005/07/08(金) 20:43:04 ]
次のようなコードがあるとします:
 struct base1 { base1(int x) {}; };
 struct base2 { base2(int x, int y) {}; };

 // IF<P,T,F>クラステンプレートは、Pが非0のときT、0のときFをIF::typeにtypedefする
 template <int N> struct derived : public IF<N,base1,base2>::type {};

このとき引数の数が異なるコンストラクタを持つ基底クラスをテンプレートで切り替え、
派生クラスのコンストラクタから、基底クラスのコンストラクタを呼び出したいのです:
 derived<1> d(0); // base1から継承し、コンストラクタは引数1
 derived<0> d(0, 1); // base2から継承し、コンストラクタは引数2

基底クラスのコンストラクタを呼び出すときには、派生クラスの初期化リストを使います。
ところが、派生クラスのコンストラクタ初期化リストでは、基底クラスのコンストラクタ
以外呼べませんから、次のように多重定義できません:
 // Nが非0だとすると
 derived(int x) : base1(x) {};
 derived(int x, int y) : base2(x, y) {}; // error! 基底クラスはbase1

このように基底クラスをテンプレートで替える場合に、うまく派生クラスのコンストラクタの
引数の数を調整するようなテクニックがあれば、ご教示いただけると幸いです。
また、異なるアプローチもあればコメントください。


732 名前:デフォルトの名無しさん mailto:sage [2005/07/08(金) 20:50:10 ]
俺にはderivedをNの値によって特殊化する方法しか思いつかない。

733 名前:デフォルトの名無しさん mailto:sage [2005/07/08(金) 22:22:17 ]
試しにこう書いてみたら g++ 3.4.4 cygming special では通ったんだが。

derived(int x) : IF<N,base1,base2>::type(x) {}
derived(int x, int y) : IF<N,base1,base2>::type(x,y) {}

734 名前:731 mailto:sage [2005/07/09(土) 02:41:09 ]
>>732-733
レスありがとうございました。
>733の方法で、パパ、うまくできそうです。
続きがんばります!

735 名前:デフォルトの名無しさん mailto:sage [2005/07/09(土) 08:17:21 ]
どうもネットの世界の「ご教示」とか「ご教授」って浮いた言葉だなぁ。

736 名前:デフォルトの名無しさん mailto:sage [2005/07/10(日) 00:59:18 ]
実は初めてこの構文を知ったんだけどさ

>ttp://www.comeaucomputing.com/techtalk/templates/#esprobs
>
>template <class T>
>T foo(T blah)
>{
>    xyz object;
>    T someInt;
>
>// (略)
>
>    someInt = object.mt<int>(99.99); // AA: ill-formed
>    someInt = object.template mt<int>(99.99); // BB: well-formed
>
>    return someInt;
>}

ってなってて AA は ill-formed になってるんだけど、 object はテンプレートパラメータに依存してないんだから
template をつけなくても問題ないと思うんだけど。実際 g++ 3.4.4 だと通るし、. の前をテンプレートパラメータに
依存するように書き換えるとエラーが出る。

規格参照箇所 14.2-4
> When the name of a member template specialization appears after . or -> in a postfix-expression, or after
> nested-name-specifier in a qualified-id, and the postfix-expression or qualified-id explicitly depends on a
> template-parameter (14.6.2), the member template name must be prefixed by the keyword template.
> Otherwise the name is assumed to name a non-template.

737 名前:デフォルトの名無しさん mailto:sage [2005/07/10(日) 02:07:52 ]
template <typename T>
class Hoge {
public:
typedef std::vector<T> Container;
typedef Container::iterator Iterator;

private:
Container v;
};

と書いて、Hoge<int> hoge; とか呼ぶと、implicitなtypenameだと警告を言われます。
iteratorを表現するにはどのように記述すべきなのでしょうか。

738 名前:デフォルトの名無しさん mailto:sage [2005/07/10(日) 02:09:19 ]
>>737 gcc version 3.2 20020927 (prerelease) です。

739 名前:737 mailto:sage [2005/07/10(日) 02:11:47 ]
www.tietew.jp/cppll/archive/10073 によると、

typename Container::iterator Iterator;

と書くみたいですね。これって常識なのかしら。



740 名前:デフォルトの名無しさん mailto:sage [2005/07/10(日) 02:27:11 ]
>>739
その場合、typenameは必須。

741 名前:デフォルトの名無しさん mailto:sage [2005/07/10(日) 02:36:16 ]
常識

742 名前:デフォルトの名無しさん mailto:sage [2005/07/10(日) 04:36:52 ]
当然

743 名前:デフォルトの名無しさん mailto:sage [2005/07/11(月) 10:24:40 ]
>>739
特殊化があるC++では、Tが確定しないと型推論が困っちゃうんで、
typedef typename Container::iterator Iterator;
って感じで。
typename Container::iterator Iterator;
も可能。
Container<int> v;
なら何とかなるはずだけど、explicitにtypenameしましょうという仕様。


744 名前:デフォルトの名無しさん mailto:sage [2005/07/16(土) 20:53:42 ]
>型推論が困っちゃう

そうなのか?
Tが確定しないと、特殊化のあるC++ではstd::vector<T>::iteratorが
typedefされた型名か、メンバ(メンバ変数・関数)かが分からないから
コンパイラへのヒントとして型名であることを明示するのを義務付けてるんでは?

745 名前:デフォルトの名無しさん [2005/07/19(火) 22:11:08 ]

全然わかってないけど質問します。

テンプレートクラスの実装って全てヘッダーでやらないといけないんですか?
.cppの方でやるとリンカーエラーが出てリンクできないのですが!?
(全部ヘッダーにコピペしたら通った)


746 名前:デフォルトの名無しさん mailto:sage [2005/07/19(火) 22:14:53 ]

追加

だが、しかしそれをやると2重定義になる…
どうすればいいんじゃーーーー

747 名前:デフォルトの名無しさん mailto:sage [2005/07/19(火) 22:20:05 ]
>>745
テンプレートの定義をcppファイルに書きたければ、宣言と定義の両方にexportを付けるだけ。
しかしほとんどのコンパイラで使えない。(使えるコンパイラが全くないわけではない)

というわけで普通はヘッダにインラインで全て書く。
ごく稀に明示的実体化が使われることはあるが。

748 名前:デフォルトの名無しさん mailto:sage [2005/07/19(火) 22:48:35 ]
>>747
明示的実体化ってまさか、

template class c<bool>;
template class c<char>;
template class c<unsigned char>;

みたいに延々と cpp ファイルに書いていくわけ?

749 名前:デフォルトの名無しさん mailto:sage [2005/07/19(火) 23:06:05 ]
g++にはextern templateってのがあるね。



750 名前:デフォルトの名無しさん mailto:sage [2005/07/19(火) 23:11:50 ]
>748
そゆこと。

751 名前:745 mailto:sage [2005/07/19(火) 23:17:21 ]
やってみた>>747

make -k all
g++ -Wall main.cpp Class.cpp -c
g++ -Wall main.o Class.o -o a.exe
main.o(.text+0x25):main.cpp: undefined reference to `Class<int>::Class[in-charge]()'
collect2: ld returned 1 exit status
make: *** [all] Error 1

ムリポ

>>749を含めて出直してくる。これはイマの私の頭ではいくら考えても答えが出ない。
本を読むかg++のマニュアルを漁るか…

752 名前:デフォルトの名無しさん mailto:sage [2005/07/19(火) 23:44:58 ]
>>751
g++のinclude/bits/istream.tccより

// Inhibit implicit instantiations for required instantiations,
// which are defined via explicit instantiations elsewhere.
// NB: This syntax is a GNU extension.
#if _GLIBCPP_EXTERN_TEMPLATE
extern template class basic_istream<char>;
extern template istream& ws(istream&);
extern template istream& operator>>(istream&, char&);
extern template istream& operator>>(istream&, char*)

753 名前:デフォルトの名無しさん mailto:sage [2005/07/23(土) 19:33:12 ]
template <class T> class foo;

template <class T> class baa{
 friend foo;
 int n;
public:
 baa() : n(777){}
};

template <class T> class foo : public baa<T>{
 int hoge;
public:
 void set_val( baa<T>& arg ){ hoge = arg.n; }
};

int main(){
 baa<int> b;
 foo<int> f;
 f.set_val( b );
 return 0;
}

インデントが全角スペースですいません
これだとarg.nにアクセス出来ないのですが、間違っている場所を教えて頂けないでしょうか
friend foo; が、やっぱり
template <class T> friend foo; なんでしょうか

754 名前:デフォルトの名無しさん mailto:sage [2005/07/23(土) 19:45:24 ]
>>753
g++ でコンパイルすると、
:4: error: ISO C++ forbids declaration of `foo' with no type
:4: error: `foo' is neither function nor member function; cannot be declared friend

まぁそれは置いとくとして、
 friend class foo<T>;
で通ったよ。

755 名前:753 mailto:sage [2005/07/23(土) 19:59:42 ]
>>754
やっぱりclass指定しますよね
書き込む前にチェックしたサイトで、指定が無かったので、自分が間違っていたのかと

そうか、再度template <class T>付けるのは馬鹿でした。
VC6なので、Tが同じじゃなかったらアウトだったかも・・・良かった。

本当に助かりました。コンパイルまでして頂いてすいません。ありがとうございました。

756 名前:デフォルトの名無しさん mailto:sage [2005/07/23(土) 20:13:13 ]
baaっての…なんかプログラムがアホっぽくなるな。

757 名前:デフォルトの名無しさん mailto:sage [2005/07/23(土) 22:22:39 ]
>>755
friend かどうかっていう問題なのか?
baa<T>::n が private か protected/public かどうかっていう問題では?

758 名前:デフォルトの名無しさん mailto:sage [2005/07/23(土) 22:47:57 ]
>>757
vtableを避けるための小細工なんです
眉をしかめる人が多いと思いますが、自分しか使わないのでお見逃しを

759 名前:デフォルトの名無しさん mailto:sage [2005/07/23(土) 23:36:56 ]
>>758
よくわからないな。>>753 のを
template <class T> class baa{
protected:
 int n;
public:
 baa() : n(777){}
};
とすると VC6 だと vtable に関して状況が変わるの?



760 名前:デフォルトの名無しさん mailto:sage [2005/07/23(土) 23:51:14 ]
753がprotectedを知らなかったというオチ?

761 名前:デフォルトの名無しさん mailto:sage [2005/07/24(日) 00:21:24 ]
>>759
失礼、深読みしすぎてました。

しかしすいません、そうなると>>757で頂いたレスの意図が分からないです。
protectedすると、引数で他のbaaを受け取ったとき、nにアクセス出来るのでしょうか。

762 名前:760 mailto:sage [2005/07/24(日) 00:40:00 ]
753のコードでは、bar<T>::nがprotectedならfoo<T>::set_valの中でarg.nにアクセスできると思っていたがそうではなかったようだ。
スマソ

763 名前:デフォルトの名無しさん mailto:sage [2005/07/24(日) 01:03:17 ]
>>761
アクセスできると思ってた。けど間違ってたのなら失礼。
・基本 class から 派生 class を public 継承したとき、
・基本 class の protected member である n について、
・派生 class から this の n にアクセスできる。
・派生 class から this 以外の n にアクセスできない。
ということかな?も一回勉強しなおそ。

・ある class の private member である n について、
・その class から this の n にアクセスできる。
・その class から this 以外の n にアクセスできる。
というのは間違いないと思うんだけど。

あと自分の VC7 は、これに関して template class かそうでないかによって
コンパイル結果が違うのもよくわからない。

764 名前:デフォルトの名無しさん mailto:sage [2005/07/24(日) 02:17:54 ]
勉強しなおした。>>763は間違い多数につきスルーよろしく。失礼しますた。


765 名前:デフォルトの名無しさん mailto:sage [2005/07/28(木) 18:38:46 ]
Compile-time if
で型でなく値を返すにはどうすればいいのでしょうか?
int v= boost::mpl::if_c< (sizeof(T) <= sizeof(double)), 10, 20 >::Value
はだめでした


766 名前:デフォルトの名無しさん mailto:sage [2005/07/28(木) 19:41:12 ]
>>765
boost::mpl::int_
を使って、型にマップすればいい。

767 名前:デフォルトの名無しさん mailto:sage [2005/07/28(木) 19:56:38 ]
>>765
struct R0 {
enum {value = 10};
};
struct R1 {
enum {value = 20};
};
template <typename T>
int func ()
{
typedef typename boost::mpl::if_c <(sizeof (T) <= sizeof (double)), R0, R1>::type Result;
return Result::value;
}


768 名前:デフォルトの名無しさん mailto:sage [2005/07/29(金) 10:42:43 ]
template<CONTANER>
class CmyContaner
{
typedef CONTANER::iterator iterator_type;
};
としたらコンパイル通らなかったんですが、
CONTANER::iteratorはできないってことなのでしょうか?

769 名前:デフォルトの名無しさん mailto:sage [2005/07/29(金) 11:35:24 ]
>>768
-typedef CONTANER::iterator iterator_type;
+typedef typename CONTANER::iterator iterator_type;




770 名前:デフォルトの名無しさん mailto:sage [2005/07/29(金) 15:37:41 ]
そのままじゃ型名かメンバ変数かわからんからね。

> CONTANER
北斗の拳の主題歌を思い出すスペルミスだな。

771 名前:デフォルトの名無しさん mailto:sage [2005/07/29(金) 16:46:27 ]
>>768
ここもだね
-template<CONTANER>
+template<typename CONTANER>


772 名前:デフォルトの名無しさん [2005/07/30(土) 08:40:48 ]
template<Functor>
class MyMethod
{
public:
Functor f_
MyMethod(Functor f):f(f_)
{}
value()
{
f_(10);
}
};

class MyClass
{
public:
struct MyFunctor{
operator()(int a)
{
std::cout << a;
}myFunc;

//MyMethod<MyFunctor> myMethod(myFunc);//コンパイル通らない
MyMethod<MyFunctor> myMethod(MyFunctor);//なぜかコンパイル通る
value(){
myMethod.value();//左側がクラス 構造体 共用体でありません と怒られる
}
};

クラスの中でfunctorを定義したら動かなくなりました。
回避方法はないのでしょうか?

773 名前:デフォルトの名無しさん mailto:sage [2005/07/30(土) 09:48:49 ]
>>772
>クラスの中でfunctorを定義したら動かなくなりました。
クラスの外でfunctorを定義したらそれ動く?


774 名前:デフォルトの名無しさん mailto:sage [2005/07/30(土) 13:47:17 ]
>772
とりあえず } が 1 個足りない。
} myFunc; の前に 1 個ある、でいいのか?

>MyMethod<MyFunctor> myMethod(MyFunctor);
これだと MyFunctor 型の引数をとり、MyMethod<MyFunctor> 型を返すメンバ関数 myMethod を
宣言しているんじゃまいか?

>//MyMethod<MyFunctor> myMethod(myFunc);//コンパイル通らない
なんでメンバ変数を宣言してるのに初期化しようとしてるの?

MyMethod<MyFunctor> myMethod;
MyClass() : myMethod(myFunc) {}

じゃねーのか?あと↑だと myFunc との初期化順序が問題になる場合があるかも。
今回の場合、MyClass() : myMethod(MyFunctor()) でいいような気もするが。

775 名前:772 [2005/07/30(土) 14:59:26 ]
すみません } が1つぬけてました。

template<Functor> class MyMethod
にclass の外で定義したfunctorを使うと
意図したとうりの動きをすることを確認しています。

776 名前:デフォルトの名無しさん mailto:sage [2005/07/30(土) 15:06:57 ]
>>775
>class の外で定義したfunctorを使うと
>意図したとうりの動きをすることを確認しています。
本当に?
コピペにかなりミスがあると思うよ
MyMethod::value()
MyClass::MyFunctor::operator()(int a)
の返値の型は?

もし本当に動くなら処理系を教えてね


777 名前:776 mailto:sage [2005/07/30(土) 15:09:07 ]
たぶんこんなことしたいのかな
template <typename Functor>
struct MyMethod {
Functor f_;
MyMethod (Functor f): f_(f) {}
void value () {f_ (10);}
};
struct MyClass {
struct MyFunctor {
void operator () (int a) {
std::cout << a;
}
} myFunc;
MyMethod <MyFunctor> myMethod;
MyClass (): myFunc (), myMethod(myFunc) {}
void value() {myMethod.value();}
};


778 名前:デフォルトの名無しさん mailto:sage [2005/08/02(火) 22:23:20 ]
template<X>
class CHoge
{public:
CHoge( X= typeof(x) ) {}
};
なんてできないの?
自動で型判別してほしい。
自動判別した型を使ってCompile-time Ifもできるとさらにいいんだけど

779 名前:デフォルトの名無しさん mailto:sage [2005/08/02(火) 23:18:35 ]
>>778
>自動で型判別してほしい。
>自動判別した型を使ってCompile-time Ifもできるとさらにいいんだけど
これらはできるけど
例で何がしたいのかさっぱり分かりません




780 名前:デフォルトの名無しさん mailto:sage [2005/08/05(金) 23:15:18 ]
template< ArrayType >
function( ArrayType array)
{
Compile-time If (ArrayType はポインタの配列?)
{
int a= array[0]->value;
}else{
int a= array[0].value;
}
こんなことがしたい

781 名前:デフォルトの名無しさん mailto:sage [2005/08/05(金) 23:30:47 ]
type_traitsでいいんじゃないの?

782 名前:デフォルトの名無しさん mailto:sage [2005/08/06(土) 00:52:15 ]
個人的には値の配列とポインタの配列を静的多相に扱おうとする行為そのものに
異議を申し立てたい.

783 名前:デフォルトの名無しさん mailto:sage [2005/08/06(土) 02:36:31 ]
次のようなコードが、Visual C++では通るけどGCCでは通りません。

オブジェクトの名前と番号の型を保持する構造体を用意

template<class S,class I>
struct Types
{
  typedef S String;
  typedef I Integer;
};

この定義を受け取って型を定義するベースクラスを作成

template<class T>
struct Base
{
  typedef typename T::String StringType;
  typedef typename T::Integer IntegerType;
};

そして、これを利用するサブクラスを作成。

template<class T>
struct Derived : public Base<T>
{
  StringType name; //!< ここでコンパイルエラー
  IntegerType number; //!< 同様
};

typedef Types<std::string,int> StdTypes;
Derived<StdTypes> derived;


784 名前:デフォルトの名無しさん mailto:sage [2005/08/06(土) 02:38:23 ]
続き

以下のように書けばGCCでもコンパイルは通ります。

typename Derived::StringType name;
typename Derived::IntegerType number;

こんな面倒な書き方しかできないなら、
わざわざベースクラスにtypedefした意味がないんですが
何かいい方法ありませんか?


785 名前:デフォルトの名無しさん mailto:sage [2005/08/06(土) 02:58:54 ]
>>783-784
Base の定義中に typename が必要な理由を知っていれば、無理だと予想が付くだろうに。

786 名前:デフォルトの名無しさん mailto:sage [2005/08/06(土) 07:54:33 ]
>>783-784
俺だったら
Base::Stringと書けないか
Derivedの中にusing Base::String;と書けばStringが使えないか
の2つをまず試してみる。これでできるかどうかはもちろんしらんが。

787 名前:デフォルトの名無しさん mailto:sage [2005/08/06(土) 09:04:33 ]
Baseを使うなら、
typename Base<T>::StringType name;
typename Base<T>::IntegerType number;
こうなるから、これこそ、
> わざわざベースクラスにtypedefした意味がない
ので、>>784のやり方が良いだろう。

VC++もそのうち>>783は駄目になることでしょう。


788 名前:デフォルトの名無しさん mailto:sage [2005/08/06(土) 09:32:41 ]
>>784
それVC7.1のバグらしい。
面倒見が良すぎて、typenameを本来ならば書かなければならない
所を、曖昧さがない場合は無くても通してしまう。

VC7.1でもちゃんと typename は書くべき。

789 名前:デフォルトの名無しさん mailto:sage [2005/08/06(土) 12:59:29 ]
このスレの難読コードをみて
おれにとて


C++はなかたことになた



790 名前:デフォルトの名無しさん mailto:sage [2005/08/06(土) 13:03:53 ]
そんなだから、未だに君にとってこの程度が「難読コード」なんだよ。

791 名前:デフォルトの名無しさん mailto:sage [2005/08/06(土) 13:07:40 ]
俺もtemplateのコードは可読性が低いと思うよ
唯一の弱点だな

792 名前:デフォルトの名無しさん mailto:sage [2005/08/06(土) 13:32:35 ]
テンプレートとC++「本体」って明らかに別の言語だよな。
概念の異なる2つの言語が混在してるんだから、
可読性が低いのは当たり前。


793 名前:デフォルトの名無しさん mailto:sage [2005/08/06(土) 15:19:32 ]
>>792
じゃあどういう構文にすればいいよ?


794 名前:デフォルトの名無しさん mailto:sage [2005/08/06(土) 19:15:56 ]
構文の話なのかな。

795 名前:デフォルトの名無しさん mailto:sage [2005/08/06(土) 19:21:27 ]
>>784
template<class T>
struct Derived : public Base<T>
{
typedef Base <T> Base_;
typedef typename Base_::StringType StringType;
typedef typename Base_::IntegerType IntegerType;
StringType name;
IntegerType number;
};


796 名前:デフォルトの名無しさん mailto:sage [2005/08/06(土) 20:27:48 ]
>>795 意味無いじゃん。

797 名前:神゜ mailto:sage [2005/08/06(土) 20:49:53 ]
そろそろ俺の出番か?

798 名前:デフォルトの名無しさん mailto:sage [2005/08/06(土) 21:04:29 ]
>>784
ベースクラスがテンプレート依存でなければ StringType,IntegerType
は見えるが、そうでない場合は 795 のように書く必要がある。

実はずっと前の GCC で VC7.1 みたくエラーにならない時期が
あったんだが、バージョン上げたらエラーになったんで仕様を
確認したことがあったのを思い出したよ。

799 名前:デフォルトの名無しさん mailto:sage [2005/08/06(土) 23:17:54 ]
>>798
2.95あたりは確かそうだったね




800 名前:デフォルトの名無しさん mailto:sage [2005/08/07(日) 16:48:53 ]
template<class A>
struct Foo
{
  template<class B>
  struct Bar
  {
  };
};

このBarだけを特殊化するのって、GCCでは

template<>template<>
struct Foo<int>::Bar<int>

って書かなきゃならないんだね。
VC++7.1では

template<>
struct Foo<int>::Bar<int>

で通るんだけど、これはバグなのかな?


801 名前:デフォルトの名無しさん mailto:sage [2005/08/07(日) 16:55:26 ]
>>800
どっちが規格に準じてるかによるね


802 名前:デフォルトの名無しさん mailto:sage [2005/08/07(日) 17:00:26 ]
>>800
14.7.3.17 より
"If the declaration of an explicit specialization for such a member appears in namespace scope, the member declaration shall be preceded by a template<> for each enclosing class template that is explicitly specialized."

template<> template<> ... と繰り返すのが正解っぽい。

803 名前:デフォルトの名無しさん mailto:sage [2005/08/07(日) 17:10:09 ]
>>800
gccを信じてそちらに合わせておけ。

804 名前:デフォルトの名無しさん mailto:sage [2005/08/07(日) 17:27:08 ]
>>800
gccのバージョンは何?
g++ 3.3.5
だとそれ両方とも通るんだけど
新しいのは通らないのかな?


805 名前:デフォルトの名無しさん mailto:sage [2005/08/07(日) 18:19:07 ]
template <class T>
typename enable_if<boost::is_integral<T>, void>::type
foo(T t) {}
で関数を定義したりできないのはわかるけど
これでclassのコンストラクターを定義したりしなかったりを決めると

コンストラクターに戻り値が定義されています

と怒られる。何か方法ないのでしょうか?
template <class T>
class A{
typename enable_if<boost::is_integral<T>, void>::type
A(T t) { }
}

806 名前:デフォルトの名無しさん mailto:sage [2005/08/07(日) 18:44:57 ]
>>805
SFINAEは戻り値の型でやる方法と(デフォルト)引数の型でやる方法の2通りできて,
コンストラクタの場合は戻り値の型を指定できないですから引数の型のほうでやります.

template<class T>
class T{
A(T t, typename enable_if<boost::is_integral<T> >::type * = 0){}
};

こんな感じで.逆に演算子関数の場合は余計なデフォルト引数を指定できないので
戻り値型で,という感じになると思います.

807 名前:デフォルトの名無しさん mailto:sage [2005/08/07(日) 22:38:01 ]
enable_ifが何をするもんなのか、未だにわかんねえ。
てか、何年英語の勉強してもboostのドキュメントさえ読めない俺ってすげえよ。
よっぽど英語の才能が無いんだな。

808 名前:デフォルトの名無しさん mailto:sage [2005/08/07(日) 22:41:04 ]
テメェは自己紹介がしたいだけだろ
分からねぇんだったらイチイチ出てくんな

809 名前:デフォルトの名無しさん mailto:sage [2005/08/07(日) 22:50:40 ]
>>807
SFINAEによるオーバーロードセットのコントロールを簡単に
行うためのユーティリティ。

英語分からなくてもC++分かるんならひたすらソース詠めば
何となく見えてくる、かもよ。



810 名前:デフォルトの名無しさん mailto:sage [2005/08/07(日) 22:53:46 ]
>>808
なにキレてんのキミ。
相手以上の駄レス書いてたら意味無いのに。

811 名前:デフォルトの名無しさん mailto:sage [2005/08/07(日) 22:59:07 ]
駄レスとかいってたら、ほとんどがそうだろw

812 名前:デフォルトの名無しさん mailto:sage [2005/08/07(日) 23:00:10 ]
ほとんどがそうならなおのこと
突然特定のレスにキレる理由が無いよ。

813 名前:デフォルトの名無しさん mailto:sage [2005/08/07(日) 23:03:27 ]
自己顕示欲丸出しの厨房がウザイだけだろ
まあ、どこにでもいるからいちいちキレるのもどうかと思うが

814 名前:デフォルトの名無しさん mailto:sage [2005/08/07(日) 23:16:33 ]
キレて説教するほうがよっぽど自己顕示欲激しいと思う。
世に言う自爆ですな。アホくさ。

815 名前:デフォルトの名無しさん mailto:sage [2005/08/07(日) 23:17:52 ]
www.boost.org/libs/utility/enable_if.html
ここの「1.2 Background」は、何が問題だって言ってるんですか?

816 名前:デフォルトの名無しさん mailto:sage [2005/08/07(日) 23:20:01 ]
説教がどう自己顕示欲につながるんだ??

817 名前:デフォルトの名無しさん [2005/08/07(日) 23:22:14 ]
>>814
ワロス

818 名前:デフォルトの名無しさん mailto:sage [2005/08/07(日) 23:29:27 ]
>>816
キレるたびにいちいちスレ違いの書き込みするような奴が
自己顕示欲薄いって言い張る気?

819 名前:デフォルトの名無しさん [2005/08/07(日) 23:30:34 ]
enable_ifがわからんってののどこが自己顕示欲に繋がるのかもわからんけどな



820 名前:デフォルトの名無しさん [2005/08/07(日) 23:30:49 ]
>>818
藻前もキレてるじゃん
あと煽り耐性なさ過ぎ
いい加減スルーしろよ

821 名前:デフォルトの名無しさん mailto:sage [2005/08/07(日) 23:31:47 ]
>>815
いや,そこの部分は別に何かが問題だなんて書いてないです.
単にSFINAEというのがどう機能するか(そしてなぜそのような機能が必要なのか)
を説明しているだけです.

822 名前:デフォルトの名無しさん mailto:sage [2005/08/07(日) 23:32:15 ]
816が煽りには見えないけどなあ。
普通にズレてるだけで。

823 名前:デフォルトの名無しさん mailto:sage [2005/08/07(日) 23:32:55 ]
>>815
あっと,「もしSFINAEがなければこういうことが問題だよね」というのは書いてますけれど.

824 名前:デフォルトの名無しさん [2005/08/07(日) 23:35:03 ]
>>822
分かったからもう出てくんな

825 名前:デフォルトの名無しさん mailto:sage [2005/08/07(日) 23:40:11 ]
本日の推奨NG
「。」「顕示」「煽り」「キレ」
すっきりして(・∀・)イイ!!

826 名前:デフォルトの名無しさん mailto:sage [2005/08/08(月) 02:07:36 ]
expressional template
VC.net2003だと、ちょっと複雑な式を書いただけで
コンパイル通らない。
そういうものなの?
gccなら通るのかな

827 名前:デフォルトの名無しさん mailto:sage [2005/08/08(月) 02:12:44 ]
>>826 その「ちょっと複雑な式」とやらを晒すとレスが付くかもしれない。

828 名前:デフォルトの名無しさん [2005/08/08(月) 03:35:21 ]
>>826
現存する如何なるコンパイラでも通らない程複雑(広義の)なコードに問題ありに100円。


829 名前:デフォルトの名無しさん mailto:sage [2005/08/08(月) 04:40:19 ]
ネストが17超えるとか?




830 名前:デフォルトの名無しさん mailto:sage [2005/08/08(月) 15:16:31 ]
いろんな要素が混じってるので必ずしもexpressional templateが
原因でないのかもしれないけど

boost::numeric::ublas::matrix & A(){return A_ }
boost::numeric::ublas::matrix & B(){return B_ }

B() = prod( A(), A())*3 + B() + ....

こんな感じかな.全部はさらせないのですまそ

831 名前:デフォルトの名無しさん mailto:sage [2005/08/09(火) 01:41:27 ]
>>830
エラー貼ったがいいよ
もし膨大なら
再現するコンパイル可能な最小のコードを貼って


832 名前:831 mailto:sage [2005/08/09(火) 01:45:25 ]
>コンパイル可能な
おっとコンパイルは通らないのか

>あなたがコンパイル通らないことを理不尽に思う
に訂正

ようするにテストする側の身になってコードを
貼ってください


833 名前:デフォルトの名無しさん mailto:sage [2005/08/09(火) 11:45:51 ]
>>830
>こんな感じかな.全部はさらせないのですまそ

じゃあ、他の人にエラーの原因を調べてもらうのも諦める事ですな。
証拠不十分なまま、証言台に立つような物ですぞ。

834 名前:デフォルトの名無しさん mailto:sage [2005/08/20(土) 08:39:28 ]
だれもいない

835 名前:デフォルトの名無しさん mailto:sage [2005/08/20(土) 20:28:20 ]
ホントにだれもいないのかよ

836 名前:デフォルトの名無しさん [2005/08/20(土) 20:39:26 ]
いねーよ

837 名前:デフォルトの名無しさん mailto:sage [2005/08/20(土) 20:40:28 ]
質問やら話題があれば人は自然と集まってくる。

838 名前:デフォルトの名無しさん mailto:sage [2005/08/20(土) 20:52:57 ]
おまえら
”てんぷれーと”にだまされてないか?
”しーぷらぷらのてんぷれーと”って結局あれだよ。
中途半端。
そう中途半端。
LISPに比べたら。
全然読み易くならない。
いろんな括弧であふれてLISPの方がまだサルのように読みやすい。
まあここにタムロしてるおまえらの言い分は判ってるよ
こうだろ、静的カタカタ型が重要なんです!
LISPじゃすぴーどでないよプププ
とかな。
ばーか。
カタなんかより柔軟性なんだよこのご時世はよ
カタカタうるせーのなんのって、笑うわ。
C++考えた奴みたいにハゲろ
全員

839 名前:デフォルトの名無しさん mailto:sage [2005/08/20(土) 20:59:39 ]
確かに、「ネイティブコード吐く言語じゃないと速度が」
とか必死に言ってる奴に優秀なプログラマはいないな。




840 名前:デフォルトの名無しさん mailto:sage [2005/08/20(土) 21:10:42 ]
しーぷらぷらの処理系。
てんぷれーとバグだらけ。
笑うわ。
いったい何年てんぷれーとやってんだよ
おまえらがべんだーの修正待つあいだに
おれLISPで新しいマクロどっさり作る
生産性バカたけぇーわLISPはよ
LISPはカタないからすぴーどでないよプププて、
そりゃ頭がかてえ証拠だな。
そんな奴は引退したほーがいいんじゃねーかなあ
LISPにカタないなら組み込めよ、ハゲども
ぶーとすとらっぷとか考えろよ
わかるか?ぶーとすとらっぷって。
しーぷらぷらにはそんながいねんはないかもなあ。
最適化なんかやりやすいなーすいすいいけるぜ
こんすの海の中にいると不満なんてすぐ解消する
それがLISP。
まあ頭のかたいカタカタ野郎は
やっぱりC++考えた奴みたいにハゲろ
全員

841 名前:デフォルトの名無しさん mailto:sage [2005/08/20(土) 21:16:51 ]
>>839よりは優秀だけどね。

842 名前:マイク ◆yrBrqfF1Ew mailto:sage [2005/08/20(土) 21:31:32 ]
C++をしーぷらぷらなんて言うのは無能。

843 名前:デフォルトの名無しさん mailto:sage [2005/08/20(土) 21:59:52 ]
C++でLisp系の俺言語&処理系作るのが最近の俺の趣味なんだが、
なんかこいつの仲間と思われたくないな、恥ずかしくて。

844 名前:デフォルトの名無しさん mailto:sage [2005/08/20(土) 22:59:08 ]
>>842
シープラスプラス?
それともシーたすたす?


845 名前:デフォルトの名無しさん mailto:sage [2005/08/20(土) 23:33:28 ]
しーいんくりめんと

846 名前:デフォルトの名無しさん mailto:sage [2005/08/20(土) 23:43:58 ]
C++
後置ということは、まだ本当のC++にはであてないわけだ

847 名前:デフォルトの名無しさん mailto:sage [2005/08/20(土) 23:45:24 ]
C++には出会えている
++Cに出会えてないだけ

848 名前:デフォルトの名無しさん mailto:sage [2005/08/21(日) 00:37:45 ]
838は、C++のテンプレートが読みにくく、
コンパイラのバグのことも分かっていて、
C++作った人物についても詳しいようだな

849 名前:デフォルトの名無しさん mailto:sage [2005/08/21(日) 00:48:03 ]
Schemeの純粋指向にはあこがれるけど、Lispはどうでもいいや。
継続は面白いな。

>LISPはカタないからすぴーどでないよプププて、
型が無いと遅くなるつうのは初耳ですが、どこの情報?



850 名前:デフォルトの名無しさん mailto:sage [2005/08/21(日) 01:06:13 ]
>>849
VBのバリアント型みたくデータ側に型情報があるから
オブジェクトを参照するたびに動的な判定が毎回必要ってことだよ。
型判定に値の取り出しとか最低でもCの3倍以上のコストが掛かる。
Rubyが遅いのもこれがかなり影響してる。

851 名前:デフォルトの名無しさん mailto:sage [2005/08/21(日) 01:09:17 ]
でも日本語は不自由なようだ。

852 名前:851 mailto:sage [2005/08/21(日) 01:09:45 ]
>>838

853 名前:デフォルトの名無しさん mailto:sage [2005/08/21(日) 01:25:23 ]
> オブジェクトを参照するたびに動的な判定が毎回必要ってことだよ。
随分ダサい実装ですね。

854 名前:デフォルトの名無しさん mailto:sage [2005/08/21(日) 01:41:07 ]
そのダサイ実装を越えたところに桃源郷が

855 名前:デフォルトの名無しさん mailto:sage [2005/08/21(日) 01:41:43 ]
ももげんごう?

856 名前:デフォルトの名無しさん mailto:sage [2005/08/21(日) 12:12:15 ]
ももげんごう(←なか変換できない)

857 名前:デフォルトの名無しさん mailto:sage [2005/08/21(日) 14:42:55 ]
桃源郷=Xanadu キサナドゥ

858 名前:デフォルトの名無しさん mailto:sage [2005/08/22(月) 00:38:44 ]
>>850
正直、有名なコンパイラならそんなださい実装は少ないよ。
Common Lispには型指定の構文があるくらいだし。

859 名前:デフォルトの名無しさん mailto:sage [2005/08/23(火) 09:18:30 ]
数値計算したい人は
速度気にしないならlistでなくてMatlab使う



860 名前:デフォルトの名無しさん mailto:sage [2005/08/23(火) 15:06:35 ]
>>858
CLOS基地外氏ね
スレ違いだし

861 名前:デフォルトの名無しさん mailto:sage [2005/08/23(火) 15:34:43 ]
だれもいないからとか言うから

862 名前:デフォルトの名無しさん mailto:sage [2005/08/23(火) 16:29:46 ]
人稲杉なので、チラシの裏

boost::bind は、bind( f, _1, _2, a, b, _1 ) を行うことで、
func::return_type ( A1 & a1, A2 & a2 ) というファンクタを返すけど、
この _1 や _2 を、_decimal や、_text、_float のような書式指定プレイスホルダに
置き換えて、以下のようにすれば、タイプセーフな printf が出来るなと
考えたことがあった。

function< void( int ) > f = format( cout, "a = ", _hex, endl );
// ↑ cout << "a=" << %x << endl; と同じ事を行うファンクタを返す。
f( 10 ); // cout << "a=" << hex << 10 << endl;
f("aaa"); // コンパイルエラー

上の形とは違うけどその思想に基づいて実際に作ってみたことがある。
でも結局実用では (w)sprintf しか使わなかった。勉強にはなったけどね。
template プログラミングは楽しいけど、冷静なるとしなくていいことまで
テンプレート化してたりしていることがあるので気をつけないと。

863 名前:デフォルトの名無しさん mailto:sage [2005/08/23(火) 17:12:40 ]
>>862
> 冷静なるとしなくていいことまでテンプレート化してたりしていることがある
昨夜、そんな関数テンプレートを必死で非テンプレート関数に直してた・・・。
数日前に必死で関数テンプレートにした箇所だったのだけど・・・。

864 名前:デフォルトの名無しさん mailto:sage [2005/08/24(水) 12:24:27 ]
template<typename X_TYPE>
void xxx(X_TYPE x)
{}
として型の自動認識の手間減らしは多用するな

865 名前:デフォルトの名無しさん mailto:sage [2005/08/24(水) 13:32:40 ]
そうね。時々やる。いっそのこと型を書くのはオプションにして
MLみたいに型推論してくれればいいのにと思う。


866 名前:デフォルトの名無しさん mailto:sage [2005/08/24(水) 17:50:00 ]
C++ 0xだとそんな機能が追加されるとかされないとか。

867 名前:デフォルトの名無しさん [2005/08/28(日) 09:36:27 ]

テンプレートがちんぷんかんぷんでまったく理解できない私に
理解できるようになる方法を教えてください。まじで。


868 名前:デフォルトの名無しさん mailto:sage [2005/08/28(日) 11:02:49 ]
引数の型を使うときに決められるんだよ。

869 名前:デフォルトの名無しさん mailto:sage [2005/08/28(日) 11:35:27 ]
>>867
騙されたと思ってstd::min()でも使って味噌。



870 名前:デフォルトの名無しさん mailto:sage [2005/08/28(日) 13:22:51 ]
せめてstd::vector くらい使わないとありがたみ沸かないだろう。

871 名前:デフォルトの名無しさん mailto:sage [2005/08/28(日) 18:04:02 ]
>>867
つ[C++ Templates(英文)]

872 名前:デフォルトの名無しさん mailto:sage [2005/08/29(月) 06:58:30 ]
STL バンザイ

873 名前:デフォルトの名無しさん mailto:sage [2005/08/29(月) 21:56:02 ]
STLとboostが無かったら俺C++使いつづけて無かったよ。

874 名前:デフォルトの名無しさん mailto:sage [2005/08/29(月) 22:30:29 ]
俺もそうだ。

875 名前:デフォルトの名無しさん mailto:sage [2005/09/03(土) 00:21:09 ]
会社でtemplate使うなって言われたんだけど…
何故?

876 名前:デフォルトの名無しさん mailto:sage [2005/09/03(土) 00:24:13 ]
会社で使いこなせるヤシがいないからと邪推

877 名前:デフォルトの名無しさん mailto:sage [2005/09/03(土) 00:31:06 ]
代わりにLISP使え

もっと困るかもな
へへ

878 名前:デフォルトの名無しさん mailto:sage [2005/09/03(土) 03:19:35 ]
>>875
それは、あなたが馬鹿だからです。

879 名前:デフォルトの名無しさん mailto:sage [2005/09/03(土) 03:26:37 ]
お前だけは使うなって言われたなら
そうかもしれないけどさ



880 名前:デフォルトの名無しさん mailto:sage [2005/09/03(土) 09:13:41 ]
>>875
まともな会社にうつるべし

881 名前:デフォルトの名無しさん mailto:sage [2005/09/03(土) 09:55:32 ]
>>875
会社に聞け。
ここで聞くようなやつは>>878に決定。

882 名前:デフォルトの名無しさん mailto:sage [2005/09/03(土) 10:02:04 ]
>>881
なんでそんな必死にこの話題にフタしたがるの?
コンプレックスでも刺激された?w

883 名前:デフォルトの名無しさん mailto:sage [2005/09/03(土) 11:09:31 ]
>>882
頭、大丈夫か?

884 名前:デフォルトの名無しさん mailto:sage [2005/09/03(土) 14:45:37 ]
VC6のプログラム保守してるとかじゃないのか>875


885 名前:デフォルトの名無しさん mailto:sage [2005/09/03(土) 22:33:39 ]
>>883
大丈夫だよ。
質問に答えられない誰かさんの頭は大丈夫じゃないみたいだけど。

886 名前:デフォルトの名無しさん mailto:sage [2005/09/04(日) 03:17:12 ]
・移植性重視
・扱える開発者が少ない or メンテする人が固定とは限らない

のどっちかだろうねえ
後者の事情のほうが多いと思うけども

887 名前:デフォルトの名無しさん mailto:sage [2005/09/09(金) 02:16:23 ]
管理職の団塊世代が、ピュアなC以外理解できないとか


888 名前:デフォルトの名無しさん mailto:sage [2005/09/09(金) 22:28:28 ]
名前空間→記述が冗長すぎる
テンプレート→制限が多すぎる
クラス→継承が可読性を悪化させる
その他→コンパイル時間が長すぎる

889 名前:デフォルトの名無しさん mailto:sage [2005/09/09(金) 23:39:18 ]
C++→俺が解からない



890 名前:デフォルトの名無しさん mailto:sage [2005/09/09(金) 23:45:15 ]
俺が解からない→みんなも解からない

891 名前:デフォルトの名無しさん mailto:sage [2005/09/10(土) 02:04:02 ]
>>886
>移植性重視

templateって移植性下がるの?

892 名前:デフォルトの名無しさん mailto:sage [2005/09/10(土) 02:33:11 ]
例えばGCCと心中するつもりならGCCで動けばOKって人もいるでしょ

893 名前:デフォルトの名無しさん mailto:sage [2005/09/10(土) 02:46:27 ]
>>891
ある程度ISO C++に準拠したコンパイラがない環境には移植できなったりだとか。

894 名前:デフォルトの名無しさん mailto:sage [2005/09/10(土) 03:16:30 ]
少なくとも、vc7.1とgccの両方で動くテンプレートくらい書けないと
話にならないと思うけど。


895 名前:デフォルトの名無しさん mailto:sage [2005/09/10(土) 12:53:08 ]
VC7.1とgcc3.3以降で動くテンプレート書くのは簡単だろ、どっちもほぼ100%標準準拠なんだから。
むしろVC6とかgcc3.2とかで動くか動かないか判断する方が難しいと思われ。

896 名前:デフォルトの名無しさん mailto:sage [2005/09/10(土) 13:14:28 ]
>>895
VC6とgcc3.2以前はもうあきらめた。
というかエラーメッセージすらとんちんかんな時があるのが頭痛い。

昔の仕事のプロジェクトコードのメンテでちょっとしたテンプレート書いてとかで
引っかかると泣きたくなる。


897 名前:デフォルトの名無しさん mailto:sage [2005/09/10(土) 13:25:22 ]
>>894-895
まるで、複数コンパイラで有効なテンプレートを書くのが上級者であるかのような言い方だな。
そういった汎用性のあるテンプレートは入門者レベルの機能しか使ってない。
君らは、入門者レベルのテンプレートしか書いたことないんだろ?

898 名前:デフォルトの名無しさん mailto:sage [2005/09/10(土) 13:31:55 ]
スレの存在を否定するような行為が、目下のベストな対処法

「技巧に走らない」

899 名前:デフォルトの名無しさん mailto:sage [2005/09/10(土) 14:04:38 ]
>>897
> であるかのような言い方だな。
印象だけでものを書く場合、その印象がトンチンカンだと
残りの文章がすべてトンチンカンになるから今後は気をつけな。



900 名前:デフォルトの名無しさん mailto:sage [2005/09/10(土) 14:25:57 ]
シンプル伊豆ベスト

901 名前:デフォルトの名無しさん mailto:sage [2005/09/10(土) 15:15:35 ]
>>897
「入門者レベル」とか「汎用性のある」とか、
自分が「上級者」じゃない事がバレバレなんですがw

まぁ、恥の上塗りだけはしないようになw


902 名前:名無しさん@そうだ選挙に行こう [2005/09/10(土) 18:43:40 ]
>>888
つまり、templateに限らずC++は糞だって事で包茎?

903 名前:名無しさん@そうだ選挙に行こう mailto:sage [2005/09/10(土) 19:37:56 ]
ていうかお前が包茎。

904 名前:名無しさん@そうだ選挙に行こう mailto:sage [2005/09/10(土) 19:45:33 ]
24時間テレビ C++ は地球を救う

905 名前:名無しさん@そうだ選挙に行こう mailto:sage [2005/09/10(土) 20:09:37 ]
>>902,904
んなこたーない。


906 名前:名無しさん@そうだ選挙に行こう mailto:sage [2005/09/10(土) 22:11:14 ]
>>894は馬鹿だな。

907 名前:名無しさん@そうだ選挙に行こう mailto:sage [2005/09/11(日) 01:31:57 ]
894は、VC以外でも通るように、typenameちゃんと書けとか
その程度の意味じゃねえの?

908 名前:名無しさん@そうだ選挙に行こう mailto:sage [2005/09/11(日) 05:40:17 ]
言語仕様が複雑すぎて処理系が追いつかないのは本末転倒

言語仕様満たしてから最適化とかやれよ馬鹿ベンダーはよ
現実逃避してんじゃねーよ

909 名前:名無しさん@そうだ選挙に行こう [2005/09/11(日) 07:05:25 ]
ヒント:需要と供給



910 名前:名無しさん@そうだ選挙に行こう mailto:sage [2005/09/11(日) 09:16:30 ]
つまりDelphiが最強ということになるな。

911 名前:名無しさん@そうだ選挙に行こう mailto:sage [2005/09/11(日) 09:37:08 ]
Delphi知らないんだけどtemplateみたいなのあるの?

912 名前:名無しさん@そうだ選挙に行こう mailto:sagen [2005/09/11(日) 09:44:31 ]
あるか!

913 名前:名無しさん@そうだ選挙に行こう mailto:sage [2005/09/11(日) 09:52:58 ]
なぜ怒る・・・。
そこがDelphi信者のコンプレックスなのか?

914 名前:名無しさん@そうだ選挙に行こう mailto:sage [2005/09/11(日) 09:57:55 ]
でもDelphiってすごいよね
一代でここまでメジャーになった言語パッケージってないでしょ
それともPascalの下積みがあったから?

915 名前:名無しさん@そうだ選挙に行こう mailto:sage [2005/09/11(日) 10:18:13 ]
>>914
世間ではC#の方がメジャーだと思うがね。

916 名前:名無しさん@そうだ選挙に行こう mailto:sage [2005/09/11(日) 10:20:04 ]
C#は単なるM$の宣伝力だと思うけど

917 名前:名無しさん@そうだ選挙に行こう mailto:sage [2005/09/11(日) 11:13:26 ]
>>916
CとかC++から名前の連続性もあるしね。


918 名前:名無しさん@そうだ選挙に行こう mailto:sage [2005/09/11(日) 12:07:50 ]
C#なんて使って製品開発とかしてる香具師っているの?

919 名前:名無しさん@そうだ選挙に行こう mailto:sage [2005/09/11(日) 14:40:54 ]
天下のM$がVBで真似したぐらいだからな
当時はRADは斬新な開発環境だった



920 名前:名無しさん@そうだ選挙に行こう mailto:sage [2005/09/11(日) 15:18:44 ]
Delphi使いこそプログラマの頂点ということか。

921 名前:名無しさん@そうだ選挙に行こう mailto:sage [2005/09/11(日) 16:34:19 ]
Delphiが当初からMS謹製であったならば、VBだ、MFCだ、ATLだ、WTLだ、
STLだ、.Netだ、C#だ、C++/CLIだといったことで右往左往することもなく
10年間一貫とした言語体制、RAD環境、爆速コンパイル、コンポーネント化
による高い生産性等々を皆が維持・共有できたかと思うと残念でならないよ。

922 名前:名無しさん@そうだ選挙に行こう mailto:sage [2005/09/11(日) 16:49:55 ]
C#って、Delphi作った香具師が理想の言語として設計したんだろ。

Delphi信者御苦労様w


923 名前:名無しさん@そうだ選挙に行こう mailto:sage [2005/09/11(日) 18:34:04 ]
まだDel厨いたのか
そろそろ博物館に行けよ

924 名前:名無しさん@そうだ選挙に行こう mailto:sage [2005/09/11(日) 20:14:45 ]
博物館の恐竜が一緒に浮かれて踊ったぜ

925 名前:名無しさん@そうだ選挙に行こう mailto:sage [2005/09/11(日) 23:35:20 ]
>>921
STLだけその中で異質だな。

926 名前:デフォルトの名無しさん mailto:sage [2005/09/12(月) 09:47:06 ]
予想通り嫌Del厨が暴れることになったか・・・

927 名前:デフォルトの名無しさん mailto:sage [2005/09/12(月) 11:54:51 ]
つか、スレ違いうぜぇですよ?

928 名前:デフォルトの名無しさん mailto:sage [2005/09/12(月) 11:58:56 ]
>>924
子門乙

929 名前:デフォルトの名無しさん [2005/09/14(水) 15:45:52 ]
template< typename char_type, tepename char_traits >
std::basic_ostream< char_type, char_traits >& operator<< ( std::basic_ostream< char_type, char_traits >& stream, const int& value )
{
stream << "value = " << value << endl;
return stream;
}

この関数内で文字列リテラル"value = "を
char_type がcharなら、"value = "
char_type がwcharなら、L"value = "
にしたいんですが、どうしたら良いでしょうか?



930 名前:デフォルトの名無しさん mailto:sage [2005/09/14(水) 16:12:57 ]
>>929
テンプレートの特殊化か、オーバーライドで解決させる。

ex)
inline char const * choice( char const * s, wchar_t const *, char )
{
 return s;
}
inline wchar_t const * choice( char const *, wchar_t const * s, wchar_t )
{
 return s;
}

stream << choice("value=",L"value=",char_type()) << value << endl;

931 名前:929 mailto:sage [2005/09/14(水) 16:31:48 ]
>>930
#define literal_str( char_type, str ) choice( str, L##str, char_type##() )
付きで採用しますた。
ありがとうございました。

932 名前:デフォルトの名無しさん mailto:sage [2005/09/14(水) 17:21:04 ]
>>931
二番目の##は余計。

933 名前:929 mailto:sage [2005/09/14(水) 21:31:05 ]
だからなんだよこのタコ助!

934 名前:デフォルトの名無しさん mailto:sage [2005/09/14(水) 22:41:20 ]
確かに余計だな。

935 名前:929 mailto:sage [2005/09/15(木) 00:04:09 ]
>>933
>>929の著作権は私にあります。
なんなら出るとこ出ても・・
と思いましたがきっと>>933
私にインスパイヤされて誕生した新種なんでしょう。
今回はかんべんしてやります。

936 名前:デフォルトの名無しさん mailto:sage [2005/09/15(木) 11:53:02 ]
template <class T>
void f1(T t)
{
 f2(t);
}

void f2(int) {}

int main()
{
 f1(1);
}

というコードは正しいのでしょうか?

VC7.1 ではコンパイル可能で comeau ではコンパイルできません。

937 名前:デフォルトの名無しさん mailto:sage [2005/09/15(木) 12:50:56 ]
>>936
comeauだとなんてエラーが出るの?


938 名前:636 mailto:sage [2005/09/15(木) 13:09:16 ]
>>637
identifier "f2" is undefined
detected during instantiation of "void f1(T) [with T=int]"

というエラーです。strict mode のみのようです。

ちなみに、ユーザ定義型の場合は期待通りにコンパイルできました。

template <class T>
void f1(T t)
{
 f2(t);
}

struct a{};
void f2(a) {}

namespace adl
{
 struct a{};
 void f2(a) {}
}

int main()
{
 f1(a());
 f1(adl::a());
}

このコードはコンパイル成功。

939 名前:デフォルトの名無しさん mailto:sage [2005/09/15(木) 14:23:18 ]
>>936
gcc3.4.4(MinGW) で、-Wallで通る。



940 名前:デフォルトの名無しさん mailto:sage [2005/09/15(木) 14:26:00 ]
>>938
プロトタイプ宣言したら?

941 名前:デフォルトの名無しさん mailto:sage [2005/09/15(木) 14:31:54 ]
>>938
f2()のプロトタイプ宣言が必要っぽい。

942 名前:デフォルトの名無しさん mailto:sage [2005/09/15(木) 16:28:36 ]
Incompatibilities Between ISO C and ISO C++, David R. Tribble

david.tribble.com/text/cdiffs.htm#C90-impl-func
・ Implicit function declarations

> C++ does not allow implicit function declarations. It is invalid to call a function
> that does not have a previous declaration in scope.
>
> C99 no longer allows functions to be implicitly declared.
> The code above is invalid in both C99 and C++.


943 名前:デフォルトの名無しさん mailto:sage [2005/09/15(木) 17:47:26 ]
>>936
標準の (14.6.4.2/1) をそのまま読む限りでは, unqualified name lookup として
解決される名前は point of definition の文脈のみが考慮されて,
associated namespaces を用いた名前解決(要するにADL)では,point of definitionと
point of instantiation の双方の文脈が考慮されるみたいですね.なので,

>>936 の f1(1) という呼び出しにおける f1 中の f2(t) に対する名前解決の場合,
unqualified name lookup では f2 の呼び出しを定義している場所(point of definition)
からは f2 という名前は解決されないので失敗し,さらに f2(t) は int を引数とした
呼び出しのために associated sets of namespaces and classes も空 (3.4.2/2) の
ため,ADL 経由でも f2 は見つからずに,結果 f2(t) という関数呼び出しに対応する
名前の解決が失敗する.

一方で,>>938 の f1(a()) 及び f1(adl::a()) という呼び出しにおける f1 中の f2(t)
に対する名前解決の場合,>>936 と同様 unqualified name lookup による名前解決は
失敗する.ところが,a 及び adl::a はユーザ定義型で,各々グローバルと adl が
associated namespace になる.この場合,f2(t) という呼び出しが定義されている
場所 (point of definition) と f1 がインスタンス化された場所
(point of instantiation) 双方の文脈が名前解決において考慮される.結果,
point of instantiation の文脈で void f2(a) と void adl::f2(adl::a) が
visible のため,これらの名前解決が成功する.

と,こういう感じだと思います.ちなみに VC++7.1 の挙動は,dependent name だろうが
non-dependent name だろうが,ADL 経由だろうがなかろうが,全て
point of instantiation の文脈も考慮するという実装になっているための結果で,
これは標準に準拠した挙動ではないです.

944 名前:943 mailto:sage [2005/09/15(木) 17:49:27 ]
あ,すいません.長々と書きましたけれど結論としては,
936のコードは(標準に準拠していないという意味で)正しくないと思います.

945 名前:936 mailto:sage [2005/09/15(木) 22:07:49 ]
>>943
なるほど。
実体化の時点で名前の解決を行っても、
実体化の時点の文脈が考慮されるとは限らないんですね。

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

946 名前:デフォルトの名無しさん mailto:sage [2005/09/15(木) 22:41:25 ]
template<class T>
class Foo {
 public:
    ...;
 private:
    class Bar { 
    public:
        ...;
        bool operator()(const Bar& l, const Bar&r) const;
    private:
        T m_value; 
        int misc_info;
    };
    
    std::multiset<Bar, Bar::Comp> m_bars;
};

m_bars の先頭・末尾に番人(misc_value などは他のメ
ンバと同様にアクセス可能にしたもの)を導入したいの
ですが、どういうアプローチで作れば良いでしょうか?


947 名前:デフォルトの名無しさん mailto:sage [2005/09/16(金) 01:33:46 ]
>>946 undeclared identifier `misc_value'

948 名前:デフォルトの名無しさん mailto:sage [2005/09/16(金) 09:43:59 ]
>>946
テンプレート関係ないやん。

949 名前:デフォルトの名無しさん mailto:sage [2005/09/18(日) 16:56:08 ]
STLportではコンパイルできるけれど、
g++のSTLではエラーが出てしまうようなコードってどんなものがあるでしょうか?
vectorやstringくらいしか使ってないんですが、コンパイルでエラーが出ます。。



950 名前:デフォルトの名無しさん mailto:sage [2005/09/18(日) 17:25:59 ]
エラーメッセージ書かん奴には答えない

951 名前:デフォルトの名無しさん mailto:sage [2005/09/18(日) 17:33:35 ]
>>949
氏ね!

952 名前:デフォルトの名無しさん mailto:age [2005/10/05(水) 16:55:29 ]
template<int num, int count> struct power{ enum { value = power<num, count-1>::value * num }; };
template<int num> struct power<num, 1>{ enum { value = num }; };
template<int num> struct power<num, 0>{ enum { value = 0 }; };
template<> struct power<0, 0>{ enum { value = 0 }; };
       ∋oノハヽo∈
         ( ´D`) <テンプレート ♪ で、計算♪計算♪  age♪ age♪
          (つ┳9
         (_)┃_)
          ━§━
            §
   ⌒ヽ〃⌒ヽ〃    
int main()
{ //2の8乗
cout << power<2, 8>::value << endl;
return 0;
}


953 名前:デフォルトの名無しさん mailto:sage [2005/10/05(水) 18:45:40 ]
>template<int num> struct power<num, 0>{ enum { value = 0 }; };

それはどうかと思うぞ。

954 名前:デフォルトの名無しさん mailto:sage [2005/10/05(水) 19:02:12 ]
template<int num> struct power<num, 0>{ enum { value = 1 };};

955 名前:デフォルトの名無しさん mailto:sage [2005/10/05(水) 19:13:50 ]
<0,0>,<num,1>の特殊化は必要ないな

956 名前:デフォルトの名無しさん mailto:sage [2005/10/05(水) 21:12:57 ]
むしろこうしてコンパイル時エラーにしろよ。
template<> struct power<0, 0>{};

957 名前:デフォルトの名無しさん mailto:sage [2005/10/05(水) 21:24:22 ]
0^0って数学的にはどうなるの?

958 名前:ヽ(´ー`)ノ ◆.ogCuANUcE mailto:sage [2005/10/05(水) 22:22:38 ]
>>956
n^0 = 1


959 名前:ヽ(´ー`)ノ ◆.ogCuANUcE mailto:sage [2005/10/05(水) 22:23:20 ]
スマン。レス番間違えた orz



960 名前:デフォルトの名無しさん mailto:sage [2005/10/05(水) 22:28:09 ]
>>957-958
一方で0 ^ n = 0となっているから問題になる。
ところで^と言えばXORの立場が。

961 名前:デフォルトの名無しさん mailto:sage [2005/10/06(木) 12:22:20 ]
VC6のtemplate関数ってバグある気がするんだけど...
template<typename T> void test();
引数無し呼んだときに解決できてないみたい...
template<typename T> void test(const T&);
みたいにすればオーバーロードで解決できるのか、大丈夫みたいなんだが...


962 名前:デフォルトの名無しさん mailto:sage [2005/10/06(木) 12:36:11 ]
いまどきそんな化石コンパイラに文句言われても…

963 名前:デフォルトの名無しさん mailto:sage [2005/10/06(木) 13:39:14 ]
化石以前にtemplateに関しては欠陥コンパイラですから・・・

964 名前:デフォルトの名無しさん mailto:sage [2005/10/06(木) 17:42:46 ]
そもそもC++コンパイラじゃないですから

965 名前:デフォルトの名無しさん mailto:sage [2005/10/06(木) 22:25:31 ]
少なくともANSI/ISO C++準拠とは言えないな。

966 名前:デフォルトの名無しさん mailto:sage [2005/10/07(金) 04:44:36 ]
じゃーVC7はどうですか?

967 名前:デフォルトの名無しさん mailto:sage [2005/10/07(金) 05:23:27 ]
7.1はかなりまとも。

968 名前:デフォルトの名無しさん mailto:sage [2005/10/07(金) 12:23:52 ]
7と7.1は全然違うぞ
7はかなり微妙

969 名前:デフォルトの名無しさん mailto:sage [2005/10/07(金) 13:11:10 ]
7はCStringにバグがあったね。STL周りもちょっと不安定なところがあった気もする。



970 名前:デフォルトの名無しさん mailto:sage [2005/10/07(金) 14:50:27 ]
7.1って具体的にclのどのバージョン?


Microsoft(R) 32-bit C/C++ Optimizing Compiler Version 13.10.3077 for 80x86
っての使ってるけど

971 名前:デフォルトの名無しさん mailto:sage [2005/10/07(金) 15:06:35 ]
VS.net(VC.net)2003か、VCTK2003のやつが7.1
13.10.3077なら7.1だな。VS.net2003の方のやつだろ。

972 名前:デフォルトの名無しさん mailto:sage [2005/10/14(金) 17:36:27 ]
codeguruに記事の投稿してみたがレビュー通んないとだめなんだね


973 名前:デフォルトの名無しさん [2005/10/18(火) 15:57:25 ]
age

974 名前:デフォルトの名無しさん mailto:sage [2005/10/26(水) 22:29:10 ]
人稲杉なので、バカネタを投下。
www.hakusi.com/up/src/up5538.zip.html

Boost.Lambda みたいに Expression Template を使った、引数に対して安全なフォーマットライブラリ。
Boost.Function や、Boost.Bind と組み合わせることが可能。
以前作成したものと違い、オマケ機能だが入力も可能で、ワイド文字にも対応。

ただ、 _ と % だらけで見た目がキモイ上に、実用性がイマイチ謎。
Expression Template の資料として。

// 出力
 string strA, strB;
 sprint( strA, "1 " % !_x[6] % "/" % _s, 10, "aaaa" ); // sprintf( str, "%#6x/%s", 10, "aaaa" ); みたいな。
 sprint( strB, "2 " % (!_x[6]*='0') % "/" %_s, 10, "aaaa" ); // sprintf( str, "%#06x", 10, "aaaa" ); みたいな。
 cout << strA << endl; // 1 0xa/aaaa と出力
 cout << strB << endl; // 2 0x000a/aaaa と出力
// 入力
 int xA, xB;
 string yA, yB;
 sscan( strA, "1 " % _ws % _x % "/" % _s, xA, yA ); // 空白部分はスキップさせる
 sscan( strB, "2 " % _x % "/" % _s[3], xB, yB ); // 文字列部分は3文字のみ取得
 // 出力
 print( cout, "xA = " % _d % "\nyA = " % _s % _endl, xA, yA );
 print( cout, "xB = " % _d % "\nyB = " % _s % _endl, xB, yB );
 // xA = 10
 // yA = aaaa
 // xB = 10
 // yB = aaa と出力

975 名前:デフォルトの名無しさん mailto:sage [2005/10/27(木) 00:15:14 ]
>>974
せっかくなので便乗しておきますね.将来の話なのでアレですけれど.

www.open-std.org/jtc1/sc22/wg21/docs/papers/2004/n1603.pdf

976 名前:デフォルトの名無しさん mailto:sage [2005/10/29(土) 10:05:49 ]
難読コンテスト会場はここですか?

977 名前:デフォルトの名無しさん [2005/10/31(月) 13:08:43 ]
>>974
すげー--w
確かに scanf っぽいこと出来るし。

でも、Perl みたいで汚いな。使おうとは思わんけど。

978 名前:デフォルトの名無しさん mailto:sage [2005/10/31(月) 13:59:50 ]
>>974
マジキモス

979 名前:デフォルトの名無しさん mailto:sage [2005/11/02(水) 14:02:41 ]
>>974
良くこんなん書く気になるなあ。



980 名前:デフォルトの名無しさん mailto:sage [2005/11/02(水) 14:40:35 ]
>>975
boostな人達はあれば便利だけど、一般人的にはどうなのかなあ?

981 名前:デフォルトの名無しさん mailto:sage [2005/11/02(水) 16:19:39 ]
>>980
どの辺が便利なのか理解に苦しむ。

982 名前:デフォルトの名無しさん mailto:sage [2005/11/03(木) 13:49:05 ]
>>980
型安全な printf, scanf というのが一番インパクトが大きいと思います.
後,lambda のような(擬似的な)可変長テンプレート引数を使ったライブラリの
コンパイル時メッセージが見やすくなるというのもあるかと.

>>981
Boost な人にとっては,これまでプリプロセッサなどで力技で実装していた
Function, Tuple, MPL, Lambda など多くのライブラリの実装が
非常に楽に見通しよく実装できるようになり,便利になると思います.

983 名前:デフォルトの名無しさん mailto:sage [2005/11/03(木) 15:15:01 ]
>>982
コンパイルエラーなどたいして問題じゃないけどね。
それよりもデバッグの方が大変。

984 名前:デフォルトの名無しさん mailto:sage [2005/11/03(木) 15:19:33 ]
変な拡張するより単にプリプロセッサを名前空間対応にすればいいだけちがうの?


985 名前:デフォルトの名無しさん mailto:sage [2005/11/03(木) 15:30:42 ]
>>984
それじゃプリプロセッサにならないでしょ。

986 名前:デフォルトの名無しさん mailto:sage [2005/11/03(木) 17:19:51 ]
え、C/C++のプリプロセッサってトークン理解してるはずなんだけどなあ。
商用じゃプリプロセスと同時に解析するのが主流だし。
テンプレート引数程度の局所的変更じゃ根本的解決にならないでしょ。

987 名前:デフォルトの名無しさん mailto:sage [2005/11/03(木) 17:26:54 ]
名前空間を通常のものとプリプロセッサで共有しようとすると
泥沼になる気がする。(例えば
# define STD_BEGIN namespace std{
とか)
pp専用の名前空間ならwaveが実験的に対応している。

988 名前:デフォルトの名無しさん mailto:sage [2005/11/03(木) 22:37:23 ]
プリプロセッサと言えば、C++/CLIでとんちきな拡張してるよ。
スペース区切りキーワードってやつ。
www.microsoft.com/japan/msdn/vs05/visualc/TransGuide.asp

989 名前:デフォルトの名無しさん mailto:sage [2005/11/04(金) 00:29:44 ]
プリプロセッサと本体の間のフォーマットってANSIか何かで標準規格ある?
#132 "hogehote.h"
たいていはこんなの出るんだよね?



990 名前:デフォルトの名無しさん mailto:sage [2005/11/04(金) 01:08:57 ]
次スレ立てて良いですか?

991 名前:デフォルトの名無しさん mailto:sage [2005/11/04(金) 01:21:16 ]
C++相談室で十分だと思うんだ。

992 名前:デフォルトの名無しさん mailto:sage [2005/11/04(金) 01:32:58 ]
ハゲドー
一年もかかってやっと1スレなペースだし

993 名前:デフォルトの名無しさん mailto:sage [2005/11/04(金) 01:40:20 ]
>>983
> コンパイルエラーなどたいして問題じゃないけどね。

断言君さようなら


994 名前:デフォルトの名無しさん mailto:sage [2005/11/04(金) 11:26:29 ]
断言君だって。なにその俺様用語w

オナニーマクロだらけの糞コード書いてる奴は
日本語にもそれが出るね。

995 名前:デフォルトの名無しさん mailto:sage [2005/11/04(金) 12:12:24 ]
断言君 の検索結果 約 926,000 件中 1 - 10 件目 (0.27 秒)

996 名前:デフォルトの名無しさん mailto:sage [2005/11/04(金) 12:25:58 ]
俺も>>983を支持する。
ランタイムエラーが恐ろしいのであって、
コンパイルエラーなどコンパイラとの対話交渉に過ぎない。

997 名前:デフォルトの名無しさん mailto:sage [2005/11/04(金) 13:14:27 ]
てかさ、コンパイルエラーが出てたら、
そもそも実行ファイルはビルドされて無いんじゃないか?
ワーニングなら分かるけど。

998 名前:デフォルトの名無しさん mailto:sage [2005/11/04(金) 13:49:38 ]
つぎスレ立てるかどうか迷っているんだが
このスレのタイトルをよく吟味したら

「統合」:いくつかの物を一つにまとめあわせること

このように辞書では出ている。
つーことは「STL相談室」も「BOOSTを語れ」も入らないよーな気がした。
それとも、ここのつぎスレが要らないのか?
そんな疑問を抱いてしまって、俺には次スレを立てる勇気がない。
さあ。次をたてる勇者はだれか。

999 名前:デフォルトの名無しさん mailto:sage [2005/11/04(金) 13:53:56 ]
boostは微妙だがSTLスレもこのスレも必要なし
あっても混乱するだけ




1000 名前:デフォルトの名無しさん mailto:sage [2005/11/04(金) 14:02:28 ]
STLを使うと実行ファイルのサイズが10倍になるから
スレは統合すべきだと思います。

1001 名前:1001 [Over 1000 Thread]
このスレッドは1000を超えました。
もう書けないので、新しいスレッドを立ててくださいです。。。






[ 新着レスの取得/表示 (agate) ] / [ 携帯版 ]

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

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