일반 펑터는 다양한 인수 목록이 있는 함수를 처리하는 편리한 방법을 제공하는 유용한 클래스입니다. 그러나 이러한 클래스 내에서 함수 포인터의 인수 유형에 액세스하는 것은 어려울 수 있습니다.
다음 functor 클래스를 고려하세요.
<code class="cpp">template <typename... ARGS> class Foo { std::function<void(ARGS...)> m_f; public: Foo(std::function<void(ARGS...)> f) : m_f(f) {} void operator()(ARGS... args) const { m_f(args...); } };</code>
쉽게 액세스할 수 있지만 args... 재귀적 "필링" 함수를 사용하는 Operator() 메서드에서 생성자에서 인수 유형을 가져오는 것이 더 복잡합니다.
이 문제를 해결하려면 function_traits 클래스를 구현할 수 있습니다.
<code class="cpp">template<typename T> struct function_traits; template<typename R, typename ...Args> struct function_traits<std::function<R(Args...)>> { static const size_t nargs = sizeof...(Args); typedef R result_type; template<size_t i> struct arg { typedef typename std::tuple_element<i, std::tuple<Args...>>::type type; }; };</code>
이 클래스를 사용하면 함수 포인터의 인수 유형, 반환 유형 및 인수 수를 결정할 수 있습니다.
다음 코드는 기능을 보여줍니다.
<code class="cpp">struct R {}; struct A {}; struct B {}; void main() { typedef std::function<R(A, B)> fun; cout << std::is_same<R, function_traits<fun>::result_type>::value << endl; cout << std::is_same<A, function_traits<fun>::arg<0>::type>::value << endl; cout << std::is_same<B, function_traits<fun>::arg<1>::type>::value << endl; }</code>
위 내용은 Variadic 템플릿 클래스에서 함수 포인터의 인수 유형을 검색하는 방법은 무엇입니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!