어떤 클래스의 non static 멤버의 포인터를 가져오고 싶다면 아래와 같이 코딩을 해서 해결할 수 있습니다. thread를 생성하는 방법으로 설명하겠습니다.
#include <iostream>
#include <utility>
#include <thread>
#include <chrono>
#define IS_STATIC 1
class foo
{
public:
#if IS_STATIC
static void bar()
#else
void bar()
#endif
{
for (int i = 0; i < 5; ++i) {
std::cout << "Thread 3 executing\n";
//++n;
std::this_thread::sleep_for(std::chrono::milliseconds(10));
}
}
};
int main()
{
int n = 0;
foo f;
#if IS_STATIC
std::thread t5(foo::bar); // t5 runs foo::bar() on object f
#else
std::thread t5(&foo::bar, &f); // t5 runs foo::bar() on object f
#endif // 0
t5.join();
}
std::thread t5(&foo::bar, &f);
인스턴스 f의 bar 함수를 수행하는 스레드를 생성하기 위한 코드입니다. 이를 위해 f의 포인터를 넘기고, member pointer인 &foo::bar까지 같이 넘깁니다.
그러면 static function이 만들어지고 이를 t5가 수행하게 됩니다.
위처럼 코딩하면 non static 멤버의 포인터를 이용할 수 있습니다. getter를 굳이 만들지 않고서도요. 하지만 이는 thread를 생성할때 문법적으로 맞춰줘야 하는 부분이므로 굳이 다른 상황에서 이용할 필요는 없을것 같습니다.
** 만일 static 메서드라면 아래와 같이 이용할 수 있습니다. static이기 때문에 인스턴스는 param에서 제외되도 됩니다.
std::thread t5(foo::bar);
'C++ > 코딩' 카테고리의 다른 글
c파일와 cpp파일 mix 빌드 (0) | 2022.09.03 |
---|