私はVisual Studio 2008を使用していますが、可変引数リストなしの文字列フォーマット機能を実装します。pre-C++ 0x(VS2008)で "Variadic Template"を実装する方法は?
pre-C++ 0x(VS2008)で「Variadic Template」を実装する方法は?
ブーストのようなライブラリがありますか?
これを実装する別の方法ですか?
ここは私のサンプルコードです。 (私はVS2008を使用していますので、もちろん、これは遵守することはできません。)
bool VarPrint(std::ostringstream& out, const std::string& s)
{
std::string::size_type offset = 0;
if((offset = s.find("%")) != std::string::npos)
{
if(!(offset != s.size() - 1 && s[offset + 1] == '%'))
{
ASSERT(!"Missing Arguments!");
return false;
}
}
out << s;
return true;
}
template<typename T, typename... Args>
bool VarPrint(std::ostringstream& out, const std::string& s, const T& value, const Args&... args)
{
std::string::size_type prev_offset = 0;
std::string::size_type curr_offset = 0;
while((curr_offset = s.find("%", prev_offset)) != std::string::npos)
{
out << s.substr(prev_offset, curr_offset);
if(!(curr_offset != s.size() - 1 && s[curr_offset + 1] == '%'))
{
out << value;
if(curr_offset + 2 < s.length())
return VarPrint(out, s.substr(curr_offset + 2), args...); return true;
}
prev_offset = curr_offset + 2;
if(prev_offset >= s.length)
break;
}
ASSERT(!"Extra Argument Provided!");
return false;
}
任意の量の引数が必要な場合は不可能です。 1〜10個の引数のような、束縛された数の引数の実装を提供するだけです。 – Dani
あなたの例をコンパイルする: 'prev_offset> = s.length' - >'() 'が' length'関数を呼び出すことに注意してください:) –
ありがとう。私は直接入力しながら '()'を見逃しました。 hah:D – winnerrrr