我在这个网站上找到了这个漂亮的小帮手: Howto throw std::exceptions with variable messages?
class Formatter
{
public:
Formatter() {}
~Formatter() {}
template <typename Type>
Formatter & operator << (const Type & value)
{
stream_ << value;
return *this;
}
std::string str() const { return stream_.str(); }
operator std::string () const { return stream_.str(); }
enum ConvertToString
{
to_str
};
std::string operator >> (ConvertToString) { return stream_.str(); }
private:
std::stringstream stream_;
Formatter(const Formatter &);
Formatter & operator = (Formatter &);
};
可以像
一样使用 std::string foo(Formatter() << "foo" << 42);
为了允许启用/禁用流输入,我使用
扩展了类bool enabled;
enum class status {
active, inactive
};
Formatter& operator << (status s)
{
if (s == status::active) enabled = true;
if (s == status::inactive) enabled = false;
return *this;
}
并将输入模板更改为if (enabled) stream_ << value;
现在我可以做到
std::string optional = "";
std::string foo(Formatter()
<< "foo"
<< (optional.empty() ? Formatter::status::inactive : Formatter::status::active)
<< "bar" << optional
<< Formatter::status::active
<< "!");
现在我正在寻找摆脱status
并直接使用Formatter::inactive
的方法。