반응형
invoke_result는 C++ 17부터 추가된 함수의 리턴 타입을 알아내는데 사용되는 함수 입니다. 기존에는 C++ 11에 추가된 result_of가 사용되었는데 C++ 20에서 삭제된 관계로 더 이상 result_of는 사용할 수 없습니다. 해당 함수는 템플릿을 프로그래밍을 할 때 사용할 수 있는 함수인 관계로 일반적인 프로그래밍에는 별로 사용되지 않을 듯 보입니다.
사용법은 invoke_result<함수, 인자1, 인자2, ...>::type 입니다. 비주얼 스튜디오에서 제대로된 인자를 넣지 않을 경우 인텔리센스에서 멤버로 type이 나오지 않습니다.
아래 예제는 std::result_of, std::invoke_result(https://en.cppreference.com/w/cpp/types/result_of)을 응용하여 작성하였습니다.
#include <iostream>
#include <type_traits>
using namespace std;
int main(int argc, char* argv[])
{
struct std_test_06_02
{
double operator() (char, int) {}
float operator()(int) { return 1.0; }
};
invoke_result<std_test_06_02, int>::type F;
static_assert(is_same<decltype(F), float>::value, "");
invoke_result<std_test_06_02, char, int>::type G;
static_assert(is_same<decltype(G), double>::value, "");
struct std_test_06_03
{
double func(char, int&);
};
invoke_result<decltype(&std_test_06_03::func), std_test_06_03, char, int&>::type H;
static_assert(is_same<decltype(H), double>::value, "");
auto lamda2 = [](int, int)->char { return '0'; };
invoke_result<decltype(lamda2), int, int>::type I = 'A';
static_assert(is_same<decltype(I), char>::value, "");
return 0;
}
이런 템플릿 프로그래밍 처음 보는 사람한테는 어색해 보일 수 있는 코드입니다. static_assert는 관련 포스팅으로 이해하실 수 있습니다. 이 외에 decltype, is_same 등은 코드 보시면 대충 쉽게 이해가실 수 있을 듯 합니다.
반응형
'C++ 프로그래밍' 카테고리의 다른 글
std::chrono::steady_clock 관련 종합 예제 (0) | 2021.11.22 |
---|---|
동적 라이브러리(DLL)를 사용할 것인가? 아니면 정적 라이브러리(LIB)를 사용할 것인가? (1) | 2021.11.18 |
C++ chrono system_clock과 steady_clock의 이해 및 차이점 (0) | 2021.11.10 |
C/C++ __FUNCTION__, __FILE__의 유니코드 버전 (0) | 2021.11.01 |
C++ static_assert (0) | 2021.10.30 |
error C3520: 'args': 이 컨텍스트에서 매개 변수 팩을 확장해야 합니다. (0) | 2021.10.28 |
C++ optional의 활용 (0) | 2021.10.24 |
C++에서 stderr로 출력하기 (0) | 2021.10.11 |