C COUT自动分离器

C++ cout auto separator

本文关键字:分离器 COUT      更新时间:2023-10-16

我想知道std::cout是否会自动插入印刷序列之间的一些预定值。

例如:

std::cout << 2 << 3 << 33 << 45 << std::endl;

输出

233345

我希望它输出

2 3 33 45

我知道,很容易:

std::cout << 2 << " " << 3 <<  " " << 33 <<  " " << 45 << std::endl;

但是我想知道是否有一种自动化的方法,例如:

std::cout << set_some_separator(" ") << 2 << 3 << 33 << 45 << std::endl;

有人知道这样的事情吗?

好吧,我被它殴打了。我无论如何都会发布。

编辑:嗯,阅读Nim的回答后,我的 do 实现了所希望的。

#include <iostream>
#include <algorithm>
struct with_separator {
    with_separator(std::string sep)
    : sep(std::move(sep)) {}
    std::string sep;
};
struct separated_stream {
    separated_stream(std::ostream &stream, std::string sep)
    : _stream(stream), _sep(std::move(sep)), _first(true) {}
    template <class Rhs>
    separated_stream &operator << (Rhs &&rhs) {
        if(_first)
            _first = false;
        else
            _stream << _sep;
        _stream << std::forward<Rhs>(rhs);
        return *this;
    }
    separated_stream &operator << (std::ostream &(*manip)(std::ostream&)) {
        manip(_stream);
        return *this;
    }
    private:
    std::ostream &_stream;
    std::string _sep;
    bool _first;
};
separated_stream operator << (std::ostream &stream, with_separator wsep) {
    return separated_stream(stream, std::move(wsep.sep));
}
int main()
{
    std::cout << with_separator(", ") << 1 << 2 << 3 << std::endl;
}

输出:

1, 2, 3

简单的答案是否定的,但是,您可以自己滚动...

#include <iostream>
#include <sstream>
using namespace std;
struct set_some_separator{
    set_some_separator(const char* sep) : _sep(sep)
    { };
    template <typename T>
    set_some_separator& operator<<(const T& v)
    {
        _str << v << _sep;
        return *this;
    }
    friend
    ostream& operator<<(ostream& os, const set_some_separator& s)
    { return os << s._str.str(); }
    const char* _sep;
    ostringstream _str;
};
int main()
{
    cout << (set_some_separator(" ") << 2 << 3 << 33 << 45) << endl;
}

好吧, cout的格式是略有不同的,嘿,ho ...

不是完全相同的事情,而是:

#include <array>
#include <iostream>
#include <iterator>
int main() {
    std::array<int, 3> data = { 1, 2, 3 };
    std::ostream_iterator<int> out(std::cout, " ");
    std::copy(data.begin(), data.end(), out);
    std::cout << 'n';
    return 0;
}

使用ostream_iterator

如何
int main()
{
     std::vector<int> data {2,3,33,45};
     std::copy(std::begin(data), std::end(data),
               std::ostream_iterator(std::cout, " "));
     std::cout << "n";
}

a c 17倍表达式使用逗号操作员可以创建一个不错的单线:

[](auto &&...xs){ ((std::cout << xs << ',') , ...); }(2,3,33,45);

简单解决方案,也许您可以对其进行调整以使用<<

template<typename T> 
void myout(T value) 
{ 
   std::cout << value << std::endl; 
} 
template<typename First, typename ... Rest> 
void myout(First first, Rest ... rest) 
{ 
   std::cout << first << " ";
   myout(rest...); 
}

myout('a',"Hello",1,2,3,22/7.0);

如果您只是在寻找一种正确界定元素的矢量的方法(最后没有额外的定界符),请尝试以下操作:

#include <iostream>
#include <vector>
int main()
{
  std::vector<int> v{1, 2, 3};
  auto it = v.begin();
  if (it != v.end())
  {
    std::cout << *it;
    ++it;
  }
  for (; it != v.end(); ++it)
  {
    std::cout << ", " << *it;
  }
}