请考虑以下代码。
int id = 666;
stringstream stream(stringstream::in | stringstream::out);
stream << "Object " << id << " active.";
file.write(stream.str());
它结合了前面带有&lt;&lt;的所有值。在一个字符串非常好。我希望发现一个更短,更易于使用的版本,减少代码重复。此外,上面的代码只是一个例子,命令应该接受变量和字符串的任意组合。理想情况如下:
int id = 666;
WRITE("Object ", id, " active.");
这是否可以在C ++ 中以便携方式,即使使用Boost.Preprocessor,内联函数和所有技巧。
答案 0 :(得分: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());
}
答案 1 :(得分: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'
然后:
{{1}}
答案 2 :(得分: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;