私はこのような機能を持っています
print(const std::string& message);
使用できるように、他の場所でラップするにはどうすればよいですか
print2("some message"<<object);
これは上記の関数を内部的に呼び出す必要があります。
私はこのような機能を持っています
print(const std::string& message);
使用できるように、他の場所でラップするにはどうすればよいですか
print2("some message"<<object);
これは上記の関数を内部的に呼び出す必要があります。
可変個引数テンプレートを使用した C++11 ソリューションは次のとおりです。
void print(std::string const & message); // your original function as before
void print2(std::istringstream & iss)
{
print(iss.str());
}
template <typename T, typename ...Rest>
void print2(std::istringstream & iss, T && t, Rest &&... rest)
{
iss << std::forward<T>(t);
print2(iss, std::forward<Rest>(rest)...);
}
template <typename ...Args>
void print2(Args &&... args)
{
std::istringstream iss;
print2(iss, std::forward<Args>(args)...);
}
使用法:
print2("Some message", x, foo, "text");
可変数の引数を持つインターフェイスは、関数呼び出しでシフト演算子を不自然に使用するよりもすっきりと直接的です。後者では、ストリーム オブジェクトを明示的に作成する必要があり、ストリームの低レベルを処理する必要があるためです。 levelrdbuf
直接、およびそのアプローチには、特別なケースとして、元の引数のないバージョンはありません。
operator<<
文字列ストリームを返すテンプレートを作成できる可能性があります
template<class T>
std::stringstream operator<<(const char* c_str, T t)
{
std::stringstream tmp;
tmp << t;
return tmp;
}
次に、定義する必要があります
void print2(std::stringstream sstream)
{
print(sstream.str())
}
元の print メソッドをオーバーロードすることもできるので、同様にうまく書くことができます
print("something"<<some_obj);