부스트
유형 특성
라이브러리를 살펴보십시오. 특히
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