모두의 코드 커뮤니티

선생님 c++ 7.1을 공부하다 모르는게 있어서 질문드립니다

7.1 밑에 질문을 했는데 버튼을 누르고 보니 내용과 관계없는 질문은 이 사이트에다가 하라는 안내가 있었네요… 그래서 질문을 지우려 했으나 지워지지가 않습니다.

우선 질문은

#include <iostream>
#include <string>	
#include <ios>
#include <ostream>
#include <istream>

class A {
public:
	A& operator >> (std::ios_base& (*pf)(std::ios_base&)) {
		pf;
		return *this;
	}
	A& operator >> (int& a) {
		std::cin >> a;
		return *this;
	}
};
int main() {
	int b;
	A a;
	
	a >> std::hex >> b;
	std::cout << "입력 : " << b << std::endl;

	return 0;
}

ios::hex 함수가 구현되는 원리를 공부하던 중에 이렇게 해도 돌아갈까 하구 해봤습니다.

근데 여기서 pf 함수가 실행이 안되는거 같습니다. 그래서 당연히
str.setf(std::ios_base::hex, std::ios_base::basefield) 이것도 실행이 안되는거 같았습니다.

어찌 저찌 해서 답을 알아냈는데
pf -> std::cin>>pf 로 바꾸면 원하는 답이 나오더라구요…
std::cin>>pf 이게 도대체 무슨 말인지 모르겠습니다.

혹시 아래 3개중에 어떤 istream 연산자 오버로딩 때문에 실행 되고 있는 건가요??

istream& operator>> (void*& val);
istream& operator>> (istream& (*pf)(istream&));
istream& operator>> (ios& (*pf)(ios&));

애초애 저가 쓴 pf는 왜 실행이 안될까요,?
pf가 ios::hex의 주소를 가지고 있는데 말이죠…

좋아요 1

안녕하세요. 댓글을 달아드렸는데 다시 이야기 하자면

pf 는 인자를 std::ios_base& 를 가지는 함수 포인터 입니다. 따라서 해당 함수를 실행하려면 마치 함수를 실행하는 듯이 해야 합니다. pf(base); 이렇게 말이죠. 여기서 base 는 ios_base 타입의 객체 입니다.

좋아요 1

답변 감사합니다 선생님