2017-05-15 7 views
1

私は間に合わせと-__DEBUGはこのようなものでトレース有効に行うために思っていた:STDに付着したダミーのデバッグクラス:: ENDL過負荷

#ifdef __DEBUG 
# define dbg std::cout 
# define err std::cerr 
#else 

#include <iostream> 

class dummy_cout 
{ 
private: 

public: 
    dummy_cout & operator << (auto &obj) 
    { return *this; } 

    dummy_cout & operator << (std::result_of< decltype(&std::endl) >::type &obj) 
    { return *this; } 
}; 

# define dbg dummy_cout() 
# define err dummy_cout() 
#endif 


int main(int argc, char *argv[]) 
{ 
    dbg << "Bla, bla. bla..." << std::endl; 
} 

しかし、それは私を与える:

cond_dbg.cpp:16:66: error: decltype cannot resolve address of overloaded function 
    dummy_cout & operator << (std::result_of< decltype(&std::endl) >::type &obj) 

私はdecltype,result_of,ostreamなどの6種類のバリエーションも試しましたが、それ以上のステップはまだありません。

これは簡単です。 __DEBUGを定義するコードをコンパイルすると、coutcerrとなります。私が普通のコンパイルをした場合、私はdummy_coutを持っているだけで何もしませんが、私のコードを変更せずにコンパイルすることができます。

ご協力いただきますようお願い申し上げます。あなたはstd::endlは関数ではありませんので、それは関数テンプレートdecltype(&std::endl)を書き込むことはできません

+0

dummy_cout'クラス 'であなたの'演算子<< '過負荷にコメントを:それはあなたがC++'のstd :: ostream'挿入をオーバーロードする方法だけではありません演算子.... – WhiZTiM

+1

なぜ 'std :: endl'を別に扱う必要がありますか?それは、テンプレートバージョンでキャプチャする必要があります。 –

+0

ありがとう@Henri Menke。これは私の最初の裁判でしたが、うまくいきませんでした。 'テンプレート引数の控除/置換に失敗しました ' – j4x

答えて

3

:このよう

template< class CharT, class Traits > 
std::basic_ostream<CharT, Traits>& endl(std::basic_ostream<CharT, Traits>& os); 

、それはタイプを持っていないので、それは意味がありません。それを求める。また、型があったとしてもその後のラッピングは意味をなさないでしょう。

std::cout << std::endl

作品は、関数ポインタの特定のタイプを受け入れるoverloadがあることであることを理由:

basic_ostream& operator<<(
    std::basic_ios<CharT,Traits>& (*func)(std::basic_ios<CharT,Traits>&)); 

この演算子でない関数テンプレート(それはbasic_ostreamのメンバ関数でありますクラステンプレート)、ここでオーバーロードの解決はendlの特殊化のインスタンス化をトリガーします。

dummy_cout& operator<<(std::ostream&(*p)(std::ostream&)); 

たり、ダミーのタイプのためのいくつかの適切なCharTTraits選ぶ:

dummy_cout& operator<<(std::basic_ostream<C,T>&(*p)(std::basic_ostream<C,T>&)); 

だけのノートを、この作業を取得するには

は、あなただけの同じことを行う必要があります。この宣言は、病気に形成された任意のC++標準である:

dummy_cout& operator<<(auto& obj); 

簡潔関数テンプレートの構文はまだTSである、概念TSの機能です。あなたが使用している場合を除き - fconceptsを、あなたが記述する必要があります。

template <class T> 
dummy_cout& operator<<(T& obj); 
+0

メンバ関数の宣言で問題を指摘するべきではありません:' dummy_cout&operator <<(自動&obj); '?..あるいは、C++ XXでは正当な宣言ですか? – WhiZTiM

+0

@WhiZTiM確かに、メモを追加しました。 – Barry

+0

ありがとう@バリー。 'dummy_cout&operator <<(std :: ostream&(* p)(std :: ostream&))'はそのままの状態で動作します。私はちょうどいくつかの結果を表示するために私の質問を編集したし、あなたがそれについてコメントすることができれば本当に感謝します。 – j4x

関連する問題