카테고리 없음

[C ++] 호출하지 않고 함수의 반환 유형 추출 (템플릿 사용?)

행복을전해요 2021. 1. 5. 23:20

부스트

유형 특성

라이브러리를 살펴보십시오. 특히

function_traits

템플릿은 이러한 기능을 즉시 제공합니다. 부스트를 사용할 수없는 경우 코드를 다운로드하고 소스를 읽고 어떻게 수행되는지에 대한 통찰력을 얻으십시오.기능은 구체적인 기능이 아닌 유형을 기반으로하므로 추가 코드를 추가해야 할 수 있습니다.


몇 가지 작은 테스트를 수행 한 후에는 실제로 필요한 것이 아닐 수 있으며 '추가 코드'라면 사소하지 않을 것입니다. 문제는

function_traits

템플릿이 실제 함수 포인터가 아니라 함수 시그니처에서 작동 한다는 것이므로 문제가 '함수 포인터에서 반환 유형 가져 오기'에서 '함수 포인터에서 서명 가져 오기'로 변경되었는데 이는 아마도 가장 어려운 부분 일 것입니다.-------------------
함수 이름은 유형이 아닌 표현식이기 때문에 까다 롭습니다

typeof

. gcc와 같은 것이 필요합니다 . Boost의

TypeOf

는 매우 근접한 휴대용 솔루션입니다.그러나 작업이 전달

Foo

되거나

Bar

전달 될 수 있는 함수 템플릿 내에서 수행되도록 코드를 구성 할 수있는 경우 다음과 같은 간단한 대답이 있습니다.

template <class R>
void test(R (*)())
{
  R var1;
  }
  
  int main()
  {
    test(&Foo);
    }
    

-------------------
Foo와 Bar는 함수 유형이 아니라 함수이므로 약간의 추가 작업이 필요합니다.다음은 boost :: function_traits 및 BOOST_TYPEOF의 조합을 사용하는 솔루션입니다.

#include <boost/typeof/typeof.hpp>
#include <boost/type_traits.hpp>

float Foo();
int Bar();

int main()
{
  boost::function_traits<BOOST_TYPEOF(Foo)>::result_type f = 5.0f;
    boost::function_traits<BOOST_TYPEOF(Bar)>::result_type i = 1;
      return i;
      }
      

편집하다:

  • 이것은 가장 현명한 용도로 충분해야하는 최대 10 개의 기능에 대해 작동합니다.
  • 이러한 BOOST_TYPEOF 사용은 기본 typeof를 제공하지 않는 플랫폼에서 작동하므로 이식성이 좋습니다.

-------------------
C ++ 0x에서는

decltype

.문제에 대한 토론과 이전 C ++ 표준에 대한 솔루션을 구성하려면 여기를 참조하십시오.

Scott Myers "도전"

(PDF)과

Andrei Alexandrescu가이를 해결하려고합니다.

-------------------
여기에 템플릿 마법이 있습니다 (아니요

Boost

) :

template <typename ReturnType> class clFunc0
{
    typedef ReturnType ( *FuncPtr )();
    public:
        typedef ReturnType Type;
        };
        
        template <typename ReturnType> inline clFunc0<ReturnType> ResultType( ReturnType ( *FuncPtr )() )
        {
            return clFunc0<ReturnType>();
            }
            
            #define FUNC_TYPE( func_name ) decltype( ResultType( &func_name ) )::Type
            
            int test()
            {
                return 1;
                }
                
                int main()
                {
                    FUNC_TYPE( test ) Value = 1;
                    
                        return Value;
                        }
                        

그리고 그것을 통해 컴파일하십시오.

gcc Test.cpp -std=gnu++0x

-------------------
dribeas가 제안한 것처럼 결국 내가 찾은 해결책은 다음과 같습니다.

float Foo();
int Bar();

template<typename T> Monkey(T) {
    boost::function_traits< boost::remove_pointer<T>::type >::result_type var1 = ...;
        // Now do something
        }
        
        Monkey(Foo);
        Monkey(Bar);
        

이것은 내 원래 질문에서 목표로 삼은 형식은 아니지만 충분히 가깝습니다.-------------------
다음과 같이 시도하십시오.

template<class T> struct magic_template
{};

template<class T> struct magic_template<T()>
{
    typedef T type;
    };
    



출처
https://stackoverflow.com/questions/2005794