5ちゃんねる ★スマホ版★ ■掲示板に戻る■ 全部 1- 最新50  

■ このスレッドは過去ログ倉庫に格納されています

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

1 :デフォルトの名無しさん:02/11/20 21:29
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 あたりに。

952 :デフォルトの名無しさん:03/03/13 18:37
>>951
boost::lexical_castは内部的にstd::stringstreamを使っている。
バラして書けばこんな感じ。簡単だろ。

int main()
{
std::string str("123");
std::stringstream sstr(str);
int i;

sstr >> i;

std::cout << i << std::endl;
}

953 :948:03/03/13 19:16
>>952
す、素敵すぎです!ありがとうございました。
移行はするとしても、当座はこれでしのいでみます。

954 :デフォルトの名無しさん:03/03/13 19:24
>>953
ちなみにstd::stringstreamのコンストラクタを起動した直後は書き込み位置
も読み込み位置もゼロになっているようだから、適当にシークして追加する
と良い。本当はstd::ios::pos_typeをstd::coutに出力できない場合もあるんだ
けどね。あくまでも例って事で。

int main()
{
std::string str("123");
std::stringstream sstr(str);
int i, j;
std::ios::pos_type p;

p = sstr.tellg();
std::cout << "read pos = " << p << std::endl;
p = sstr.tellp();
std::cout << "write pos = " << p << std::endl;

sstr.seekp(0, std::ios::end);

sstr << " 456";
sstr.seekg(0, std::ios::beg);
sstr >> i >> j;

std::cout << i << ' ' << j << std::endl;
}

955 :デフォルトの名無しさん:03/03/13 19:25
sstr.seekg(0, std::ios::beg);
はいらなかったかな。
C++のストリームはCとは違って読み込みと書き込みのポインタは
別々だからね。

956 :948:03/03/13 22:02
>>954-955
いやはや、コードは言葉より雄弁と言いますか・・・。
分かりやすくて本当にためになりました。ありがとうございました。

読んで置いて良かった・・・正直いうと、こんな使いかたしてましたよ(笑

int main()
{
int i;
std::string str("123");
std::stringstream( str ) >> i;

std::cout << i << std::endl;
}


957 :デフォルトの名無しさん:03/03/13 23:13
>>945

#include <vector>

template<typename T>
struct foo {
static void Hoge(const T& t)
{
*****
}
static void Hoge(const std::vector<T>& t)
{
****
}
};

foo<int>::Hoge(0);
foo<int>::Hoge(std::vector<int>());

とかじゃダメなの?


958 :957:03/03/14 00:17
>>945

やっぱ上のじゃ不便だな、ってことで以下...

template <int N> struct foo {
template <class T> static void baka(const T& t) { //hogehoge }
};

template <> struct foo<1> {
template <class T> static void baka(const std::vector<T>& t) { //hogehoge }
};

template <class T> char hage(const std::vector<T>& t);
double hage(...);

template<typename T>
static void Hoge(const T& t) { foo<sizeof(hage(t))>::baka(t); }

void test() {
int a = 3;
std::vector<int> v(8);
Hoge(a);
Hoge(v);
}

ちゃんとディスパッチできたよ。
sizeof(char) < sizeof(double) だと規格のどこに書いてあるのか小一時間(略


959 :デフォルトの名無しさん:03/03/14 00:55
>>956
うぉ、こんなやり方でもできるんだな
やっぱ使うのまずいっぽ?

コンストラクタで作ってから、どうなってるんだろ
デバッガで追ってみたけどテンプレートが複雑でいまいちわからん

960 :デフォルトの名無しさん:03/03/15 03:43
>>945
ふつうにオーバーロードで
template<typename T>
void Fn(const T&){}

template<typename T>
void Fn(const std::vector<T>&){}

int main(){
Fn(int() );
Fn<int>(std::vector<int>() );//Fn<int> 明示的に型指定
return 0;
}



961 :デフォルトの名無しさん:03/03/15 08:32
>>956
の示したコードの使い方、あれでいいんじゃないですか?
あってるよね?

962 :958:03/03/15 10:20
>>960

なるほど<int>と限定した上ではただのオーバーロードに
なるんだね。
複雑にして損したよ

963 :956:03/03/15 21:32
>>959 >>961
自分で書いて置いてなんですが、あってるんですか?
さすがに無理な気がしないでもないです…要するにこういう事ですよね?

#include <iostream>

class B{
public:
void hage(){
std::cout << "Hoge" << std::endl;
}
};

int main(){
B().hage();

return 0;
}

実体はどこに・・・というかうちのコンパイラ(VC++6.0)以外でも通るのだろうか。
詳しい方のご意見をお尋ねしたいところです。ってC++スレの方がいいのかな。

964 :デフォルトの名無しさん:03/03/15 21:45
>>963

ん?一時オブジェクトの寿命の問題でしょ
全然問題ないよ

965 :956:03/03/15 22:00
>>964
いやぁ、そうなんですか・・・また一つ勉強になりました。

てっきり、Bコンストラクタのスコープから出た瞬間、
デストラクタが呼ばれるのかと思ってました。
Bコンストラクタ>hage>Bデストラクタは保証されているんですねぇ。

うーん、ダメだ。自分この辺ぐだぐだで・・・再勉強してきます。
レスありがとうございました。

966 :デフォルトの名無しさん:03/03/15 23:24
一時オブジェクトってのは非constな参照では受けられないけど
非constなメソッドを呼べるという特殊な存在。
この性質を利用したテクニックもある。
でもこれを多用すると一部の論者に睨まれるという諸刃の剣。


967 :デフォルトの名無しさん:03/03/16 00:15
一時オブジェクトって、非constな参照で受けられなかったんだ……。
言われてみると、敢えて受けてみたことはないな。
thx.



968 :デフォルトの名無しさん:03/03/16 03:16
>>966
おまけに自分自身を返すメソッドを呼ぶと
非constな参照で受けることが可能になるだけでなく
当然左辺値として扱うことも可能になる。

一時オブジェクトは非constな参照で受けることが
できない/右辺値として扱われるって
仕様はホントにあほらしいんだよなぁ。
そんなんだったら始めからエラーじゃなくて、
ワーニング程度に留めとけっての。

969 :デフォルトの名無しさん:03/03/16 13:34
>>960

intと明示的に型指定できるくらいだったらvectorなのか
そうでないのかもわかるだろうから、オーバーロードすら
必要ないんじゃない?


970 :デフォルトの名無しさん:03/03/16 16:46
>>969

>>945
を、よめ!!!!!!!!!

ちなみにほかのコンパイラーなら
明示的の指定はいらん


971 :デフォルトの名無しさん:03/03/16 16:49
>>963
そういう使い方ならstatic関数にすればいいやん
B::hage(); みたいに

972 :デフォルトの名無しさん:03/03/16 17:19
>>970

945の意味するところが『いずれテンパラはある一つの型に決めます』ってなら
<T>の部分を明示するのは抵抗ないだろうけどね。
テンパラになる型が最終的に複数出てくる場合はどうだろう。
と思って957→958という流れになったわけだが


973 :デフォルトの名無しさん:03/03/16 17:25
staticにしたらこんなのが通らん

#include<cstdio>

//#define STATIC__
struct FuncOperator
{
#ifdef STATIC__
static void operator () (){ puts("static operator"); }
#else
void operator () (){ puts("Non static operator"); }
#endif
};

int main(){

#ifdef STATIC__

FuncOperator::operator ()();
#else
FuncOperator()();

#endif

return 0;
}

974 :デフォルトの名無しさん:03/03/16 18:44
staticなオペレータって蟻なのか?

975 :デフォルトの名無しさん:03/03/16 18:51
>>974

為し


976 :945:03/03/17 13:24
>>958さん、ありがとうございます。たしかにうまくいきますね。
で、えぇと……実はHoge()はあるクラスのメンバ関数なんですが、
この場合はどうしたらいいんでしょう?^^;

条件が後出しになって申し訳ありません。詳しく状況を言いますね。
まず、バイナリの入出力を簡便にしてくれるクラスが欲しいのです。
標準だと、こうなりますよね。

ifstream ifs("piyo.dat",ios::binary);
int n;
ifs.read(reinterpret_cast<char*>(&n),sizeof(int));
vector<int> v(n);
ifs.read(reinterpret_cast<char*>(&v[0]),sizeof(int)*n);

これだとあまりにも面倒なのです。不要な指定が多すぎて。

CReadFile rf("piyo.dat");
int n;
rf >> n;
vector<int> v(n);
rf >> v

こういう感じですっきり指定できるラッパークラスを作りたいのです。
出力の方も、同じ要領でやりたいと思ってます。
これで、intだけを入出力したいわけじゃないから、templateで、
ということなんです。
で、VC6固有の(ですよね?)templateヘタレ解析に悩まされてるわけです。
そういうわけですので、>>960さんみたいなやり方は、クラス使用者の
負担になりますので、あんまり意味がないわけです。
>>958さんのやり方みたく、多少機種依存の部分があっても、なんとか
隠蔽できればいいんですけど……。

977 :デフォルトの名無しさん:03/03/17 14:47
して、次スレの方は?

978 :デフォルトの名無しさん:03/03/17 15:06
>>976
template <class T> void hoge(const T &);
を用意しなければいいのでは

つまり
void hoge(int);//unsigned int,float,なども用意する
template <class T> void hoge(const vector<T> &);

でどうでしょう? あんまり無条件でバイナリ保存できる型なんてそうそうないでしょ?
逆に安全性の面から用意されていないと入出力できないようにしたほうが良いとおもわれ

979 :デフォルトの名無しさん:03/03/17 17:42
reinterpret_cast<?>(?)のなにがいやぁーなの
もしながくていやとかぬかしてんのそれなら(char*)キャスト使えば
もし、それでもかっこ悪いとか言うんなら自分でvector<T>専用をつくれば

template<typename T>char* Cast(std::vector<T>& tt)
{return reinterpret_cast<char*>(&tt[0]); }

こんな感じに。
さらにintとunsigned charを使い分けたいなんて我侭もあるんなら

union bit{
int i;
unsigned char bitn[4];
};
std::vector<bit>これで読み込ませればint、
unsigned charの使い分けが一回の作業で実現できよう。
とにかくreinterpret_castぐらいでクラスなんて作ってられない




980 :デフォルトの名無しさん:03/03/17 20:22
#define scast static_cast
#define rcast reinterpret_cast
#define ccast const_cast
#define dcast dynamic_cast

981 :デフォルトの名無しさん:03/03/17 20:37
template <class T,class U> T scast(const U &u)
{ return static_cast<T>(u); }

982 :デフォルトの名無しさん:03/03/17 21:14
>>980
それをやるならここでは、こうでしょ。。
#define Cast(M) reinterpret_cast<char*>(M)


983 :デフォルトの名無しさん:03/03/17 21:19
>>981
いみない。結局明示的に指定しなくちゃならんでしょ

984 :デフォルトの名無しさん:03/03/17 22:30
http://www.tietew.jp/cppll/archive/1071
キャスト

985 :デフォルトの名無しさん:03/03/17 23:06
>>982
char * 型以外に使えないじゃん。

986 :デフォルトの名無しさん:03/03/17 23:38
ねえ、早く!


987 :スレタイはこれで:03/03/18 02:09
template<typename STL,Boost,Loki,etc>class part2

988 :デフォルトの名無しさん:03/03/18 02:56
>>987
<> は化けるのでは?

989 :デフォルトの名無しさん:03/03/18 18:10
一応新スレ立てときました。

【C++】template 統合スレ -- Part2
http://pc2.2ch.net/test/read.cgi/tech/1047978546/

990 : :03/03/19 06:35
〈〉←これで代用という手がある。

991 :デフォルトの名無しさん:03/03/19 20:53
777?

992 :デフォルトの名無しさん:03/03/19 22:52
この板では1000ゲットは興味なしですか?

993 :デフォルトの名無しさん:03/03/19 23:04
ぬるぽがこのスレに興味を持ったようです。

  ∧_∧
 ( ´∀`)< ぬるぽ

994 :デフォルトの名無しさん:03/03/19 23:12
  ∧_∧
 ( ´∀`)< ぼくぬるぽ


995 :デフォルトの名無しさん:03/03/19 23:41
もうすぐか…

996 :デフォルトの名無しさん:03/03/19 23:42
なにが?

997 :デフォルトの名無しさん:03/03/19 23:44
>>996
1000が

998 :デフォルトの名無しさん:03/03/19 23:48
 

999 :デフォルトの名無しさん:03/03/19 23:49
999

1000 :デフォルトの名無しさん:03/03/19 23:49
そんなバカなやり取りしてる間に1000げt

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

323 KB
★スマホ版★ 掲示板に戻る 全部 前100 次100 最新50

read.cgi ver 05.04.02 2018/11/22 Walang Kapalit ★
FOX ★ DSO(Dynamic Shared Object)