好了,所以這是挑釁不乾淨/最短的解決方案,但在這裏是做這件事的一種方法:
namespace custom
{
struct sep
{
sep(const std::string & s)
:separator(s)
{
}
std::string separator;
};
}
typedef std::basic_ostream<char, std::char_traits<char> > CoutType;
typedef CoutType& (*StandardEndLine)(CoutType&);
class SeparatorWrap
{
public:
SeparatorWrap(std::ostream & _ofs, const custom::sep & s)
: ofs(_ofs)
, separator(s)
{}
template <class W>
SeparatorWrap& operator << (W && w)
{
ofs << separator.separator << w;
return (*this);
}
ostream & operator << (const StandardEndLine &)
{
//writing std::endl will remove the separator
return ofs << std::endl;
}
protected:
std::ostream & ofs;
custom::sep separator;
};
class SeparatorWrapFirst
{
public:
SeparatorWrapFirst(std::ostream & _ofs, const custom::sep & s)
: ofs(_ofs)
, separator(s)
{}
template <class W>
SeparatorWrap operator << (W && w)
{
ofs << w;
return SeparatorWrap(ofs, separator);
}
ostream & operator << (const StandardEndLine &)
{
//writing std::endl will remove the separator
return ofs << std::endl;
}
protected:
std::ostream & ofs;
custom::sep separator;
};
SeparatorWrapFirst operator << (std::ostream & ofs,const custom::sep & s)
{
return SeparatorWrapFirst(ofs, s);
}
int main()
{
std::cout << custom::sep(", ") << 1 << "two" << 3 << std::endl;
}
這裏是它如何工作的:
std::cout << custom::sep(", ")
返回類SeparatorWrapFirst
型(使用全局operator <<
)用於寫入一個沒有分隔符值的輸出。這是因爲如果你有一個元素,你不需要寫分隔符。
在調用SeparatorWrapFirst
的第一個運算符<<
之後,將返回SeparatorWrap
類,並且也使用分隔符進行打印。這是爲了多個值。
編輯:
因此,從評論(@gexicide)看來,我的可能把custom manipulator inside std::cout
。這可以讓你做這樣的事情:
std::cout << custom::sep(", ");
std::cout << 1 << "two" << 3 << std::endl;
哪裏從上面的第一個解決方案不會爲此工作。
流不支持您提出的設計。沒有勾選「輸出項目」。但爲什麼不編寫「打印」功能,而不是試圖將流打到非自然的事情?或者你可以支持一個字符串的'<<'符號作爲目的地,即字符串生成器。兩者都相當容易做到。 –
@kloffy這是可能的,但不是直接在'std :: cout'內。我正在寫回復 – Raxvan
感謝您的意見。我的問題的部分動機是找出是否有可能。我期待着看到你的解決方案@Raxvan! – kloffy