2011-04-17 39 views
4

大家好!我試圖做一個sprintf的簡單副本,返回格式化的字符串,但我進入了一個小的障礙...C++從變長參數列表中提取std :: string

顯然,使用可變長度參數列表不能傳遞一個std :: string實例。

我已經有解析器正常使用int,double,float,char,const char *,char * ...我還沒有讓字符串工作。 :\

在你想知道的情況下,這是編譯錯誤,我得到:/root/learncpp/StringFormat/main.cpp:8: warning: cannot pass objects of non-POD type 'struct std::string' through '...'; call will abort at runtime

我這樣做的主要原因是,這樣我可以有方便的格式,而無需依靠第三方庫,但仍然不需要將「.c_str()」附加到每個我使用的字符串實例。

幫助,這將不勝感激。也許有專門爲C++製作的可變長度參數列表的不同版本?

編輯:我剛剛意識到,如果你傳遞一個指向字符串的指針(即使用前綴&),它的效果很好。您只需在自定義sprintf中取消引用字符串指針,同時傳遞std :: string的地址!

不過,很高興看到是否有任何方法通過可變長度參數列表直接支持字符串。謝謝!

回答

3

否 - 正如編譯器所說的,只允許您將POD類型的對象傳遞給可變參數函數。

你通常想要做的就是消除首先使用可變參數函數,比如通過使用iostream而不是像printf(或者stringstream而不是sprintf)。

+1

那麼,我喜歡sprintf的原因是你可以自動將ints/double變成一個字符串的方式,以及使用它的很好的格式。在混合很多變量和間隔符時,iostreams/stringstreams對我來說看起來很笨拙,即在%dth月份的第d天,「Hello%s,時間爲%d:%d:%d」。 – FurryHead 2011-04-17 01:49:34

+3

你看過Boost格式嗎? http://www.boost.org/doc/libs/1_46_0/libs/format/index.html – 2011-04-17 01:50:40

+0

@Jerry,是不是很難得到有時工作?我見過幾個人很難讓它鏈接或編譯(無法記住哪個) – FurryHead 2011-04-17 01:52:40

相關問題