すべて、コードを共有するためのおかげで、私はテストを行う、そしてニールの方法はまだ、たとえば、文字列の整形を行います。
このプログラムを実行する
#include <streambuf>
#include <ostream>
#include <iostream>
using namespace std;
template <class cT, class traits = std::char_traits<cT> >
class basic_nullbuf: public std::basic_streambuf<cT, traits> {
typename traits::int_type overflow(typename traits::int_type c)
{
return traits::not_eof(c); // indicate success
}
};
template <class cT, class traits = std::char_traits<cT> >
class basic_onullstream: public std::basic_ostream<cT, traits> {
public:
basic_onullstream():
std::basic_ios<cT, traits>(&m_sbuf),
std::basic_ostream<cT, traits>(&m_sbuf)
{
init(&m_sbuf);
}
private:
basic_nullbuf<cT, traits> m_sbuf;
};
typedef basic_onullstream<char> onullstream;
typedef basic_onullstream<wchar_t> wonullstream;
class MyClass
{
int a;
friend ostream& operator<< (ostream&, MyClass const&);
};
ostream& operator<<(ostream& out,MyClass const& b)
{
std::cout<<"call format function!!";
out << b.a;
return out;
}
int main() {
onullstream os;
MyClass obj;
os<<obj;
}
、あなたは "ostreamに&オペレータ< <(ostreamに&うち、MyClassののconstの& b)は" と呼ぶことにすること。わかりますしたがって、objの書式を実行することは依然として呼び出されます。したがって、メッセージの書式設定のオーバーヘッドを回避することはできません。
私は心配しません。 neilで示されるようなヌルストリームを使用してください。明らかにあなたがヌルのターゲットを持っていない場合、フォーマット*が*行われているので、クラスはそれ以上のパフォーマンスを必要としないので、明らかに重要ではありません。ちょうど私の2セント –
ええと、それは "デバッグ出力"のthingyとして意図されているようですね?私が見た1つの方法は次のようなものです:out()<< a << b ...; out()はstruct f {}を返します。テンプレートなしの場合 f const&operator <<(f const&f_、T const){return f_; }、ログレベルに応じて異なる構造体を返すようにしてください。異なる機能や何かを作成することができます。 –