【C++】template 統合スレ -- STL/Boost/Loki, etc.
■ このスレッドは過去ログ倉庫に格納されています
0001デフォルトの名無しさん
NGNG以下のスレッドを統合するスレです。
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 あたりに。
0686デフォルトの名無しさん
NGNGその日記の元ネタは cuj web site の記事。URL を忘れたので元記事へのリンクを
張らなかったんだが、google に掛け合って見つけてきたよ。制限事項に関しても詳
しく書いてあるから、ざっと読んでおくと良いと思いかと。
http://www.cuj.com/articles/1999/9902/9902h/9902h.htm?topic=articles
これに関連した小ネタだと、std::for_each のような一定範囲を扱うアルゴリズムに
次のような多重定義をしておくってのもある。for_each や find_if は、コンテナ全部
に適用したいケースが多いから。
template <class T, class TFunc>
inline TFunc for_each(T& col, TFunc f)
{
return std::for_each(col.begin(), col.end(), f);
}
template <class T, int N, class TFunc>
inline TFunc for_each(T (&ary)[N], TFunc f)
{
return std::for_each(&ary[0], &ary[N], f);
}
template <class T, int N, class TFunc>
inline TFunc for_each(T const (&ary)[N], TFunc f)
{
return std::for_each(&ary[0], &ary[N], f);
}
0687デフォルトの名無しさん
NGNGあれがもっとも汎用的でいいと思うのですが
なんでboostには含まれないのかな?
0688デフォルトの名無しさん
NGNGつかってまつ。gcc 2,95のバグに悩まされました。
0689デフォルトの名無しさん
NGNGいま、ちょうどboostのMLでLokiの人含めて色々議論してるようだから読んでみれば?
0690デフォルトの名無しさん
NGNGboost-mlでなんか今 auto_ptr みたいな挙動をどーするか
議論してるよ。boostに取り込まれる予定なはず。いつかは知らんけど。
0691690
NGNG0692デフォルトの名無しさん
NGNG逝かんで良いから、議論の流れをザクッと要約してくれると嬉しい。
0693690
NGNG無理でふ。サラッと見ながら
「あー、なんかモメてるっぽいなぁ」
程度にしか読んでいないので・・・
「結論出たら結論だけ見ればいいや」
と思ってるんであんま(全然)流れ追ってないんですわ。
ちなみに今は配列のサポートでまた何やら議論してるみたい。
これも別にマトモに追ってないんですけど。
0694デフォルトの名無しさん
NGNG単純がいいなら、こっちにしとけば?
main()
{
std::ifstream ifs("copy1.cpp");
std::cout << ifs.rdbuf();
}
0695デフォルトの名無しさん
NGNG何と!簡単ですね!
0696デフォルトの名無しさん
NGNG0697デフォルトの名無しさん
NGNG参考になりました。Thanks!
0698デフォルトの名無しさん
NGNG「それ」ってなに?
0699デフォルトの名無しさん
NGNG>>694
0700デフォルトの名無しさん
NGNGなんで「メモリ食う」なんて思ったんだ?
ファイルの読み取りバッファと標準出力の
書き込みバッファくらいしか思いつかないんだが。
0701デフォルトの名無しさん
NGNGいや、内部的に何が起こるのかなと思って。
0702デフォルトの名無しさん
NGNG「内部的」なことは当然わからんが、
1文字ずつ読んだ場合に比べて余分に
メモリを必要とする理由はなにもない。
0703デフォルトの名無しさん
NGNGbinary_function<Arg1, Arg2, RetVal>にはoperator()
定義されてないんでしょうか?
cout << plus<int>()(2,3) << endl;
は上手くいくのに,
binary_function<int, int, int> fn = plus<int>();
cout << fn(2, 3) << endl;
は上手くいきません.
0704デフォルトの名無しさん
NGNG定義されてない。
operator()は仮想関数じゃないよ。
0705703
NGNG引数の型は何にしたらいいんでしょうか?
0706デフォルトの名無しさん
NGNGふつうはテンプレートの型引数だな。
template<typename BinaryFunction>
void f(BinaryFunction fn);
0707703
NGNGテンプレートで取り込もうとすると,
色々と面倒な事起こりませんか?
出来れば,引数として取り込みたいのです.
0708デフォルトの名無しさん
NGNG別に面倒なことなんかないが?
0709703
NGNG様はtemplateは使わずに,
void f(binary_function<int, int, int> fn);
みたいな感じで使いたいのです.
binary_functionはlessやらplusやらの基底クラスらしいですが,
共通に使われるであろうoperator()を仮想関数として定義
してないんじゃ使えないですね.
引数としてこのクラスの関数オブジェクトを読み込む場合,
この代わりに何を基底クラスとして使うべきなのでしょうか?
0710703
NGNGtemplateを使って定義すると,
ソースコードをいちいちincludeしないといけなくなりませんか?
0711デフォルトの名無しさん
NGNGそんな方法はない。お前はbinary_functionの存在理由を大幅に誤解している。
0712デフォルトの名無しさん
NGNGそうなると、基底クラスじゃぁないが、boost::functionなんだろうなぁ。
0713デフォルトの名無しさん
NGNGbinary_functionはtypedef導入用のテンプレートであって、
多態で使うことを目的としたものじゃない。
> void f(binary_function<int, int, int> fn);
何故templateにしないでこうしたいのかがよく
わからんが、とりあえず boost::function 使え。
0714703
NGNGSTLじゃ無理なんですね.
0715デフォルトの名無しさん
NGNGbinary_function は引数、戻り値の型を class 内の typedef として定義するための
クラス。それ自身はなんの機能も持たない。
Generic Programming あたりを読んでお勉強するのが良いと思われ。
0716デフォルトの名無しさん
NGNGテンプレート引数の整数はunigned int ではだめで、特別化がおきず、intにしなくてはいけません。
これってC++の仕様ででしょうか?整数引数単独のテンプレはOK。
#include<iostream>
template<class T,unsigned int Sz>
struct vector{
public:
vector(){std::cout << "Standard" <<std::endl;}
};
template<class T>
struct vector<T,3>{
public:
vector(){std::cout << "Special" <<std::endl;}
};
int main(){
vector<double,1> v1;//Standard
vector<double,3> v3;//Specialになってほしいが・・・
return 0;
}
0717デフォルトの名無しさん
NGNGBCC5.6.2だとちゃんとSpecialになるよ。
0718デフォルトの名無しさん
NGNGお、そうですか・・・。BCC5.5のバグなんですね。ありがとうございます。
0719デフォルトの名無しさん
NGNGVC++7.0 で、以下の式が正しく通るんだけど…
// ↓LokiPort for VC++7.0
Loki::SmartPtrDef<MyClass>::type sp( new MyClass );
sp[ 2 ];
犯人は特定できたけど、この仕様のおかげで、
自作の添え字演算子を持つポリシーが使えないじゃないかっ!
0720デフォルトの名無しさん
NGNG音無しくboost::shared_arrayにするよろし
0721デフォルトの名無しさん
NGNG犯人は?
0722デフォルトの名無しさん
NGNG0723デフォルトの名無しさん
NGNGいつのネタだよ。
ポートピア連即殺人事件の中の人も大変だな。
0724デフォルトの名無しさん
NGNGoperator Tester*()
こいつのおかげで、operator[] が曖昧だといわれてしまう。
>>723
中の人な(ry
0726デフォルトの名無しさん
NGNG0727デフォルトの名無しさん
NGNG良書を探していたら、C++Primerが目に止まった。
この本はC++初心者用だからと今まで目もくれなかったが、今日
何気に立ち止まって読んでみると、templateについてじつに詳しく
書いてある。これだけでも買う価値があると思い、速攻レジへ。
本の厚さに圧倒されつつも、読んでいます。アルゴリズムについて
も相当詳しい解説があります。でもアルゴリズムは一通りやった
んだけどな。
0729デフォルトの名無しさん
NGNG0730デフォルトの名無しさん
NGNG二分木コンテナ?何に使うの?
0731デフォルトの名無しさん
NGNGset とか map とか、内部実装的には tree になってるよ。
ちなみに、STL で使われてる平衡木アルゴリズムは二色木(red black tree)。
0732デフォルトの名無しさん
NGNGバランス木または多分木のコンテナが欲しいです。
ゲームの探索に使おうと思ってます。
0733デフォルトの名無しさん
NGNG要するに、そのゲームに特化した最適な構造の木を使いたいってこと?
そんな特定用途向けのライブラリ、早々転がってないぞ。
とりあえず、STL ので我慢して作って、
パフォーマンス的にどうしても必要になったら改めて自作しろ。
0734デフォルトの名無しさん
NGNGtemplate<typename A, typename B>
bool IsSameType();
いろいろ考えましたが思いつきませんでした・・・
0735デフォルトの名無しさん
NGNGstd::map をどうやって「木として」使うんだ?
>>729
平衡木なら http://www.essemage.com/aapl/ とかが有名どころではなかろうか。
多分木はあんまり見たこと無いなぁ。
>>734
template<typename A, typename B> struct ist { enum{ val = 0 }; };
template<typename A> struct ist<A,A> { enum{ val = 1 }; };
template<typename A, typename B>
bool IsSameType() { return ist<A,B>::val; }
0736デフォルトの名無しさん
NGNGhttp://www.damtp.cam.ac.uk/user/kp229/tree/
ってなモノがある。昔boost-mlに流されたけどどーなったんだっけか?
まぁただGPLという最大の罠があるわけだが。
0737デフォルトの名無しさん
NGNGclass A2;
...
class B {
private:
A1 a1;
A2 a2;
...
public:
};
の時にa1、a2に[]を使ってアクセスする方法はないでしょうか?
0738デフォルトの名無しさん
NGNG0739738
NGNGまぁ、operator[]でも定義しなさいってこった。
0740737
NGNG[ ]を定義できるのですが、この場合どうやったらいいか分かりません。
また上記の場合派生して加えた関数にアクセス出来ません。templateを使って旨く出来ないでしょうか?
0741738
NGNGB::operator[]
をテキトーに定義してやるんじゃマズいの?
なんか良く意味が分かんないんだけど。
0742デフォルトの名無しさん
NGNGB b; があって、
b[0]がa1、b[1]がa2を返すとか、そういう事かい?
0743737
NGNG0745デフォルトの名無しさん
NGNGA1とA2が継承関係にでもないと、一つの[]でA1とA2両方返すのは
難しくないかい?
0746デフォルトの名無しさん
NGNGstruct A1 {
virtual void func() { std::cout << "A1" << std::endl; }
};
struct A2 : public A1 {
void func() { std::cout << "A2" << std::endl; }
};
struct B {
A1 a1;
A2 a2;
A1* operator[](int i) {
if (i == 0) return &a1;
else return &a2;
}
};
int main()
{
B b;
b[0]->func();
b[1]->func();
}
0747738
NGNG>>744
で、[]の引数はやっぱコンパイルタイムには決まらんの?
決まるんなら boost::tuple みたいな事すれば
b.get<0>().func(hoge)
なら出来る・・・かな?
0748デフォルトの名無しさん
NGNGメンバ関数でないとだめみたいだしなあ。friend使えたら何とか
なったかもしれんのだが。
0749デフォルトの名無しさん
NGNGstruct A1 {
virtual void func() { std::cout << "A1" << std::endl; }
};
struct A2 : public A1 {
void func() { std::cout << "A2" << std::endl; }
};
struct B {
A1 a1;
A2 a2;
A1& operator[](int i) {
if (i == 0) return a1;
else return a2;
}
};
int main()
{
B b;
b[0].func();
b[1].func();
}
0750デフォルトの名無しさん
NGNG0751737
NGNG>>747 さんの方法も含めて考えてみます。
出来るだけpublicにはしないように頑張っているのですが、初心者には中々難しいです。
0752デフォルトの名無しさん
NGNGvoid func() { std::cout << "A1" << std::endl; }
};
struct A2 {
void func() { std::cout << "A2" << std::endl; }
};
struct B {
A1 a1;
A2 a2;
void* operator[](int i) {
if (i == 0) return &a1;
else return &a2;
}
};
int main()
{
B b;
reinterpret_cast<A1*>(b[0])->func();
reinterpret_cast<A2*>(b[1])->func();
}
0753デフォルトの名無しさん
NGNG0754737
NGNGB b[100];
としたいので、b[1][1].func(hoge)って呼べた方が楽だなぁと思ったのです。
>>752 ありがとうございます。参考にさせて頂きます。
0755デフォルトの名無しさん
NGNG> としたいので、b[1][1].func(hoge)って呼べた方が楽だなぁと思ったのです。
激しく読みにくいコードのような気がするが…
面倒でも、素直に「役割」を反映したメソッドを書いて deletate した方が
良いと思うぞ。
0757デフォルトの名無しさん
NGNG> 2つの型が同じかどうか判定することってできるでしょうか
boostの、<boost/type_traits.hpp>をインクルードして、
boost::is_same<T, U>::value
でいけるようだが、中身を見ても何をしているのか解らなかった・・・。
0758729
NGNG結局、色々やるには自分で作った方がいいという結論になったのですが、
上記の物は参考にはなりました。
ありがとうございました。
//構造的にはこんな感じ
template <typename _Elem> class tree
{
tree *parent;
list<tree*> m_child;
_Elem m_element;
};
0759デフォルトの名無しさん
NGNGホントにキタ━━━━━━(゚∀゚)━━━━━━ !!!!!
0760デフォルトの名無しさん
NGNGスレ違いかもしれんけど、いい知恵を貸してください。
COMなんかで使用する BSTR は ATLインターナル等を読む限り、
「長さをプレフィックスとするOLECHAR型の文字列」だそうです。
~~~~~~~~~~~~~~~~~~~~~~~~~~
で、これを std::basic_string で表現したいと思い、
char_traits をいじり始めたのですが、
「長さをプレフィックスとする」の部分で躓きました。
このような長さを先頭にもつ文字列を basic_string で表現する
うまい手段があったら教えてください。
0761デフォルトの名無しさん
NGNGbasic_stringで表現するより、
別のクラスにしてbasic_stringと相互?変換できるようにするほうが楽じゃないの?
0762デフォルトの名無しさん
NGNG0763デフォルトの名無しさん
NGNGそれとももっと適した板があるなら教えてくだたい
0764デフォルトの名無しさん
NGNGシェルスクリプトならUNIX板とかLinux板とかでないかね
0765デフォルトの名無しさん
NGNGどっちみち、一般のヒープ管理関数じゃなくてSysAllocStringで確保しなきゃいけないわけだし、
プレフィックス部分はポイントされている番地より「前」に存在するわけだし、
いじるならchar_traitsじゃなくてallocatorのほうではないか。
char_traitsはそのままstd::char_traits<wchar_t>でいい気がする。
0766デフォルトの名無しさん
NGNG(const char* __s, ios_base::openmode __mod = ios_base::in)
ファイル名が、なぜ wchar_t でなく char なのでしょうか?
0767デフォルトの名無しさん
NGNG#include <iostream>
#include <memory>
class A
{
public:
void Print(void){ std::cout << "OK" << std::endl; }
};
int main()
{
std::auto_ptr< A > ptr( new A() );
void (A::*method)(void) = A::Print;
(ptr->*method)(); // ここや
return 0;
}
0768デフォルトの名無しさん
NGNG探すことにならんか?
0769デフォルトの名無しさん
NGNGptrはA型へのポインタだから、当然Aの中にmethodというメンバ
がないとエラーになる。
struct A {
int i;
}
std::auto_ptr<A> ptr(new A);
int j;
ptr->j;
としているのと極端に言えば同じ。
0770デフォルトの名無しさん
NGNG0771デフォルトの名無しさん
NGNG(a->*method)();
としたら通るね。ということは、std::auto_ptrの->演算子の多重定義
の問題なのだろう。
->の先がメンバー関数へのポインタだった場合、正常に解釈して
くれないのでは。
0772766
NGNG0773デフォルトの名無しさん
NGNGにしれ
0774デフォルトの名無しさん
NGNGauto_ptr<> には operator->* というメンバ関数はないので
どのコンパイラでも無理だ。
0775デフォルトの名無しさん
NGNG((*ptr).*method)() が通るという事は、.*は定義されているのかな。
0776デフォルトの名無しさん
NGNG(*ptr)の時点で A* になってる
0777デフォルトの名無しさん
NGNG0778デフォルトの名無しさん
NGNGなるほどよく理解できました。
そしたら、((*ptr.get()).*method)();が通る理由も理解できます。
0779767
NGNG神
ってゆーかその手に気付かなかった自分が恥ずかしいよ。
->が定義されてるなら->*も自動だと思ったんだけどそうじゃなかったんだな。
ためしに->*を定義してみたらなかなか面白いことになったけどいまいち使いどころがわかんね。
0780デフォルトの名無しさん
NGNG0781デフォルトの名無しさん
NGNGできるよ。
0782デフォルトの名無しさん
NGNG->*が定義できるのだから、今度の新しい標準C++はstd::auto_ptrにも
定義して欲しいものだ。
0783デフォルトの名無しさん
NGNG作ろうと思ったら、boost::bind 完全再生産、くらいのレベルで大変なんだけど、
なんであんな規格なんだろう。
0784デフォルトの名無しさん
NGNG. .* :: ?: sizeof # ##
で全部?
■ このスレッドは過去ログ倉庫に格納されています