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

【C++】template 統合スレ -- STL/Boost/Loki, etc.

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

STLスレッド
Part1 http://pc.2ch.net/tech/kako/1004/10042/1004287394.html
Part2 http://pc3.2ch.net/test/read.cgi/tech/1026793823/

【C++】Boost使い集まれ!
http://pc3.2ch.net/test/read.cgi/tech/1033830935/

Generic Programming with C++ Template
http://pc.2ch.net/tech/kako/1008/10085/1008593126.html

関連スレ、その他リンクは >>2-5 あたりに。
0002デフォルトの名無しさんNGNG
関連スレ
C++相談室 part12
 http://pc3.2ch.net/test/read.cgi/tech/1035005882/

リンク
STLPort
 http://www.stlport.org/

boost
 http://www.boost.org/

Loki
 http://freshmeat.net/projects/lokilibrary/
 http://www.geocities.com/rani_sharoni/LokiPort.html

ISO/IEC 14882
Programming languages -- C++
 http://webstore.ansi.org/ansidocstore/product.asp?sku=ISO%2FIEC+14882%2D1998
 http://www.kuzbass.ru/docs/isocpp/
0003デフォルトの名無しさんNGNG
重複スレで良いな?
0004デフォルトの名無しさんNGNG
boost固有の話は boostスレでやってくれていいけど、いずれは
このスレに統合するってことで。
0005デフォルトの名無しさんNGNG
>>1
乙カレー
0006デフォルトの名無しさんNGNG
C++標準以外のものは使うな。よってSTLのみとする。
0007デフォルトの名無しさんNGNG
スレ立ったの見て一瞬 (゚Д゚)ハァ? と思ったが、後で合流するならいいか。
0008デフォルトの名無しさんNGNG
>>1-2
乙ー
0009デフォルトの名無しさんNGNG
カレー
0010デフォルトの名無しさんNGNG
boostに関する有名な日本語サイト

・boost info
http://user.ecc.u-tokyo.ac.jp/~g940455/wp/boost/

・Hattareme Programming
http://www.dodgson.org/lab/hat/

・Let's boost
http://www.kmonos.net/alang/boost/

・Regex
http://www.s34.co.jp/cpptechdoc/article/regexpp/

・Boostを使おう
http://www.emaki.minidns.net/Programming/tools/Boost/
0011デフォルトの名無しさんNGNG
乙
マターリ逝きましょう
0012デフォルトの名無しさんNGNG
#include <memory>

class B {};
class D : public B {};

std::auto_ptr<B> f()
{
  std::auto_ptr<D> p;
  return p;
}

↑の一見通りそうだけど、エラーになります。
test.cpp:9: no matching function for call to `std::auto_ptr<B>::auto_ptr(
std::auto_ptr<B>)'
/usr/include/c++/3.1.1/memory:346: candidates are:
std::auto_ptr<_Tp>::auto_ptr(std::auto_ptr_ref<_Tp>) [with _Tp = B]
/usr/include/c++/3.1.1/memory:216:
std::auto_ptr<_Tp>::auto_ptr(std::auto_ptr<_Tp1>&) [with _Tp1 = B, _Tp = B]
/usr/include/c++/3.1.1/memory:203:
std::auto_ptr<_Tp>::auto_ptr(std::auto_ptr<_Tp>&) [with _Tp = B]
test.cpp:9: initializing temporary from result of `
std::auto_ptr<_Tp>::operator std::auto_ptr<_Tp1>() [with _Tp1 = B, _Tp = D]'

とりあえず、
  return std::auto_ptr<B>( p );
で、エラーにならなくなるようです。
この修正が妥当なんでしょうか?
0013デフォルトの名無しさんNGNG
>>12
std::auto_ptrが継承に対応してないからかと思ったけど、どうも区別が
曖昧だというエラーが出るね。
0014○NGNG
なかなか難しいよね。templateベースのものは。
まあ仕事にも使った事はあったけど。便利なんだけど。
0015デフォルトの名無しさんNGNG
継承は対応してないのか。確かに通らんね。

#include <memory>

class B {};
class D : public B {};

std::auto_ptr<B> f()
{
std::auto_ptr<D> p;
return dynamic_cast<std::auto_ptr<B> >(p);
}
0016デフォルトの名無しさんNGNG
auto_ptr<B>とauto_ptr<D>は単に別の型であって、
暗黙の型変換ができなかった、ということでは?

>>15
そこでdynamic_castを思い浮かべてしまうというのは
ちと知識不足すぎやしませんか。ネタ?
0017デフォルトの名無しさんNGNG
>>16
いや(汗、本当に継承に対応してないのかと思って。
でもパラメタの型が違うから当たり前か・・・・
001812NGNG
>>16
ttp://www.kuzbass.ru/docs/isocpp/lib-utilities.html#lib.auto.ptr
↑には、
>template<class Y> auto_ptr(auto_ptr<Y>&) throw();
>Requires: Y* can be implicitly converted to X*.

>template<class Y> auto_ptr& operator=(auto_ptr<Y>& a) throw();
>Requires: Y* can be implicitly converted to X*. The expression delete get() is well formed.

っていうインターフェースがあるようで、
auto_ptrの規格は、>>12の最初のコードが
コンパイルできるように配慮されているように見えます。

同時に、余計な変換手段に見えるインターフェースもありますが・・・。
0019デフォルトの名無しさんNGNG
よく読み直してみろ
0020デフォルトの名無しさんNGNG
統合スレになったとたんレベルが...
0021デフォルトの名無しさんNGNG
C言語スレみたいにバカをネタにしてつきあうぐらいの寛大さが必要です
0022デフォルトの名無しさんNGNG
でも確かに、何でstd::auto_ptrにキャストオペレータ入れなかったんだろうとは思うね。
0023デフォルトの名無しさんNGNG
std::auto_ptrってどんなメンバ関数があるのだろう?
0024デフォルトの名無しさんNGNG
> std::auto_ptrにキャストオペレータ

作るとしたらどんなコーディングになる?
0025デフォルトの名無しさんNGNG
template<class T, class U>
std::auto_ptr<T> cast(std::auto_ptr<U>& ref)
{ return std::auto_ptr<T>( ref.release() ); }
と、やりたいけど出来ないんだよな
0026デフォルトの名無しさんNGNG
そうじゃなくて、自分がauto_ptrの設計者だとしたら。
002712NGNG
>>19
読み直してみたけど、新しく気づいたことはなかったです。

・・・やっぱりわからん。
<memory>を読んでみたけど、変換インターフェースの実装のところに、
「派生関係の変換が可能になるように、これらのモノが必要」みたいなコメントまで書いてある。
コメント中にあるサンプルと同様のコードをコンパイルしようとしたけど、
やっぱり>>12と同じエラーになる。

モッカイageテミル
0028デフォルトの名無しさんNGNG
>>25
release()必要ないのでは?std::auto_ptrのコンストラクタは所有権を
移動させるから。
0029デフォルトの名無しさんNGNG
auto_ptr<T>とauto_ptr<U>の互換性があるかどうか分からないのに、
どうやって所有権を移動させるんだ?
0030デフォルトの名無しさんNGNG
継承と同じように考えて、親クラスのポインタ変数に子のオブジェクトのアドレス
を代入できるかと自然と考えてしまいました。でもstd::auto_ptrは継承とか考慮
してないので、エラーになるのですね。
0031デフォルトの名無しさんNGNG
>>12
むしろ継承関係にあるからこそのエラーと思われ。
継承関係になかったら別のエラーになるけどさ。

gcc-2.95.3 でcompileしてみた。
conversion from `auto_ptr<D>' to `auto_ptr<B>' is ambiguous
: candidates are: auto_ptr<D>::operator auto_ptr<B><B>()
: auto_ptr<B>::auto_ptr<D>(auto_ptr<D> &)

>>29
互換性があればcompileできるだろ?
003231NGNG
あぁ >>25 のままじゃcompileできんな
template<class T, class U>
std::auto_ptr<T> cast(std::auto_ptr<U>& ref, std::auto_ptr<T>&)
{ return std::auto_ptr<T>( ref.release() ); }
だね。

つーか、むしろ
template<typename T, typename U>
T cast(U &ref, T &) {return T(ref.release());}
0033デフォルトの名無しさんNGNG
http://www.zdnet.co.jp/enterprise/0211/11/n20.html
003412NGNG
>>32
そのテンプレート関数はどうやって呼び出すんだ?

template<typename Y> std::auto_ptr<X>::auto_ptr( std::auto_ptr<Y>& r );
template<typename Y> std::auto_ptr<X>& std::auto_ptr<X>::operator = ( std::auto_ptr<Y>& r );
template<typename Y> std::auto_ptr<X>::operator auto_ptr<Y>();
↑キャストなんて標準で装備されてるこれらで十分のはずだ。
003531NGNG
>>34
>そのテンプレート関数はどうやって呼び出すんだ?
質問ですか?説明しなきゃいけないようなこと?
class B {};
class D {} public B {};
//class D {};
auto_ptr<B> b;
auto_ptr<D> d;
b = cast(d, b);
DがBを継承してなかったらどうなるか。

>キャストなんて標準で装備されてるこれらで十分のはずだ。
あ、そ。で、>>31 の内容は理解できましたか?
0036デフォルトの名無しさんNGNG
2!
0037デフォルトの名無しさんNGNG
>そのテンプレート関数はどうやって呼び出すんだ?
質問ですか?説明しなきゃいけないようなこと?
class B {};
class D {} public B {};
//class D {};
auto_ptr<B> b;
auto_ptr<D> d;
b = cast(d, b);
DがBを継承してなかったらどうなるか。

>キャストなんて標準で装備されてるこれらで十分のはずだ。
あ、そ。で、>>31 の内容は理解できましたか?
>そのテンプレート関数はどうやって呼び出すんだ?
質問ですか?説明しなきゃいけないようなこと?
class B {};
class D {} public B {};
//class D {};
auto_ptr<B> b;
auto_ptr<D> d;
b = cast(d, b);
DがBを継承してなかったらどうなるか。

>キャストなんて標準で装備されてるこれらで十分のはずだ。
あ、そ。で、>>31 の内容は理解できましたか?
0038デフォルトの名無しさんNGNG
>そのテンプレート関数はどうやって呼び出すんだ?
質問ですか?説明しなきゃいけないようなこと?
class B {};
class D {} public B {};
//class D {};
auto_ptr<B> b;
auto_ptr<D> d;
b = cast(d, b);
DがBを継承してなかったらどうなるか。

>キャストなんて標準で装備されてるこれらで十分のはずだ。
あ、そ。で、>>31 の内容は理解できましたか?
>そのテンプレート関数はどうやって呼び出すんだ?
質問ですか?説明しなきゃいけないようなこと?
class B {};
class D {} public B {};
//class D {};
auto_ptr<B> b;
auto_ptr<D> d;
b = cast(d, b);
DがBを継承してなかったらどうなるか。

>キャストなんて標準で装備されてるこれらで十分のはずだ。
あ、そ。で、>>31 の内容は理解できましたか?
 え
0039デフォルトの名無しさんNGNG
>そのテンプレート関数はどうやって呼び出すんだ?
質問ですか?説明しなきゃいけないようなこと?
class B {};
class D {} public B {};
//class D {};
auto_ptr<B> b;
auto_ptr<D> d;
b = cast(d, b);
DがBを継承してなかったらどうなるか。

>キャストなんて標準で装備されてるこれらで十分のはずだ。
あ、そ。で、>>31 の内容は理解できましたか?
>そのテンプレート関数はどうやって呼び出すんだ?
質問ですか?説明しなきゃいけないようなこと?
class B {};
class D {} public B {};
//class D {};
auto_ptr<B> b;
auto_ptr<D> d;
b = cast(d, b);
DがBを継承してなかったらどうなるか。

>キャストなんて標準で装備されてるこれらで十分のはずだ。
あ、そ。で、>>31 の内容は理解できましたか?
  
0040デフォルトの名無しさんNGNG
>そのテンプレート関数はどうやって呼び出すんだ?
質問ですか?説明しなきゃいけないようなこと?
class B {};
class D {} public B {};
//class D {};
auto_ptr<B> b;
auto_ptr<D> d;
b = cast(d, b);
DがBを継承してなかったらどうなるか。

>キャストなんて標準で装備されてるこれらで十分のはずだ。
あ、そ。で、>>31 の内容は理解できましたか?
>そのテンプレート関数はどうやって呼び出すんだ?
質問ですか?説明しなきゃいけないようなこと?
class B {};
class D {} public B {};
//class D {};
auto_ptr<B> b;
auto_ptr<D> d;
b = cast(d, b);
DがBを継承してなかったらどうなるか。

>キャストなんて標準で装備されてるこれらで十分のはずだ。
あ、そ。で、>>31 の内容は理解できましたか?
       
0041デフォルトの名無しさんNGNG
>>31
通常時、TとUには互換性があるかも知れないが、
auto_ptr<T>とauto_ptr<U>に互換性があるときはT==Uの時だけだろ。
0042デフォルトの名無しさんNGNG
一体このスレは何が起きているんだ?
0043デフォルトの名無しさんNGNG
>>42
もう後には引き下がれない意地と意地のぶつかり合いが
繰り広げられています。
0044デフォルトの名無しさんNGNG
異常なほど向きになっておりますな。
しかも会話がかみ合っていないときている。
0045デフォルトの名無しさんNGNG
意見が噛み合ってないのは議論じゃなくて論破しようとしてるせい。
0046デフォルトの名無しさんNGNG
ん?
とりあえず、前の発言者のレスを引用して、(゚Д゚)ハァ? とか書けばいいわけか?
004712NGNG
>>31
器用な人ですな。

> で、>>31 の内容は理解できましたか?
え・・・?理解できません、たぶん。
あと、キャストする関数の引数が二つなのが理解できませんねぃ。
0048デフォルトの名無しさんNGNG
> ん?
> とりあえず、前の発言者のレスを引用して、(゚Д゚)ハァ? とか書けばいいわけか?

(゚Д゚)ハァ?
0049デフォルトの名無しさんNGNG
> > ん?
> > とりあえず、前の発言者のレスを引用して、(゚Д゚)ハァ? とか書けばいいわけか?
>
> (゚Д゚)ハァ?

(゚Д゚)ハァ?
0050デフォルトの名無しさんNGNG
時期ヴァージョンのJava(J2SE1.5)でJavaGenerics(?)がコアAPIに統合されテンプレートが使えるようになり、コレクション系インターフェースの問題が
解消されるというのでちょっと期待しているのですが
C++でテンプレートを使うメリット、デメリットとはどんなものでしょうか?

投稿記事のC++ソースを見た感じ、複雑そうに見えます。
テンプレートを使いこなすには修行が必要そうですね。
0051デフォルトの名無しさんNGNG
STL ライクなコードが Java で書けるというだけで、template が使える
というのとは違うと思っていたが気のせいか?
■ このスレッドは過去ログ倉庫に格納されています