需要字符串流包装操作员帮助

时间:2014-05-18 20:02:39

标签: c++ types operators stringstream

我在这个网站上找到了这个漂亮的小帮手: 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的方法。

0 个答案:

没有答案