C++ 프로그래밍

C++ invoke_result: return type 알아내기

하늘흐늘 2021. 10. 31. 13:14
반응형

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 등은 코드 보시면 대충 쉽게 이해가실 수 있을 듯 합니다.

반응형