2016-08-11 5 views
1

コンテキスト:私は従来のコードで作業していますが、このコードをC++ 14標準にゆっくりと作りたいのですが、printfが好きです。コードの は、したがって、この種の(簡体字):パラメータパックからvar argsへ

#include <iostream> 
#include <string> 
#include <cstdio> 

template <typename... Args> 
const char* Format(const char* strFormat, Args... args) 
{ 
    static char szBuffer[10000]; 

    auto len = std::vsnprintf(szBuffer, 10000, strFormat, args...); 

    if (len < 0 || 10000 <= len) 
    { 
    szBuffer[0] = 0; 
    } 

    return szBuffer;  
} 

int main() 
{ 
    auto test = Format("%s %s %d", "test", "test", 42); 
} 

これが妙に動作しません:gccの& VS2013はのva_argに拡張パラメータパックから行くことはできません。 (http://cpp.sh/4aue

10:66: error: cannot convert 'const char*' to '__va_list_tag*' for argument '4' to 'int vsnprintf(char*, size_t, const char*, __va_list_tag*)' 

なぜこの現象が発生するのですか? 一方、間違って中間のvar_arg関数をコンパイルすると、&が正しく動作します(http://cpp.sh/2ggms)。

はあなたが snprintf、ない vsnprintfたい

答えて

2

ありがとうございます。パラメータパックはコンマ区切りのリストに展開されます。これらの機能のvバージョンは、va_listのみを受け入れます。

コード例を見ると、std::stringを渡す場合は、まだtransform_to_cのような関数が必要です。

サイドノート:このコードがスレッドセーフかリエントラントかどうかを検討する必要があります。静的バッファを使用することはどちらも意味しません。

+0

テンプレート拡張で起こりうる問題に焦点を当てているので、私はv/snprintfエラーを完全に見落としています...ありがとう、はい、引数チェックが目標です! – Errata

関連する問題