2011-08-26 208 views
0

嵌套重載操作符可能嗎?我想窩< <內()嵌套重載操作符?

template<class T> 
struct UnknownName 
{ 
    T g; 
    T&operator<<(std::ostream&os, const T&v){return os<<v;} 
    bool operator()(const T&v) 
    { 
     if(v==g) 
     //do the streaming << then return true 
     else return false; 
    } 
}; 

你可以幫我嗎?恐怕我的例子對你來說已經不夠了,請問你是否還有疑問。真誠。

+0

你必須將你的'operator <<'作爲非成員函數在類之外。 –

+2

'operator <<'是一個二元運算符,所以你的例子有太多的參數('std :: ostream','const T&'和接收者對象'UnknownName '。你想調用'operator <<'''Unknown''object或'const T&'參數? – Dawson

回答

0

我能想到的辦法是有operator<<返回一個特定的類型,然後最好超載operator()接受類型:

#include <cstdio> 

namespace { 
    struct Foo { 
     struct Bar { 
      int i; 
     }; 

     Foo& operator()(const Bar& b) 
     { 
      std::printf("bar, %d\n", b.i); 
      return *this; 
     } 

     // obviously you don't *have* to overload operator() 
     // to accept multiple types; I only did so to show that it's possible 
     Foo& operator()(const Foo& f) 
     { 
      std::printf("foo\n"); 
      return *this; 
     } 
    }; 

    Foo::Bar operator<<(const Foo& f, const Foo& g) 
    { 
     Foo::Bar b = { 5 }; 
     return b; 
    } 
} 

int main() 
{ 
    Foo f, g, h; 
    f(g << h); 
    f(g); 
} 

這不是一個常見的成語,至少可以說。

1

我真的不知道你在問什麼,但我認爲你的意思是寫一個類ostream&傳遞給operator<<。首先,您必須設法將T轉換爲字符串表示形式。我會假設功能TToString這樣做。

template<class T> 
struct UnknownName 
{ 
    T g; 

    bool operator()(const T&v) 
    { 
     if(v==g) { 
     cout << v; 
     return true; 
     } 

     return false; 
    } 

    friend std::ostream& operator<<(std::ostream& os, const T& v) { 
     return os << TToString(v); 
    } 
}; 

對不起,如果我誤解了你的問題。

+0

你不應該需要實現'TToString'。只要'operator <<'被定義爲'T'類型,使用'os < Dawson

+0

@Toolbox這是爲'T'定義'operator <<'所以你必須把'T'變成字符串,所以你不會得到無限遞歸。 –

+0

啊gotcha,傻了我。 – Dawson