2011-08-26 11 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 '.) 연산자를 호출 하시겠습니까 'UnknownName '객체 또는'const T &'아규먼트에 대해서 – Dawson

답변

0

그때 operator<<이 특정 유형을 반환하고하는 것입니다 생각할 수있는 최선의 해당 유형에 동의 operator() 과부하.

1

나는 당신이 묻고있는 것을 정말로 말할 수는 없지만, 으로 전달되는 ostream&에 클래스를 작성한다고 가정합니다. 먼저 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); 
    } 
}; 

귀하의 질문을 잘못 해석하면 죄송합니다.

#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); 
} 

이 공통 관용구하지 않다가, 적어도 말을하기 :

+0

'TToString'을 구현할 필요는 없습니다 ..'T'를 위해'operator <<'가 정의되어있는 한'os < 가''int ''와 같은 경우에 Dawson

+0

@Toolbox 이것은'T'에 대해'operator <<'를 정의하고 있습니다. 문자열 그래서 무한 재귀를 얻을하지 않습니다. –

+0

아아 잡았다. 바보 같은 날. – Dawson

관련 문제