鍦╯tackoverflow涓婄湅鍒?a >榪欎釜甯栧瓙, 浜庢槸鍙戠幇浜哹oost::implicit_cast榪欎釜灝忎笢瑗?
鍏堟潵鐪嬬湅榪欐浠g爜:
struct top {};
struct mid_a : top {};
struct mid_b : top {};
struct bottom : mid_a, mid_b {};
void foo(mid_a&) {}
void foo(mid_b&) {}
void bar(bottom &arg) {
foo(arg); // 鎯寵璋冪敤"void foo(mid_a&)"
}
int main() {
bottom x;
bar(x);
return 0;
}
鏄棤娉曠紪璇戦氳繃鐨? 鍥犱負foo鐨勯噸杞借В鏋愭湁姝т箟. 閭d箞鎶奲ar閲岀殑浠g爜鏀逛竴鏀? 涓轟簡淇濇寔C++椋庢牸, 鎴戜滑浣跨敤static_cast, 鑰屼笉鏄疌椋庢牸鐨勮漿鎹?
foo(static_cast<mid_a&>(arg));
紼嬪簭緙栬瘧閫氳繃浜? 榪愯璧鋒潵涔熸病鏈夐棶棰? 鐒惰?#8230;
涓涓湀浠ュ悗鎴戞妸bar鐨勫弬鏁扮被鍨嬩慨鏀逛簡涓涓?
struct top {};
struct mid_a : top {};
struct mid_b : top {};
struct bottom : mid_a, mid_b {};
void foo(mid_a&) {}
void foo(mid_b&) {}
void bar(top &arg) {
// ... 榪囦簡涓涓湀, 榪欓噷宸茬粡娣誨姞浜嗗緢澶氫唬鐮?
foo(static_cast<mid_a&>(arg));
}
int main() {
top x;
bar(x);
return 0;
}
浠g爜渚濇棫緙栬瘧閫氳繃, 鍙槸榪愯鏃剁▼搴忔寕鎺変簡(鍋囪榪欏嚑涓被閲岄潰鏈夎澶氭垚鍛? 騫朵笖鍦╢oo閲屽鍏惰繘琛屼簡璁塊棶).
鍙戠幇闂浜嗗悧? 鍘熷洜灝卞湪浜巗tatic_cast澶己澶т簡, 寮哄ぇ鍒板彲浠ヨ繘琛?#8221;down-cast”. 浜庢槸緙栬瘧鍣ㄦ病鏈夌粰浣犱換浣曡鍛? 灝辨妸涓涓猼op綾誨瀷鐨勫紩鐢ㄧ粰寮哄埗杞崲鎴愪簡min_a鐨勫紩鐢?
榪欎釜鏃跺欒疆鍒癰oost::implicit_cast鍑哄満浜? 鎶奲ar閲岄潰鐨勯偅鍙oo璋冪敤鏀逛竴鏀?
foo(boost::implicit_cast<mid_a&>(arg));
浜庢槸涓涓湀鍓嶇殑浠g爜渚濇棫鍙互閫氳繃緙栬瘧, 鑰屼竴涓湀鍚庣殑浠g爜涓殑閿欒琚紪璇戝櫒鎻嚭鏉ヤ簡. 鍘熷洜鍦ㄤ簬闅愬紡綾誨瀷杞崲涓嶅厑璁?#8221;down-cast”, 鍙兘”up-cast”.
榪欓噷綆瑕佽涓涓嬫墍璋撴樉寮忓拰闅愬紡綾誨瀷杞崲鐨勫尯鍒? 鍦–++涓栫晫鐨勮嫳鏂囬噷, 鎴戜滑璇?#8221;convert”閫氬父鎸?#8221;implicit convert”, 鑰?#8221;cast”鎸?#8221;explicit cast”. 闅愬紡綾誨瀷杞崲濂界悊瑙? 灝辨槸浣犲啓浜嗕釜a=b, 鑰宎b涓嶅悓綾誨瀷, 緙栬瘧鍙堜笉鎶ラ敊, 灝辮鏄庨殣寮忕被鍨嬭漿鎹㈠彂鐢熶簡, 綾諱技鐨勬儏鍐佃繕鏈夊湪鍑芥暟璋冪敤鐨勫弬鏁頒紶閫掓椂. 鑰屾樉寮忕被鍨嬭漿鎹㈢壒鎸嘋椋庢牸鐨勫己鍒惰漿鎹?(type)obj鎴栬匔++涓瓑浠風殑type(obj)), 浠ュ強C++椋庢牸鐨勫洓涓叧閿瓧(static_cast, const_cast, dynamic_cast, reinterpret_cast). 鐒惰岃繖涓畾涔夋槸鐩稿綋妯$硦鐨? 姣斿涓涓猧nt綾誨瀷鐨剎, bool(x)鏄樉寮忕殑, 鑰?!x鏄殣寮忕殑, 鍏跺疄鏁堟灉涓婂茍娌℃湁鍖哄埆, 鍙槸瀛楅潰涓婄殑涓嶅悓緗簡. (鍏充簬cast鍜宑onvert鐨勫尯鍒? 鍙傝榪欓噷鍜?a >榪欓噷)
鎵浠ュ湪bar閲屾垜浠渶瑕佺殑浠呬粎鏄竴涓殣寮忕被鍨嬭漿鎹? 鐒惰岀洿鎺ユ妸arg浼犻掔粰foo鐨勮瘽浼氬嚭鐜伴噸杞芥涔? 浜庢槸鎴戜滑闇瑕佸憡璇夌紪璇戝櫒鍒板簳瑕佽繘琛屽摢涓殣寮忕被鍨嬭漿鎹? 鐒惰宻tatic_cast鍙堝お榪囧己澶? 瀹冭繕鑳藉仛闅愬紡綾誨瀷杞崲涔嬪鐨勪簨鎯?up-cast), 浜庢槸鍦ㄦ棩鍚庝唬鐮佹紨鍖栫殑榪囩▼涓暀涓嬩簡bug.
浜庢槸boost::implicit_cast搴旇繍鑰岀敓, 瀹冩瘮static_cast寮? 姝e瀹冪殑鍚嶅瓧涓鏍? 瀹冨彧鑳界敤鏉ュ憡璇夌紪璇戝櫒鎵ц浠涔堥殣寮忕被鍨嬭漿鎹?
鑰屽畠鐨勪唬鐮佸憿? 綆鍗曞埌浠や漢鍙戞寚:
template <typename T>
inline T implicit_cast (typename mpl::identity<T>::type x) {
return x;
}
鑰宮pl::identity鐨勫畾涔変篃鏋佸叾綆鍗?
template<typename T> struct identity { typedef T type; };
鏈変漢瑕侀棶榪欎釜identity騫蹭粈涔堢敤鐨? 鐪嬭搗鏉ュ緢绱禈. 濡傛灉娌℃湁榪欎釜identity, 鍍?#8221;implicit_cast(obj)”榪欐牱鐨勪唬鐮佷篃鑳介氳繃緙栬瘧, 鐒惰屽畠鍏跺疄浠涔堜篃娌″仛, obj鐨勭被鍨嬩粛鐒舵病鍙? identity鐨勫瓨鍦ㄤ嬌寰楀嚱鏁版ā鏉跨殑鍙傛暟綾誨瀷鎺ㄥ澶辨晥, 鍥犱負瑕佹帹瀵煎嚭T, 棣栧厛寰楃煡閬搃dentity鏄粈涔? 鑰宨dentity鍙堟槸渚濊禆浜嶵鐨? 浜庢槸灝卞艦鎴愪簡寰幆渚濊禆, 鍙傛暟綾誨瀷鎺ㄥ灝卞け鏁堜簡. 浜庢槸緙栬瘧鍣ㄥ氨瑕佹眰浣犳樉寮忓湴鎸囧畾T鐨勭被鍨?