1. std::invoke 기본 개념

일반 함수 호출 방법

#include <functional>
#include <iostream>

int square(int x) {
    return x * x;
}

int main() {
    int result = std::invoke(square, 5);  // square(5)를 호출 -> 25
    std::cout << "square(5): " << result << "\\n";
    return 0;
}

멤버 함수 포인터 호출 방법

#include <functional>
#include <iostream>

struct Calculator {
    int add(int a, int b) const { return a + b; }
};

int main() {
    Calculator calc;
    // 멤버 함수 포인터 선언: Calculator의 const 멤버 함수 add를 가리킴
    int (Calculator::*addPtr)(int, int) const = &Calculator::add;
    
    // std::invoke를 사용하여 calc 객체의 add 함수를 호출
    int result = std::invoke(addPtr, calc, 3, 4);  // calc.add(3,4) 호출
    std::cout << "calc.add(3, 4): " << result << "\\n";
    return 0;
}

객체 포인터

#include <functional>
#include <iostream>

struct Calculator {
    int add(int a, int b) const { return a + b; }
};

int main() {
    Calculator calc;
    Calculator* pCalc = &calc;
    
    int (Calculator::*addPtr)(int, int) const = &Calculator::add;
    
    // 객체 포인터를 이용해 호출: std::invoke가 내부적으로 pCalc->*addPtr 형태로 호출함.
    int result = std::invoke(addPtr, pCalc, 10, 20);
    std::cout << "pCalc->add(10, 20): " << result << "\\n";
    return 0;
}

Lamda 함수 호출

#include <functional>
#include <iostream>

int main()
{
	auto lamda = [](int x, int y){ return x > y};
	
	int sum = std::invoke(lamda, 10 ,20);
	std::cout << "Lamda sum :" << sum << "\\n" ;
	return 0;

}