2010-03-16 3 views
2

템플릿 함수를 사용하고 있으며 전달 중이고 다양한 클래스의 인스턴스를 문자열 스트림으로 보낼 수 있습니다. 이것이 계속 작동하려면 어떻게해야합니까?C++에서 알 수없는 클래스를 문자열 스트림으로 전달

좀 더 자세하게 설명해 드리겠습니다.이 동작을 어디에 정의해야합니까? 문자열 스트림으로 보내지는 각 클래스에 있어야하는 멤버가 있습니까? 기존 String 스트림을 향상 시키거나 확장해야합니까 (sstream에서 상속받은 클래스를 작성하고 가능한 모든 것을 처리하기 위해 < < 연산자를 오버로드해야한다고 생각 했었습니다.) 수업)?

더 많은 리소스에 대한 링크조차 도움이 될 정도로이 문서를 찾는 데 어려움이있었습니다.

답변

5

스트림 삽입 연산자를 만들고 싶습니다. 클래스에 대해 당신이 스트림에 출력 할 수있는 무료 기능을 정의하려면 :

std::ostream& operator<<(std::ostream& stream, const SomeClassType& x) 
{ 
    stream << x.someData(); 

    return stream; 
} 

을 그래서 우리는 SomeClassType z;을 가지고, 우리는 std::cout << z을 (다른 출력 스트림, fstream 또는 stringstream 같은 이상) 경우, 컴파일러는 우리의 함수를 찾아서 찾을 것이다. 즉, std::cout << zoperator<<(std::cout, z)이되고 내부에서 필요한 것을 출력합니다.

+0

이 내가 필요 정확히 :

struct Point { int x, y; }; std::ostream& operator<<(std::ostream& os, const Point& p) { return os << '(' << p.x << ", " << p.y << ')'; } 

당신은 다음과 같이 될 수있는 함수에서 사용할 수 있습니다 – Sqeaky

4

이러한 클래스에는 operator<<을 오버로드하면됩니다.

template <class T> 
std::string to_string(const T& x) 
{ 
    std::stringstream ss; 
    ss << x; 
    return ss.str(); 
} 

int main() 
{ 
    Point p = {1, 2}; 
    std::string ps = to_string(p); 
    std::cout << ps << std::endl; // (1, 2) 
} 
관련 문제