0

重複の可能性:
C++ パラメータとして << の後に stringstream を使用

私はこのような機能を持っています

print(const std::string& message);

使用できるように、他の場所でラップするにはどうすればよいですか

print2("some message"<<object);

これは上記の関数を内部的に呼び出す必要があります。

4

2 に答える 2

2

可変個引数テンプレートを使用した 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直接、およびそのアプローチには、特別なケースとして、元の引数のないバージョンはありません。

于 2012-09-24T09:33:26.790 に答える
0

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);
于 2012-09-24T09:24:28.793 に答える