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的一些示例代码的启发下被无耻地窃取

很容易将其调整为写入 anfstream而不是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 回答