[cppll:0364] <tips> viva comma ( was: Re: <tips> expression )
- Subject:
- [cppll:0364] <tips> viva comma ( was: Re: <tips> expression )
- From:
- Wraith the Trickster <wraith@...>
- Date:
- Thu, 27 Dec 2001 11:23:28 +0900
- X-Mailer:
- Microsoft Outlook Express 5.50.4807.1700
- Message-Id:
- <003201c18e7d$84e8f3c0$acee12d3@mist>
- References:
- 340
道化師です。
【[cppll:0340] Re: <tips> expression】
> <tips>がいつのまにか<tricks>や<magics>になっちゃって、
内容に関してはすでそーなっている気が...。(^^;
【[cppll:0340] Re: <tips> expression】
> , なんかも再定義できます。
>
> でもよいこのみんなは真似しちゃだめだよ。
...というリクエスト( ←違うって )にお応えして、カンマ演算子の
再定義を御題に二つほど...
■choose result
定義:
template<class T> struct comma_result {
T &value;
comma_result(T &_value) :value(_value) {}
};
template<class T> inline comma_result<T> comma_set(T &value) {
return comma_result<T>(value);
}
class comma_get {};
template<class T, class U>
inline comma_result<T> & operator,(comma_result<T> &result, U) {
return result;
}
template<class T>
inline T & operator,(comma_result<T> &result, comma_get) {
return result.value;
}
用例:
hoge = (A, B, comma_set(C), D, E, F, comma_get());
目的:
通常カンマ演算子で区切られた値はその最後の値が全体の評価値と
して扱われるんだけど、これを使うことで途中の値を全体の評価値
にできる。
■enumerate element
定義:
template<class T> struct enum_adapter {
T &value;
enum_adapter(T &_value) :value(_value) {}
};
template<class T> inline enum_adapter<T> enum_start(T &value) {
return enum_adapter<T>(value);
}
class enum_end {};
template<class T> inline enum_adapter<T>
operator,(enum_adapter<T> container, const T &element) {
container.value.push_back(element);
return container;
}
template<class T>
inline T & operator,(enum_adapter<T> container, enum_end) {
return container.value;
}
用例:
hoge(enum_start(demi< std::list<int> >()()), 1, 2, 3, 4, enum_end());
目的:
コンテナへ複数の値をまとめて代入。インラインで使用可。
# demi は http://www.tietew.jp/cppll/archive/167 のものを使用。
【[cppll:0340] Re: <tips> expression】
> 'ε'や'道'が大喜びしちゃうからね。
んだ、んだ。
...ちなみに上記のネタは二つとも VC6 ではダメ、お話になんない。
VC6 でカンマ演算子の再定義を利用することはあきらめませう。
他のコンパイラはというと、BCC5.5, CW6 では OK 。BC5 では最後の
部分を...
...., D, E, F).value;
...などとすれば大丈夫。でね、でね、よくわかんないのが、enum_start
の引数。上記用例では demi をかましているんだけど、demi を使わな
いと BCC5.5 も CW6 もコンパイラが文句たれだすの。で、demi をかま
さなくても...
std::list<int> hoge;
enum_start(hoge), 1, 2, 3, 4, 5, enum_end();
...という形なら OK 。なんなんだろう?で、gcc/g++ ではどーかと、
試してみたら choose result はすんなり動くんだけど、enumerate
element は定義もいじりながらいろいろやってみたんだけど全然うま
くいかない。choose result が大丈夫なんだからもうちょっと頑張れ
ばうまくいくようにはなるとは思うんだけど...。
# VC7 ではどうでしょう? > 誰ぞ。
□■□■ Wraith the Trickster □■□■
■□■□ 〜I'll go with heaven's advantage and fool's wisdom.〜 ■□■□
【[cppll:0340] Re: <tips> expression】
> <tips>がいつのまにか<tricks>や<magics>になっちゃって、
内容に関してはすでそーなっている気が...。(^^;
【[cppll:0340] Re: <tips> expression】
> , なんかも再定義できます。
>
> でもよいこのみんなは真似しちゃだめだよ。
...というリクエスト( ←違うって )にお応えして、カンマ演算子の
再定義を御題に二つほど...
■choose result
定義:
template<class T> struct comma_result {
T &value;
comma_result(T &_value) :value(_value) {}
};
template<class T> inline comma_result<T> comma_set(T &value) {
return comma_result<T>(value);
}
class comma_get {};
template<class T, class U>
inline comma_result<T> & operator,(comma_result<T> &result, U) {
return result;
}
template<class T>
inline T & operator,(comma_result<T> &result, comma_get) {
return result.value;
}
用例:
hoge = (A, B, comma_set(C), D, E, F, comma_get());
目的:
通常カンマ演算子で区切られた値はその最後の値が全体の評価値と
して扱われるんだけど、これを使うことで途中の値を全体の評価値
にできる。
■enumerate element
定義:
template<class T> struct enum_adapter {
T &value;
enum_adapter(T &_value) :value(_value) {}
};
template<class T> inline enum_adapter<T> enum_start(T &value) {
return enum_adapter<T>(value);
}
class enum_end {};
template<class T> inline enum_adapter<T>
operator,(enum_adapter<T> container, const T &element) {
container.value.push_back(element);
return container;
}
template<class T>
inline T & operator,(enum_adapter<T> container, enum_end) {
return container.value;
}
用例:
hoge(enum_start(demi< std::list<int> >()()), 1, 2, 3, 4, enum_end());
目的:
コンテナへ複数の値をまとめて代入。インラインで使用可。
# demi は http://www.tietew.jp/cppll/archive/167 のものを使用。
【[cppll:0340] Re: <tips> expression】
> 'ε'や'道'が大喜びしちゃうからね。
んだ、んだ。
...ちなみに上記のネタは二つとも VC6 ではダメ、お話になんない。
VC6 でカンマ演算子の再定義を利用することはあきらめませう。
他のコンパイラはというと、BCC5.5, CW6 では OK 。BC5 では最後の
部分を...
...., D, E, F).value;
...などとすれば大丈夫。でね、でね、よくわかんないのが、enum_start
の引数。上記用例では demi をかましているんだけど、demi を使わな
いと BCC5.5 も CW6 もコンパイラが文句たれだすの。で、demi をかま
さなくても...
std::list<int> hoge;
enum_start(hoge), 1, 2, 3, 4, 5, enum_end();
...という形なら OK 。なんなんだろう?で、gcc/g++ ではどーかと、
試してみたら choose result はすんなり動くんだけど、enumerate
element は定義もいじりながらいろいろやってみたんだけど全然うま
くいかない。choose result が大丈夫なんだからもうちょっと頑張れ
ばうまくいくようにはなるとは思うんだけど...。
# VC7 ではどうでしょう? > 誰ぞ。
□■□■ Wraith the Trickster □■□■
■□■□ 〜I'll go with heaven's advantage and fool's wisdom.〜 ■□■□
▼ スレッド
- 327: まずは、下のトリックを見ちくれ。 class expression_start {}; template<class T> struct expression_joint { bool res Wraith the Trickster
- └330: おもしれぇ。ブール代数オブジェクトってわけだ。 ちょいと似たことを Rogue Wave SourcePro/DB でや FUKUDA Fumiki
- └336: Pro*C/C++ みたいなプリコンパイルとはまた違い、面白いアプローチっ すね。 ここの && って、 & Wraith the Trickster
- └337: そ。SQLを書かないのでRDB毎にちょびっとづつ 異なるSQL方言をライブラリが吸収できるっす。 ん FUKUDA Fumiki
- └339: Pro*C/C++ は Oracle の製品だから Oracle 用になってるだけで、似たよ うな汎用プリコンパイラを作 Wraith the Trickster
- ├340: そらまそーですけどね^^; んでもだからといってPro*C/C++ for ODBC/DB2/SQLServer が存在するわけじゃな FUKUDA Fumiki
- │├346: ってわけで、演算子再定義の濫用による'おちゃらかスタック' template<class C> struct ikeike_koikoi_adapt FUKUDA Fumiki
- ││└392: επιστημηさんにはniftyでお世話になっております。 Set<char, 'A', 'Z'> s; // 要素の型と、最大/最 FUU
- ││ ├393: 道化師@明日から冬休みー(いぇ〜い!)です。 ↓こんなのもあります。よかったら覗いてみてやっ Wraith the Trickster
- ││ └396: ども。ninftyからは抜けました。 なにもそこまでしてDelphiに似せなくてもって思うんだけどな > V FUKUDA Fumiki
- ││ └432: どうも、お返事遅くなりました。 うう、寂しいですが、時代の流れでしょうか…。 Delphi関係な FUU
- ││ └433: 生い立ちから考えるとムリそうですね。Delphi のための VCL ですから。 C++ のクラスライブラリと SHINOHARA Shoji
- │└364: 内容に関してはすでそーなっている気が...。(^^; 再定義を御題に二つほど... ■choose result 定義: t Wraith the Trickster
- │ ├365: ちょっと話題がズレてしまうんですが、 松浦 明彦 <matuura‐at‐core.co.jp> Akihiko Matuura
- │ │└367: enumerate element もその一例っすよ。(^^; □■□■ Wraith the Trickster □■□■ ■□■□ 〜I'll go with he Wraith the Trickster
- │ │ └369: よく読んでませんでした。^^; hoge は結果的に std::list<int> を受け取るわけですね。 なるほど。 Akihiko Matuura
- │ ├368: レス付けたいけど消化不良。ビオフェルミン舐めよ。 FUKUDA (episteme) Fumiki -- magical, but never a magic. FUKUDA Fumiki
- │ │└373: 夢のなかではいつも"ねくろまんしぃ"が使えます/使ってます。:-) あんまり、深追いするのもア Wraith the Trickster
- │ ├375: enum_adapterのテンプレート引数Tはコンテナ型ですよね? elementの型にもなってるのがちょっと気に mars
- │ │└376: あ、ごめんなさい。ご推察通り... template<class T, class U> inline enum_adapter<T> operator,(enum_adapter<T> contai Wraith the Trickster
- │ │ ├377: あ、ここだけでよかったんですね。 とち狂って全体をテンプレート引数2個に変えてました。 mars
- │ │ ├382: ちなみに container.value.push_back(element); を container.value.insert(container.value.end(), element); にすげかえる FUKUDA Fumiki
- │ │ └384: ふーむ...どうやらコンパイラじゃなく、ライブラリに問題ありそう。 FUKUDA (episteme) Fumiki -- magica FUKUDA Fumiki
- │ │ ├385: ろ 思い出せないですが、何かのライブラリに std::string あたりに バグがあるから、違う string を oki
- │ │ │└388: わかりました…。string じゃなく strstream でした…。 boost の libs/src/graph/graphviz_parser.y に書いてあ oki
- │ │ └386: operator,をメンバ関数にするとおっけーだったりする。 class enum_end {}; template<class C, class T=C::value_t FUKUDA Fumiki
- │ │ └409: この部分。gcc2.96で「C::value_type」がコンパイルできないんです。 perse error before `>' と怒られてし mars
- │ │ └411: 新年明けましておめでとうございます。 今年もよろしくお願いいたします。m(__)m その部分につ Wraith the Trickster
- │ │ └412: やはりそうでしたか。自分がオオボケでないことがわかって一安心です(笑)。 試してみました mars
- │ │ └413: うげっ!これダメなの? ... 信じられなかったのでおいらもいくつかの パターンで試して見たけど Wraith the Trickster
- │ │ └415: 同様の例で、たとえば、 typedef C::value_type value_type; は、エラーでも、 typedef typename C::value_type valu Shin'ya MORINO
- │ │ └416: ふむふむ。テンプレート引数でclassの代りだとしか思ってませんでした…。 で、試しにgcc 2.96で mars
- │ │ └422: VC7-beta2 だとおっけーみたいっす。 かなりstdC++に肉迫してますな > VC7 FUKUDA (episteme) Fumiki -- magical FUKUDA Fumiki
- │ └407: おいらの拙いトリックをフォローしてくださった方々ありがとうござい ます。m(__)m 誤認等もあ Wraith the Trickster
- └341: SourcePro/DBはライブラリだから、ひとつのアプリで複数の異なるRDBに 同じインタフェースで接続/ FUKUDA Fumiki