0

次のコードを検討してください。

int id = 666;
stringstream stream(stringstream::in | stringstream::out);
stream << "Object " << id << " active.";
file.write(stream.str());

これは、<<で始まるすべての値を文字列内で非常にうまく組み合わせます。コードの重複が少なく、短くて使いやすいバージョンを見つけたいと思います。さらに、上記のコードは単なる例であり、コマンドは変数と文字列の任意の組み合わせを受け入れる必要があります。理想的には次のようなものです。

int id = 666;
WRITE("Object ", id, " active.");

これは、Boost.Preprocessor、インライン関数、およびすべてのトリックを使用しても、C++で移植可能な方法で可能ですか。

4

3 に答える 3

3

これは、マクロを使用して型チェックを行わなくても実現できます。

//filewrite.h
#define WRITE(first, second, third) \
{\
   stringstream stream(stringstream::in | stringstream::out);\
   stream << first << second << third;\
   file.write(stream.str());\
}

または、よりきれいに、テンプレート関数を使用します。

template<typename T1, typename T2, typename T3>
void WRITE(T1 const& first, T2 const& second, T3 const& third, fstream& file)
{
   stringstream stream(stringstream::in | stringstream::out);
   stream << first << second << third;
   file.write(stream.str());
}
于 2012-08-28T08:55:36.357 に答える
1

型チェックが本当に必要ない場合は、C++ を使用しないでください。これは静的に型指定された言語です。

任意のタイプで機能させたいだけの場合は、マクロ ( eurgh ) を使用するか、 https: //gitlab.com/redistd/redistd/blob/master/include/redi/printers.hのような可変個引数テンプレートを使用します。以下をサポートします。

#include <redi/printers.h>
using redi::println;
int main()
{
  int id = 666;
  println("Object ", id, " active.");  // write arguments to stdout
}

このprintln関数は任意の数の引数を取り、 Howard Hinnantのサンプル コードにインスパイアされて恥知らずに盗用されました。

たとえば、追加するのではfstreamなく、に書き込むように適応させるのは非常に簡単です。std::cout

inline
void
fprintln()
{ file << std::endl; }

template<typename T0, typename... T>
  inline
  void
  fprintln(const T0& t0, const T&... t)
  {
    print_one(file, t0);
    fprintln(t...);
  }

それで:

 fprintln("Object ", id, " active.");  // write arguments to 'file'
于 2012-08-28T09:05:52.950 に答える
1

マクロは必要ありません (したくもありません)。テンプレートは次の目的で設計されています。

template <typename T>
void
write( std::string const& prefix, T const& value, std::string const& suffix )
{
    std::ostringstream fmt;
    fmt << prefix << value << suffix;
    file.write( fmt.str() );
}

一方、なぜわざわざ?クライアントコードに慣用句を使用させないのはなぜですか:

file << prefix << value << suffix;
于 2012-08-28T09:08:46.623 に答える