C++相談室 part143

■ このスレッドは過去ログ倉庫に格納されています
2019/06/15(土) 13:51:53.57ID:DKQ0QQLH0
C++に関する質問やら話題やらはこちらへどうぞ。
ただし質問の前にはFAQに一通り目を通してください。
IDE (VC++など)などの使い方の質問はその開発環境のスレにお願いします。

前スレ
C++相談室 part142
https://mevius.5ch.net/test/read.cgi/tech/1554124625/

このスレもよろしくね。
【初心者歓迎】C/C++室 Ver.105【環境依存OK】
https://mevius.5ch.net/test/read.cgi/tech/1556142878/

■長いソースを貼るときはここへ。■
 http://codepad.org/
 https://ideone.com/

[C++ FAQ]
https://isocpp.org/wiki/faq/
http://www.bohyoh.com/CandCPP/FAQ/ (日本語)

----- テンプレ ここまで -----
VIPQ2_EXTDAT: default:vvv:1000:512:----: EXT was configured
2019/06/30(日) 21:18:32.10ID:HRz15QoR0
RustスレなのにC++の話で申し訳ないが、この前
 template<class T, class U> void tr_pos(const T& src, U& dst) { ... } // メンバ関数T::get()、U::set()がある前提
というテンプレートを1個書いて、メンバ関数get()やset()を有する無数のクラスA、B、C、...について
任意の組み合わせでの相互変換(および同一型のコピー)を可能ならしめたんじゃわ
C++は数学や!とそのときオモタわ

次の日、今度はメンバ関数get()やset()を持たないクラスFooとBarについて
 template<class U> void tr_pos(const Foo& src, U& dst) { ... } // メンバ関数U::set()がある前提
 template<class T> void tr_pos(const T& src, Foo& dst) { ... } // メンバ関数T::get()がある前提
 template<class U> void tr_pos(const Bar& src, U& dst) { ... } // メンバ関数U::set()がある前提
 template<class T> void tr_pos(const T& src, Bar& dst) { ... } // メンバ関数T::get()がある前提
というテンプレートを追加して、{ A, B, C, ... }とFoo、および{ A, B, C, ... }とBar、
および(前日実現済みの){ A, B, C, ... }内の任意のクラス間のの相互変換を
tr_pos(src, dst)と書いただけで可能ならしめるという壮大な体系を実現したんじゃわ
C++は数学や!という思いをそのときさらに強くしたわ
2019/06/30(日) 21:19:31.58ID:HRz15QoR0
さらに次の日、Foo型オブジェクトsrcとBar型オブジェクトdstについてtr_pos(src, dst)と
書いたらビルドエラーになったわ;
仕方ないので関数のオーバーロードを使って
 void tr_pos(const Foo& src, Bar& dst) { tr_pos(src, A); tr_pos(A, dst); }
 void tr_pos(const Bar& src, Foo& dst) { tr_pos(src, A); tr_pos(A, dst); }
のようにして解決したんじゃわ
C++はちょっとしたテクニックを要する数学や!とそのときオモタわ

さらに次の日、Foo型同士、およびBar型同士でコピーしたくなったので、
一昨日書いたテンプレートを特殊化したら行けるやろ、と思って
 template<> void tr_pos<Foo>(const Foo& src, const Foo& dst) { ... }
 template<> void tr_pos<Bar>(const Bar& src, const Bar& dst) { ... }
と書いたらコンパイラが一昨日書いたテンプレートではなくて昨日書いた
オーバーロード関数を特殊化しようとしてビルドエラーになるわrz
C++はいろいろ破綻している罠だらけの言語やとそのとき確信したわ;
■ このスレッドは過去ログ倉庫に格納されています