문제

템플릿 함수를 사용하고 있으며 통과 중이며 다양한 클래스의 인스턴스를 문자열 스트림으로 보낼 수 있습니다. 이것이 계속 작동하는지 확인하기 위해 무엇을 할 수 있습니까?

더 구체적으로 이에 대한 동작을 어디에서 정의할까요? 기존 문자열 스트림을 향상 시키거나 확장 해야하는 각 클래스에 문자열 스트림으로 전송되어야하는 멤버가 있습니까 (SSTREAM에서 상속하고 가능한 모든 것을 처리하도록 << 연산자를 과부하시키는 클래스를 구축하고 있다고 생각했습니다. 클래스)?

나는 이것에 대한 문서를 찾는 데 어려움을 겪었으므로 더 많은 자원에 대한 링크조차 도움이 될 것입니다.

도움이 되었습니까?

해결책

스트림 삽입 연산자를 만들고 싶은 것처럼 들립니다. 스트림에 출력 할 수있는 클래스의 경우 자유 함수를 정의하십시오.

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

    return stream;
}

그래서 우리가 있다면 SomeClassType z;, 그리고 우리는합니다 std::cout << z (또는 다른 출력 스트림과 같은 다른 출력 스트림 fstream 또는 stringstream), 컴파일러는 우리의 기능을 찾고 찾고 호출합니다. 그건, std::cout << z becomes operator<<(std::cout, z) 그리고 거기 내부에서 당신은 당신이 필요한 것을 출력합니다.

다른 팁

당신은 단지 과부하 만하면됩니다 operator<< 그 수업의 경우, 예를 들어

struct Point { int x, y; };

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

그런 다음 기능에서 사용할 수 있습니다. 이는 다음과 같은 것일 수 있습니다.

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)
}
라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top