C++上級者が集まるス ..
[2ch|▼Menu]
855:デフォルトの名無しさん
09/01/23 21:55:00
>プライベート継承よりも包含&インライン関数の方が良いと思う。
○汎用性が高い
 - 同じ名前で一部だけ流用とかも簡単
 - 名前の変更も問題なし
 - NVIにするのも簡単
○余計な関数を導入するリスクが少ない
 Traitsにするのならちゃんと切り離した方が良いと思う。

×オブジェクトがちょっと大きくなる(pimplにしてもポインタ分余計になる)
×コードが面倒

といったところかね。


>forはよく見るけど別のってあまり見なくない?
だからdynamic_castとかでは普通に使うって。MC++Dで紹介されてるよ。


856:デフォルトの名無しさん
09/01/23 23:24:12
>>855
ゴメンifに関しては使うわ。でも他人が
使っているのを見ることがほとんど無いのよ。

継承に関してはなるほどね。
でも、その用途だったら初めからプライベート継承要らなくない?
実際プライベート継承が有用な時はthisを渡してオーバーライド
を使うときや、templateでのシグニチャの移譲用だと思うけど。

857:855
09/01/24 02:25:07
どっかで見たと思ったら、C++狂 Sutter & AlexandrescuのC++ Coding Standardsに概要あったわ。

○呼び出し側コードに影響を与えず、柔軟性に富む
○コンパイル時の独立性が高く、コンパイル時間も短い
○予期しない振る舞いを抑制する
○適用範囲がより広い
○優れた強固さと安全性
○複雑性と脆弱性がより小さい

非public継承を使うのは
・仮想関数をオーバーライドする必要がある
・protectedメンバーへのアクセスが必要
・メンバー変数よりも前に生成&後に破壊
・仮想基本クラスに配慮する必要がある
・空の基本クラスの最適化
・制御されたポリモーフィズムが必要
ぐらいだって。

858:デフォルトの名無しさん
09/01/24 02:28:00
自分の場合、最もprivate継承を使う機会はboost::noncopyableを使うときだな。

859:デフォルトの名無しさん
09/01/24 13:37:51
C++の上級者はWindows GUIアプリケーションの開発でMFCを使いますか?

860:デフォルトの名無しさん
09/01/24 13:53:21
 GUIは、C♯.NETで作って、C++で速度を求める部分をDLLとして作ってC♯から呼び出す。

861:デフォルトの名無しさん
09/01/24 14:13:31
C++/CLIでWPF

862:デフォルトの名無しさん
09/01/24 14:18:21
C++&wxWidgets

863:デフォルトの名無しさん
09/01/24 14:27:41
Qt !

864:デフォルトの名無しさん
09/01/24 14:57:59
そういうことを決めるのは上級者ではないことが多いと思う。
ともかく案件による。配布の問題もあるし。

865:デフォルトの名無しさん
09/01/24 15:07:41
オラ、おまいらここ行ってマイナーな奴を楽しんで来い。
スレリンク(tech板)

866:デフォルトの名無しさん
09/01/24 15:46:39
誰も反応してくれないけど、boost::any用のMC++D風マルチメソッドを実装してみました。
(実装)URLリンク(cvs.sourceforge.jp)
(使い方)URLリンク(cvs.sourceforge.jp)
一応、boost::any以外でも使えるように汎用化しています。
#下半分がboost::anyをこのマルチメソッド用に最適化したクラスね。

まだ使い込んでないから何とも言えないけど、なんかヤバそうなところある?


867:デフォルトの名無しさん
09/01/24 15:48:46
>>866
さみしいからて出張してくんなよ、素にもどれ

868:デフォルトの名無しさん
09/01/24 16:02:24
スレ違いじゃないからいいじゃない。あっちは誰も相手にしてくれんのよ。
けっこう適当に作ってるので、変な落とし穴にはまってないかけっこう不安なんだよね。


869:デフォルトの名無しさん
09/01/24 16:30:56
なんで反応が無いんだろうねぇ。
こういうの好きそうな人っていそうだけどね。
みんな今忙しいのかな。

ちなみに俺はそういうのは Excel とかで管理するから興味ない。
バリデータ書くにも楽だし。

870:デフォルトの名無しさん
09/01/24 16:51:54
Excel(笑)

871:デフォルトの名無しさん
09/01/24 17:10:21
>>868
それはなんなの?

872:デフォルトの名無しさん
09/01/24 17:32:32
マルチメソッドという便利ツール。実行時にオブジェクトの種類に応じて実行するメソッドを変更してくれる。
あらかじめ関数オブジェクトを作って登録しておく必要があるのが面倒だけど。

struct TestAnyMethod0 {
 // transfer member function
 string operator()(any& arg1) { return MultiMethod::apply<string>(*this, arg1); };
 // multi method
 string operator()(int value) const { return string("int"); };
 string operator()(double value) const { return string("double"); };
};
bool m00(MultiMethod::entry<std::string, TestAnyMethod0, boost::any, int>());
bool m01(MultiMethod::entry<std::string, TestAnyMethod0, boost::any, double>());

int main() {
 TestAnyMethod0 m0;
 any m(m0);
 any a(0);
 BOOST_CHECK_EQUAL(boost::any_cast<std::string>(MultiMethod::apply(m, a)), "int");
 a = 0.0;
 BOOST_CHECK_EQUAL(boost::any_cast<std::string>(MultiMethod::apply(m, a)), "double");
}

873:デフォルトの名無しさん
09/01/24 17:35:03
ただのポリモーフィズムとどう違うの?

874:デフォルトの名無しさん
09/01/24 17:35:14
あっとこれを忘れてた。
int main() {
 TestAnyMethod0 m0;
 any m(m0);
 any a(0);
 BOOST_CHECK_EQUAL(m(a), "int");
 BOOST_CHECK_EQUAL(boost::any_cast<std::string>(MultiMethod::apply(m, a)), "int");
 a = 0.0;
 BOOST_CHECK_EQUAL(m(a), "double");
 BOOST_CHECK_EQUAL(boost::any_cast<std::string>(MultiMethod::apply(m, a)), "double");
}

875:デフォルトの名無しさん
09/01/24 17:36:10
バグってた…… ×m(a) -> ○m0(a)



876:デフォルトの名無しさん
09/01/24 17:39:23
>873
普通の多態だと引数の実行時多態ができないけど、これだとできる。
さらに関数オブジェクト自体の多態もできるように作ってみた。


877:866
09/01/24 17:46:30
boost::anyって、データを処理しようとするとデータの中身が何かを知らないといけないから、
けっこう不便なんだよね。
boost::variantだと(visitorを活用して)中身を知らなくても処理を行えるようにしているので、
これをboost::anyに応用できないか、と思って拵えたのが>866


878:866
09/01/24 17:48:51
>872はバクってるな……面倒なのでサンプルはこっち見て。
(使い方)URLリンク(cvs.sourceforge.jp)


879:デフォルトの名無しさん
09/01/31 16:14:29
>>878
みんなの現場はそういうの使わしてくれるん?
うちはboostも無理っぽいのだけど

880:デフォルトの名無しさん
09/02/05 19:44:31
マ板でやれ

881:デフォルトの名無しさん
09/02/05 23:04:39
最終的にboostを目指すんだ


最新レス表示
スレッドの検索
類似スレ一覧
話題のニュース
おまかせリスト
▼オプションを表示
暇つぶし2ch

5266日前に更新/170 KB
担当:undef