Program Language/C & C++

[C++] result_of

야곰야곰+책벌레 2021. 10. 6. 13:46
728x90
반응형

지정된 인수 유형을 사용하는 호출 가능 형식의 반환 형식을 결정한다.

template<class>
struct result_of; // Causes a static assert

template <class Fn, class... ArgTypes>
struct result_of<Fn(ArgTypes...)>;

// Helper type
template<class T>
   using result_of_t = typename result_of<T>::type;

Fn : 쿼리할 호출 가능 형식

ArgTypes : 쿼리 할 호출 가능 형식에 대한 인수 목록의 형식

 

#include <type_traits>
#include <iostream>

struct S
{
	double operator()(char, int&);
	float operator()(int) { return 1.0; }
};

template <class T>
typename std::result_of<T(int)>::type f(T& t)
{
	std::cout << "overload of f for callable T\n";
	return t(0);
}

template<class T, class U>
int f(U u)
{
	std::cout << "overload of f for non-callable T\n";
	return u;
}

int main()
{
	// char 및 int& 인수로 S를 호출한 결과는 double이다.
	std::result_of<S(char, int&)>::type d = 3.14; // d는 double형이다.
	static_assert(std::is_same<decltype(d), double>::value, "");

	// int 인수로 S를 호출한 결과는 float입니다.
	std::result_of<S(int)>::type x = 3.14; // x에는 float 유형이 있다.
	static_assert(std::is_same<decltype(x), float>::value, "");

	// result_of는 다음과 같이 멤버 함수에 대한 포인터와 함께 사용할 수 있다.
	struct C { double Func(char, int&); };
	std::result_of<decltype(&C::Func)(C, char, int&)>::type g = 3.14;
	static_assert(std::is_same<decltype(g), double>::value, "");

	f<C>(1);
	
	return 0;
}

 

근데.. 잘 모르겠다. ㅎㅎ C++17부터는 사용하지 않는 용법이라니 접어둘까.. 

728x90
반응형

'Program Language > C & C++' 카테고리의 다른 글

[C++] error LNK2001: unresolved external symbol (Static member)  (0) 2021.10.07
[C++] recursive_mutex  (0) 2021.10.07
[C++] Callable  (0) 2021.10.06
[C++] condition_variable  (2) 2021.10.05
[C++] noexcept  (10) 2021.10.01