2019/07/01 - [프로그래밍 노트/C++ | Modern C++] - 숨겨진 This pointer 는 어떻게 넘어 가는가~
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)로 작성하는것은 불가능한것같다.
'프로그래밍 언어 노트 > C++ | Modern C++' 카테고리의 다른 글
[Modern C++] C++ 의 map, reduce, filter (0) | 2019.12.18 |
---|---|
[Modern C++] C++ 코루틴 (0) | 2019.07.09 |
[C++] 숨겨진 This pointer 는 어떻게 넘어 가는가~ (0) | 2019.07.01 |
[모던 C++] C++의 아버지 스트로스트눕이 해주는 모던 C++ 이야기 (0) | 2019.06.01 |
[Visual Studio] Template의 intellisence (0) | 2018.10.07 |