顯示廣告
隱藏 ✕
※ 本文為 xxxx9659.bbs. 轉寄自 ptt.cc 更新時間: 2013-05-01 03:26:31
看板 C_and_CPP
作者 loveme00835 (高髮箍)
標題 Re: [問題] C++ Variable-length argument
時間 Sat Apr 27 20:36:04 2013


※ 引述《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)

--
※ 看板: xxxx9659 文章推薦值: 0 目前人氣: 0 累積人氣: 107 
作者 loveme00835 的最新發文:
  • Re: [問題] C++ Variable-length argument - C_and_CPP 板
    作者: 140.121.221.215 (台灣) 2013-04-27 20:36:04
    你指的應該是 C語言 Varadic Function, 但是它用法就跟 printf 一樣很麻煩. 接受任意個數引數 在 C++ 裡我們可以用寫好幾個重載函式來做這種事: // 一個參數, 2 種版 …
  • Re: [問題] 相似的class中減少code duplication - C_and_CPP 板
    作者: 140.121.221.215 (台灣) 2013-04-27 03:56:28
    把操作抽象化成物件, 操作可以繼承, 資料成員當然也可以繼承. 在父類別裡增加 protected 屬性(一連串操作)以提供子類別使用/修改: std::vector< std::functio …
  • [影音] 120825 春川休閒大賽 - Rainbow 板
    作者: 140.121.197.115 (台灣) 2012-08-28 20:32:53
    YouTube 全場 (2012.08.25) Jae Kyung 재경 fancam @ Chuncheon World Leisure Games - YouTube by ksh850817 P …
  • [情報] 新單曲預測 - Rainbow 板
    作者: 140.121.216.43 (台灣) 2012-08-09 15:14:41
    有關在網路上傳得沸沸揚揚的新日單 KISS 發行預測, 是因為近一個月 以來成員們上傳的自拍圖中, 有的含有 KISS 的字樣, 有的則是作勢想 親粉絲. 所以有的粉絲認為這可能是在暗示下一個作品即為 …
  • [圖片] 120607 COLORFUL magazine vol.2 訪問 - Rainbow 板
    作者: 140.121.197.115 (台灣) 2012-06-07 23:36:30
    裁經 想去美國黃石公園 黃石公園的超級活火山每64萬年的噴發一次週期已經逼近了 所以想用自己的雙眼鑑定這大火山噴發前的模樣還有用照 相機捕捉它的風采也想去非洲. 想目睹獅子捉著羚羊吃的樣子和在草原上 …
點此顯示更多發文記錄
分享網址: 複製 已複製
guest
x)推文 r)回覆 e)編輯 d)刪除 M)收藏 ^x)轉錄 同主題: =)首篇 [)上篇 ])下篇