2010-09-23 41 views
4

FastFormat庫的工作原理是這樣的:如何在接受無限量參數的函數中保證類型安全?

string example; 
fastformat::fmt(example, "I am asking {0} question on {1}", 1, "stackoverflow"); 

它還宣稱 「100%類型安全」。我可以理解其他庫如boost::format是如何通過重載operator%實現的,這也是我經常用我的代碼實現的。

但是,如果我能夠使用逗號,而不會讓其他程序員感到意外。我很想知道如何在沒有模板操作符重載技巧的情況下保證類型安全。


除了注意:如果你想知道什麼是 「模板操作符重載帽子戲法」,這是何等的boost ::格式作品(大部分):

struct Test 
{ 
    template<class T> 
    Test& operator%(const T& what) { cout << what << "\n" /* Example */; return *this; } 
}; 

Test() % 5 % "abc"; 
+0

有趣的是,當我運行時,我得到「5abcabc」(VS2010) – 2010-09-23 00:55:38

+0

@Anders:對我來說工作得很好 – frm 2010-09-23 00:59:58

回答

6

fastformat::fmt()接受無限數量的參數。只有一些重載需要固定數量的參數。例如,重載可能看起來像:

template <typename T0> 
std::string fmt(const std::string& format_str, const T0& arg0); 

template <typename T0, typename T1> 
std::string fmt(const std::string& format_str, const T0& arg0, const T1& arg1); 

// etc. for more numbers of arguments 

當您使用fmt(),重載發生與觀點的權利號碼選擇功能。

你必須檢查它支持多少個參數的文檔,但它絕對不是一個無限制的數字。

在C++ 0x中,您將能夠使用可變參數模板獲得無限的(好的,幾乎不受限制的)參數數量和類型安全性。

+0

該文檔提到32重載。 – UncleBens 2010-09-23 15:14:18

+0

AIUI,你可以(重新)生成某些標題,以允許你希望的任何上限。請注意,編譯器不喜歡走極端。 :-) – dcw 2011-06-27 05:39:03

相關問題