본문 바로가기

프로그래밍 언어 노트/C++ | Modern C++

[C++] 숨겨진 This pointer 는 어떻게 넘어 가는가~ 2

2019/07/01 - [프로그래밍 노트/C++ | Modern C++] - 숨겨진 This pointer 는 어떻게 넘어 가는가~

 

숨겨진 This pointer 는 어떻게 넘어 가는가~

파이썬의 경우 self (C++ 의 this) 를 명시적으로 써준다. 그리고 객체.함수(파라미터1, 파라미터2) 에서 묵시적으로 객체 자신을 첫 파라미터로 넘기게 되는데 따라서 클래스명.함수(객체, 파라미터1, 파라미터2)..

see-ro-e.tistory.com

C++ 에서 A::fun(*a) 와 같이 함수(객체 .. ) 형식으로 넘길수 있는가를 찾아보던중

invoke 함수를 이용하면 가능하다는것을 알게되었다.

 

#include <iostream>
#include <type_traits>

using namespace std;
class A {
public:
	void __stdcall print(int a, int b)
	{
		cout << a << b << endl;
		cout << this << endl;
	}
};


int main()
{
	A a;
	auto p = &A::print;
	a.print(1,2);
	invoke(p,a, 1, 2);
}

 

Invoke 함수는 첫번째인자로 함수로써 사용가능한 것을 받고 뒤로는파라미터를 받는다.

print함수는 A::print(객체,파라미터1, 파라미터2) 형태의 꼴이므로

실제로 invoke 를 통하여 함수,객체,파라미터1,파라미터2 를 넘겼다.

 

실제로 값도 똑같이 나온다. 메데타시 메데타시

 

인줄 알았으나... 내가 알아보고싶어하던것은 실제로 this포인터가 넘어가는

 A::fun(a) 꼴 함수 호출을 직접 하는것을 원했으므로

이런식으로 동작하도록 해주는 invoke 함수를 까서 내용을 그대로쓰면 되지않을까? 라는 생각을 했는데..

struct _CONCAT(NAME_PREFIX, _Invoker_pmf_object) { /* INVOKE a pointer to member function on an object */          \
        template <class _Decayed, class _Ty1, class... _Types2>                                                        \
        static CONSTEXPR auto _Call(_Decayed _Pmf, _Ty1&& _Arg1, _Types2&&... _Args2)                                  \
            _NOEXCEPT_COND(noexcept((_STD forward<_Ty1>(_Arg1).*_Pmf)(_STD forward<_Types2>(_Args2)...)))              \
                -> decltype((_STD forward<_Ty1>(_Arg1).*_Pmf)(                                                         \
                    _STD forward<_Types2>(_Args2)...)) { /* INVOKE a pointer to member function on an object */        \
            return (_STD forward<_Ty1>(_Arg1).*_Pmf)(_STD forward<_Types2>(_Args2)...);                                \
        }                                                                                                              \
    };          

이부분이 맴버 평선일때 수행되는 invoke 들중에 하나인데..

 

return 부분을 보면 대충 arg1.pmf 꼴로 바꾼다.

여기서 pmf 는 함수 A::print()이고 arg1이 객체 a기때문에

 결국 a.print(~~) 형태의 코드가 되는것이다.

 

내가 원한것은 a.print() 를 A::print(a) 꼴로 호출하는것을 원했는데

invoke는 결국 a.print()를 A::print() 와 a로 나눠서 넘겨주면 다시 a.print()를 만들어주는꼴..

 

결국 언바운드형식으로 코드를 작성하는것은 실패하였다.

invoke 의 함수 구현자체가 저런꼴인걸 보니

순전히 본인의 생각으로는

this포인터가 숨겨져서 넘어간다~ 는 결과론적으로 프로그램이 함수는 메모리 공간에 하나만 올라가고 구분을 숨겨져서 넘어간 this포인터로 구분한다~ 라는 의미일뿐이고

실제로 코드상에서  A::fun(a)로 작성하는것은 불가능한것같다.

 

 

 

 

 

 

728x90