namespace details {
std::string format(char const* sformat, ...) {
// code
}
}
template<class...Args>
std::string format(std::string const& str, Args const&... args) {
return details::format(str.data(), args...);
}
、私はto_pod
ヘルパー書くことができます。
namespace details {
std::string format(char const* sformat, ...) {
// code
}
}
template<class T>
T const& to_pod(T const& t){ return t; }
template<class Char, class Attribs>
Char const* to_pod(std::basic_string<Char, Attribs> const& str) {
return t.data();
}
template<class...Args>
std::string format(std::string const& str, Args const&... args) {
return details::format(str.data(), to_pod(args)...);
}
を、今私は、最初の引数を過ぎてのものとしてstd::string
Sを渡すことができ、そして、彼らはへchar const*
ポインタに自動変換され、バッファ。
...
あなたは(MSVC 2010と言う)C++ 11コンパイラを持っていない場合は、あなたの最善の策は、単にオーバーロードを書くことが考えられます。
std::string format(std::string const& str) {
return details::format(str.data());
}
template<class A0>
std::string format(std::string const& str, A0 const& a0) {
return details::format(str.data(), to_pod(a0));
}
template<class A0, class A1>
std::string format(std::string const& str, A0 const& a0, A1 const& a1) {
return details::format(str.data(), to_pod(a0), to_pod(a1));
}
// etc
おそらく10個を超える引数が必要です。
「またはもっと良い解決策がありますか?」可変長パックを削除して可変長テンプレートを使用する方法はありますか? – Rakete1111
これはコンパイラ固有のものなので、使用しているコンパイラを教えてください。どのバージョン?あなたはどのシステムをターゲットにしていますか? –
[variadic template](http://en.cppreference.com/w/cpp/language/parameter_pack)を使用しますか? – NathanOliver