Re: [問題] C++ Variable-length argument

看板C_and_CPP作者 (高髮箍)時間11年前 (2013/04/27 20:36), 編輯推噓0(000)
留言0則, 0人參與, 最新討論串2/3 (看更多)
※ 引述《shihyuyao (shihyuyao)》之銘言: : 請問在C++ 中 我有個函數是 Variable-length argument : 函數帶入的類型有 int , string , long 三種, : 這樣我函數內要怎麼判斷傳入的類型跟 個數? : Java 可以把要傳入函數先裝在容器 , 用Object 類型容器 , 判斷容器大小, 再用 : instanceOf 判別類型做轉型處理 , : 但在C++ 要怎麼做? : 謝謝 你指的應該是 C語言 Varadic Function, 但是它用法就跟 printf 一樣很麻煩. 接受任意個數引數 在 C++ 裡我們可以用寫好幾個重載函式來做這種事: // 一個參數, 2 種版本 void foo( int ); void foo( std::string ); void foo( long ); // 兩個參數, 9 種版本 void foo( int, int ); void foo( int, std::string ); void foo( int, long ); ... 如果照這樣寫人力耗費太多了所以一般我們都會寫幾個函式模板 (template)讓編譯器幫我們產生可以呼叫的版本 // 一個參數, 視呼叫方式決定有幾種版本 template < typename T0 > void foo( T0 ); // 兩個參數, 視呼叫方式決定有幾種版本 template < typename T0, typename T1 > void foo( T0, T1 ); 這樣我們就可以接受多個引數了, 在各個函式模板裡可以針對 "已知" 的參數個數作不同處理. 判斷及限定傳進來的引數型別 你可以用 Boost.TypeTraits 或是 <type_traits> (C++11) 裡的 meta functions來詢問型別特性, 就像 Java instanceof 運算子 的功能, 只不過 C++ 是在編譯時期做這件事情的: live demo: http://ideone.com/VZlVTD 限定型別可以使用 Boost.StaticAssert 或是 static_assert (C++11) 在編譯時就擋下你不想處理的型別: live demo: http://ideone.com/eX8T71 其他方案 另外也可以用 Boost.Variant 來實作 overloaded functions, 個人覺得此法可以在 prototype 上表達比較多資訊 example: http://ideone.com/OvG0LQ -- ╔═══╗╔═══╗ ╔═╗═╗╔═══╗╔═══╗╔╦═╦╗ 金栽經║ ╔╗ ║║ ╔╗ ║╔╗║ ║ ║║ ═ ║║ ╔╗ ║║║ ║║RAINNOUS ≡≡║ ╚╝ ║║ ╚╝ ║║║║ ║║ ╞╣║ ║║ ║║ ║ ═╣║ ╥ ║║║║ ║ ║║ ═ ║║ ╚╝ ║║ ║ ║ 高佑麗╚═╩═╝╚═╩═╝╚╝╚═╚═╝╚═══╝╚═══╝╚═╩═╝鄭允慧 趙賢榮金智淑盧 乙吳勝雅ψmocki -- ※ 發信站: 批踢踢實業坊(ptt.cc) ◆ From: 140.121.221.215 ※ 編輯: loveme00835 來自: 140.121.221.215 (04/27 20:53)
文章代碼(AID): #1HUyOuMh (C_and_CPP)
文章代碼(AID): #1HUyOuMh (C_and_CPP)